Migrar métricas e otimizadores

Veja no TensorFlow.org Executar no Google Colab Ver fonte no GitHub Baixar caderno

No TF1, tf.metrics é o namespace da API para todas as funções de métrica. Cada uma das métricas é uma função que recebe label e prediction como parâmetros de entrada e retorna o tensor de métricas correspondente como resultado. No TF2, tf.keras.metrics contém todas as funções e objetos de métrica. O objeto Metric pode ser usado com tf.keras.Model e tf.keras.layers.layer para calcular valores de métrica.

Configurar

Vamos começar com algumas importações necessárias do TensorFlow,

import tensorflow as tf
import tensorflow.compat.v1 as tf1

e prepare alguns dados simples para demonstração:

features = [[1., 1.5], [2., 2.5], [3., 3.5]]
labels = [0, 0, 1]
eval_features = [[4., 4.5], [5., 5.5], [6., 6.5]]
eval_labels = [0, 1, 1]

TF1: tf.compat.v1.metrics com estimador

No TF1, as métricas podem ser adicionadas ao EstimatorSpec como eval_metric_ops , e o op é gerado por meio de todas as funções de métricas definidas em tf.metrics . Você pode seguir o exemplo para ver como usar tf.metrics.accuracy .

def _input_fn():
  return tf1.data.Dataset.from_tensor_slices((features, labels)).batch(1)

def _eval_input_fn():
  return tf1.data.Dataset.from_tensor_slices(
      (eval_features, eval_labels)).batch(1)

def _model_fn(features, labels, mode):
  logits = tf1.layers.Dense(2)(features)
  predictions = tf.argmax(input=logits, axis=1)
  loss = tf1.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits)
  optimizer = tf1.train.AdagradOptimizer(0.05)
  train_op = optimizer.minimize(loss, global_step=tf1.train.get_global_step())
  accuracy = tf1.metrics.accuracy(labels=labels, predictions=predictions)
  return tf1.estimator.EstimatorSpec(mode, 
                                     predictions=predictions,
                                     loss=loss, 
                                     train_op=train_op,
                                     eval_metric_ops={'accuracy': accuracy})

estimator = tf1.estimator.Estimator(model_fn=_model_fn)
estimator.train(_input_fn)
INFO:tensorflow:Using default config.
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpnfk2kv3b
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpnfk2kv3b', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/training_util.py:401: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.
INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/adagrad.py:143: calling Constant.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpnfk2kv3b/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 1.0451624, step = 0
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 3...
INFO:tensorflow:Saving checkpoints for 3 into /tmp/tmpnfk2kv3b/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 3...
INFO:tensorflow:Loss for final step: 0.54487616.
<tensorflow_estimator.python.estimator.estimator.Estimator at 0x7f894c163990>
estimator.evaluate(_eval_input_fn)
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2021-11-19T02:25:11
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpnfk2kv3b/model.ckpt-3
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Inference Time : 0.14330s
INFO:tensorflow:Finished evaluation at 2021-11-19-02:25:11
INFO:tensorflow:Saving dict for global step 3: accuracy = 0.6666667, global_step = 3, loss = 0.588699
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 3: /tmp/tmpnfk2kv3b/model.ckpt-3
{'accuracy': 0.6666667, 'loss': 0.588699, 'global_step': 3}

Além disso, as métricas podem ser adicionadas ao estimador diretamente via tf.estimator.add_metrics() .

def mean_squared_error(labels, predictions):
  labels = tf.cast(labels, predictions.dtype)
  return {"mean_squared_error": 
          tf1.metrics.mean_squared_error(labels=labels, predictions=predictions)}

estimator = tf1.estimator.add_metrics(estimator, mean_squared_error)
estimator.evaluate(_eval_input_fn)
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpnfk2kv3b', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2021-11-19T02:25:12
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpnfk2kv3b/model.ckpt-3
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Inference Time : 0.14966s
INFO:tensorflow:Finished evaluation at 2021-11-19-02:25:12
INFO:tensorflow:Saving dict for global step 3: accuracy = 0.6666667, global_step = 3, loss = 0.588699, mean_squared_error = 0.33333334
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 3: /tmp/tmpnfk2kv3b/model.ckpt-3
{'accuracy': 0.6666667,
 'loss': 0.588699,
 'mean_squared_error': 0.33333334,
 'global_step': 3}

