Trang này được dịch bởi Cloud Translation API.
Switch to English

Di chuyển mã TensorFlow 1 của bạn sang TensorFlow 2

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

Tài liệu này dành cho người dùng các API TensorFlow cấp thấp. Nếu bạn đang sử dụng các API cấp cao ( tf.keras ), bạn có thể phải thực hiện ít hoặc không cần thực hiện hành động nào để mã của mình tương thích hoàn toàn với TensorFlow 2.0:

Vẫn có thể chạy mã 1.X, không được sửa đổi ( ngoại trừ đóng góp ), trong TensorFlow 2.0:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

Tuy nhiên, điều này không cho phép bạn tận dụng nhiều cải tiến được thực hiện trong TensorFlow 2.0. Hướng dẫn này sẽ giúp bạn nâng cấp mã của mình, làm cho mã đơn giản hơn, hiệu quả hơn và dễ bảo trì hơn.

Tập lệnh chuyển đổi tự động

Bước đầu tiên, trước khi cố gắng triển khai các thay đổi được mô tả trong tài liệu này, là thử chạy tập lệnh nâng cấp .

Điều này sẽ thực hiện bước đầu khi nâng cấp mã của bạn lên TensorFlow 2.0. Nhưng nó không thể làm cho mã của bạn trở thành thành ngữ 2.0. Mã của bạn vẫn có thể sử dụng điểm cuối tf.compat.v1 để truy cập trình giữ chỗ, phiên, bộ sưu tập và chức năng kiểu 1.x khác.

Thay đổi hành vi cấp cao nhất

Nếu mã của bạn hoạt động trong TensorFlow 2.0 bằng cách sử dụng tf.compat.v1.disable_v2_behavior() , vẫn có những thay đổi hành vi toàn cầu mà bạn có thể cần giải quyết. Những thay đổi chính là:

  • Thực thi háo hức, v1.enable_eager_execution() : Bất kỳ mã nào sử dụng ngầm tf.Graph sẽ không thành công. Đảm bảo bọc mã này trong ngữ cảnh with tf.Graph().as_default() .

  • Biến tài nguyên, v1.enable_resource_variables() : Một số mã có thể phụ thuộc vào các hành vi không xác định được kích hoạt bởi các biến tham chiếu TF. Các biến tài nguyên bị khóa trong khi được ghi vào, và do đó cung cấp các đảm bảo nhất quán trực quan hơn.

    • Điều này có thể thay đổi hành vi trong các trường hợp cạnh.
    • Điều này có thể tạo thêm các bản sao và có thể sử dụng bộ nhớ cao hơn.
    • Điều này có thể bị vô hiệu hóa bằng cách chuyển use_resource=False tới tf.Variable tạo tf.Variable .
  • Tensor shape, v1.enable_v2_tensorshape() : TF 2.0 đơn giản hóa hoạt động của các hình dạng tensor. Thay vì t.shape[0].value bạn có thể nói t.shape[0] . Những thay đổi này chỉ nên nhỏ và bạn nên sửa chúng ngay lập tức. Xem TensorShape để biết các ví dụ.

  • Luồng điều khiển, v1.enable_control_flow_v2() : Việc triển khai luồng điều khiển TF 2.0 đã được đơn giản hóa và do đó tạo ra các biểu diễn đồ thị khác nhau. Vui lòng gửi lỗi cho bất kỳ vấn đề nào.

Đặt mã gốc 2.0

Hướng dẫn này sẽ giới thiệu một số ví dụ về chuyển đổi mã TensorFlow 1.x sang TensorFlow 2.0. Những thay đổi này sẽ cho phép mã của bạn tận dụng tối ưu hóa hiệu suất và các lệnh gọi API đơn giản hóa.

Trong mỗi trường hợp, mô hình là:

1. Thay thế các cuộc gọi v1.Session.run

Mọi cuộc gọi v1.Session.run nên được thay thế bằng một hàm Python.

  • Các feed_dictv1.placeholder s trở thành các đối số của hàm.
  • Các lần fetches trở thành giá trị trả về của hàm.
  • Trong quá trình thực thi háo hức chuyển đổi cho phép dễ dàng gỡ lỗi với các công cụ Python tiêu chuẩn như pdb .

Sau đó, thêm tf.function trang trí tf.function để làm cho nó chạy hiệu quả trong biểu đồ. Xem Hướng dẫn Chữ ký để biết thêm về cách thức hoạt động.

Lưu ý rằng:

  • Không giống như v1.Session.run tf.function có một chữ ký trả về cố định và luôn trả về tất cả các đầu ra. Nếu điều này gây ra sự cố về hiệu suất, hãy tạo hai hàm riêng biệt.

  • Không cần tf.control_dependencies hoặc các hoạt động tương tự: Một tf.function hoạt động như thể nó được chạy theo thứ tự đã viết. Ví dụ: các phép gán tf.Variabletf.assert s được thực thi tự động.

Phần mô hình chuyển đổi chứa một ví dụ hoạt động của quá trình chuyển đổi này.

2. Sử dụng các đối tượng Python để theo dõi các biến và tổn thất

Tất cả các theo dõi biến dựa trên tên đều không được khuyến khích trong TF 2.0. Sử dụng các đối tượng Python để theo dõi các biến.

Sử dụng tf.Variable thay vì v1.get_variable .

Mọi v1.variable_scope phải được chuyển đổi thành một đối tượng Python. Thông thường đây sẽ là một trong số:

Nếu bạn cần phải liệt kê tổng hợp của các biến (như tf.Graph.get_collection(tf.GraphKeys.VARIABLES) ), sử dụng .variables.trainable_variables thuộc tính của LayerModel đối tượng.

Các LayerModel triển khai một số thuộc tính khác giúp loại bỏ nhu cầu về các bộ sưu tập toàn cục. .losses tính .losses của họ có thể thay thế cho việc sử dụng bộ sưu tập tf.GraphKeys.LOSSES .

Xem hướng dẫn keras để biết thêm chi tiết.

3. Nâng cấp các vòng đào tạo của bạn

Sử dụng API cấp cao nhất phù hợp với trường hợp sử dụng của bạn. Thích tf.keras.Model.fit hơn là xây dựng các vòng đào tạo của riêng bạn.

Các chức năng cấp cao này quản lý rất nhiều chi tiết cấp thấp có thể dễ dàng bỏ sót nếu bạn viết vòng lặp đào tạo của riêng mình. Ví dụ, chúng tự động thu thập các tổn thất về quy định và đặt đối số training=True khi gọi mô hình.

4. Nâng cấp đường ống đầu vào dữ liệu của bạn

Sử dụng bộ dữ liệu tf.data để nhập dữ liệu. Những đối tượng này hiệu quả, biểu cảm và tích hợp tốt với tensorflow.

Chúng có thể được chuyển trực tiếp đến phương thức tf.keras.Model.fit .

model.fit(dataset, epochs=5)

