Trang này giải thích cách tiếp tục sử dụng TensorFlow Hub trong khi di chuyển mã TensorFlow của bạn từ TensorFlow 1 sang TensorFlow 2. Trang này bổ sung cho hướng dẫn di chuyển chung của TensorFlow.
Đối với TF2, TF Hub đã loại bỏ API hub.Module
cũ để xây dựng tf.compat.v1.Graph
giống như tf.contrib.v1.layers
. Thay vào đó, giờ đây đã có hub.KerasLayer
để sử dụng cùng với các lớp Keras khác nhằm xây dựng tf.keras.Model
(thường là trong môi trường thực thi háo hức mới của TF2) và phương thức hub.load()
cơ bản của nó cho mã TensorFlow cấp thấp.
API hub.Module
vẫn có sẵn trong thư viện tensorflow_hub
để sử dụng trong TF1 và ở chế độ tương thích TF1 của TF2. Nó chỉ có thể tải các mô hình ở định dạng TF1 Hub .
API mới của hub.load()
và hub.KerasLayer
hoạt động cho TensorFlow 1.15 (ở chế độ háo hức và biểu đồ) và trong TensorFlow 2. API mới này có thể tải các nội dung TF2 SavingModel mới và với các hạn chế được đặt ra trong mô hình hướng dẫn tương thích , các mô hình cũ ở định dạng TF1 Hub.
Nói chung, nên sử dụng API mới bất cứ khi nào có thể.
Tóm tắt API mới
hub.load()
là hàm cấp thấp mới để tải SavingModel từ TensorFlow Hub (hoặc các dịch vụ tương thích). Nó bao bọc tf.saved_model.load()
của TF2; Hướng dẫn SavingModel của TensorFlow mô tả những gì bạn có thể làm với kết quả.
m = hub.load(handle)
outputs = m(inputs)
Lớp hub.KerasLayer
gọi hub.load()
và điều chỉnh kết quả để sử dụng trong Keras cùng với các lớp Keras khác. (Nó thậm chí có thể là một trình bao bọc tiện lợi cho các SavingModel đã tải được sử dụng theo những cách khác.)
model = tf.keras.Sequential([
hub.KerasLayer(handle),
...])
Nhiều hướng dẫn hiển thị các API này đang hoạt động. Dưới đây là một số ví dụ:
Sử dụng API mới trong đào tạo về Công cụ ước tính
Nếu bạn sử dụng TF2 SavingModel trong Công cụ ước tính để đào tạo với các máy chủ tham số (hoặc nói cách khác là trong Phiên TF1 với các biến được đặt trên thiết bị từ xa), bạn cần đặt experimental.share_cluster_devices_in_session
trong ConfigProto của tf.Session, nếu không bạn sẽ gặp lỗi như "Thiết bị được chỉ định '/job:ps/replica:0/task:0/device:CPU:0' không khớp với bất kỳ thiết bị nào."
Tùy chọn cần thiết có thể được đặt như
session_config = tf.compat.v1.ConfigProto()
session_config.experimental.share_cluster_devices_in_session = True
run_config = tf.estimator.RunConfig(..., session_config=session_config)
estimator = tf.estimator.Estimator(..., config=run_config)
Bắt đầu với TF2.2, tùy chọn này không còn mang tính thử nghiệm nữa và phần .experimental
có thể bị loại bỏ.
Đang tải các mô hình cũ ở định dạng TF1 Hub
Có thể xảy ra trường hợp TF2 SavingModel mới chưa có sẵn cho trường hợp sử dụng của bạn và bạn cần tải mô hình cũ ở định dạng TF1 Hub. Bắt đầu từ bản phát hành tensorflow_hub
0.7, bạn có thể sử dụng mô hình cũ ở định dạng TF1 Hub cùng với hub.KerasLayer
như hiển thị bên dưới:
m = hub.KerasLayer(handle)
tensor_out = m(tensor_in)
Ngoài ra, KerasLayer
còn có khả năng chỉ định tags
, signature
, output_key
và signature_outputs_as_dict
để sử dụng cụ thể hơn các mô hình cũ ở định dạng TF1 Hub và SavingModels cũ.
Để biết thêm thông tin về khả năng tương thích định dạng Hub TF1, hãy xem hướng dẫn tương thích kiểu máy .
Sử dụng API cấp thấp hơn
Các mô hình định dạng Hub TF1 kế thừa có thể được tải qua tf.saved_model.load
. Thay vì
# DEPRECATED: TensorFlow 1
m = hub.Module(handle, tags={"foo", "bar"})
tensors_out_dict = m(dict(x1=..., x2=...), signature="sig", as_dict=True)
nên sử dụng:
# TensorFlow 2
m = hub.load(path, tags={"foo", "bar"})
tensors_out_dict = m.signatures["sig"](x1=..., x2=...)
Trong các ví dụ này, m.signatures
là một mệnh lệnh về các hàm cụ thể của TensorFlow được khóa bằng tên chữ ký. Việc gọi một hàm như vậy sẽ tính toán tất cả kết quả đầu ra của nó, ngay cả khi không được sử dụng. (Điều này khác với việc đánh giá lười biếng chế độ đồ thị của TF1.)