الترحيل من Estimator إلى Keras APIs

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

يوضح هذا الدليل كيفية الترحيل من tf.estimator.Estimator APIs إلى TensorFlow 2's tf.keras APIs. أولاً ، ستقوم بإعداد وتشغيل نموذج أساسي للتدريب والتقييم باستخدام tf.estimator.Estimator . بعد ذلك ، ستقوم بتنفيذ الخطوات المكافئة في TensorFlow 2 باستخدام واجهات برمجة تطبيقات tf.keras . سوف تتعلم أيضًا كيفية تخصيص خطوة التدريب عن طريق التصنيف الفرعي tf.keras.Model واستخدام tf.GradientTape .

  • في TensorFlow 1 ، تتيح لك واجهات برمجة تطبيقات tf.estimator.Estimator عالية المستوى تدريب نموذج وتقييمه ، بالإضافة إلى إجراء الاستدلال وحفظ النموذج (للعرض).
  • في TensorFlow 2 ، استخدم Keras APIs لأداء المهام المذكورة أعلاه ، مثل بناء النموذج وتطبيق التدرج والتدريب والتقييم والتنبؤ.

(لترحيل النموذج / حفظ نقاط التحقق لعمليات سير العمل إلى TensorFlow 2 ، تحقق من أدلة الترحيل SavedModel و Checkpoint .)

يثبت

ابدأ بالواردات ومجموعة بيانات بسيطة:

import tensorflow as tf
import tensorflow.compat.v1 as tf1
features = [[1., 1.5], [2., 2.5], [3., 3.5]]
labels = [[0.3], [0.5], [0.7]]
eval_features = [[4., 4.5], [5., 5.5], [6., 6.5]]
eval_labels = [[0.8], [0.9], [1.]]

TensorFlow 1: تدريب وتقييم باستخدام tf.estimator.Estimator

يوضح هذا المثال كيفية إجراء التدريب والتقييم باستخدام tf.estimator.Estimator في TensorFlow 1.

ابدأ بتحديد بعض الوظائف: وظيفة إدخال لبيانات التدريب ، ووظيفة إدخال تقييم لبيانات التقييم ، ووظيفة نموذجية تخبر Estimator كيف يتم تعريف عملية التدريب بالميزات والتسميات:

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(1)(features)
  loss = tf1.losses.mean_squared_error(labels=labels, predictions=logits)
  optimizer = tf1.train.AdagradOptimizer(0.05)
  train_op = optimizer.minimize(loss, global_step=tf1.train.get_global_step())
  return tf1.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)

إنشاء مثيل Estimator الخاص بك ، وتدريب النموذج:

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/tmpeovq622_
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpeovq622_', '_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:236: 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:77: 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/tmpeovq622_/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 2.0834494, step = 0
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 3...
INFO:tensorflow:Saving checkpoints for 3 into /tmp/tmpeovq622_/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 3...
INFO:tensorflow:Loss for final step: 9.88002.
<tensorflow_estimator.python.estimator.estimator.Estimator at 0x7fbd06673350>

قم بتقييم البرنامج بمجموعة التقييم:

estimator.evaluate(_eval_input_fn)
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2021-10-26T01:32:58
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpeovq622_/model.ckpt-3
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Inference Time : 0.10194s
INFO:tensorflow:Finished evaluation at 2021-10-26-01:32:58
INFO:tensorflow:Saving dict for global step 3: global_step = 3, loss = 20.543152
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 3: /tmp/tmpeovq622_/model.ckpt-3
{'loss': 20.543152, 'global_step': 3}

TensorFlow 2: تدريب وتقييم باستخدام أساليب Keras المضمنة

يوضح هذا المثال كيفية إجراء التدريب والتقييم باستخدام Keras Model.fit و Model.evaluate في TensorFlow 2. (يمكنك معرفة المزيد في التدريب والتقييم باستخدام دليل الأساليب المضمنة .)

  • ابدأ بإعداد خط أنابيب مجموعة البيانات باستخدام tf.data.Dataset APIs.
  • حدد نموذج Keras Sequential بسيطًا بطبقة خطية واحدة ( tf.keras.layers.Dense ).
  • إنشاء مُحسِّن Adagrad ( tf.keras.optimizers.Adagrad ).
  • قم بتكوين النموذج للتدريب عن طريق تمرير متغير optimizer وخسارة خطأ التربيع المتوسط ​​( "mse" ) إلى Model.compile .
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)