Chúng có thể được lặp lại qua Python chuẩn trực tiếp:

for example_batch, label_batch in dataset:
    break

5. Di chuyển khỏi các ký hiệu compat.v1

Mô-đun tf.compat.v1 chứa API TensorFlow 1.x hoàn chỉnh, với ngữ nghĩa gốc của nó.

Tập lệnh nâng cấp TF2 sẽ chuyển đổi các ký hiệu thành các ký hiệu tương đương 2.0 nếu quá trình chuyển đổi đó là an toàn, tức là nếu nó có thể xác định rằng hành vi của phiên bản 2.0 chính xác là tương đương (ví dụ: nó sẽ đổi tên v1.arg_max thành tf.argmax , vì đó là những chức năng giống nhau).

Sau khi tập lệnh nâng cấp được thực hiện với một đoạn mã, có thể có nhiều đề cập đến compat.v1 . Bạn nên xem qua mã và chuyển đổi chúng theo cách thủ công sang tương đương 2.0 (cần nêu rõ trong nhật ký nếu có).

Chuyển đổi mô hình

Biến cấp thấp và thực thi toán tử

Ví dụ về việc sử dụng API cấp thấp bao gồm:

  • sử dụng phạm vi thay đổi để kiểm soát việc sử dụng lại
  • tạo biến với v1.get_variable .
  • truy cập các bộ sưu tập một cách rõ ràng
  • truy cập ngầm các bộ sưu tập bằng các phương thức như:

  • sử dụng v1.placeholder để thiết lập đầu vào biểu đồ

  • thực thi đồ thị với Session.run

  • khởi tạo các biến theo cách thủ công

Trước khi chuyển đổi

Đây là những gì các mẫu này có thể trông giống như trong mã sử dụng TensorFlow 1.x.

import tensorflow as tf
import tensorflow.compat.v1 as v1

import tensorflow_datasets as tfds
g = v1.Graph()

with g.as_default():
  in_a = v1.placeholder(dtype=v1.float32, shape=(2))
  in_b = v1.placeholder(dtype=v1.float32, shape=(2))

  def forward(x):
    with v1.variable_scope("matmul", reuse=v1.AUTO_REUSE):
      W = v1.get_variable("W", initializer=v1.ones(shape=(2,2)),
                          regularizer=lambda x:tf.reduce_mean(x**2))
      b = v1.get_variable("b", initializer=v1.zeros(shape=(2)))
      return W * x + b

  out_a = forward(in_a)
  out_b = forward(in_b)
  reg_loss=v1.losses.get_regularization_loss(scope="matmul")

with v1.Session(graph=g) as sess:
  sess.run(v1.global_variables_initializer())
  outs = sess.run([out_a, out_b, reg_loss],
                feed_dict={in_a: [1, 0], in_b: [0, 1]})

print(outs[0])
print()
print(outs[1])
print()
print(outs[2])
[[1. 0.]
 [1. 0.]]

[[0. 1.]
 [0. 1.]]

1.0

Sau khi chuyển đổi

Trong mã đã chuyển đổi:

  • Các biến là các đối tượng Python cục bộ.
  • Hàm forward vẫn xác định phép tính.
  • Cuộc gọi Session.run được thay thế bằng cuộc gọi forward
  • Bộ trang trí tf.function tùy chọn có thể được thêm vào để thực hiện.
  • Các quy định được tính toán thủ công, không đề cập đến bất kỳ bộ sưu tập toàn cầu nào.
  • Không có phiên hoặc trình giữ chỗ.
W = tf.Variable(tf.ones(shape=(2,2)), name="W")
b = tf.Variable(tf.zeros(shape=(2)), name="b")

@tf.function
def forward(x):
  return W * x + b

out_a = forward([1,0])
print(out_a)
tf.Tensor(
[[1. 0.]
 [1. 0.]], shape=(2, 2), dtype=float32)

out_b = forward([0,1])

regularizer = tf.keras.regularizers.l2(0.04)
reg_loss=regularizer(W)

Mô hình dựa trên tf.layers

Mô-đun v1.layers được sử dụng để chứa các hàm lớp dựa vào v1.variable_scope để xác định và sử dụng lại các biến.

Trước khi chuyển đổi

def model(x, training, scope='model'):
  with v1.variable_scope(scope, reuse=v1.AUTO_REUSE):
    x = v1.layers.conv2d(x, 32, 3, activation=v1.nn.relu,
          kernel_regularizer=lambda x:0.004*tf.reduce_mean(x**2))
    x = v1.layers.max_pooling2d(x, (2, 2), 1)
    x = v1.layers.flatten(x)
    x = v1.layers.dropout(x, 0.1, training=training)
    x = v1.layers.dense(x, 64, activation=v1.nn.relu)
    x = v1.layers.batch_normalization(x, training=training)
    x = v1.layers.dense(x, 10)
    return x
train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)