TF2: API de métricas Keras com tf.keras.Model

No TF2, tf.keras.metrics contém todas as classes e funções de métricas. Eles são projetados em um estilo OOP e se integram intimamente com outras APIs do tf.keras . Todas as métricas podem ser encontradas no namespace tf.keras.metrics , e geralmente há um mapeamento direto entre tf.compat.v1.metrics com tf.keras.metrics .

No exemplo a seguir, as métricas são adicionadas no método model.compile() . Os usuários precisam apenas criar a instância da métrica, sem especificar o rótulo e o tensor de previsão. O modelo Keras roteará a saída e o rótulo do modelo para o objeto de métricas.

dataset = tf.data.Dataset.from_tensor_slices((features, labels)).batch(1)
eval_dataset = tf.data.Dataset.from_tensor_slices(
      (eval_features, eval_labels)).batch(1)

inputs = tf.keras.Input((2,))
logits = tf.keras.layers.Dense(2)(inputs)
predictions = tf.argmax(input=logits, axis=1)
model = tf.keras.models.Model(inputs, predictions)
optimizer = tf.keras.optimizers.Adagrad(learning_rate=0.05)

model.compile(optimizer, loss='mse', metrics=[tf.keras.metrics.Accuracy()])
model.evaluate(eval_dataset, return_dict=True)
3/3 [==============================] - 0s 2ms/step - loss: 0.3333 - accuracy: 0.6667
{'loss': 0.3333333432674408, 'accuracy': 0.6666666865348816}

Com a execução antecipada habilitada, as instâncias tf.keras.metrics.Metric podem ser usadas diretamente para avaliar dados numpy ou tensores ansiosos. Os objetos tf.keras.metrics.Metric são contêineres com estado. O valor da métrica pode ser atualizado via metric.update_state(y_true, y_pred) , e o resultado pode ser recuperado por metrics.result() .

accuracy = tf.keras.metrics.Accuracy()

accuracy.update_state(y_true=[0, 0, 1, 1], y_pred=[0, 0, 0, 1])
accuracy.result().numpy()
0.75
accuracy.update_state(y_true=[0, 0, 1, 1], y_pred=[0, 0, 0, 0])
accuracy.update_state(y_true=[0, 0, 1, 1], y_pred=[1, 1, 0, 0])
accuracy.result().numpy()
0.41666666

Para obter mais detalhes sobre tf.keras.metrics.Metric , consulte a documentação da API em tf.keras.metrics.Metric , bem como o guia de migração .

Migrar otimizadores TF1.x para otimizadores Keras

Os otimizadores em tf.compat.v1.train , como o otimizador Adam e o otimizador gradiente descendente , têm equivalentes em tf.keras.optimizers .

A tabela abaixo resume como você pode converter esses otimizadores herdados em seus equivalentes Keras. Você pode substituir diretamente a versão TF1.x pela versão TF2, a menos que etapas adicionais (como atualizar a taxa de aprendizado padrão ) sejam necessárias.

Observe que a conversão de seus otimizadores pode tornar os pontos de verificação antigos incompatíveis .

TF1.x TF2 Etapas adicionais
`tf.v1.train.GradientDescentOptimizer` tf.keras.optimizers.SGD Nenhum
`tf.v1.train.MomentumOptimizer` tf.keras.optimizers.SGD Incluir o argumento `momentum`
`tf.v1.train.AdamOptimizer` tf.keras.optimizers.Adam Renomeie os argumentos `beta1` e `beta2` para `beta_1` e `beta_2`
`tf.v1.train.RMSPropOptimizer` tf.keras.optimizers.RMSprop Renomeie o argumento `decay` para `rho`
`tf.v1.train.AdadeltaOptimizer` tf.keras.optimizers.Adadelta Nenhum
`tf.v1.train.AdagradOptimizer` tf.keras.optimizers.Adagrad Nenhum
`tf.v1.train.FtrlOptimizer` tf.keras.optimizers.Ftrl Remova os argumentos `accum_name` e `linear_name`
`tf.contrib.AdamaxOptimizer` tf.keras.optimizers.Adamax Renomeie os argumentos `beta1` e `beta2` para `beta_1` e `beta_2`
`tf.contrib.Nadam` tf.keras.optimizers.Nadam Renomeie os argumentos `beta1` e `beta2` para `beta_1` e `beta_2`