Di chuyển từ Công cụ ước tính sang API Keras

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ ghi chép

Hướng dẫn này trình bày cách di chuyển từ các API tf.keras của TensorFlow 1 sang các API tf.estimator.Estimator của TensorFlow 2. Đầu tiên, bạn sẽ thiết lập và chạy một mô hình cơ bản để đào tạo và đánh giá với tf.estimator.Estimator . Sau đó, bạn sẽ thực hiện các bước tương tự trong TensorFlow 2 với các API tf.keras . Bạn cũng sẽ học cách tùy chỉnh bước đào tạo bằng cách phân lớp tf.keras.Model và sử dụng tf.GradientTape .

  • Trong TensorFlow 1, các API tf.estimator.Estimator cấp cao cho phép bạn đào tạo và đánh giá một mô hình, cũng như thực hiện suy luận và lưu mô hình của bạn (để phục vụ).
  • Trong TensorFlow 2, sử dụng API Keras để thực hiện các tác vụ nói trên, chẳng hạn như xây dựng mô hình , ứng dụng gradient, đào tạo , đánh giá và dự đoán.

(Để di chuyển dòng công việc lưu mô hình / điểm kiểm tra sang TensorFlow 2, hãy xem hướng dẫn di chuyển SavedModelCheckpoint .)

Thành lập

Bắt đầu với nhập và một tập dữ liệu đơn giản:

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: Huấn luyện và đánh giá với tf.estimator.Estimator

Ví dụ này cho thấy cách thực hiện đào tạo và đánh giá với tf.estimator.Estimator trong TensorFlow 1.

Bắt đầu bằng cách xác định một số chức năng: một chức năng đầu vào cho dữ liệu đào tạo, một chức năng đầu vào đánh giá cho dữ liệu đánh giá và một chức năng mô hình cho Estimator biết cách op đào tạo được xác định với các tính năng và nhãn:

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)

Khởi tạo Estimator của bạn và đào tạo mô hình:

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>

Đánh giá chương trình với bộ đánh giá:

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: Đào tạo và đánh giá bằng các phương pháp Keras tích hợp sẵn

Ví dụ này trình bày cách thực hiện đào tạo và đánh giá với Keras Model.fitModel.evaluate trong TensorFlow 2. (Bạn có thể tìm hiểu thêm trong phần Đào tạo và đánh giá với hướng dẫn phương pháp tích hợp sẵn .)

  • Bắt đầu bằng cách chuẩn bị đường dẫn tập dữ liệu với các API tf.data.Dataset .
  • Xác định một mô hình Tuần tự Keras đơn giản với một lớp tuyến tính ( tf.keras.layers.Dense ).
  • Khởi tạo trình tối ưu hóa Adagrad ( tf.keras.optimizers.Adagrad ).
  • Định cấu hình mô hình để đào tạo bằng cách chuyển biến trình optimizer và lỗi bình phương trung bình ( "mse" ) vào 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")

Cùng với đó, bạn đã sẵn sàng đào tạo người mẫu bằng cách gọi Model.fit :

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

Cuối cùng, đánh giá mô hình với Model.evaluate :

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

TensorFlow 2: Đào tạo và đánh giá với một bước đào tạo tùy chỉnh và các phương pháp Keras tích hợp sẵn

Trong TensorFlow 2, bạn cũng có thể viết hàm bước huấn luyện tùy chỉnh của riêng mình với tf.GradientTape để thực hiện các đường chuyền tiến và lùi, trong khi vẫn tận dụng được tính năng hỗ trợ huấn luyện tích hợp, chẳng hạn như tf.keras.callbacks.Callbacktf.distribute.Strategy . (Tìm hiểu thêm trong Tùy chỉnh những gì xảy ra trong Model.fitViết các vòng đào tạo tùy chỉnh từ đầu .)

Trong ví dụ này, hãy bắt đầu bằng cách tạo tf.keras.Model tùy chỉnh bằng cách phân lớp tf.keras.Sequential ghi đè Model.train_step . (Tìm hiểu thêm về phân lớp tf.keras.Model ). Bên trong lớp đó, hãy xác định một hàm train_step tùy chỉnh mà đối với mỗi lô dữ liệu thực hiện chuyển tiếp và chuyển lùi trong một bước huấn luyện.

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}

Tiếp theo, như trước:

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

Gọi Model.fit để đào tạo người mẫu:

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

Và cuối cùng, hãy đánh giá chương trình với Model.evaluate :

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

Bước tiếp theo

Các tài nguyên Keras bổ sung mà bạn có thể thấy hữu ích:

Các hướng dẫn sau có thể hỗ trợ di chuyển quy trình công việc của chiến lược phân phối từ API tf.estimator :