print(train_out)
print()
print(test_out)
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:4: conv2d (from tensorflow.python.keras.legacy_tf_layers.convolutional) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.keras.layers.Conv2D` instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/convolutional.py:424: Layer.apply (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
Please use `layer.__call__` method instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:5: max_pooling2d (from tensorflow.python.keras.legacy_tf_layers.pooling) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.MaxPooling2D instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:6: flatten (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.Flatten instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:7: dropout (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.dropout instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:8: dense (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.Dense instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:9: batch_normalization (from tensorflow.python.keras.legacy_tf_layers.normalization) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.BatchNormalization instead.  In particular, `tf.control_dependencies(tf.GraphKeys.UPDATE_OPS)` should not be used (consult the `tf.keras.layers.BatchNormalization` documentation).
tf.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32)

tf.Tensor(
[[ 0.07562444 -0.27538717  0.21692204  0.2411264  -0.01209673 -0.0923705
   0.19058049 -0.00468709 -0.17215249 -0.07528099]], shape=(1, 10), dtype=float32)

Sau khi chuyển đổi

Hầu hết các đối số vẫn giữ nguyên. Nhưng hãy lưu ý sự khác biệt:

  • Đối số training được mô hình truyền cho mỗi lớp khi nó chạy.
  • Đối số đầu tiên của hàm model ban đầu (đầu vào x ) đã biến mất. Điều này là do các lớp đối tượng tách biệt việc xây dựng mô hình khỏi việc gọi mô hình.

Cũng lưu ý rằng:

  • Nếu bạn đang sử dụng bộ điều chỉnh của bộ khởi tạo từ tf.contrib , chúng có nhiều thay đổi đối số hơn những bộ khởi tạo khác.
  • Mã không còn ghi vào các bộ sưu tập, vì vậy các hàm như v1.losses.get_regularization_loss sẽ không còn trả về các giá trị này nữa, có khả năng phá vỡ các vòng huấn luyện của bạn.
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.04),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
])

train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))
train_out = model(train_data, training=True)
print(train_out)
tf.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32)

test_out = model(test_data, training=False)
print(test_out)
tf.Tensor(
[[-0.32132083  0.22252844 -0.11330387 -0.4613616  -0.08817139 -0.52697927
  -0.1538124   0.23069203 -0.15860984 -0.453844  ]], shape=(1, 10), dtype=float32)

# Here are all the trainable variables.
len(model.trainable_variables)
8
# Here is the regularization loss.
model.losses
[<tf.Tensor: shape=(), dtype=float32, numpy=0.08671833>]

Biến hỗn hợp & v1.layers

Mã hiện tại thường trộn các biến TF 1.x cấp thấp hơn và các phép toán với v1.layers cấp cao hơn.

Trước khi chuyển đổi

def model(x, training, scope='model'):
  with v1.variable_scope(scope, reuse=v1.AUTO_REUSE):
    W = v1.get_variable(
      "W", dtype=v1.float32,
      initializer=v1.ones(shape=x.shape),
      regularizer=lambda x:0.004*tf.reduce_mean(x**2),
      trainable=True)
    if training:
      x = x + W
    else:
      x = x + W * 0.5
    x = v1.layers.conv2d(x, 32, 3, activation=tf.nn.relu)
    x = v1.layers.max_pooling2d(x, (2, 2), 1)
    x = v1.layers.flatten(x)
    return x

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)

Sau khi chuyển đổi

Để chuyển đổi mã này, hãy làm theo mẫu ánh xạ các lớp thành các lớp như trong ví dụ trước.

Mô hình chung là:

  • Thu thập các thông số lớp trong __init__ .
  • Xây dựng các biến trong bản build .
  • Thực hiện các phép tính trong call và trả về kết quả.

Về cơ bản, v1.variable_scope là một lớp của riêng nó. Vì vậy, hãy viết lại nó dưới dạng tf.keras.layers.Layer . Xem hướng dẫn để biết chi tiết.

# Create a custom layer for part of the model
class CustomLayer(tf.keras.layers.Layer):
  def __init__(self, *args, **kwargs):
    super(CustomLayer, self).__init__(*args, **kwargs)

  def build(self, input_shape):
    self.w = self.add_weight(
        shape=input_shape[1:],
        dtype=tf.float32,
        initializer=tf.keras.initializers.ones(),
        regularizer=tf.keras.regularizers.l2(0.02),
        trainable=True)

  # Call method will sometimes get used in graph mode,
  # training will get turned into a tensor
  @tf.function
  def call(self, inputs, training=None):
    if training:
      return inputs + self.w
    else:
      return inputs + self.w * 0.5
custom_layer = CustomLayer()
print(custom_layer([1]).numpy())
print(custom_layer([1], training=True).numpy())
[1.5]
[2.]

train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))

# Build the model including the custom layer
model = tf.keras.Sequential([
    CustomLayer(input_shape=(28, 28, 1)),
    tf.keras.layers.Conv2D(32, 3, activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
])

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)

Một số điều cần lưu ý:

  • Các mô hình & lớp Keras phân lớp cần chạy trong cả đồ thị v1 (không có phụ thuộc điều khiển tự động) và ở chế độ háo hức

    • Kết hợp call() trong một tf.function() để có chữ ký và các phụ thuộc điều khiển tự động
  • Đừng quên chấp nhận một đối số training để call .

    • Đôi khi nó là một tf.Tensor
    • Đôi khi nó là một boolean Python.
  • Tạo các biến mô hình trong constructor hoặc Model.build bằng self.add_weight() .

    • Trong Model.build bạn có quyền truy cập vào hình dạng đầu vào, vì vậy có thể tạo trọng số với hình dạng phù hợp.
    • Sử dụng tf.keras.layers.Layer.add_weight cho phép Keras theo dõi các biến và tổn thất chính quy.
  • Đừng giữ tf.Tensors trong các đối tượng của bạn.

    • Chúng có thể được tạo ra trong một tf.function hoặc trong bối cảnh háo hức, và những bộ căng này hoạt động khác nhau.
    • Sử dụng tf.Variable s cho trạng thái, chúng luôn có thể sử dụng được từ cả hai ngữ cảnh
    • tf.Tensors chỉ dành cho các giá trị trung gian.

Một lưu ý trên Slim & Contrib.layers

Một lượng lớn mã TensorFlow 1.x cũ hơn sử dụng thư viện Slim , được đóng gói với TensorFlow 1.x dưới dạng tf.contrib.layers . Là một mô-đun contrib , điều này không còn khả dụng trong TensorFlow 2.0, ngay cả trong tf.compat.v1 . Chuyển đổi mã sử dụng Slim sang TF 2.0 liên quan nhiều hơn chuyển đổi các kho lưu trữ sử dụng v1.layers . Trên thực tế, có thể hợp lý khi chuyển đổi mã Slim của bạn thành v1.layers trước, sau đó chuyển đổi sang Keras.

  • Loại bỏ arg_scopes , tất cả các args cần phải rõ ràng
  • Nếu bạn sử dụng chúng, hãy chia normalizer_fnactivation_fn thành các lớp riêng của chúng
  • Các lớp chuyển đổi có thể tách rời ánh xạ đến một hoặc nhiều lớp Keras khác nhau (theo chiều sâu, theo chiều kim và các lớp Keras có thể phân tách)
  • Slim và v1.layers có tên đối số và giá trị mặc định khác nhau
  • Một số args có quy mô khác nhau
  • Nếu bạn sử dụng các mô hình đã được đào tạo trước của Slim, hãy thử các mô hình đã được đào tạo trước của Keras từ các tf.keras.applications hoặc TF2 SavedModels của TF Hub được xuất từ ​​mã Slim ban đầu.

Một số lớp tf.contrib có thể không được chuyển sang TensorFlow lõi mà thay vào đó đã được chuyển sang gói bổ trợ TF .

Đào tạo

Có nhiều cách để cung cấp dữ liệu vào mô hình tf.keras . Họ sẽ chấp nhận trình tạo Python và mảng Numpy làm đầu vào.

Cách khuyến nghị để cung cấp dữ liệu cho một mô hình là sử dụng gói tf.data , gói này chứa một tập hợp các lớp hiệu suất cao để thao tác dữ liệu.

Nếu bạn vẫn đang sử dụng tf.queue , chúng hiện chỉ được hỗ trợ dưới dạng cấu trúc dữ liệu, không phải là đường ống đầu vào.

Sử dụng tập dữ liệu

Gói TensorFlow Datasets ( tfds ) chứa các tiện ích để tải các tập dữ liệu được xác định trước dưới dạng các đối tượng tf.data.Dataset .

Đối với ví dụ này, tải MNISTdataset, sử dụng tfds :

datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
mnist_train, mnist_test = datasets['train'], datasets['test']
Downloading and preparing dataset mnist/3.0.1 (download: 11.06 MiB, generated: 21.00 MiB, total: 32.06 MiB) to /home/kbuilder/tensorflow_datasets/mnist/3.0.1...

Warning:absl:Dataset mnist is hosted on GCS. It will automatically be downloaded to your
local data directory. If you'd instead prefer to read directly from our public
GCS bucket (recommended if you're running on GCP), you can instead pass
`try_gcs=True` to `tfds.load` or set `data_dir=gs://tfds-data/datasets`.


