ย้ายเมตริกและเครื่องมือเพิ่มประสิทธิภาพ

ดูบน TensorFlow.org ทำงานใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดโน๊ตบุ๊ค

ใน 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: tf.compat.v1.metrics พร้อมเครื่องมือประมาณการ

ใน TF1 คุณสามารถเพิ่มเมตริกใน EstimatorSpec เป็น eval_metric_ops และ op จะถูกสร้างขึ้นผ่านฟังก์ชันเมตริกทั้งหมดที่กำหนดไว้ใน 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.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}

นอกจากนี้ คุณสามารถเพิ่มตัวชี้วัดไปยังตัวประมาณโดยตรงผ่าน 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 พร้อม tf.keras.Model

ใน 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.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}

เมื่อเปิดใช้งานการดำเนินการอย่างกระตือรือร้น อินสแตนซ์ tf.keras.metrics.Metric สามารถใช้โดยตรงเพื่อประเมินข้อมูลจำนวนมากหรือเทนเซอร์แบบกระตือรือร้น 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()
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

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ tf.keras.metrics.Metric โปรดดูเอกสารประกอบ API ที่ tf.keras.metrics.Metric รวมทั้ง คู่มือการโยกย้าย

ย้ายเครื่องมือเพิ่มประสิทธิภาพ TF1.x ไปยังเครื่องมือเพิ่มประสิทธิภาพ Keras

เครื่องมือเพิ่มประสิทธิภาพใน tf.compat.v1.train เช่น Adam Optimizer และตัวเพิ่มประสิทธิภาพการ ไล่ระดับสีแบบ เกรเดียนท์มีเทียบเท่าใน 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 รวมอาร์กิวเมนต์ "โมเมนตัม"
`tf.v1.train.AdamOptimizer` tf.keras.optimizers.Adam เปลี่ยนชื่ออาร์กิวเมนต์ "beta1" และ "beta2" เป็น "beta_1" และ "beta_2"
`tf.v1.train.RMSPropOptimizer` tf.keras.optimizers.RMSprop เปลี่ยนชื่ออาร์กิวเมนต์ `สลายตัว' เป็น `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.นาดาม` tf.keras.optimizers.Nadam เปลี่ยนชื่ออาร์กิวเมนต์ "beta1" และ "beta2" เป็น "beta_1" และ "beta_2"