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` |