Dataset mnist downloaded and prepared to /home/kbuilder/tensorflow_datasets/mnist/3.0.1. Subsequent calls will reuse this data.

Sau đó, chuẩn bị dữ liệu để đào tạo:

  • Chia tỷ lệ lại từng hình ảnh.
  • Xáo trộn thứ tự của các ví dụ.
  • Thu thập hàng loạt hình ảnh và nhãn.
BUFFER_SIZE = 10 # Use a much larger value for real code.
BATCH_SIZE = 64
NUM_EPOCHS = 5


def scale(image, label):
  image = tf.cast(image, tf.float32)
  image /= 255

  return image, label

Để giữ cho ví dụ ngắn gọn, hãy cắt bớt tập dữ liệu để chỉ trả về 5 lô:

train_data = mnist_train.map(scale).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
test_data = mnist_test.map(scale).batch(BATCH_SIZE)

STEPS_PER_EPOCH = 5

train_data = train_data.take(STEPS_PER_EPOCH)
test_data = test_data.take(STEPS_PER_EPOCH)
image_batch, label_batch = next(iter(train_data))

Sử dụng các vòng huấn luyện Keras

Nếu bạn không cần kiểm soát mức độ thấp quá trình đào tạo của mình, bạn nên sử dụng các phương pháp fit , evaluatepredict sẵn của Keras. Các phương pháp này cung cấp một giao diện thống nhất để huấn luyện mô hình bất kể việc triển khai (tuần tự, chức năng hay phân lớp).

Ưu điểm của các phương pháp này bao gồm:

  • Họ chấp nhận mảng Numpy, trình tạo Python và tf.data.Datasets
  • Họ áp dụng quy định và các khoản lỗ kích hoạt tự động.
  • Họ hỗ trợ tf.distribute để đào tạo đa thiết bị .
  • Họ hỗ trợ các khoản có thể gọi tùy ý dưới dạng lỗ và số liệu.
  • Chúng hỗ trợ các lệnh gọi lại như tf.keras.callbacks.TensorBoard và các lệnh gọi lại tùy chỉnh.
  • Chúng hoạt động hiệu quả, tự động sử dụng đồ thị TensorFlow.

Đây là một ví dụ về đào tạo một mô hình bằng cách sử dụng Dataset . (Để biết chi tiết về cách hoạt động của điều này, hãy xem hướng dẫn .)

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.02),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
])

# Model is the full model w/o custom layers
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(train_data, epochs=NUM_EPOCHS)
loss, acc = model.evaluate(test_data)

print("Loss {}, Accuracy {}".format(loss, acc))
Epoch 1/5
5/5 [==============================] - 0s 6ms/step - loss: 1.5665 - accuracy: 0.4969
Epoch 2/5
5/5 [==============================] - 0s 6ms/step - loss: 0.5249 - accuracy: 0.8656
Epoch 3/5
5/5 [==============================] - 0s 5ms/step - loss: 0.3246 - accuracy: 0.9438
Epoch 4/5
5/5 [==============================] - 0s 6ms/step - loss: 0.2407 - accuracy: 0.9719
Epoch 5/5
5/5 [==============================] - 0s 5ms/step - loss: 0.1841 - accuracy: 0.9906
5/5 [==============================] - 0s 4ms/step - loss: 1.5957 - accuracy: 0.5375
Loss 1.5956770181655884, Accuracy 0.5375000238418579

Viết vòng lặp của riêng bạn

Nếu bước đào tạo của mô hình Keras phù hợp với bạn, nhưng bạn cần kiểm soát nhiều hơn bên ngoài bước đó, hãy xem xét sử dụng phương thức tf.keras.Model.train_on_batch , trong vòng lặp lặp dữ liệu của riêng bạn.

Hãy nhớ rằng: Nhiều thứ có thể được triển khai dưới dạng tf.keras.callbacks.Callback .

Phương pháp này có nhiều ưu điểm của các phương pháp đã đề cập trong phần trước, nhưng cho phép người dùng kiểm soát vòng lặp bên ngoài.

Bạn cũng có thể sử dụng tf.keras.Model.test_on_batch hoặc tf.keras.Model.evaluate để kiểm tra hiệu suất trong quá trình đào tạo.

Để tiếp tục đào tạo mô hình trên:

# Model is the full model w/o custom layers
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

for epoch in range(NUM_EPOCHS):
  #Reset the metric accumulators
  model.reset_metrics()

  for image_batch, label_batch in train_data:
    result = model.train_on_batch(image_batch, label_batch)
    metrics_names = model.metrics_names
    print("train: ",
          "{}: {:.3f}".format(metrics_names[0], result[0]),
          "{}: {:.3f}".format(metrics_names[1], result[1]))
  for image_batch, label_batch in test_data:
    result = model.test_on_batch(image_batch, label_batch,
                                 # return accumulated metrics
                                 reset_metrics=False)
  metrics_names = model.metrics_names
  print("\neval: ",
        "{}: {:.3f}".format(metrics_names[0], result[0]),
        "{}: {:.3f}".format(metrics_names[1], result[1]))
train:  loss: 0.145 accuracy: 1.000
train:  loss: 0.183 accuracy: 0.984
train:  loss: 0.216 accuracy: 0.953
train:  loss: 0.229 accuracy: 0.938
train:  loss: 0.201 accuracy: 0.969

eval:  loss: 1.588 accuracy: 0.628
train:  loss: 0.097 accuracy: 1.000
train:  loss: 0.101 accuracy: 1.000
train:  loss: 0.086 accuracy: 1.000
train:  loss: 0.130 accuracy: 0.984
train:  loss: 0.127 accuracy: 1.000

eval:  loss: 1.580 accuracy: 0.766
train:  loss: 0.086 accuracy: 1.000
train:  loss: 0.081 accuracy: 1.000
train:  loss: 0.079 accuracy: 1.000
train:  loss: 0.076 accuracy: 1.000
train:  loss: 0.077 accuracy: 1.000

eval:  loss: 1.542 accuracy: 0.809
train:  loss: 0.067 accuracy: 1.000
train:  loss: 0.068 accuracy: 1.000
train:  loss: 0.063 accuracy: 1.000
train:  loss: 0.063 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000

eval:  loss: 1.503 accuracy: 0.816
train:  loss: 0.055 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000
train:  loss: 0.048 accuracy: 1.000
train:  loss: 0.051 accuracy: 1.000
train:  loss: 0.048 accuracy: 1.000

eval:  loss: 1.482 accuracy: 0.828

Tùy chỉnh bước đào tạo

