Đị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 Hub TF1 trong TF1 (hoặc chế độ tương thích TF1 của TF2) với lớp hub.Module và các API liên quan. (Cách sử dụng thông thường là xây dựng một 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 TF1 Hub với tf.compat.layers hoặc tf.layers ).

Người dùng TensorFlow 2 (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 SavingModel mới nhưng cũng hỗ trợ hạn chế việc tải định dạng TF1 Hub vào TF2 .

Sử dụng mô hình ở định dạng TF1 Hub

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

Một mô hình ở định dạng Hub 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")

Lưu ý: Xem thêm thông tin về các loại xử lý hợp lệ khác tại đây .

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

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

Khi tạo mô-đun từ một URL, nội dung mô-đun sẽ được tải xuống và lưu vào bộ đệ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 trữ có thể được ghi đè bằ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ô-đun m có thể được gọi bằng 0 hoặc nhiều lần giống như 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 biểu đồ 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ì chúng sẽ được chia sẻ giữa tất cả các ứng dụng.

Các 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ó tới đối số signature= tùy chọn.

Nếu chữ ký có nhiều đầu vào, chúng phải được chuyển dưới dạng lệnh, với các khóa được xác định bởi chữ ký. Tương tự, nếu chữ ký có nhiều đầu ra, thì những đầu ra này có thể được truy xuất dưới dạng lệnh bằng cách chuyể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 áp dụng Mô-đun chung nhất sẽ như sau:

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ả đầ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ả đầu ra của mô-đun. TensorFlow sẽ chỉ chạy những phần của mô-đun kết thúc dưới dạng 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 nhiều đầ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 khéo léo.

Đang thử các mô-đun thay thế

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

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

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

Ghi chú tương thích

Định dạng TF1 Hub hướng tới TensorFlow 1. Nó chỉ được TF Hub hỗ trợ một phần trong TensorFlow 2. Thay vào đó, vui lòng xem xét xuất bản ở định dạng TF2 SavingModel mới.

Định dạng TF1 Hub tương tự như định dạng SavingModel 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 nhau về mặt ngữ nghĩa để cho phép tái sử dụng, tổng hợp và đào tạo lại mô-đun (ví dụ: lưu trữ các trình khởi tạo tài nguyên khác nhau, gắn thẻ khác nhau quy ước về siêu hình). 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() bằng hàm module_fn . Hàm này xây dựng một biểu đồ biểu thị cấu trúc bên trong của mô-đun, sử dụng tf.placeholder() cho các đầu vào do người gọi cung cấp. 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ì đường dẫn để khởi tạo một đối tượng mô-đun trong một biểu đồ TensorFlow cụ thể. Trong trường hợp như vậy, không có điểm kiểm tra và thay vào đó, phiên bản mô-đun sẽ sử dụng bộ khởi tạo biến.

Bất kỳ phiên bản 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 sẽ 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ô-đun lần đầu tiên cũng như khi xuất mô-đun được tinh chỉnh.

Để tương thích với Công cụ ước tính TensorFlow, hub.LatestModuleExporter xuất các 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 nhà xuất khẩu 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 tạo ra nhiều 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 chỉnh sửa chất lượng đơn giản hơn và chỉ khi nhà xuất bản mô-đun đề xuất điều đó.

Dành cho 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ể huấn luyện được 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ể phù hợp cho việc đà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 mức tạ đã được tập luyện trước, chẳng hạn như 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 dễ dàng điều chỉnh hơn, vui lòng lưu ý những điều sau:

  • Tinh chỉnh cần chính quy. Mô-đun của bạn được xuất cùng với bộ sưu tập REGULARIZATION_LOSSES , đây là bộ sưu tập đặt sự lựa chọn của bạn về 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 gần nhất khác. Chúng không được xuất cùng với mô-đun và việc đặt 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, thay vào đó có thể sử dụng các tổn thất chính quy riêng lẻ.

  • Nếu bạn sử dụng phương pháp bỏ học, 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 dự kiến. Tỷ lệ bỏ học có thể phải được điều chỉnh theo xu hướng trang bị quá mức của vấn đề mục tiêu. Trong quá trình chuẩn hóa hàng loạt, động lượng (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 việc thêm chữ ký để thể hiện quyền kiểm soát đối với các siêu tham số quan trọng.