Giới thiệu
TensorFlow Hub lưu trữ SavedModels cho TensorFlow 2, cùng với các tài nguyên khác. Chúng có thể được tải lại vào chương trình Python bằng obj = hub.load(url) [ tìm hiểu thêm ]. Đối obj được trả về là kết quả của tf.saved_model.load() (xem hướng dẫn về SavedModel của TensorFlow). Đối tượng này có thể có các thuộc tính tùy ý là tf.functions, tf.Variables (được khởi tạo từ các giá trị đã được huấn luyện trước), các tài nguyên khác và, một cách đệ quy, nhiều đối tượng tương tự hơn nữa.
Trang này mô tả một giao diện cần được triển khai bởi obj đã tải để có thể tái sử dụng trong chương trình TensorFlow Python. Các SavedModel tuân thủ giao diện này được gọi là SavedModel có thể tái sử dụng .
Việc tái sử dụng có nghĩa là xây dựng một mô hình lớn hơn xung quanh obj , bao gồm cả khả năng tinh chỉnh nó. Tinh chỉnh có nghĩa là huấn luyện thêm các trọng số trong obj đã được tải như một phần của mô hình xung quanh. Hàm mất mát và bộ tối ưu hóa được xác định bởi mô hình xung quanh; obj chỉ định nghĩa ánh xạ từ các kích hoạt đầu vào đến đầu ra (quá trình "truyền tiến"), có thể bao gồm các kỹ thuật như dropout hoặc chuẩn hóa theo lô.
Nhóm TensorFlow Hub khuyến nghị triển khai giao diện Reusable SavedModel trong tất cả các SavedModel được thiết kế để tái sử dụng theo nghĩa nêu trên. Nhiều tiện ích từ thư viện tensorflow_hub , đặc biệt là hub.KerasLayer , yêu cầu SavedModel phải triển khai giao diện này.
Mối liên hệ với SignatureDefs
Giao diện này, xét về tf.functions và các tính năng khác của TF2, hoàn toàn tách biệt với các chữ ký của SavedModel, vốn đã có từ TF1 và tiếp tục được sử dụng trong TF2 để suy luận (chẳng hạn như triển khai SavedModels lên TF Serving hoặc TF Lite). Các chữ ký dùng cho suy luận không đủ khả năng diễn đạt để hỗ trợ tinh chỉnh, và tf.function cung cấp một API Python tự nhiên và dễ diễn đạt hơn cho mô hình được tái sử dụng.
Mối liên hệ với thư viện xây dựng mô hình
Mô hình đã lưu có thể tái sử dụng chỉ sử dụng các thành phần cơ bản của TensorFlow 2, độc lập với bất kỳ thư viện xây dựng mô hình cụ thể nào như Keras hoặc Sonnet. Điều này tạo điều kiện thuận lợi cho việc tái sử dụng giữa các thư viện xây dựng mô hình, không phụ thuộc vào mã xây dựng mô hình ban đầu.
Cần có một số điều chỉnh để tải các SavedModel có thể tái sử dụng vào hoặc lưu chúng từ bất kỳ thư viện xây dựng mô hình nào. Đối với Keras, hub.KerasLayer cung cấp chức năng tải, và chức năng lưu tích hợp sẵn của Keras ở định dạng SavedModel đã được thiết kế lại cho TF2 với mục tiêu cung cấp một tập hợp con của giao diện này (xem RFC từ tháng 5 năm 2019).
Mối liên hệ với các "API SavedModel chung" dành riêng cho từng tác vụ
Định nghĩa giao diện trên trang này cho phép bất kỳ số lượng và loại đầu vào và đầu ra nào. Các API Common SavedModel dành cho TF Hub tinh chỉnh giao diện tổng quát này với các quy ước sử dụng cho các tác vụ cụ thể để giúp các mô hình dễ dàng hoán đổi cho nhau.
Định nghĩa giao diện
Thuộc tính
Một SavedModel có thể tái sử dụng là một SavedModel của TensorFlow 2 sao cho obj = tf.saved_model.load(...) trả về một đối tượng có các thuộc tính sau
__call__. Bắt buộc. Một tf.function thực hiện quá trình tính toán của mô hình ("lượt truyền tiến") tuân theo các thông số kỹ thuật bên dưới.variables: Một danh sách các đối tượng tf.Variable, liệt kê tất cả các biến được sử dụng bởi bất kỳ lời gọi nào của__call__, bao gồm cả các biến có thể huấn luyện và không thể huấn luyện.Danh sách này có thể được bỏ qua nếu trống.
trainable_variables: Một danh sách các đối tượng tf.Variable sao chov.trainablelà true cho tất cả các phần tử. Các biến này phải là một tập con củavariables. Đây là các biến sẽ được huấn luyện khi tinh chỉnh đối tượng. Người tạo SavedModel có thể chọn bỏ qua một số biến ở đây mà ban đầu có thể huấn luyện được để chỉ ra rằng chúng không nên được sửa đổi trong quá trình tinh chỉnh.Danh sách này có thể được bỏ qua nếu trống, đặc biệt là nếu SavedModel không hỗ trợ tinh chỉnh.
regularization_losses: Một danh sách các tf.function, mỗi hàm không nhận đầu vào và trả về một tensor float vô hướng duy nhất. Để tinh chỉnh, người dùng SavedModel nên thêm các hàm này như các thuật ngữ điều chỉnh bổ sung vào hàm mất mát (trong trường hợp đơn giản nhất mà không cần điều chỉnh tỷ lệ thêm). Thông thường, chúng được sử dụng để biểu diễn các bộ điều chỉnh trọng số. (Do thiếu đầu vào, các tf.function này không thể biểu diễn các bộ điều chỉnh hoạt động.)Danh sách này có thể được bỏ qua nếu trống, đặc biệt là nếu SavedModel không hỗ trợ tinh chỉnh hoặc không muốn quy định việc điều chỉnh trọng số.
Hàm __call__
Một đối obj SavedModel được khôi phục có thuộc tính obj.__call__ là một tf.function được khôi phục và cho phép gọi obj như sau.
Tóm tắt (mã giả):
outputs = obj(inputs, trainable=..., **kwargs)
Lập luận
Các lập luận như sau.
Có một tham số vị trí bắt buộc với một loạt các kích hoạt đầu vào của SavedModel. Kiểu của nó là một trong số đó.
- một Tensor duy nhất cho một đầu vào duy nhất.
- một danh sách các Tensor cho một chuỗi đầu vào không tên được sắp xếp theo thứ tự.
- Một từ điển các Tensor được khóa bằng một tập hợp các tên đầu vào cụ thể.
(Các phiên bản sửa đổi trong tương lai của giao diện này có thể cho phép lồng nhau tổng quát hơn.) Người tạo SavedModel chọn một trong số đó cùng với hình dạng và kiểu dữ liệu của tensor. Khi cần thiết, một số chiều của hình dạng nên được để không xác định (đặc biệt là kích thước lô).
Có thể có một đối số từ khóa tùy chọn `
trainingchấp nhận giá trị boolean của Python,TruehoặcFalse. Mặc định làFalse. Nếu mô hình hỗ trợ tinh chỉnh (fine-tuning), và nếu phương pháp tính toán khác nhau giữa hai trường hợp (ví dụ: như trong dropout và batch normalization), sự khác biệt đó được thực hiện bằng đối số này. Ngược lại, đối số này có thể không cần thiết.Không bắt buộc hàm
__call__phải chấp nhận đối sốtrainingcó giá trị Tensor. Người gọi phải sử dụngtf.cond()nếu cần thiết để điều phối giữa chúng.Người tạo SavedModel có thể chọn chấp nhận thêm các đối số tùy chọn
kwargscó tên cụ thể.Đối với các đối số có giá trị Tensor, người tạo SavedModel xác định các kiểu dữ liệu và hình dạng được cho phép của chúng.
tf.functionchấp nhận một giá trị mặc định của Python trên một đối số được theo dõi bằng đầu vào tf.TensorSpec. Các đối số như vậy có thể được sử dụng để cho phép tùy chỉnh các siêu tham số số liên quan đến__call__(ví dụ: tỷ lệ dropout).Đối với các đối số có giá trị kiểu Python, người tạo SavedModel sẽ định nghĩa các giá trị cho phép của chúng. Các đối số như vậy có thể được sử dụng như các cờ để đưa ra các lựa chọn riêng biệt trong hàm được theo dõi (nhưng hãy lưu ý đến sự bùng nổ tổ hợp của các dấu vết).
Hàm __call__ được khôi phục phải cung cấp dấu vết cho tất cả các tổ hợp đối số được cho phép. Việc chuyển đổi training giữa True và False không được làm thay đổi tính hợp lệ của các đối số.
Kết quả
outputs từ việc gọi obj có thể là:
- một Tensor duy nhất cho một đầu ra duy nhất.
- một danh sách các Tensor cho một chuỗi các đầu ra không tên được sắp xếp theo thứ tự.
- Một từ điển các Tensor được khóa bằng một tập hợp các tên đầu ra cụ thể.
(Các phiên bản sửa đổi trong tương lai của giao diện này có thể cho phép lồng ghép tổng quát hơn.) Kiểu dữ liệu trả về có thể thay đổi tùy thuộc vào các đối số kwargs có giá trị Python. Điều này cho phép các cờ tạo ra các đầu ra bổ sung. Trình tạo SavedModel xác định các kiểu dữ liệu và hình dạng đầu ra cũng như sự phụ thuộc của chúng vào đầu vào.
Các hàm có thể gọi được đặt tên
Một SavedModel có thể tái sử dụng có thể cung cấp nhiều thành phần mô hình theo cách được mô tả ở trên bằng cách đặt chúng vào các đối tượng con được đặt tên, ví dụ: obj.foo , obj.bar , v.v. Mỗi đối tượng con cung cấp một phương thức __call__ và các thuộc tính hỗ trợ về các biến, v.v., cụ thể cho thành phần mô hình đó. Đối với ví dụ trên, sẽ có obj.foo.__call__ , obj.foo.variables , v.v.
Lưu ý rằng giao diện này không bao gồm phương pháp thêm trực tiếp một tf.function trần dưới dạng tf.foo .
Người dùng của Reusable SavedModels chỉ cần xử lý một cấp độ lồng nhau ( obj.bar nhưng không phải obj.bar.baz ). (Các phiên bản sửa đổi trong tương lai của giao diện này có thể cho phép lồng nhau sâu hơn và có thể bỏ qua yêu cầu đối tượng cấp cao nhất phải tự gọi được.)
Lời bế mạc
Mối liên hệ với các API đang xử lý
Tài liệu này mô tả giao diện của một lớp Python bao gồm các kiểu dữ liệu cơ bản như `tf.function` và `tf.Variable`, những kiểu dữ liệu này vẫn tồn tại sau quá trình tuần tự hóa thông qua tf.saved_model.save() và tf.saved_model.load() . Tuy nhiên, giao diện này đã có sẵn trên đối tượng gốc được truyền vào tf.saved_model.save() . Việc điều chỉnh giao diện đó cho phép trao đổi các thành phần của mô hình giữa các API xây dựng mô hình trong cùng một chương trình TensorFlow.