Nếu bạn cần sự linh hoạt và kiểm soát nhiều hơn, bạn có thể có nó bằng cách thực hiện vòng đào tạo của riêng bạn. Có ba bước:

  1. Lặp lại trên trình tạo Python hoặc tf.data.Dataset để nhận hàng loạt ví dụ.
  2. Sử dụng tf.GradientTape để thu thập các gradient.
  3. Sử dụng một trong các tf.keras.optimizers để áp dụng cập nhật trọng số cho các biến của mô hình.

Nhớ lại:

  • Luôn bao gồm một đối số training về phương thức call của các lớp và mô hình phân lớp con.
  • Đảm bảo gọi mô hình với đối số training được đặt chính xác.
  • Tùy thuộc vào cách sử dụng, các biến mô hình có thể không tồn tại cho đến khi mô hình được chạy trên một lô dữ liệu.
  • Bạn cần phải xử lý thủ công những thứ như tổn thất quy định cho mô hình.

Lưu ý các đơn giản hóa liên quan đến v1:

  • Không cần phải chạy bộ khởi tạo biến. Các biến được khởi tạo khi tạo.
  • Không cần thêm các phụ thuộc điều khiển thủ công. Ngay cả trong tf.function hoạt động chức năng hoạt động như ở chế độ háo hức.
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.02),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
])

optimizer = tf.keras.optimizers.Adam(0.001)
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

@tf.function
def train_step(inputs, labels):
  with tf.GradientTape() as tape:
    predictions = model(inputs, training=True)
    regularization_loss=tf.math.add_n(model.losses)
    pred_loss=loss_fn(labels, predictions)
    total_loss=pred_loss + regularization_loss

  gradients = tape.gradient(total_loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))

for epoch in range(NUM_EPOCHS):
  for inputs, labels in train_data:
    train_step(inputs, labels)
  print("Finished epoch", epoch)

Finished epoch 0
Finished epoch 1
Finished epoch 2
Finished epoch 3
Finished epoch 4

Các chỉ số và tổn thất kiểu mới

Trong TensorFlow 2.0, các chỉ số và tổn thất là các đối tượng. Những công việc này đều hoạt động hăng hái và trong tf.function . tf.function s.

Một đối tượng mất mát có thể gọi được và mong đợi (y_true, y_pred) làm đối số:

cce = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
cce([[1, 0]], [[-1.0,3.0]]).numpy()
4.01815

Đối tượng số liệu có các phương pháp sau:

Bản thân đối tượng có thể gọi được. Việc gọi cập nhật trạng thái với các quan sát mới, như với update_state và trả về kết quả mới của số liệu.

Bạn không phải khởi tạo các biến của chỉ số theo cách thủ công và vì TensorFlow 2.0 có các phụ thuộc kiểm soát tự động, nên bạn cũng không cần phải lo lắng về những biến đó.

Đoạn mã dưới đây sử dụng một số liệu để theo dõi tổn thất trung bình được quan sát trong vòng đào tạo tùy chỉnh.

# Create the metrics
loss_metric = tf.keras.metrics.Mean(name='train_loss')
accuracy_metric = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')

@tf.function
def train_step(inputs, labels):
  with tf.GradientTape() as tape:
    predictions = model(inputs, training=True)
    regularization_loss=tf.math.add_n(model.losses)
    pred_loss=loss_fn(labels, predictions)
    total_loss=pred_loss + regularization_loss

  gradients = tape.gradient(total_loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))
  # Update the metrics
  loss_metric.update_state(total_loss)
  accuracy_metric.update_state(labels, predictions)


for epoch in range(NUM_EPOCHS):
  # Reset the metrics
  loss_metric.reset_states()
  accuracy_metric.reset_states()

  for inputs, labels in train_data:
    train_step(inputs, labels)
  # Get the metric results
  mean_loss=loss_metric.result()
  mean_accuracy = accuracy_metric.result()

  print('Epoch: ', epoch)
  print('  loss:     {:.3f}'.format(mean_loss))
  print('  accuracy: {:.3f}'.format(mean_accuracy))

Epoch:  0
  loss:     0.207
  accuracy: 0.991
Epoch:  1
  loss:     0.167
  accuracy: 0.994
Epoch:  2
  loss:     0.147
  accuracy: 0.997
Epoch:  3
  loss:     0.123
  accuracy: 0.997
Epoch:  4
  loss:     0.109
  accuracy: 0.997

Tên chỉ số Keras

Trong TensorFlow 2.0, các mô hình keras nhất quán hơn về việc xử lý tên số liệu.

Bây giờ khi bạn chuyển một chuỗi trong danh sách số liệu, chuỗi chính xác đó được sử dụng làm name của số liệu. Những tên này hiển thị trong đối tượng lịch sử được trả về bởi model.fit và trong nhật ký được chuyển đến keras.callbacks . được đặt thành chuỗi bạn đã chuyển trong danh sách chỉ số.

model.compile(
    optimizer = tf.keras.optimizers.Adam(0.001),
    loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics = ['acc', 'accuracy', tf.keras.metrics.SparseCategoricalAccuracy(name="my_accuracy")])
history = model.fit(train_data)
5/5 [==============================] - 0s 6ms/step - loss: 0.1233 - acc: 0.9937 - accuracy: 0.9937 - my_accuracy: 0.9937

history.history.keys()
dict_keys(['loss', 'acc', 'accuracy', 'my_accuracy'])

Điều này khác với các phiên bản trước khi việc chuyển metrics=["accuracy"] dict_keys(['loss', 'acc']) metrics=["accuracy"] sẽ dẫn đến dict_keys(['loss', 'acc'])

Keras tối ưu hóa

Các trình tối ưu hóa trong v1.train , như v1.train.AdamOptimizerv1.train.GradientDescentOptimizer , có các tính năng tương đương trong tf.keras.optimizers .

Chuyển đổi v1.train sang keras.optimizers

Dưới đây là những điều cần lưu ý khi chuyển đổi trình tối ưu hóa của bạn:

Mặc định mới cho một số tf.keras.optimizers

Không có thay đổi nào đối với trình optimizers.SGD , optimizers.Adam hoặc trình optimizers.RMSprop .

Các tỷ lệ học tập mặc định sau đã thay đổi:

TensorBoard

TensorFlow 2 bao gồm những thay đổi đáng kể đối với API tf.summary được sử dụng để viết dữ liệu tóm tắt để hiển thị trong TensorBoard. Để có phần giới thiệu chung về tf.summary mới, có một số hướng dẫn sử dụng API TF 2. Điều này bao gồm Hướng dẫn di chuyển TensorBoard TF 2

Lưu & Đang tải

Khả năng tương thích của trạm kiểm soát

TensorFlow 2.0 sử dụng các điểm kiểm tra dựa trên đối tượng .

Các điểm kiểm tra dựa trên tên kiểu cũ vẫn có thể được tải, nếu bạn cẩn thận. Quá trình chuyển đổi mã có thể dẫn đến thay đổi tên biến, nhưng có những cách giải quyết.

