Przenieś metryki i optymalizatory

Zobacz na TensorFlow.org Uruchom w Google Colab Wyświetl źródło na GitHub Pobierz notatnik

W TF1 tf.metrics jest przestrzenią nazw API dla wszystkich funkcji metryk. Każda z metryk jest funkcją, która przyjmuje label i prediction jako parametry wejściowe i zwraca jako wynik odpowiedni tensor metryk. W TF2 tf.keras.metrics zawiera wszystkie funkcje i obiekty metryki. Obiekt Metric może być używany z tf.keras.Model i tf.keras.layers.layer do obliczania wartości metryki.

Ustawiać

Zacznijmy od kilku niezbędnych importów TensorFlow,

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

i przygotuj kilka prostych danych do demonstracji:

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 z estymatorem

W TF1 metryki można dodać do EstimatorSpec jako eval_metric_ops , a operacja jest generowana za pomocą wszystkich funkcji metryk zdefiniowanych w tf.metrics . Możesz skorzystać z przykładu, aby zobaczyć, jak używać 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}

Ponadto metryki można dodawać bezpośrednio do estymatora za pomocą 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: Keras Metrics API z tf.keras.Model

W TF2 tf.keras.metrics zawiera wszystkie klasy i funkcje metryk. Zostały zaprojektowane w stylu OOP i ściśle integrują się z innymi API tf.keras . Wszystkie metryki można znaleźć w przestrzeni nazw tf.keras.metrics i zwykle istnieje bezpośrednie mapowanie między tf.compat.v1.metrics a tf.keras.metrics .

W poniższym przykładzie metryki są dodawane w model.compile() . Użytkownicy muszą tylko utworzyć instancję metryki bez określania etykiety i tensora prognozy. Model Keras skieruje dane wyjściowe modelu i etykietę do obiektu metryk.

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}

Po włączeniu szybkiego wykonywania, instancje tf.keras.metrics.Metric mogą być bezpośrednio używane do oceny numpy danych lub szybkich tensorów. Obiekty tf.keras.metrics.Metric są kontenerami stanowymi. Wartość metryki można zaktualizować za pomocą metric.update_state(y_true, y_pred) , a wynik można pobrać za pomocą 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

Więcej informacji na temat tf.keras.metrics.Metric można znaleźć w dokumentacji interfejsu API pod adresem tf.keras.metrics.Metric , a także w przewodniku migracji .

Migracja optymalizatorów TF1.x do optymalizatorów Keras

Optymalizatory w tf.compat.v1.train , takie jak Adam Optimizer i Gradient Descent Optimizer , mają swoje odpowiedniki w tf.keras.optimizers .

Poniższa tabela podsumowuje, w jaki sposób można przekonwertować te starsze optymalizatory na ich odpowiedniki Keras. Wersję TF1.x można bezpośrednio zastąpić wersją TF2, chyba że są wymagane dodatkowe kroki (takie jak aktualizacja domyślnej szybkości uczenia się).

Pamiętaj, że konwertowanie optymalizatorów może spowodować, że stare punkty kontrolne będą niekompatybilne .

TF1.x TF2 Dodatkowe kroki
`tf.v1.train.GradientDescentOptimizer` tf.keras.optimizers.SGD Nic
`tf.v1.train.MomentumOptimizer` tf.keras.optimizers.SGD Dołącz argument `momentum`
`tf.v1.train.AdamOptimizer` tf.keras.optimizers.Adam Zmień nazwy argumentów „beta1” i „beta2” na „beta_1” i „beta_2”
`tf.v1.train.RMSPropOptimizer` tf.keras.optimizers.RMSprop Zmień nazwę argumentu `decay` na `rho`
`tf.v1.train.AdadeltaOptimizer` tf.keras.optimizers.Adadelta Nic
`tf.v1.train.AdagradOptimizer` tf.keras.optimizers.Adagrad Nic
`tf.v1.train.FtrlOptimizer` tf.keras.optimizers.Ftrl Usuń argumenty `accum_name` i `linear_name`
`tf.contrib.AdamaxOptimizer` tf.keras.optimizers.Adamax Zmień nazwy argumentów „beta1” i „beta2” na „beta_1” i „beta_2”
`tf.wkład.Nadam` tf.keras.optimizers.Nadam Zmień nazwy argumentów „beta1” i „beta2” na „beta_1” i „beta_2”