TensorFlow.js cung cấp chức năng lưu và tải các mô hình đã được tạo bằng API Layers
hoặc được chuyển đổi từ các mô hình TensorFlow hiện có. Đây có thể là những mô hình bạn tự đào tạo hoặc những mô hình được người khác đào tạo. Lợi ích chính của việc sử dụng API Lớp là các mô hình được tạo bằng nó có thể tuần tự hóa và đây là những gì chúng ta sẽ khám phá trong hướng dẫn này.
Hướng dẫn này sẽ tập trung vào việc lưu và tải các mô hình TensorFlow.js (có thể nhận dạng bằng các tệp JSON). Chúng tôi cũng có thể nhập các mô hình TensorFlow Python. Việc tải các mô hình này được đề cập trong hai hướng dẫn sau:
Lưu một tf.Model
tf.Model
và tf.Sequential
đều cung cấp hàm model.save
cho phép bạn lưu cấu trúc liên kết và trọng số của mô hình.
Cấu trúc liên kết: Đây là một tệp mô tả kiến trúc của một mô hình (tức là nó sử dụng những thao tác nào). Nó chứa các tham chiếu đến trọng lượng của mô hình được lưu trữ bên ngoài.
Trọng số: Đây là các tệp nhị phân lưu trữ trọng số của một mô hình nhất định ở định dạng hiệu quả. Chúng thường được lưu trữ trong cùng thư mục với cấu trúc liên kết.
Chúng ta hãy xem mã để lưu một mô hình trông như thế nào
const saveResult = await model.save('localstorage://my-model-1');
Một số điều cần lưu ý:
- Phương thức
save
lấy một đối số chuỗi giống URL bắt đầu bằng một lược đồ . Điều này mô tả loại đích đến mà chúng tôi đang cố lưu mô hình vào. Trong ví dụ trên, lược đồ làlocalstorage://
- Đề án được theo sau bởi một con đường . Trong ví dụ trên, đường dẫn là
my-model-1
. - Phương thức
save
không đồng bộ. - Giá trị trả về của
model.save
là một đối tượng JSON mang thông tin như kích thước byte của cấu trúc liên kết và trọng số của mô hình. - Môi trường được sử dụng để lưu mô hình không ảnh hưởng đến môi trường nào có thể tải mô hình. Việc lưu mô hình trong node.js không ngăn mô hình đó được tải trong trình duyệt.
Dưới đây chúng tôi sẽ kiểm tra các chương trình khác nhau có sẵn.
Bộ nhớ cục bộ (Chỉ trình duyệt)
Lược đồ: localstorage://
await model.save('localstorage://my-model');
Thao tác này sẽ lưu một mô hình dưới tên my-model
vào bộ nhớ cục bộ của trình duyệt. Điều này sẽ tiếp tục xảy ra giữa các lần làm mới, mặc dù người dùng hoặc chính trình duyệt có thể xóa bộ nhớ cục bộ nếu không gian trống trở thành mối lo ngại. Mỗi trình duyệt cũng đặt giới hạn riêng về lượng dữ liệu có thể được lưu trữ trong bộ nhớ cục bộ cho một miền nhất định.
IndexedDB (Chỉ dành cho trình duyệt)
Lược đồ: indexeddb://
await model.save('indexeddb://my-model');
Thao tác này sẽ lưu mô hình vào bộ lưu trữ IndexedDB của trình duyệt. Giống như bộ nhớ cục bộ, nó vẫn tồn tại giữa các lần làm mới, nó cũng có xu hướng có giới hạn lớn hơn về kích thước của các đối tượng được lưu trữ.
Tải xuống tệp (Chỉ trình duyệt)
Sơ đồ: downloads://
await model.save('downloads://my-model');
Điều này sẽ khiến trình duyệt tải các tệp mô hình xuống máy của người dùng. Hai tập tin sẽ được tạo ra:
- Tệp JSON văn bản có tên
[my-model].json
, chứa cấu trúc liên kết và tham chiếu đến tệp trọng số được mô tả bên dưới. - Một tệp nhị phân mang các giá trị trọng số có tên
[my-model].weights.bin
.
Bạn có thể thay đổi tên [my-model]
để nhận các tệp có tên khác.
Vì tệp .json
trỏ đến .bin
bằng đường dẫn tương đối nên hai tệp này phải nằm trong cùng một thư mục.
Yêu cầu HTTP(S)
Lược đồ: http://
hoặc https://
await model.save('http://model-server.domain/upload')
Điều này sẽ tạo một yêu cầu web để lưu mô hình vào máy chủ từ xa. Bạn phải kiểm soát máy chủ từ xa đó để có thể đảm bảo rằng nó có thể xử lý yêu cầu.
Mô hình sẽ được gửi đến máy chủ HTTP được chỉ định thông qua yêu cầu POST . Phần thân của POST có định dạng multipart/form-data
và bao gồm hai tệp
- Tệp JSON văn bản có tên
model.json
, chứa cấu trúc liên kết và tham chiếu đến tệp trọng số được mô tả bên dưới. - Một tệp nhị phân mang các giá trị trọng số có tên
model.weights.bin
.
Lưu ý tên của 2 file sẽ luôn chính xác như đã chỉ định ở trên (tên được tích hợp sẵn trong hàm). Tài liệu api này chứa đoạn mã Python minh họa cách người ta có thể sử dụng khung web bình để xử lý yêu cầu bắt nguồn từ save
.
Thông thường, bạn sẽ phải chuyển nhiều đối số hoặc tiêu đề yêu cầu hơn tới máy chủ HTTP của mình (ví dụ: để xác thực hoặc nếu bạn muốn chỉ định thư mục mà mô hình sẽ được lưu vào đó). Bạn có thể giành quyền kiểm soát chi tiết đối với các khía cạnh này của yêu cầu từ save
bằng cách thay thế đối số chuỗi URL trong tf.io.browserHTTPRequest
. API này mang lại sự linh hoạt cao hơn trong việc kiểm soát các yêu cầu HTTP.
Ví dụ:
await model.save(tf.io.browserHTTPRequest(
'http://model-server.domain/upload',
{method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));
Hệ thống tệp gốc (chỉ Node.js)
Lược đồ: file://
await model.save('file:///path/to/my-model');
Khi chạy trên Node.js, chúng ta cũng có quyền truy cập trực tiếp vào hệ thống tệp và có thể lưu các mô hình ở đó. Lệnh trên sẽ lưu hai tệp vào path
được chỉ định sau scheme
.
- Tệp JSON văn bản có tên
[model].json
, chứa cấu trúc liên kết và tham chiếu đến tệp trọng số được mô tả bên dưới. - Một tệp nhị phân mang các giá trị trọng số có tên
[model].weights.bin
.
Lưu ý tên của 2 file sẽ luôn chính xác như đã chỉ định ở trên (tên được tích hợp sẵn trong hàm).
Đang tải tf.Model
Với một mô hình đã được lưu bằng một trong các phương pháp trên, chúng ta có thể tải mô hình đó bằng API tf.loadLayersModel
.
Chúng ta hãy xem mã để tải một mô hình trông như thế nào
const model = await tf.loadLayersModel('localstorage://my-model-1');
Một số điều cần lưu ý:
- Giống như
model.save()
, hàmloadLayersModel
nhận một đối số chuỗi giống URL bắt đầu bằng một lược đồ . Điều này mô tả loại đích mà chúng tôi đang cố tải mô hình từ đó. - Đề án được theo sau bởi một con đường . Trong ví dụ trên, đường dẫn là
my-model-1
. - Chuỗi giống url có thể được thay thế bằng một đối tượng phù hợp với giao diện IOHandler.
- Hàm
tf.loadLayersModel()
không đồng bộ. - Giá trị trả về của
tf.loadLayersModel
làtf.Model
Dưới đây chúng tôi sẽ kiểm tra các chương trình khác nhau có sẵn.
Bộ nhớ cục bộ (Chỉ trình duyệt)
Lược đồ: localstorage://
const model = await tf.loadLayersModel('localstorage://my-model');
Thao tác này sẽ tải một mô hình có tên my-model
từ bộ nhớ cục bộ của trình duyệt.
IndexedDB (Chỉ dành cho trình duyệt)
Lược đồ: indexeddb://
const model = await tf.loadLayersModel('indexeddb://my-model');
Thao tác này sẽ tải mô hình từ bộ lưu trữ IndexedDB của trình duyệt.
HTTP(S)
Lược đồ: http://
hoặc https://
const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');
Thao tác này sẽ tải mô hình từ điểm cuối http. Sau khi tải tệp json
hàm sẽ đưa ra yêu cầu cho các tệp .bin
tương ứng mà tệp json
tham chiếu.
Hệ thống tệp gốc (chỉ Node.js)
Lược đồ: file://
const model = await tf.loadLayersModel('file://path/to/my-model/model.json');
Khi chạy trên Node.js, chúng ta cũng có quyền truy cập trực tiếp vào hệ thống tệp và có thể tải các mô hình từ đó. Lưu ý rằng trong lệnh gọi hàm ở trên, chúng tôi tham chiếu chính tệp model.json (trong khi khi lưu, chúng tôi chỉ định một thư mục). (Các) tệp .bin
tương ứng phải nằm trong cùng thư mục với tệp json
.
Đang tải mô hình bằng IOHandlers
Nếu các sơ đồ trên không đủ cho nhu cầu của bạn, bạn có thể triển khai hành vi tải tùy chỉnh bằng IOHandler
. Một IOHandler
mà TensorFlow.js cung cấp là tf.io.browserFiles
cho phép người dùng trình duyệt tải các tệp mô hình lên trình duyệt. Xem tài liệu để biết thêm thông tin.
Lưu và tải mô hình bằng IOHhandlers tùy chỉnh
Nếu các sơ đồ trên không đủ cho nhu cầu tải hoặc lưu của bạn, bạn có thể triển khai hành vi tuần tự hóa tùy chỉnh bằng cách triển khai IOHandler
.
IOHandler
là một đối tượng có phương thức save
và load
.
Hàm save
lấy một tham số phù hợp với giao diện ModelArtifacts và sẽ trả về một lời hứa phân giải thành đối tượng SaveResult .
Hàm load
không có tham số và sẽ trả về một lời hứa phân giải thành đối tượng ModelArtifacts . Đây chính là đối tượng được truyền vào save
.
Xem BrowserHTTPRequest để biết ví dụ về cách triển khai IOHandler.