Cách tiếp cận đơn giản nhất để đặt tên của mô hình mới với tên trong trạm kiểm soát:

  • Tất cả các biến vẫn có một đối số name mà bạn có thể đặt.
  • Các mô hình Keras cũng lấy một đối số name mà chúng đặt làm tiền tố cho các biến của chúng.
  • Hàm v1.name_scope có thể được sử dụng để đặt tiền tố tên biến. Điều này rất khác với tf.variable_scope . Nó chỉ ảnh hưởng đến tên và không theo dõi các biến và sử dụng lại.

Nếu điều đó không hiệu quả với trường hợp sử dụng của bạn, hãy thử hàm v1.train.init_from_checkpoint . Phải mất một assignment_map lập luận, trong đó nêu rõ các ánh xạ từ tên cũ sang tên mới.

Kho lưu trữ Công cụ ước tính TensorFlow bao gồm một công cụ chuyển đổi để nâng cấp các điểm kiểm tra cho các công cụ ước tính tạo trước từ TensorFlow 1.X lên 2.0. Nó có thể là một ví dụ về cách xây dựng một công cụ cho một trường hợp sử dụng tương tự.

Khả năng tương thích với các mô hình đã lưu

Không có lo ngại về khả năng tương thích đáng kể cho các mô hình đã lưu.

  • TensorFlow 1.x save_models hoạt động trong TensorFlow 2.x.
  • TensorFlow 2.x save_models hoạt động trong TensorFlow 1.x — nếu tất cả các hoạt động được hỗ trợ.

Một Graph.pb hoặc Graph.pbtxt

Không có cách nào đơn giản để nâng cấp tệp Graph.pb thô lên TensorFlow 2.0. Đặt cược tốt nhất của bạn là nâng cấp mã đã tạo tệp.

Tuy nhiên, nếu bạn có "Đồ thị đông lạnh" ( tf.Graph trong đó các biến đã được chuyển thành hằng số), thì bạn có thể chuyển nó thành hàm concrete_function bằng v1.wrap_function :

def wrap_frozen_graph(graph_def, inputs, outputs):
  def _imports_graph_def():
    tf.compat.v1.import_graph_def(graph_def, name="")
  wrapped_import = tf.compat.v1.wrap_function(_imports_graph_def, [])
  import_graph = wrapped_import.graph
  return wrapped_import.prune(
      tf.nest.map_structure(import_graph.as_graph_element, inputs),
      tf.nest.map_structure(import_graph.as_graph_element, outputs))

Ví dụ: đây là biểu đồ đóng băng cho Inception v1, từ năm 2016:

path = tf.keras.utils.get_file(
    'inception_v1_2016_08_28_frozen.pb',
    'http://storage.googleapis.com/download.tensorflow.org/models/inception_v1_2016_08_28_frozen.pb.tar.gz',
    untar=True)
Downloading data from http://storage.googleapis.com/download.tensorflow.org/models/inception_v1_2016_08_28_frozen.pb.tar.gz
24698880/24695710 [==============================] - 1s 0us/step

Tải tf.GraphDef :

graph_def = tf.compat.v1.GraphDef()
loaded = graph_def.ParseFromString(open(path,'rb').read())

Gói nó vào một chức năng concrete_function :

inception_func = wrap_frozen_graph(
    graph_def, inputs='input:0',
    outputs='InceptionV1/InceptionV1/Mixed_3b/Branch_1/Conv2d_0a_1x1/Relu:0')

Chuyển nó một tensor làm đầu vào:

input_img = tf.ones([1,224,224,3], dtype=tf.float32)
inception_func(input_img).shape
TensorShape([1, 28, 28, 96])

Công cụ ước tính

Đào tạo với Công cụ ước tính

Công cụ ước tính được hỗ trợ trong TensorFlow 2.0.

Khi bạn sử dụng công cụ ước tính, bạn có thể sử dụng input_fn() , tf.estimator.TrainSpectf.estimator.EvalSpec từ TensorFlow 1.x.

Đây là một ví dụ sử dụng input_fn với thông số kỹ thuật đào tạo và đánh giá.

Tạo input_fn và thông số huấn luyện / eval

# Define the estimator's input_fn
def input_fn():
  datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
  mnist_train, mnist_test = datasets['train'], datasets['test']

  BUFFER_SIZE = 10000
  BATCH_SIZE = 64

  def scale(image, label):
    image = tf.cast(image, tf.float32)
    image /= 255

    return image, label[..., tf.newaxis]

  train_data = mnist_train.map(scale).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
  return train_data.repeat()

# Define train & eval specs
train_spec = tf.estimator.TrainSpec(input_fn=input_fn,
                                    max_steps=STEPS_PER_EPOCH * NUM_EPOCHS)
eval_spec = tf.estimator.EvalSpec(input_fn=input_fn,
                                  steps=STEPS_PER_EPOCH)

Sử dụng định nghĩa mô hình Keras

Có một số khác biệt trong cách xây dựng công cụ ước tính của bạn trong TensorFlow 2.0.

Chúng tôi khuyên bạn nên xác định mô hình của mình bằng Keras, sau đó sử dụng tiện ích tf.keras.estimator.model_to_estimator để biến mô hình của bạn thành một công cụ ước tính. Đoạn mã dưới đây cho thấy cách sử dụng tiện ích này khi tạo và đào tạo một công cụ ước tính.

def make_model():
  return tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.02),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
  ])
model = make_model()

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

estimator = tf.keras.estimator.model_to_estimator(
  keras_model = model
)

tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config.

INFO:tensorflow:Using default config.

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp333woaev

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp333woaev

INFO:tensorflow:Using the Keras model provided.

INFO:tensorflow:Using the Keras model provided.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py:220: set_learning_phase (from tensorflow.python.keras.backend) is deprecated and will be removed after 2020-10-11.
Instructions for updating:
Simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py:220: set_learning_phase (from tensorflow.python.keras.backend) is deprecated and will be removed after 2020-10-11.
Instructions for updating:
Simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp333woaev', '_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, '_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:Using config: {'_model_dir': '/tmp/tmp333woaev', '_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, '_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:Not using Distribute Coordinator.

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/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.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/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.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='/tmp/tmp333woaev/keras/keras_model.ckpt', vars_to_warm_start='.*', var_name_to_vocab_info={}, var_name_to_prev_var_name={})

INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='/tmp/tmp333woaev/keras/keras_model.ckpt', vars_to_warm_start='.*', var_name_to_vocab_info={}, var_name_to_prev_var_name={})

INFO:tensorflow:Warm-starting from: /tmp/tmp333woaev/keras/keras_model.ckpt

INFO:tensorflow:Warm-starting from: /tmp/tmp333woaev/keras/keras_model.ckpt

INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES.

INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES.

INFO:tensorflow:Warm-started 8 variables.

INFO:tensorflow:Warm-started 8 variables.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.946777, step = 0

