ترحيل المقاييس والمحسِّنون

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

في TF1 ، تعد tf.metrics مساحة اسم واجهة برمجة التطبيقات لجميع الوظائف المترية. كل من المقاييس هي وظيفة تأخذ 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 ، ويتم إنشاء المرجع عبر جميع وظائف المقاييس المحددة في 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 مع نموذج tf.keras

في TF2 ، تحتوي tf.keras.metrics على جميع فئات ووظائف المقاييس. وهي مصممة بأسلوب OOP وتتكامل بشكل وثيق مع واجهة برمجة تطبيقات 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 بشكل مباشر لتقييم البيانات غير الدقيقة أو الموترات الشديدة. 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()
placeholder14 l10n-placeholder15
0.41666666

لمزيد من التفاصيل حول tf.keras.metrics.Metric ، يُرجى إلقاء نظرة على وثائق واجهة برمجة التطبيقات على tf.keras.metrics.Metric ، بالإضافة إلى دليل الترحيل .

ترحيل محسنات TF1.x إلى محسنات Keras

المُحسِّنون في tf.compat.v1.train ، مثل مُحسِّن آدم ومحسِّن هبوط التدرج ، لديهم مكافئات في 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 أعد تسمية وسيطة "decay" إلى "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 قم بإزالة الوسيطتين "stack_name" و "linear_name"
"tf.contrib.AdamaxOptimizer" tf.keras.optimizers.Adamax أعد تسمية الوسيطتين "beta1" و "beta2" إلى "beta_1" و "beta_2"
"tf.contrib.adam" tf.keras.optimizers.Nadam أعد تسمية الوسيطتين "beta1" و "beta2" إلى "beta_1" و "beta_2"