![]() |
![]() |
![]() |
![]() |
在 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:搭配 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.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.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` |