Bermigrasi dari Estimator ke Keras API

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

Panduan ini menunjukkan cara bermigrasi dari API tf.estimator.Estimator TensorFlow 1 ke API tf.estimator.Estimator tf.keras 2. Pertama, Anda akan menyiapkan dan menjalankan model dasar untuk pelatihan dan evaluasi dengan tf.estimator.Estimator . Kemudian, Anda akan melakukan langkah-langkah yang setara di TensorFlow 2 dengan API tf.keras . Anda juga akan mempelajari cara menyesuaikan langkah pelatihan dengan tf.keras.Model dan menggunakan tf.GradientTape .

  • Di TensorFlow 1, tf.estimator.Estimator API tingkat tinggi memungkinkan Anda melatih dan mengevaluasi model, serta melakukan inferensi dan menyimpan model Anda (untuk disajikan).
  • Di TensorFlow 2, gunakan Keras API untuk melakukan tugas yang disebutkan di atas, seperti pembuatan model , aplikasi gradien, pelatihan , evaluasi, dan prediksi.

(Untuk memigrasikan alur kerja penyimpanan model/pos pemeriksaan ke TensorFlow 2, lihat panduan migrasi SavedModel dan Checkpoint .)

Mempersiapkan

Mulai dengan impor dan set data sederhana:

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: Latih dan evaluasi dengan tf.estimator.Estimator

Contoh ini menunjukkan cara melakukan pelatihan dan evaluasi dengan tf.estimator.Estimator di TensorFlow 1.

Mulailah dengan mendefinisikan beberapa fungsi: fungsi input untuk data pelatihan, fungsi input evaluasi untuk data evaluasi, dan fungsi model yang memberi tahu Estimator bagaimana operasi pelatihan didefinisikan dengan fitur dan label:

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)

Instansiasi Estimator Anda, dan latih modelnya:

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>

Evaluasi program dengan perangkat evaluasi:

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: Latih dan evaluasi dengan metode Keras bawaan

Contoh ini menunjukkan cara melakukan pelatihan dan evaluasi dengan Keras Model.fit dan Model.evaluate di TensorFlow 2. (Anda dapat mempelajari lebih lanjut di Pelatihan dan evaluasi dengan panduan metode bawaan.)

  • Mulailah dengan menyiapkan pipeline kumpulan data dengan tf.data.Dataset API.
  • Tentukan model Keras Sequential sederhana dengan satu lapisan linier ( tf.keras.layers.Dense ).
  • Buat instance pengoptimal Adagrad ( tf.keras.optimizers.Adagrad ).
  • Konfigurasikan model untuk pelatihan dengan meneruskan variabel optimizer dan kesalahan kuadrat rata-rata ( "mse" ) ke 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")

Dengan itu, Anda siap untuk melatih model dengan memanggil Model.fit :

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

Terakhir, evaluasi model dengan Model.evaluate :

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

TensorFlow 2: Latih dan evaluasi dengan langkah pelatihan khusus dan metode Keras bawaan

Di TensorFlow 2, Anda juga dapat menulis fungsi langkah pelatihan kustom Anda sendiri dengan tf.GradientTape untuk melakukan gerakan maju dan mundur, sambil tetap memanfaatkan dukungan pelatihan bawaan, seperti tf.keras.callbacks.Callback dan tf.distribute.Strategy . (Pelajari lebih lanjut di Menyesuaikan apa yang terjadi di Model.fit dan Menulis loop pelatihan kustom dari awal .)

Dalam contoh ini, mulailah dengan membuat tf.keras.Model khusus dengan mensubklasifikasikan tf.keras.Sequential yang menggantikan Model.train_step . (Pelajari lebih lanjut tentang subkelas tf.keras.Model ). Di dalam kelas itu, tentukan fungsi train_step khusus yang untuk setiap kumpulan data melakukan gerakan maju dan mundur selama satu langkah pelatihan.

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}

Selanjutnya, seperti sebelumnya:

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")

Hubungi Model.fit untuk melatih model:

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

Dan, terakhir, evaluasi program dengan Model.evaluate :

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

Langkah selanjutnya

Sumber daya Keras tambahan yang mungkin berguna bagi Anda:

Panduan berikut dapat membantu memigrasikan alur kerja strategi distribusi dari tf.estimator API: