遷移指標和最佳化工具

在 TensorFlow.org 上檢視 在 Google Colab 中執行 在 GitHub 上檢視原始碼 下載筆記本

在 TF1 中,tf.metrics 是所有指標函式的 API 命名空間。每個指標都是一個函式,會將 labelprediction 作為輸入參數,並傳回對應的指標張量作為結果。在 TF2 中,tf.keras.metrics 包含所有指標函式和物件。Metric 物件可以與 tf.keras.Modeltf.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:搭配 Estimator 的 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.math.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)
estimator.evaluate(_eval_input_fn)

此外,指標也可以透過 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)

TF2:搭配 tf.keras.Model 的 Keras Metrics API

在 TF2 中,tf.keras.metrics 包含所有指標類別和函式。它們以 OOP 樣式設計,並與其他 tf.keras API 緊密整合。所有指標都可以在 tf.keras.metrics 命名空間中找到,而且通常在 tf.compat.v1.metricstf.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.math.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)

在啟用立即執行功能的情況下,tf.keras.metrics.Metric 執行個體可以直接用來評估 numpy 資料或立即張量。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()
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()

如需 tf.keras.metrics.Metric 的更多詳細資訊,請參閱 tf.keras.metrics.Metric 的 API 文件,以及遷移指南

將 TF1.x 最佳化工具遷移至 Keras 最佳化工具

tf.compat.v1.train 中的最佳化工具 (例如 Adam 最佳化工具梯度下降最佳化工具) 在 tf.keras.optimizers 中有對應的項目。

下表摘要說明如何將這些舊版最佳化工具轉換為其 Keras 對應項目。您可以直接將 TF1.x 版本替換為 TF2 版本,除非需要其他步驟 (例如更新預設學習率)。

請注意,轉換最佳化工具可能會導致舊檢查點不相容

TF1.x TF2 其他步驟
`tf.v1.train.GradientDescentOptimizer` tf.keras.optimizers.SGD
`tf.v1.train.MomentumOptimizer` tf.keras.optimizers.SGD 包含 `momentum` 引數
`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.Nadam` tf.keras.optimizers.Nadam 將 `beta1` 和 `beta2` 引數重新命名為 `beta_1` 和 `beta_2`