Di chuyển từ TF1 sang TF2 bằng TensorFlow Hub

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()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_keysignature_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.)