Định dạng trung tâm TF1

Khi ra mắt vào năm 2018, TensorFlow Hub đã cung cấp một loại nội dung duy nhất: định dạng TF1 Hub để nhập vào các chương trình TensorFlow 1.

Trang này giải thích cách sử dụng định dạng Trung tâm TF1 trong TF1 (hoặc chế độ tương thích TF1 của TF2) với lớp hub.Module và các API được liên kết. (Cách sử dụng điển hình là tạo tf.Graph , có thể bên trong Estimator TF1, bằng cách kết hợp một hoặc nhiều mô hình ở định dạng Trung tâm TF1 với tf.compat.layers hoặc tf.layers ).

Người dùng TensorFlow 2 (bên ngoài chế độ tương thích TF1) phải sử dụng API mới với hub.load() hoặc hub.KerasLayer . API mới tải loại nội dung TF2 SavedModel mới, nhưng cũng có hỗ trợ hạn chế để tải định dạng Trung tâm TF1 thành TF2 .

Sử dụng mô hình ở định dạng Trung tâm TF1

Khởi tạo mô hình ở định dạng Trung tâm TF1

Mô hình ở định dạng Trung tâm TF1 được nhập vào chương trình TensorFlow bằng cách tạo đối tượng hub.Module từ một chuỗi có URL hoặc đường dẫn hệ thống tệp của nó, chẳng hạn như:

m = hub.Module("path/to/a/module_dir")

Điều này sẽ thêm các biến của mô-đun vào biểu đồ TensorFlow hiện tại. Chạy bộ khởi tạo của chúng sẽ đọc các giá trị được đào tạo trước của chúng từ đĩa. Tương tự như vậy, các bảng và trạng thái khác được thêm vào biểu đồ.

Mô-đun bộ nhớ đệm

Khi tạo mô-đun từ URL, nội dung mô-đun được tải xuống và lưu vào bộ nhớ đệm trong thư mục tạm thời của hệ thống cục bộ. Vị trí nơi các mô-đun được lưu trong bộ nhớ cache có thể được ghi đè bằng cách sử dụng biến môi trường TFHUB_CACHE_DIR . Để biết chi tiết, hãy xem Bộ nhớ đệm .

Áp dụng một mô-đun

Sau khi được khởi tạo, một mô-đun m có thể được gọi bằng 0 hoặc nhiều lần giống như một hàm Python từ đầu vào tensor đến đầu ra tensor:

y = m(x)

Mỗi lệnh gọi như vậy sẽ thêm các thao tác vào đồ thị TensorFlow hiện tại để tính y từ x . Nếu điều này liên quan đến các biến có trọng số được huấn luyện, thì các biến này sẽ được chia sẻ giữa tất cả các ứng dụng.

Mô-đun có thể xác định nhiều chữ ký được đặt tên để cho phép được áp dụng theo nhiều cách (tương tự như cách các đối tượng Python có các phương thức ). Tài liệu của mô-đun phải mô tả các chữ ký có sẵn. Cuộc gọi trên áp dụng chữ ký có tên "default" . Bất kỳ chữ ký nào cũng có thể được chọn bằng cách chuyển tên của nó vào đối số signature= tùy chọn.

Nếu một chữ ký có nhiều đầu vào, chúng phải được chuyển dưới dạng chính tả, với các khóa được xác định bởi chữ ký. Tương tự như vậy, nếu một chữ ký có nhiều đầu ra, chúng có thể được truy xuất dưới dạng dict bằng cách truyền as_dict=True , bên dưới các khóa được xác định bởi chữ ký (khóa "default" dành cho đầu ra duy nhất được trả về nếu as_dict=False ). Vì vậy, hình thức chung nhất của việc áp dụng Mô-đun trông giống như:

outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True)
y1 = outputs["cats"]
y2 = outputs["dogs"]

Người gọi phải cung cấp tất cả các đầu vào được xác định bằng chữ ký, nhưng không có yêu cầu sử dụng tất cả các đầu ra của mô-đun. TensorFlow sẽ chỉ chạy những phần của mô-đun mà kết thúc là phần phụ thuộc của mục tiêu trong tf.Session.run() . Thật vậy, nhà xuất bản mô-đun có thể chọn cung cấp các đầu ra khác nhau cho các mục đích sử dụng nâng cao (như kích hoạt các lớp trung gian) cùng với các đầu ra chính. Người tiêu dùng mô-đun nên xử lý các đầu ra bổ sung một cách duyên dáng.

Thử các mô-đun thay thế

Bất cứ khi nào có nhiều mô-đun cho cùng một nhiệm vụ, TensorFlow Hub khuyến khích trang bị cho chúng các chữ ký tương thích (giao diện) để việc thử các mô-đun khác nhau cũng dễ dàng như thay đổi tay cầm mô-đun như một siêu tham số có giá trị chuỗi.

Vì vậy, chúng tôi duy trì một bộ sưu tập các Chữ ký chung được đề xuất cho các nhiệm vụ phổ biến.

Tạo một mô-đun mới

Lưu ý về khả năng tương thích

Định dạng TF1 Hub hướng tới TensorFlow 1. Nó chỉ được hỗ trợ một phần bởi TF Hub trong TensorFlow 2. Thay vào đó, hãy cân nhắc xuất bản ở định dạng TF2 SavedModel mới.

Định dạng TF1 Hub tương tự như định dạng SavedModel của TensorFlow 1 ở cấp độ cú pháp (cùng tên tệp và thông báo giao thức) nhưng khác về ngữ nghĩa để cho phép sử dụng lại mô-đun, thành phần và đào tạo lại (ví dụ: lưu trữ khác nhau của bộ khởi tạo tài nguyên, gắn thẻ khác nhau quy ước cho metagraph). Cách dễ nhất để phân biệt chúng trên đĩa là sự hiện diện hay vắng mặt của tệp tfhub_module.pb .