INFO:tensorflow:loss = 2.946777, step = 0

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_v1.py:2048: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_v1.py:2048: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:37Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:37Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Inference Time : 0.84716s

INFO:tensorflow:Inference Time : 0.84716s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:38

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:38

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.715625, global_step = 25, loss = 1.5356585

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.715625, global_step = 25, loss = 1.5356585

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.52498615.

INFO:tensorflow:Loss for final step: 0.52498615.

({'accuracy': 0.715625, 'loss': 1.5356585, 'global_step': 25}, [])

Sử dụng model_fn tùy chỉnh

Nếu bạn có model_fn ước tính tùy chỉnh hiện tại mà bạn cần duy trì, bạn có thể chuyển đổi model_fn của mình để sử dụng mô hình Keras.

Tuy nhiên, vì lý do tương thích, model_fn tùy chỉnh sẽ vẫn chạy ở chế độ đồ thị kiểu 1.x. Điều này có nghĩa là không có thực thi háo hức và không có phụ thuộc điều khiển tự động.

Model_fn tùy chỉnh với các thay đổi tối thiểu

Để làm cho model_fn tùy chỉnh của bạn hoạt động trong TF 2.0, nếu bạn muốn có những thay đổi tối thiểu đối với mã hiện có, thì có thể sử dụng các ký hiệu tf.compat.v1 như trình optimizersmetrics .

Sử dụng mô hình Keras trong model_fn tùy chỉnh tương tự như sử dụng nó trong vòng lặp đào tạo tùy chỉnh:

  • Đặt giai đoạn training một cách thích hợp, dựa trên đối số mode .
  • Chuyển rõ ràng trainable_variables của mô hình đến trình tối ưu hóa.

Nhưng có những khác biệt quan trọng, liên quan đến vòng lặp tùy chỉnh :

  • Thay vì sử dụng Model.losses , hãy trích xuất các khoản lỗ bằng Model.get_losses_for .
  • Trích xuất các bản cập nhật của mô hình bằng Model.get_updates_for .

Đoạn mã sau đây tạo một công cụ ước tính từ model_fn tùy chỉnh, minh họa tất cả các mối quan tâm này.

def my_model_fn(features, labels, mode):
  model = make_model()

  optimizer = tf.compat.v1.train.AdamOptimizer()
  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

  training = (mode == tf.estimator.ModeKeys.TRAIN)
  predictions = model(features, training=training)

  if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

  reg_losses = model.get_losses_for(None) + model.get_losses_for(features)
  total_loss=loss_fn(labels, predictions) + tf.math.add_n(reg_losses)

  accuracy = tf.compat.v1.metrics.accuracy(labels=labels,
                                           predictions=tf.math.argmax(predictions, axis=1),
                                           name='acc_op')

  update_ops = model.get_updates_for(None) + model.get_updates_for(features)
  minimize_op = optimizer.minimize(
      total_loss,
      var_list=model.trainable_variables,
      global_step=tf.compat.v1.train.get_or_create_global_step())
  train_op = tf.group(minimize_op, update_ops)

  return tf.estimator.EstimatorSpec(
    mode=mode,
    predictions=predictions,
    loss=total_loss,
    train_op=train_op, eval_metric_ops={'accuracy': accuracy})

# Create the Estimator & Train
estimator = tf.estimator.Estimator(model_fn=my_model_fn)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config.

INFO:tensorflow:Using default config.

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmpnhx_c2r_

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmpnhx_c2r_

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpnhx_c2r_', '_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, '_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:Using config: {'_model_dir': '/tmp/tmpnhx_c2r_', '_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, '_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:Not using Distribute Coordinator.

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.7539256, step = 0

INFO:tensorflow:loss = 2.7539256, step = 0

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

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 2020-10-15T01:27:41Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:41Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Inference Time : 0.94175s

INFO:tensorflow:Inference Time : 0.94175s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:42

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:42

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.678125, global_step = 25, loss = 1.5622549

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.678125, global_step = 25, loss = 1.5622549

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.39462265.

INFO:tensorflow:Loss for final step: 0.39462265.

({'accuracy': 0.678125, 'loss': 1.5622549, 'global_step': 25}, [])

model_fn tùy chỉnh với các ký hiệu TF 2.0

Nếu bạn muốn loại bỏ tất cả các ký hiệu TF 1.x và nâng cấp model_fn tùy chỉnh của mình lên TF 2.0 gốc, bạn cần cập nhật trình tối ưu hóa và chỉ số thành tf.keras.optimizerstf.keras.metrics .

Trong model_fn tùy chỉnh, ngoài những thay đổi ở trên, cần phải nâng cấp thêm:

Đối với ví dụ ở trên về my_model_fn , mã được di chuyển có ký hiệu 2.0 được hiển thị như sau:

def my_model_fn(features, labels, mode):
  model = make_model()

  training = (mode == tf.estimator.ModeKeys.TRAIN)
  loss_obj = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
  predictions = model(features, training=training)

  # Get both the unconditional losses (the None part)
  # and the input-conditional losses (the features part).
  reg_losses = model.get_losses_for(None) + model.get_losses_for(features)
  total_loss=loss_obj(labels, predictions) + tf.math.add_n(reg_losses)

  # Upgrade to tf.keras.metrics.
  accuracy_obj = tf.keras.metrics.Accuracy(name='acc_obj')
  accuracy = accuracy_obj.update_state(
      y_true=labels, y_pred=tf.math.argmax(predictions, axis=1))

  train_op = None
  if training:
    # Upgrade to tf.keras.optimizers.
    optimizer = tf.keras.optimizers.Adam()
    # Manually assign tf.compat.v1.global_step variable to optimizer.iterations
    # to make tf.compat.v1.train.global_step increased correctly.
    # This assignment is a must for any `tf.train.SessionRunHook` specified in
    # estimator, as SessionRunHooks rely on global step.
    optimizer.iterations = tf.compat.v1.train.get_or_create_global_step()
    # Get both the unconditional updates (the None part)
    # and the input-conditional updates (the features part).
    update_ops = model.get_updates_for(None) + model.get_updates_for(features)
    # Compute the minimize_op.
    minimize_op = optimizer.get_updates(
        total_loss,
        model.trainable_variables)[0]
    train_op = tf.group(minimize_op, *update_ops)

  return tf.estimator.EstimatorSpec(
    mode=mode,
    predictions=predictions,
    loss=total_loss,
    train_op=train_op,
    eval_metric_ops={'Accuracy': accuracy_obj})

# Create the Estimator & Train.
estimator = tf.estimator.Estimator(model_fn=my_model_fn)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config.

INFO:tensorflow:Using default config.

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp3kddt__h

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp3kddt__h

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp3kddt__h', '_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, '_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:Using config: {'_model_dir': '/tmp/tmp3kddt__h', '_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, '_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:Not using Distribute Coordinator.

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.4914804, step = 0

INFO:tensorflow:loss = 2.4914804, step = 0

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

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 2020-10-15T01:27:45Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:45Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Inference Time : 0.91708s

