Lihat di TensorFlow.org | Jalankan di Google Colab | Lihat sumber di GitHub | Unduh buku catatan |
Di TF1, tf.metrics
adalah ruang nama API untuk semua fungsi metrik. Setiap metrik adalah fungsi yang mengambil label
dan prediction
sebagai parameter input dan mengembalikan tensor metrik yang sesuai sebagai hasilnya. Di TF2, tf.keras.metrics
berisi semua fungsi dan objek metrik. Objek Metric
dapat digunakan dengan tf.keras.Model
dan tf.keras.layers.layer
untuk menghitung nilai metrik.
Mempersiapkan
Mari kita mulai dengan beberapa impor TensorFlow yang diperlukan,
import tensorflow as tf
import tensorflow.compat.v1 as tf1
dan siapkan beberapa data sederhana untuk demonstrasi:
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 dengan Penaksir
Di TF1, metrik dapat ditambahkan ke EstimatorSpec
sebagai eval_metric_ops
, dan operasi dihasilkan melalui semua fungsi metrik yang ditentukan dalam tf.metrics
. Anda dapat mengikuti contoh untuk melihat cara menggunakan 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}
Selain itu, metrik dapat ditambahkan ke estimator secara langsung melalui 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 dengan tf.keras.Model
Di TF2, tf.keras.metrics
berisi semua kelas dan fungsi metrik. Mereka dirancang dalam gaya OOP dan terintegrasi erat dengan API tf.keras
lainnya. Semua metrik dapat ditemukan di namespace tf.keras.metrics
, dan biasanya ada pemetaan langsung antara tf.compat.v1.metrics
dengan tf.keras.metrics
.
Dalam contoh berikut, metrik ditambahkan dalam metode model.compile()
. Pengguna hanya perlu membuat instance metrik, tanpa menentukan label dan tensor prediksi. Model Keras akan mengarahkan keluaran model dan label ke objek metrik.
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}
Dengan mengaktifkan eksekusi bersemangat, tf.keras.metrics.Metric
dapat langsung digunakan untuk mengevaluasi data numpy atau tensor yang bersemangat. Objek tf.keras.metrics.Metric
adalah wadah stateful. Nilai metrik dapat diperbarui melalui metric.update_state(y_true, y_pred)
, dan hasilnya dapat diambil oleh 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
Untuk detail lebih lanjut tentang tf.keras.metrics.Metric
, silakan lihat dokumentasi API di tf.keras.metrics.Metric
, serta panduan migrasi .
Migrasikan pengoptimal TF1.x ke pengoptimal Keras
Pengoptimal di tf.compat.v1.train
, seperti pengoptimal Adam dan pengoptimal penurunan gradien , memiliki persamaan di tf.keras.optimizers
.
Tabel di bawah ini merangkum bagaimana Anda dapat mengonversi pengoptimal lama ini ke Keras yang setara. Anda dapat langsung mengganti versi TF1.x dengan versi TF2 kecuali jika diperlukan langkah tambahan (seperti memperbarui kecepatan pembelajaran default ).
Perhatikan bahwa mengonversi pengoptimal Anda dapat membuat pos pemeriksaan lama tidak kompatibel .
TF1.x | TF2 | Langkah tambahan |
---|---|---|
`tf.v1.train.GradientDescentOptimizer` | tf.keras.optimizers.SGD | Tidak ada |
`tf.v1.train.MomentumOptimizer` | tf.keras.optimizers.SGD | Sertakan argumen `momentum` |
`tf.v1.train.AdamOptimizer` | tf.keras.optimizers.Adam | Ganti nama argumen `beta1` dan `beta2` menjadi `beta_1` dan `beta_2` |
`tf.v1.train.RMSPropOptimizer` | tf.keras.optimizers.RMSprop | Ganti nama argumen `decay` menjadi `rho` |
`tf.v1.train.AdadeltaOptimizer` | tf.keras.optimizers.Adadelta | Tidak ada |
`tf.v1.train.AdagradOptimizer` | tf.keras.optimizers.Adagrad | Tidak ada |
`tf.v1.train.FtrlOptimizer` | tf.keras.optimizers.Ftrl | Hapus argumen `accum_name` dan `linear_name` |
`tf.contrib.AdamaxOptimizer` | tf.keras.optimizers.Adamax | Ganti nama argumen `beta1`, dan `beta2` menjadi `beta_1` dan `beta_2` |
`tf.contrib.Nadam` | tf.keras.optimizers.Nadam | Ganti nama argumen `beta1`, dan `beta2` menjadi `beta_1` dan `beta_2` |