Migrar métricas y optimizadores

Ver en TensorFlow.org Ejecutar en Google Colab Ver fuente en GitHub Descargar libreta

En TF1, tf.metrics es el espacio de nombres de la API para todas las funciones métricas. Cada una de las métricas es una función que toma la label y prediction como parámetros de entrada y devuelve el tensor de métricas correspondiente como resultado. En TF2, tf.keras.metrics contiene todas las funciones y objetos métricos. El objeto Metric se puede usar con tf.keras.Model y tf.keras.layers.layer para calcular valores métricos.

Configuración

Comencemos con un par de importaciones necesarias de TensorFlow,

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

y prepare algunos datos simples para la demostración:

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 con Estimador

En TF1, las métricas se pueden agregar a EstimatorSpec como eval_metric_ops , y la operación se genera a través de todas las funciones de métricas definidas en tf.metrics . Puede seguir el ejemplo para ver cómo 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}

Además, las métricas se pueden agregar al estimador directamente a través 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 de Keras con tf.keras.Model

En TF2, tf.keras.metrics contiene todas las funciones y clases de métricas. Están diseñados en un estilo OOP y se integran estrechamente con otras API de tf.keras . Todas las métricas se pueden encontrar en el espacio de nombres tf.keras.metrics y, por lo general, hay una asignación directa entre tf.compat.v1.metrics y tf.keras.metrics .

En el siguiente ejemplo, las métricas se agregan en el método model.compile() . Los usuarios solo necesitan crear la instancia de métrica, sin especificar la etiqueta y el tensor de predicción. El modelo de Keras enrutará la salida del modelo y la etiqueta al 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}

Con la ejecución entusiasta habilitada, las instancias de tf.keras.metrics.Metric se pueden usar directamente para evaluar datos numpy o tensores ansiosos. Los objetos tf.keras.metrics.Metric son contenedores con estado. El valor de la métrica se puede actualizar mediante metric.update_state(y_true, y_pred) y el resultado se puede recuperar mediante 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 obtener más detalles sobre tf.keras.metrics.Metric , consulte la documentación de la API en tf.keras.metrics.Metric , así como la guía de migración .

Migrar optimizadores TF1.x a optimizadores Keras

Los optimizadores en tf.compat.v1.train , como el optimizador Adam y el optimizador de descenso de gradiente , tienen equivalentes en tf.keras.optimizers .

La siguiente tabla resume cómo puede convertir estos optimizadores heredados en sus equivalentes de Keras. Puede reemplazar directamente la versión TF1.x con la versión TF2 a menos que se requieran pasos adicionales (como actualizar la tasa de aprendizaje predeterminada ).

Tenga en cuenta que la conversión de sus optimizadores puede hacer que los puntos de control antiguos sean incompatibles .

TF1.x TF2 Pasos adicionales
`tf.v1.train.GradientDescentOptimizer` tf.keras.optimizers.SGD Ninguna
`tf.v1.train.MomentumOptimizer` tf.keras.optimizers.SGD Incluir el argumento `impulso`
`tf.v1.train.AdamOptimizer` tf.keras.optimizers.Adam Cambie el nombre de los argumentos `beta1` y `beta2` a `beta_1` y `beta_2`
`tf.v1.train.RMSPropOptimizer` tf.keras.optimizers.RMSprop Cambie el nombre del argumento `decay` a `rho`
`tf.v1.train.AdadeltaOptimizer` tf.keras.optimizers.Adadelta Ninguna
`tf.v1.train.AdagradOptimizer` tf.keras.optimizers.Adagrad Ninguna
`tf.v1.train.FtrlOptimizer` tf.keras.optimizers.Ftrl Elimina los argumentos `accum_name` y `linear_name`
`tf.contrib.AdamaxOptimizer` tf.keras.optimizers.Adamax Cambie el nombre de los argumentos `beta1` y `beta2` a `beta_1` y `beta_2`
`tf.contrib.Nadam` tf.keras.optimizers.Nadam Cambie el nombre de los argumentos `beta1` y `beta2` a `beta_1` y `beta_2`