model = tf.keras.models.Sequential([tf.keras.layers.Dense(1)])
optimizer = tf.keras.optimizers.Adagrad(learning_rate=0.05)

model.compile(optimizer=optimizer, loss="mse")

بذلك تكون جاهزًا لتدريب النموذج عن طريق استدعاء Model.fit :

model.fit(dataset)
3/3 [==============================] - 0s 2ms/step - loss: 0.2785
<keras.callbacks.History at 0x7fbc4b320350>

أخيرًا ، قم بتقييم النموذج باستخدام Model.evaluate :

model.evaluate(eval_dataset, return_dict=True)
3/3 [==============================] - 0s 1ms/step - loss: 0.0451
{'loss': 0.04510306194424629}

TensorFlow 2: تدريب وتقييم بخطوة تدريب مخصصة وأساليب Keras المضمنة

في TensorFlow 2 ، يمكنك أيضًا كتابة وظيفة خطوة التدريب المخصصة الخاصة بك باستخدام tf.GradientTape لأداء التمريرات للأمام والخلف ، مع الاستمرار في الاستفادة من دعم التدريب المدمج ، مثل tf.keras.callbacks.Callback و tf.distribute.Strategy . (تعرف على المزيد في تخصيص ما يحدث في Model.fit وكتابة حلقات تدريب مخصصة من البداية .)

في هذا المثال ، ابدأ بإنشاء نموذج tf.keras.Model مخصص عن طريق tf.keras.Sequential الذي يتجاوز Model.train_step . (تعرف على المزيد حول التصنيف الفرعي tf.keras.Model ). داخل هذا الفصل ، حدد وظيفة train_step المخصصة التي تؤدي لكل دفعة من البيانات تمريرة إلى الأمام وتمريرة للخلف أثناء خطوة تدريب واحدة.

class CustomModel(tf.keras.Sequential):
  """A custom sequential model that overrides `Model.train_step`."""

  def train_step(self, data):
    batch_data, labels = data

    with tf.GradientTape() as tape:
      predictions = self(batch_data, training=True)
      # Compute the loss value (the loss function is configured
      # in `Model.compile`).
      loss = self.compiled_loss(labels, predictions)

    # Compute the gradients of the parameters with respect to the loss.
    gradients = tape.gradient(loss, self.trainable_variables)
    # Perform gradient descent by updating the weights/parameters.
    self.optimizer.apply_gradients(zip(gradients, self.trainable_variables))
    # Update the metrics (includes the metric that tracks the loss).
    self.compiled_metrics.update_state(labels, predictions)
    # Return a dict mapping metric names to the current values.
    return {m.name: m.result() for m in self.metrics}

بعد ذلك ، كما كان من قبل:

  • قم بإعداد خط أنابيب مجموعة البيانات باستخدام tf.data.Dataset .
  • حدد نموذجًا بسيطًا بطبقة tf.keras.layers.Dense واحدة.
  • مثيل Adagrad ( tf.keras.optimizers.Adagrad )
  • قم بتكوين النموذج للتدريب باستخدام Model.compile ، أثناء استخدام خطأ متوسط ​​التربيع ( "mse" ) كوظيفة خسارة.
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)

model = CustomModel([tf.keras.layers.Dense(1)])
optimizer = tf.keras.optimizers.Adagrad(learning_rate=0.05)

model.compile(optimizer=optimizer, loss="mse")

استدعاء Model.fit لتدريب النموذج:

model.fit(dataset)
3/3 [==============================] - 0s 2ms/step - loss: 0.0587
<keras.callbacks.History at 0x7fbc3873f1d0>

وأخيرًا ، قم بتقييم البرنامج باستخدام Model.evaluate :

model.evaluate(eval_dataset, return_dict=True)
3/3 [==============================] - 0s 2ms/step - loss: 0.0197
{'loss': 0.019738242030143738}

الخطوات التالية

موارد Keras الإضافية التي قد تجدها مفيدة:

يمكن أن تساعد الأدلة التالية في ترحيل مهام سير عمل استراتيجية التوزيع من واجهات برمجة تطبيقات tf.estimator :