Migrare metriche e ottimizzatori

Visualizza su TensorFlow.org Esegui in Google Colab Visualizza l'origine su GitHub Scarica quaderno

In TF1, tf.metrics è lo spazio dei nomi API per tutte le funzioni metriche. Ciascuna metrica è una funzione che accetta label e prediction come parametri di input e restituisce il tensore della metrica corrispondente come risultato. In TF2, tf.keras.metrics contiene tutte le funzioni e gli oggetti della metrica. L'oggetto Metric può essere utilizzato con tf.keras.Model e tf.keras.layers.layer per calcolare i valori di metrica.

Impostare

Iniziamo con un paio di importazioni TensorFlow necessarie,

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

e preparare alcuni semplici dati per la dimostrazione:

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 Estimator

In TF1, le metriche possono essere aggiunte a EstimatorSpec come eval_metric_ops e l'op viene generato tramite tutte le funzioni delle metriche definite in tf.metrics . Puoi seguire l'esempio per vedere come utilizzare 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}

Inoltre, le metriche possono essere aggiunte allo stimatore direttamente tramite 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 Keras Metrics con tf.keras.Model

In TF2, tf.keras.metrics contiene tutte le classi e le funzioni delle metriche. Sono progettati in uno stile OOP e si integrano strettamente con altre API tf.keras . Tutte le metriche possono essere trovate nello spazio dei nomi tf.keras.metrics e di solito c'è una mappatura diretta tra tf.compat.v1.metrics con tf.keras.metrics .

Nell'esempio seguente, le metriche vengono aggiunte nel metodo model.compile() . Gli utenti devono solo creare l'istanza della metrica, senza specificare l'etichetta e il tensore di previsione. Il modello Keras instraderà l'output e l'etichetta del modello all'oggetto delle metriche.

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 l'esecuzione ansiosa abilitata, le istanze tf.keras.metrics.Metric possono essere utilizzate direttamente per valutare dati numpy o tensori ansiosi. Gli oggetti tf.keras.metrics.Metric sono contenitori con stato. Il valore della metrica può essere aggiornato tramite metric.update_state(y_true, y_pred) e il risultato può essere recuperato da 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

Per maggiori dettagli su tf.keras.metrics.Metric , dai un'occhiata alla documentazione dell'API su tf.keras.metrics.Metric , oltre alla guida alla migrazione .

Migrare gli ottimizzatori TF1.x agli ottimizzatori Keras

Gli ottimizzatori in tf.compat.v1.train , come l' ottimizzatore Adam e l' ottimizzatore di discesa del gradiente , hanno equivalenti in tf.keras.optimizers .

La tabella seguente riassume come convertire questi ottimizzatori legacy nei loro equivalenti Keras. È possibile sostituire direttamente la versione TF1.x con la versione TF2 a meno che non siano necessari passaggi aggiuntivi (come l' aggiornamento della frequenza di apprendimento predefinita ).

Tieni presente che la conversione degli ottimizzatori potrebbe rendere incompatibili i vecchi checkpoint .

TF1.x TF2 Passi aggiuntivi
`tf.v1.train.GradientDescentOptimizer` tf.keras.optimizers.SGD Nessuno
`tf.v1.train.MomentumOptimizer` tf.keras.optimizers.SGD Includere l'argomento `slancio`
`tf.v1.train.AdamOptimizer` tf.keras.optimizers.Adam Rinomina gli argomenti `beta1` e `beta2` in `beta_1` e `beta_2`
`tf.v1.train.RMSPropOptimizer` tf.keras.optimizers.RMSprop Rinomina l'argomento `decay` in `rho`
`tf.v1.train.AdadeltaOptimizer` tf.keras.optimizers.Adadelta Nessuno
`tf.v1.train.AdagradOptimizer` tf.keras.optimizers.Adagrad Nessuno
`tf.v1.train.FtrlOptimizer` tf.keras.optimizers.Ftrl Rimuovere gli argomenti `accum_name` e `linear_name`
`tf.contrib.Adamax Optimizer` tf.keras.optimizers.Adamax Rinominare gli argomenti `beta1` e `beta2` in `beta_1` e `beta_2`
`tf.contrib.Nadam` tf.keras.optimizers.Nadam Rinominare gli argomenti `beta1` e `beta2` in `beta_1` e `beta_2`