Перенести метрики и оптимизаторы

Посмотреть на TensorFlow.org Запустить в Google Colab Посмотреть исходный код на GitHub Скачать блокнот

В TF1 tf.metrics — это пространство имен API для всех функций метрик. Каждая из метрик представляет собой функцию, которая принимает label и prediction в качестве входных параметров и возвращает в качестве результата соответствующий тензор метрик. В TF2 tf.keras.metrics содержит все метрические функции и объекты. Объект Metric можно использовать с tf.keras.Model и tf.keras.layers.layer для расчета значений метрик.

Настраивать

Давайте начнем с пары необходимых импортов TensorFlow,

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

и подготовьте несколько простых данных для демонстрации:

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 с оценщиком

В TF1 метрики можно добавить в EstimatorSpec как eval_metric_ops , а операция генерируется с помощью всех функций метрик, определенных в tf.metrics . Вы можете следовать примеру, чтобы увидеть, как использовать 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}

Кроме того, метрики могут быть добавлены в оценщик напрямую через 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 с tf.keras.Model

В TF2 tf.keras.metrics содержит все классы и функции метрик. Они разработаны в стиле ООП и тесно интегрируются с другими API tf.keras . Все метрики можно найти в пространстве имен tf.keras.metrics , и обычно существует прямое сопоставление между tf.compat.v1.metrics и tf.keras.metrics .

В следующем примере метрики добавляются в model.compile() . Пользователям нужно только создать экземпляр метрики, не указывая метку и тензор предсказания. Модель Keras направит выходные данные модели и метку к объекту метрики.

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}

При включенном активном выполнении экземпляры tf.keras.metrics.Metric можно напрямую использовать для оценки пустых данных или активных тензоров. Объекты tf.keras.metrics.Metric являются контейнерами с отслеживанием состояния. Значение метрики можно обновить с помощью metric.update_state(y_true, y_pred) , а результат можно получить с помощью 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

Дополнительные сведения о tf.keras.metrics.Metric см. в документации по API на tf.keras.metrics.Metric , а также в руководстве по миграции .

Перенос оптимизаторов TF1.x на оптимизаторы Keras

Оптимизаторы в tf.compat.v1.train , такие как оптимизатор Adam и оптимизатор градиентного спуска , имеют эквиваленты в tf.keras.optimizers .

В таблице ниже показано, как вы можете преобразовать эти устаревшие оптимизаторы в их эквиваленты Keras. Вы можете напрямую заменить версию TF1.x на версию TF2, если только не требуются дополнительные шаги (например, обновление скорости обучения по умолчанию ).

Обратите внимание, что преобразование ваших оптимизаторов может сделать старые контрольные точки несовместимыми .

TF1.x ТФ2 Дополнительные шаги
`tf.v1.train.GradientDescentOptimizer` tf.keras.optimizers.SGD Никто
`tf.v1.train.MomentumOptimizer` tf.keras.optimizers.SGD Включите аргумент «импульс»
`tf.v1.train.AdamOptimizer` tf.keras.optimizers.Adam Переименуйте аргументы `beta1` и `beta2` в `beta_1` и `beta_2`
`tf.v1.train.RMSPropOptimizer` tf.keras.optimizers.RMSprop Переименуйте аргумент `decay` в `rho`
`tf.v1.train.AdadeltaOptimizer` tf.keras.optimizers.Adadelta Никто
`tf.v1.train.AdagradOptimizer` tf.keras.optimizers.Adagrad Никто
`tf.v1.train.FtrlOptimizer` tf.keras.optimizers.Ftrl Удалите аргументы `accum_name` и `linear_name`
`tf.contrib.AdamaxOptimizer` tf.keras.optimizers.Adamax Переименуйте аргументы `beta1` и `beta2` в `beta_1` и `beta_2`
`tf.contrib.Надам` tf.keras.optimizers.Nadam Переименуйте аргументы `beta1` и `beta2` в `beta_1` и `beta_2`