Cách tiếp cận chung

Để xác định một mô-đun mới, nhà xuất bản gọi hub.create_module_spec() với một hàm module_fn . Hàm này xây dựng một đồ thị đại diện cho cấu trúc bên trong của mô-đun, sử dụng tf.placeholder() cho các đầu vào được cung cấp bởi người gọi. Sau đó, nó xác định chữ ký bằng cách gọi hub.add_signature(name, inputs, outputs) một hoặc nhiều lần.

Ví dụ:

def module_fn():
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.dense(inputs, 200)
  layer2 = tf.layers.dense(layer1, 100)
  outputs = dict(default=layer2, hidden_activations=layer1)
  # Add default signature.
  hub.add_signature(inputs=inputs, outputs=outputs)

...
spec = hub.create_module_spec(module_fn)

Kết quả của hub.create_module_spec() có thể được sử dụng, thay vì một đường dẫn, để khởi tạo một đối tượng mô-đun trong một đồ thị TensorFlow cụ thể. Trong trường hợp như vậy, không có điểm kiểm tra và phiên bản mô-đun sẽ sử dụng các bộ khởi tạo biến thay thế.

Bất kỳ cá thể mô-đun nào cũng có thể được tuần tự hóa vào đĩa thông qua phương thức export(path, session) của nó. Việc xuất một mô-đun tuần tự hóa định nghĩa của nó cùng với trạng thái hiện tại của các biến trong session vào đường dẫn đã truyền. Điều này có thể được sử dụng khi xuất một mô-đun lần đầu tiên, cũng như khi xuất một mô-đun đã được tinh chỉnh.

Để tương thích với TensorFlow Estimators, hub.LatestModuleExporter xuất mô-đun từ điểm kiểm tra mới nhất, giống như tf.estimator.LatestExporter xuất toàn bộ mô hình từ điểm kiểm tra mới nhất.

Nhà xuất bản mô-đun nên triển khai chữ ký chung khi có thể, để người tiêu dùng có thể dễ dàng trao đổi mô-đun và tìm ra mô-đun tốt nhất cho vấn đề của họ.

Ví dụ thực tế

Hãy xem trình xuất mô-đun nhúng văn bản của chúng tôi để biết ví dụ thực tế về cách tạo mô-đun từ định dạng nhúng văn bản phổ biến.

Tinh chỉnh

Việc huấn luyện các biến của một mô-đun đã nhập cùng với các biến của mô hình xung quanh nó được gọi là tinh chỉnh . Việc tinh chỉnh có thể mang lại chất lượng tốt hơn, nhưng lại thêm các biến chứng mới. Chúng tôi khuyên người tiêu dùng chỉ nên xem xét tinh chỉnh sau khi khám phá các tinh chỉnh chất lượng đơn giản hơn và chỉ khi nhà xuất bản mô-đun đề xuất.

Đối với người tiêu dùng

Để cho phép tinh chỉnh, hãy khởi tạo mô-đun bằng hub.Module(..., trainable=True) để làm cho các biến của nó có thể đào tạo và nhập REGULARIZATION_LOSSES của TensorFlow. Nếu mô-đun có nhiều biến thể biểu đồ, hãy đảm bảo chọn một biến thể thích hợp để đào tạo. Thông thường, đó là thẻ có thẻ {"train"} .

Chọn một chế độ tập luyện không làm hỏng các mức tạ đã tập trước, chẳng hạn, tỷ lệ học tập thấp hơn so với tập luyện từ đầu.

Dành cho nhà xuất bản

Để giúp người tiêu dùng điều chỉnh dễ dàng hơn, hãy lưu ý những điều sau:

  • Tinh chỉnh cần chính quy. Mô-đun của bạn được xuất với bộ sưu tập REGULARIZATION_LOSSES , là bộ sưu tập đưa lựa chọn tf.layers.dense(..., kernel_regularizer=...) v.v ... vào những gì người tiêu dùng nhận được từ tf.losses.get_regularization_losses() . Thích cách xác định tổn thất chính quy L1 / L2 này.

  • Trong mô hình nhà xuất bản, tránh xác định chính quy L1 / L2 thông qua các tham số l1_l2_regularization_strength của tf.train.FtrlOptimizer , tf.train.ProximalGradientDescentOptimizer và các trình tối ưu hóa vùng lân cận khác. Chúng không được xuất cùng với mô-đun và việc thiết lập các cường độ chính quy hóa trên toàn cầu có thể không phù hợp với người tiêu dùng. Ngoại trừ việc chính quy hóa L1 trong các mô hình rộng (tức là tuyến tính thưa thớt) hoặc rộng và sâu, có thể sử dụng các tổn thất chính quy riêng lẻ để thay thế.

  • Nếu bạn sử dụng kỹ thuật bỏ qua, chuẩn hóa hàng loạt hoặc các kỹ thuật đào tạo tương tự, hãy đặt siêu tham số của chúng thành các giá trị có ý nghĩa trong nhiều mục đích sử dụng được mong đợi. Tỷ lệ bỏ học có thể phải được điều chỉnh theo xu hướng ăn mặc quá sức của vấn đề mục tiêu. Trong chuẩn hóa hàng loạt, động lượng (hay còn gọi là hệ số phân rã) phải đủ nhỏ để có thể tinh chỉnh với các tập dữ liệu nhỏ và / hoặc các lô lớn. Đối với người tiêu dùng cao cấp, hãy cân nhắc thêm một chữ ký thể hiện khả năng kiểm soát đối với các siêu thông số quan trọng.