Migrasikan metrik dan pengoptimal

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`