Lưu và tải mô hình

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.Modeltf.Sequential đều cung cấp hàm model.save cho phép bạn lưu cấu trúc liên kếttrọ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:

  1. 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.
  2. 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

  1. 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.
  2. Một tệp nhị phân mang các giá trị trọng lượng 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 .

  1. Tệp JSON văn bản có tên [model].json , mang 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.
  2. 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àm loadLayersModel 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ố gắng 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.loadLayersModeltf.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 để cho biết thêm thông tin chi tiết.

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 saveload .

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.