![]() | ![]() | ![]() | ![]() |
Hướng dẫn 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 để làm cho mã của mình tương thích hoàn toàn với TensorFlow 2.x:
- Kiểm tra tỷ lệ học tập mặc định của trình tối ưu hóa của bạn.
- Lưu ý rằng "tên" mà các chỉ số được ghi vào có thể đã thay đổi .
Vẫn có thể chạy mã 1.x, chưa sửa đổi ( ngoại trừ đóng góp ), trong TensorFlow 2.x:
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.x. 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 thực hiện các thay đổi được mô tả trong hướng dẫn này, là thử chạy tập lệnh nâng cấp .
Thao tác này sẽ thực thi một thẻ ban đầu khi nâng cấp mã của bạn lên TensorFlow 2.x nhưng nó không thể làm cho mã của bạn trở thành thành ngữ v2. 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.x 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ầmtf.Graph
sẽ không thành công. Đảm bảo bọc mã này trong ngữ cảnhwith 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 TensorFlow. 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ớitf.Variable
tạotf.Variable
.
Tensor shape,
v1.enable_v2_tensorshape()
: TensorFlow 2.x đơ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óit.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. Tham khảo phần 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 TensorFlow 2.x đã đượ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ạo mã cho TensorFlow 2.x
Hướng dẫn này sẽ giới thiệu một số ví dụ về việc chuyển đổi mã TensorFlow 1.x thành TensorFlow 2.x. 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_dict
vàv1.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 thông tin về cách hoạt động của tính năng này.
Lưu ý rằng:
Không giống như
v1.Session.run
, mộttf.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ộttf.function
hoạt động như thể nó được chạy theo thứ tự đã viết. Ví dụ: các phép gántf.Variable
vàtf.assert
đượ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ả theo dõi biến dựa trên tên đều không được khuyến khích trong TensorFlow 2.x. 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
và .trainable_variables
thuộc tính của Layer
và Model
đối tượng.
Các Layer
và Model
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
.
Tham khảo 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 TensorFlow 2.x sẽ chuyển đổi các ký hiệu thành các biểu tượng tương đương v2 của chúng 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 TensorFlow 2.x là chính xác tương đương (ví dụ: nó sẽ đổi tên v1.arg_max
thành tf.argmax
, vì chúng là cùng một hàm).
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
. Nó đáng để đi qua mã và chuyển đổi chúng theo cách thủ công sang phiên bản v2 tương đương (nó sẽ được đề cập 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 bộ sưu tập một cách rõ ràng.
Truy cập ngầm định các bộ sưu tập bằng các phương pháp như:
Sử dụng
v1.placeholder
để thiết lập đầu vào đồ thị.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ọiforward
. - 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 sử dụng 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)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/convolutional.py:414: UserWarning: `tf.layers.conv2d` is deprecated and will be removed in a future version. Please Use `tf.keras.layers.Conv2D` instead. warnings.warn('`tf.layers.conv2d` is deprecated and ' /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer.py:2273: UserWarning: `layer.apply` is deprecated and will be removed in a future version. Please use `layer.__call__` method instead. warnings.warn('`layer.apply` is deprecated and ' tf.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32) tf.Tensor( [[ 0.379358 -0.55901194 0.48704922 0.11619566 0.23902717 0.01691487 0.07227738 0.14556988 0.2459927 0.2501198 ]], shape=(1, 10), dtype=float32) /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/pooling.py:310: UserWarning: `tf.layers.max_pooling2d` is deprecated and will be removed in a future version. Please use `tf.keras.layers.MaxPooling2D` instead. warnings.warn('`tf.layers.max_pooling2d` is deprecated and ' /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/core.py:329: UserWarning: `tf.layers.flatten` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Flatten` instead. warnings.warn('`tf.layers.flatten` is deprecated and ' /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/core.py:268: UserWarning: `tf.layers.dropout` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dropout` instead. warnings.warn('`tf.layers.dropout` is deprecated and ' /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/core.py:171: UserWarning: `tf.layers.dense` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dense` instead. warnings.warn('`tf.layers.dense` is deprecated and ' /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/normalization.py:308: UserWarning: `tf.layers.batch_normalization` is deprecated and will be removed in a future version. Please use `tf.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.layers.batch_normalization` is deprecated and '
Sau khi chuyển đổi
- Các lớp đơn giản nằm gọn trong
tf.keras.Sequential
. (Đối với các mô hình phức tạp hơn, hãy xem các lớp và mô hình tùy chỉnh và hướng dẫn API chức năng .) - Mô hình theo dõi các biến và tổn thất quy định.
- Việc chuyển đổi là
v1.layers
vì có ánh xạ trực tiếp từv1.layers
sangtf.keras.layers
.
Hầu hết các đối số được 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àox
) đã 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 hoặc bộ khởi tạo từ
tf.contrib
, chúng có nhiều thay đổi đối số hơn những bộ 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.2145557 -0.22979769 -0.14968733 0.01208701 -0.07569927 0.3475932 0.10718458 0.03482988 -0.04309493 -0.10469118]], 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.08174552>]
Biến hỗn hợp & v1.layers
Mã hiện tại thường trộn các biến và hoạt động TensorFlow 1.x cấp thấp hơ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 tạo lớp và mô hình mới thông qua hướng dẫn phân lớp để 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 và 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ộttf.function
để có được chữ ký và các phụ thuộc kiểm soát tự động.
- Kết hợp
Đừ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
- Đôi khi nó là một
Tạo các biến mô hình trong constructor hoặc
Model.build
bằng cách sử dụ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
- Trong
Đừ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
- Chúng có thể được tạo ra trong một
Một lưu ý trên Slim và 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.x, ngay cả trong tf.compat.v1
. Chuyển đổi mã sử dụng Slim sang TensorFlow 2.x liên quan nhiều hơn là 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_fn
vàactivation_fn
thành các lớp riêng của chúng. - Các lớp chuyển đổi riêng biệt ánh xạ tới 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 định hướng trước của Keras từ
tf.keras.applications
hoặc TensorFlow 2.x 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 đến TensorFlow cốt lõi mà thay vào đó đã được chuyển đến gói TensorFlow Addons .
Đà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 TensorFlow
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ượngtf.data.Dataset
.
Đối với ví dụ này, bạn có thể tải tập dữ liệu MNIST bằ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 cấp 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
, evaluate
và predict
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 thức hoạt động, hãy xem phần 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 [==============================] - 1s 9ms/step - loss: 2.0191 - accuracy: 0.3608 Epoch 2/5 5/5 [==============================] - 0s 9ms/step - loss: 0.4736 - accuracy: 0.9059 Epoch 3/5 5/5 [==============================] - 0s 8ms/step - loss: 0.2973 - accuracy: 0.9626 Epoch 4/5 5/5 [==============================] - 0s 9ms/step - loss: 0.2108 - accuracy: 0.9911 Epoch 5/5 5/5 [==============================] - 0s 8ms/step - loss: 0.1791 - accuracy: 0.9874 5/5 [==============================] - 0s 6ms/step - loss: 1.5504 - accuracy: 0.7500 Loss 1.5504140853881836, Accuracy 0.75
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.138 accuracy: 1.000 train: loss: 0.161 accuracy: 1.000 train: loss: 0.159 accuracy: 0.969 train: loss: 0.241 accuracy: 0.953 train: loss: 0.172 accuracy: 0.969 eval: loss: 1.550 accuracy: 0.800 train: loss: 0.086 accuracy: 1.000 train: loss: 0.094 accuracy: 1.000 train: loss: 0.090 accuracy: 1.000 train: loss: 0.119 accuracy: 0.984 train: loss: 0.099 accuracy: 1.000 eval: loss: 1.558 accuracy: 0.841 train: loss: 0.076 accuracy: 1.000 train: loss: 0.068 accuracy: 1.000 train: loss: 0.061 accuracy: 1.000 train: loss: 0.076 accuracy: 1.000 train: loss: 0.076 accuracy: 1.000 eval: loss: 1.536 accuracy: 0.841 train: loss: 0.059 accuracy: 1.000 train: loss: 0.056 accuracy: 1.000 train: loss: 0.058 accuracy: 1.000 train: loss: 0.054 accuracy: 1.000 train: loss: 0.055 accuracy: 1.000 eval: loss: 1.497 accuracy: 0.863 train: loss: 0.053 accuracy: 1.000 train: loss: 0.049 accuracy: 1.000 train: loss: 0.044 accuracy: 1.000 train: loss: 0.049 accuracy: 1.000 train: loss: 0.045 accuracy: 1.000 eval: loss: 1.463 accuracy: 0.878
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:
- Lặp lại trên trình tạo Python hoặc
tf.data.Dataset
để nhận hàng loạt ví dụ. - Sử dụng
tf.GradientTape
để thu thập các gradient. - 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ứccall
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.x, 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:
-
Metric.update_state()
: thêm các quan sát mới. -
Metric.result()
: lấy kết quả hiện tại của chỉ số, với các giá trị quan sát được. -
Metric.reset_states()
: xóa tất cả các quan sát.
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.x 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.139 accuracy: 0.997 Epoch: 1 loss: 0.116 accuracy: 1.000 Epoch: 2 loss: 0.105 accuracy: 0.997 Epoch: 3 loss: 0.089 accuracy: 1.000 Epoch: 4 loss: 0.078 accuracy: 1.000
Tên chỉ số Keras
Trong TensorFlow 2.x, các mô hình Keras nhất quán hơn về việc xử lý các tên chỉ số.
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 [==============================] - 1s 8ms/step - loss: 0.0901 - acc: 0.9923 - accuracy: 0.9923 - my_accuracy: 0.9923
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
, chẳng hạn như v1.train.AdamOptimizer
và v1.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:
- Nâng cấp trình tối ưu hóa của bạn có thể làm cho các điểm kiểm tra cũ không tương thích .
- Tất cả các epsilon hiện mặc định thành
1e-7
thay vì1e-8
(không đáng kể trong hầu hết các trường hợp sử dụng). -
v1.train.GradientDescentOptimizer
có thể được thay thế trực tiếp bằngtf.keras.optimizers.SGD
. -
v1.train.MomentumOptimizer
có thể được thay thế trực tiếp bởi trình tối ưu hóaSGD
bằng cách sử dụng đối số xung lượng:tf.keras.optimizers.SGD(..., momentum=...)
. -
v1.train.AdamOptimizer
có thể được chuyển đổi để sử dụngtf.keras.optimizers.Adam
. Các đối sốbeta1
vàbeta2
đã được đổi tên thànhbeta_1
vàbeta_2
. -
v1.train.RMSPropOptimizer
có thể được chuyển đổi thànhtf.keras.optimizers.RMSprop
. Đối sốdecay
đã được đổi tên thànhrho
. -
v1.train.AdadeltaOptimizer
có thể được chuyển đổi trực tiếp thànhtf.keras.optimizers.Adadelta
. -
tf.train.AdagradOptimizer
có thể được chuyển đổi trực tiếp thànhtf.keras.optimizers.Adagrad
. -
tf.train.FtrlOptimizer
có thể được chuyển đổi trực tiếp thànhtf.keras.optimizers.Ftrl
. Cácaccum_name
vàlinear_name
lập luận đã được gỡ bỏ. -
tf.contrib.AdamaxOptimizer
vàtf.contrib.NadamOptimizer
có thể được chuyển đổi trực tiếp thànhtf.keras.optimizers.Adamax
vàtf.keras.optimizers.Nadam
, tương ứng. Các đối sốbeta1
vàbeta2
đã được đổi tên thànhbeta_1
vàbeta_2
.
Mặc định mới cho một số tf.keras.optimizers
Không có thay đổi nào cho 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:
-
optimizers.Adagrad
từ 0,01 đến 0,001 -
optimizers.Adadelta
từ 1,0 đến 0,001 -
optimizers.Adamax
.Adamax từ 0,002 đến 0,001 -
optimizers.Nadam
hóa.Nadam từ 0,002 đến 0,001
TensorBoard
TensorFlow 2.x 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 TensorFlow 2.x. Điều này bao gồm hướng dẫn di chuyển TensorBoard TensorFlow 2.x.
Lưu và tải
Khả năng tương thích của trạm kiểm soát
TensorFlow 2.x 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ớitf.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 sẵn 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.x. Đặ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ó một "đồ thị cố định" (một tf.Graph
trong đó các biến đã được chuyển thành hằng số), thì bạn có thể chuyển đổi 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ó thành 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.x.
Khi bạn sử dụng công cụ ước tính, bạn có thể sử dụng input_fn
, tf.estimator.TrainSpec
và tf.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 and 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.x.
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/tmp0erq3im2 WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp0erq3im2 INFO:tensorflow:Using the Keras model provided. INFO:tensorflow:Using the Keras model provided. /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/backend.py:434: UserWarning: `tf.keras.backend.set_learning_phase` is deprecated and will be removed after 2020-10-11. To update it, simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model. warnings.warn('`tf.keras.backend.set_learning_phase` is deprecated and ' INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp0erq3im2', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp0erq3im2', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO:tensorflow: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/tmp0erq3im2/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/tmp0erq3im2/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/tmp0erq3im2/keras/keras_model.ckpt INFO:tensorflow:Warm-starting from: /tmp/tmp0erq3im2/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/tmp0erq3im2/model.ckpt. INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp0erq3im2/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 2.4717796, step = 0 INFO:tensorflow:loss = 2.4717796, 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/tmp0erq3im2/model.ckpt. INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp0erq3im2/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. /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:2325: UserWarning: `Model.state_updates` will be removed in a future version. This property should not be used in TensorFlow 2.0, as `updates` are applied automatically. warnings.warn('`Model.state_updates` will be removed in a future version. ' INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:17Z INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:17Z INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmp0erq3im2/model.ckpt-25 INFO:tensorflow:Restoring parameters from /tmp/tmp0erq3im2/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.86556s INFO:tensorflow:Inference Time : 0.86556s INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:18 INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:18 INFO:tensorflow:Saving dict for global step 25: accuracy = 0.6, global_step = 25, loss = 1.6160676 INFO:tensorflow:Saving dict for global step 25: accuracy = 0.6, global_step = 25, loss = 1.6160676 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp0erq3im2/model.ckpt-25 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp0erq3im2/model.ckpt-25 INFO:tensorflow:Loss for final step: 0.37597787. INFO:tensorflow:Loss for final step: 0.37597787. ({'accuracy': 0.6, 'loss': 1.6160676, '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 TensorFlow 2.x, nếu bạn thích các thay đổi tối thiểu cho mã hiện có, có thể sử dụng các ký hiệu tf.compat.v1
như trình optimizers
và metrics
.
Sử dụng mô hình Keras trong model_fn
tùy chỉnh tương tự như sử dụng mô hình này 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ằngModel.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 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/tmpifj8mysl WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpifj8mysl INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpifj8mysl', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpifj8mysl', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO:tensorflow: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/tmpifj8mysl/model.ckpt. INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpifj8mysl/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 3.0136237, step = 0 INFO:tensorflow:loss = 3.0136237, 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/tmpifj8mysl/model.ckpt. INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpifj8mysl/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 2021-01-06T02:31:20Z INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:20Z INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmpifj8mysl/model.ckpt-25 INFO:tensorflow:Restoring parameters from /tmp/tmpifj8mysl/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.97406s INFO:tensorflow:Inference Time : 0.97406s INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:21 INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:21 INFO:tensorflow:Saving dict for global step 25: accuracy = 0.59375, global_step = 25, loss = 1.6248872 INFO:tensorflow:Saving dict for global step 25: accuracy = 0.59375, global_step = 25, loss = 1.6248872 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpifj8mysl/model.ckpt-25 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpifj8mysl/model.ckpt-25 INFO:tensorflow:Loss for final step: 0.35726172. INFO:tensorflow:Loss for final step: 0.35726172. ({'accuracy': 0.59375, 'loss': 1.6248872, 'global_step': 25}, [])
model_fn
tùy chỉnh với các ký hiệu TensorFlow 2.x
Nếu bạn muốn loại bỏ tất cả các ký hiệu TensorFlow 1.x và nâng cấp model_fn
tùy chỉnh của mình lên TensorFlow 2.x, bạn cần cập nhật trình tối ưu hóa và chỉ số thành tf.keras.optimizers
và tf.keras.metrics
.
Trong model_fn
tùy chỉnh, bên cạnh những thay đổi ở trên, cần phải nâng cấp thêm:
- Sử dụng
tf.keras.optimizers
thay vìv1.train.Optimizer
. - Chuyển rõ ràng
trainable_variables
của mô hình tớitf.keras.optimizers
. - Để tính toán
train_op/minimize_op
,- Sử dụng
Optimizer.get_updates
nếu tổn thất là tổn thất vô hướngTensor
(không phải là có thể gọi). Phần tử đầu tiên trong danh sách trả về làtrain_op/minimize_op
mong muốn. - Nếu mất mát là một lệnh có thể gọi được (chẳng hạn như một hàm), hãy sử dụng
Optimizer.minimize
để lấytrain_op/minimize_op
.
- Sử dụng
- Sử dụng
tf.keras.metrics
thay vìtf.compat.v1.metrics
để đánh giá.
Đối với ví dụ ở trên về my_model_fn
, mã được di chuyển với các ký hiệu TensorFlow 2.x đượ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 and 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/tmpc93qfnv6 WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpc93qfnv6 INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpc93qfnv6', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpc93qfnv6', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO:tensorflow: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/tmpc93qfnv6/model.ckpt. INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpc93qfnv6/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 2.5293791, step = 0 INFO:tensorflow:loss = 2.5293791, 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/tmpc93qfnv6/model.ckpt. INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpc93qfnv6/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 2021-01-06T02:31:24Z INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:24Z INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmpc93qfnv6/model.ckpt-25 INFO:tensorflow:Restoring parameters from /tmp/tmpc93qfnv6/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.86534s INFO:tensorflow:Inference Time : 0.86534s INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:25 INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:25 INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.59375, global_step = 25, loss = 1.7570661 INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.59375, global_step = 25, loss = 1.7570661 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpc93qfnv6/model.ckpt-25 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpc93qfnv6/model.ckpt-25 INFO:tensorflow:Loss for final step: 0.47094986. INFO:tensorflow:Loss for final step: 0.47094986. ({'Accuracy': 0.59375, 'loss': 1.7570661, 'global_step': 25}, [])
Công cụ ước tính được tạo sẵn
Công cụ ước tính được tạo sẵn trong họ tf.estimator.DNN*
, tf.estimator.Linear*
và tf.estimator.DNNLinearCombined*
vẫn được hỗ trợ trong API TensorFlow 2.x. Tuy nhiên, một số đối số đã thay đổi:
-
input_layer_partitioner
: Đã loại bỏ trong v2. -
loss_reduction
: Đã cập nhật thànhtf.keras.losses.Reduction
thay vìtf.compat.v1.losses.Reduction
. Giá trị mặc định của nó cũng được thay đổi thànhtf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE
từtf.compat.v1.losses.Reduction.SUM
. -
optimizer
,dnn_optimizer
vàlinear_optimizer
: đối số này đã được cập nhật thànhtf.keras.optimizers
thay vìtf.compat.v1.train.Optimizer
.
Để di chuyển các thay đổi ở trên:
- Không cần di chuyển đối với
input_layer_partitioner
vìDistribution Strategy
sẽ tự động xử lý nó trong TensorFlow 2.x. - Đối với
loss_reduction
, hãy kiểm tratf.keras.losses.Reduction
để biết các tùy chọn được hỗ trợ. - Đối với các đối số của trình
optimizer
:- Nếu bạn không: 1) chuyển vào đối số trình
optimizer
,dnn_optimizer
hoặclinear_optimizer
hoặc 2) chỉ định đối số trìnhoptimizer
dưới dạng mộtstring
trong mã của bạn, thì bạn không cần thay đổi bất kỳ điều gì vìtf.keras.optimizers
được sử dụng theo mặc định . - Nếu không, bạn cần phải cập nhật nó từ
tf.compat.v1.train.Optimizer
để tương ứng của nótf.keras.optimizers
.
- Nếu bạn không: 1) chuyển vào đối số trình
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 TensorFlow 1.x, vì tf.keras.optimizers
tạo ra một tập hợp các biến khác nhau để được lưu trong các điểm kiểm tra. Để làm cho điểm kiểm tra cũ có thể tái sử dụng sau khi bạn chuyển sang TensorFlow 2.x, 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 40656 0 --:--:-- --:--:-- --:--:-- 40656
Công cụ này có trợ giúp tích hợp:
python checkpoint_converter.py -h
2021-01-06 02:31:26.297951: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0 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 giá trị 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 cho sự khác biệt giữa TensorFlow 1.x và TensorFlow 2.x.
# 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 TensorFlow 1.x:
value = shape[i].value
Sau đó, làm điều này trong TensorFlow 2.x:
value = shape[i]
value
16
Nếu bạn có cái này trong TensorFlow 1.x:
for dim in shape:
value = dim.value
print(value)
Sau đó, làm điều này trong TensorFlow 2.x:
for value in shape:
print(value)
16 None 256
Nếu bạn có điều này trong TensorFlow 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 TensorFlow 2.x:
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.TensorShape
là True
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à:
- Chạy tập lệnh nâng cấp.
- Loại bỏ các ký hiệu đóng góp.
- Chuyển mô hình của bạn sang kiểu hướng đối tượng (Keras).
- Sử dụng
tf.keras
hoặctf.estimator
vòng đánh giá đào tạo và nơi bạn có thể. - 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.x 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.