INFO:tensorflow:Inference Time : 0.91708s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:46

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:46

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.690625, global_step = 25, loss = 1.554177

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.690625, global_step = 25, loss = 1.554177

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.3999393.

INFO:tensorflow:Loss for final step: 0.3999393.

({'Accuracy': 0.690625, 'loss': 1.554177, 'global_step': 25}, [])

Công cụ ước tính được tạo sẵn

Công cụ ước tính tạo sẵn trong họ tf.estimator.DNN* , tf.estimator.Linear*tf.estimator.DNNLinearCombined* vẫn được hỗ trợ trong API TensorFlow 2.0, tuy nhiên, một số đối số đã thay đổi:

  1. input_layer_partitioner : Đã xóa trong 2.0.
  2. loss_reduction : Đã cập nhật thành tf.keras.losses.Reduction thay vì tf.compat.v1.losses.Reduction . Giá trị mặc định của nó cũng được thay đổi thành tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE từ tf.compat.v1.losses.Reduction.SUM .
  3. optimizer , dnn_optimizerlinear_optimizer : đối số này đã được cập nhật thành tf.keras.optimizers thay vì tf.compat.v1.train.Optimizer .

Để di chuyển các thay đổi trên:

  1. Không cần di chuyển đối với input_layer_partitionerDistribution Strategy sẽ tự động xử lý nó trong TF 2.0.
  2. Đối với loss_reduction , hãy kiểm tra tf.keras.losses.Reduction để biết các tùy chọn được hỗ trợ.
  3. Đối với args trình optimizer , nếu bạn không chuyển vào trình optimizer , dnn_optimizer hoặc linear_optimizer arg, hoặc nếu bạn chỉ định đối số của trình optimizer là một string trong mã của mình, bạn không cần thay đổi bất kỳ điều gì. tf.keras.optimizers được sử dụng theo mặc định. Nếu không, bạn cần cập nhật nó từ tf.compat.v1.train.Optimizer thành tf.keras.optimizers tương ứng của nó

Công cụ chuyển đổi điểm kiểm tra

Việc di chuyển sang keras.optimizers sẽ phá vỡ các điểm kiểm tra được lưu bằng TF 1.x, vì tf.keras.optimizers tạo ra một tập hợp các biến khác để được lưu trong các điểm kiểm tra. Để làm cho điểm kiểm tra cũ có thể sử dụng lại sau khi bạn chuyển sang TF 2.0, hãy thử công cụ chuyển đổi điểm kiểm tra .

 curl -O https://raw.githubusercontent.com/tensorflow/estimator/master/tensorflow_estimator/python/estimator/tools/checkpoint_converter.py
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 15165  100 15165    0     0  32265      0 --:--:-- --:--:-- --:--:-- 32197

Công cụ này có trợ giúp về nội dung:

 python checkpoint_converter.py -h
2020-10-15 01:27:47.423752: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
usage: checkpoint_converter.py [-h]
                               {dnn,linear,combined} source_checkpoint
                               source_graph target_checkpoint

positional arguments:
  {dnn,linear,combined}
                        The type of estimator to be converted. So far, the
                        checkpoint converter only supports Canned Estimator.
                        So the allowed types include linear, dnn and combined.
  source_checkpoint     Path to source checkpoint file to be read in.
  source_graph          Path to source graph file to be read in.
  target_checkpoint     Path to checkpoint file to be written out.

optional arguments:
  -h, --help            show this help message and exit

TensorShape

Lớp này được đơn giản hóa để chứa int s, thay vì các đối tượng tf.compat.v1.Dimension . Vì vậy, không cần phải gọi .value() để lấy int .

Các đối tượng tf.compat.v1.Dimension riêng lẻ vẫn có thể truy cập được từ tf.TensorShape.dims .

Sau đây là minh chứng về sự khác biệt giữa TensorFlow 1.x và TensorFlow 2.0.

# Create a shape and choose an index
i = 0
shape = tf.TensorShape([16, None, 256])
shape
TensorShape([16, None, 256])

Nếu bạn có cái này trong TF 1.x:

value = shape[i].value

Sau đó, làm điều này trong TF 2.0:

value = shape[i]
value
16

Nếu bạn có cái này trong TF 1.x:

for dim in shape:
    value = dim.value
    print(value)

Sau đó, làm điều này trong TF 2.0:

for value in shape:
  print(value)
16
None
256

Nếu bạn có điều này trong TF 1.x (Hoặc sử dụng bất kỳ phương pháp thứ nguyên nào khác):

dim = shape[i]
dim.assert_is_compatible_with(other_dim)

Sau đó, làm điều này trong TF 2.0:

other_dim = 16
Dimension = tf.compat.v1.Dimension

if shape.rank is None:
  dim = Dimension(None)
else:
  dim = shape.dims[i]
dim.is_compatible_with(other_dim) # or any other dimension method
True
shape = tf.TensorShape(None)

if shape:
  dim = shape.dims[i]
  dim.is_compatible_with(other_dim) # or any other dimension method

Giá trị boolean của tf.TensorShapeTrue nếu thứ hạng được biết, nếu không thì là False .

print(bool(tf.TensorShape([])))      # Scalar
print(bool(tf.TensorShape([0])))     # 0-length vector
print(bool(tf.TensorShape([1])))     # 1-length vector
print(bool(tf.TensorShape([None])))  # Unknown-length vector
print(bool(tf.TensorShape([1, 10, 100])))       # 3D tensor
print(bool(tf.TensorShape([None, None, None]))) # 3D tensor with no known dimensions
print()
print(bool(tf.TensorShape(None)))  # A tensor with unknown rank.
True
True
True
True
True
True

False

Các thay đổi khác

  • Loại bỏ tf.colocate_with : Các thuật toán vị trí thiết bị của TensorFlow đã được cải thiện đáng kể. Điều này không còn cần thiết nữa. Nếu việc xóa nó gây ra sự giảm cấp hiệu suất, vui lòng gửi lỗi .

  • Thay thế cách sử dụng v1.ConfigProto bằng các chức năng tương đương từ tf.config .

Kết luận

Quá trình tổng thể là:

  1. Chạy tập lệnh nâng cấp.
  2. Xóa các ký hiệu đóng góp.
  3. Chuyển mô hình của bạn sang kiểu hướng đối tượng (Keras).
  4. Sử dụng tf.keras hoặc tf.estimator vòng đánh giá đào tạo và nơi bạn có thể.
  5. Nếu không, hãy sử dụng các vòng lặp tùy chỉnh, nhưng hãy đảm bảo tránh các phiên và bộ sưu tập.

Phải mất một chút công việc để chuyển đổi mã thành TensorFlow 2.0 thành ngữ, nhưng mọi thay đổi đều dẫn đến:

  • Ít dòng mã hơn.
  • Tăng độ rõ ràng và đơn giản.
  • Gỡ lỗi dễ dàng hơn.