העבר מדדים ואופטימיזציה

הצג באתר TensorFlow.org הפעל בגוגל קולאב צפה במקור ב-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 עם Estimator

ב-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 ומשתלבים באופן הדוק עם API אחרים tf.keras . ניתן למצוא את כל המדדים במרחב השמות 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 כדי להעריך נתוני 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()
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 ו- gradient Descent 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.Nadam` tf.keras.optimizers.Nadam שנה את השם של הארגומנטים `beta1` ו-`beta2` ל-`beta_1` ו-`beta_2`