Di chuyển các chỉ số và trình tối ưu hóa

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ ghi chép

Trong TF1, tf.metrics là không gian tên API cho tất cả các hàm số liệu. Mỗi chỉ số là một hàm lấy labelprediction làm tham số đầu vào và trả về kết quả là tensor chỉ số tương ứng. Trong TF2, tf.keras.metrics chứa tất cả các chức năng và đối tượng số liệu. Đối tượng Metric có thể được sử dụng với tf.keras.Modeltf.keras.layers.layer để tính toán các giá trị của chỉ số.

Thành lập

Hãy bắt đầu với một số lần nhập TensorFlow cần thiết,

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

và chuẩn bị một số dữ liệu đơn giản để trình diễn:

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 với Công cụ ước tính

Trong TF1, các số liệu có thể được thêm vào EstimatorSpec dưới dạng eval_metric_ops và op được tạo thông qua tất cả các hàm số liệu được xác định trong tf.metrics . Bạn có thể làm theo ví dụ để biết cách sử dụng 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}

Ngoài ra, các chỉ số có thể được thêm trực tiếp vào công cụ ước tính thông qua 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 với tf.keras.Model

Trong TF2, tf.keras.metrics chứa tất cả các lớp và hàm số liệu. Chúng được thiết kế theo phong cách OOP và tích hợp chặt chẽ với API tf.keras khác. Tất cả các số liệu có thể được tìm thấy trong không gian tên tf.keras.metrics và thường có ánh xạ trực tiếp giữa tf.compat.v1.metrics với tf.keras.metrics .

Trong ví dụ sau, các chỉ số được thêm vào trong phương thức model.compile() . Người dùng chỉ cần tạo phiên bản số liệu mà không cần chỉ định nhãn và bộ căng dự đoán. Mô hình Keras sẽ định tuyến đầu ra và nhãn của mô hình tới đối tượng số liệu.

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}

Với việc kích hoạt thực thi háo hức, các thể hiện tf.keras.metrics.Metric có thể được sử dụng trực tiếp để đánh giá dữ liệu thô hoặc căng thẳng háo hức. các đối tượng tf.keras.metrics.Metric là các vùng chứa trạng thái. Giá trị chỉ số có thể được cập nhật qua metric.update_state(y_true, y_pred) và kết quả có thể được truy xuất bằng 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

Để biết thêm chi tiết về tf.keras.metrics.Metric , vui lòng xem tài liệu API tại tf.keras.metrics.Metric , cũng như hướng dẫn di chuyển .

Di chuyển trình tối ưu hóa TF1.x sang trình tối ưu hóa Keras

Các trình tối ưu hóa trong tf.compat.v1.train , chẳng hạn như trình tối ưu hóa Adam và trình tối ưu hóa gradient , có các tính năng tương đương trong tf.keras.optimizers .

Bảng dưới đây tóm tắt cách bạn có thể chuyển đổi các trình tối ưu hóa kế thừa này thành các trình tối ưu hóa Keras tương đương của chúng. Bạn có thể thay thế trực tiếp phiên bản TF1.x bằng phiên bản TF2 trừ khi cần có các bước bổ sung (chẳng hạn như cập nhật tốc độ học mặc định ).

Lưu ý rằng việc chuyển đổi các trình tối ưu hóa của bạn có thể làm cho các điểm kiểm tra cũ không tương thích .

TF1.x TF2 Các bước bổ sung
`tf.v1.train.GradientDescentOptimizer` tf.keras.optimizers.SGD Không có
`tf.v1.train.MomentumOptimizer` tf.keras.optimizers.SGD Bao gồm đối số `động lượng`
`tf.v1.train.AdamOptimizer` tf.keras.optimizers.Adam Đổi tên các đối số `beta1` và` beta2` thành `beta_1` và` beta_2`
`tf.v1.train.RMSPropOptimizer` tf.keras.optimizers.RMSprop Đổi tên đối số `phân rã` thành` rho`
`tf.v1.train.AdadeltaOptimizer` tf.keras.optimizers.Adadelta Không có
`tf.v1.train.AdagradOptimizer` tf.keras.optimizers.Adagrad Không có
`tf.v1.train.FtrlOptimizer` tf.keras.optimizers.Ftrl Loại bỏ các đối số `Accu_name` và` linear_name`
`tf.contrib.AdamaxOptimizer` tf.keras.optimizers.Adamax Đổi tên các đối số `beta1` và` beta2` thành `beta_1` và` beta_2`
`tf.contrib.Nadam` tf.keras.optimizers.Nadam Đổi tên các đối số `beta1` và` beta2` thành `beta_1` và` beta_2`