Сохранить и загрузить модели

TensorFlow.js обеспечивает функциональные возможности для сохранения и загрузки моделей , которые были созданы с помощью Layers API или преобразованы из существующих моделей TensorFlow. Это могут быть модели, которые вы обучили сами, или модели, обученные другими. Ключевым преимуществом использования Layers api является то, что модели, созданные с его помощью, можно сериализовать, и это то, что мы исследуем в этом руководстве.

В этом руководстве основное внимание уделяется сохранению и загрузке моделей TensorFlow.js (идентифицируемых по файлам JSON). Мы также можем импортировать модели TensorFlow Python. Загрузка этих моделей описана в следующих двух руководствах:

Сохраните tf.Model

tf.Model и tf.Sequential оба обеспечивают функцию model.save , которые позволяют сохранить топологию и вес модели.

  • Топология: это файл, описывающий архитектуру модели (то есть, какие операции она использует). Он содержит ссылки на веса моделей, которые хранятся извне.

  • Веса: это двоичные файлы, которые хранят веса данной модели в эффективном формате. Обычно они хранятся в той же папке, что и топология.

Давайте посмотрим, как выглядит код для сохранения модели.

const saveResult = await model.save('localstorage://my-model-1');

Несколько замечаний:

  • save метод принимает URL, как строковый аргумент , который начинается с схемой. Это описывает тип места назначения, в которое мы пытаемся сохранить модель. В приведенном выше примере схемы является localstorage://
  • Схема следуют пути. В приведенном выше примере пути является my-model-1 .
  • save метод асинхронно.
  • Возвращаемое значение model.save является объектом JSON , который несет в себе информацию , такие как размеры байт топологии и вес модели.
  • Среда, используемая для сохранения модели, не влияет на то, какие среды могут загружать модель. Сохранение модели в node.js не препятствует ее загрузке в браузере.

Ниже мы рассмотрим различные доступные схемы.

Локальное хранилище (только браузер)

Схема: localstorage://

await model.save('localstorage://my-model');

Это экономит модель под названием my-model в браузере локального хранилища . Это будет сохраняться между обновлениями, хотя локальное хранилище может быть очищено пользователями или самим браузером, если пространство становится проблемой. Каждый браузер также устанавливает собственное ограничение на объем данных, которые могут храниться в локальном хранилище для данного домена.

IndexedDB (только браузер)

Схема: indexeddb://

await model.save('indexeddb://my-model');

Это экономит модель для браузера IndexedDB хранения. Как и в локальном хранилище, оно сохраняется между обновлениями, но также имеет тенденцию иметь большие ограничения на размер хранимых объектов.

Загрузка файлов (только в браузере)

Схема: downloads://

await model.save('downloads://my-model');

Это заставит браузер загружать файлы модели на компьютер пользователя. Будут созданы два файла:

  1. Файл текст JSON с именем [my-model].json , которая несет в себе топологию и ссылку на файл весов ниже.
  2. Двоичный файл , несущее значение веса с именем [my-model].weights.bin .

Вы можете изменить имя [my-model] , чтобы получить файлы с другим именем.

Поскольку .json файл указывает на .bin , используя относительный путь, оба файла должны находиться в одной папке.

HTTP (S) запрос

Схема: http:// или https://

await model.save('http://model-server.domain/upload')

Это создаст веб-запрос для сохранения модели на удаленном сервере. Вы должны контролировать этот удаленный сервер, чтобы быть уверенным, что он сможет обработать запрос.

Модель будет отправлена на указанный сервер HTTP через POST запрос. Тело POST находится в multipart/form-data формата и состоит из двух файлов

  1. Файл текста JSON с именем model.json , который несет в себе топологию и ссылку на файл весы ниже.
  2. Двоичный файл , несущий весовые значения имени model.weights.bin .

Обратите внимание, что имена двух файлов всегда будут точно такими, как указано выше (имя встроено в функцию). Этот апи документ содержит фрагмент кода Python , который демонстрирует , как можно использовать колбу веб - фреймворк для обработки запроса возник из save .

Часто вам придется передать дополнительные аргументы или заголовки запросов на ваш HTTP-сервер (например, для аутентификации или если вы хотите указать папку, в которой должна быть сохранена модель). Вы можете получить мелкозернистый контроль над этими аспектами просьбы save , заменив URL строкового аргумента в tf.io.browserHTTPRequest . Этот API обеспечивает большую гибкость в управлении HTTP-запросами.

Например:

await model.save(tf.io.browserHTTPRequest(
    'http://model-server.domain/upload',
    {method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));

Собственная файловая система (только для Node.js)

Схема: file://

await model.save('file:///path/to/my-model');

При работе на Node.js у нас также есть прямой доступ к файловой системе и мы можем сохранять туда модели. Команда выше сохранит два файла на path указанного АВЭСА в scheme .

  1. Файл текст JSON с именем [model].json , которая несет в себе топологию и ссылку на файл весов ниже.
  2. Двоичный файл , несущий весовые значения именованных [model].weights.bin .

Обратите внимание, что имена двух файлов всегда будут точно такими, как указано выше (имя встроено в функцию).

Загрузка tf.Model

Учитывая модель , которая была сохранена одним из указанных выше способов, мы можем загрузить его с помощью tf.loadLayersModel API.

Давайте посмотрим, как выглядит код для загрузки модели.

const model = await tf.loadLayersModel('localstorage://my-model-1');

Несколько замечаний:

  • Как model.save() , то loadLayersModel функция принимает URL-строки , как аргумент , который начинается с схемой. Это описывает тип места назначения, из которого мы пытаемся загрузить модель.
  • Схема следуют пути. В приведенном выше примере пути является my-model-1 .
  • Строка, похожая на URL-адрес, может быть заменена объектом, который соответствует интерфейсу IOHandler.
  • tf.loadLayersModel() функция является асинхронным.
  • Возвращаемое значение tf.loadLayersModel является tf.Model

Ниже мы рассмотрим различные доступные схемы.

Локальное хранилище (только браузер)

Схема: localstorage://

const model = await tf.loadLayersModel('localstorage://my-model');

Это загружает модель под названием my-model из браузера локального хранилища .

IndexedDB (только браузер)

Схема: indexeddb://

const model = await tf.loadLayersModel('indexeddb://my-model');

Это загружает модель из браузера IndexedDB хранения.

HTTP (S)

Схема: http:// или https://

const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');

Это загружает модель из конечной точки http. После загрузки json файла функция будет делать запросы на соответствующие .bin файлов в json ссылки на файлы.

Собственная файловая система (только для Node.js)

Схема: file://

const model = await tf.loadLayersModel('file://path/to/my-model/model.json');

При работе на Node.js у нас также есть прямой доступ к файловой системе и возможность загружать модели оттуда. Обратите внимание, что в приведенном выше вызове функции мы ссылаемся на сам файл model.json (тогда как при сохранении мы указываем папку). Соответствующий .bin файл (ы) должен быть в той же папке, что и json файла.

Загрузка моделей с обработчиками ввода-вывода

Если схемы выше, не являются достаточными для ваших потребностей вы можете реализовать пользовательское поведение загрузки с IOHandler . Один IOHandler что TensorFlow.js обеспечивает является tf.io.browserFiles , которая позволяет пользователям браузера загружать файлы модели в браузере. Смотрите документацию для получения дополнительной информации.

Сохранение и загрузка моделей с пользовательскими обработчиками ввода-вывода

Если схемы выше, не являются достаточными для загрузки или сохранения потребностей вы можете реализовать пользовательское поведение сериализации путем реализации IOHandler .

IOHandler является объектом с save и load методой.

save функция принимает один параметр , который является соответствует ModelArtifacts интерфейс и должен вернуть обещание , что разрешается в SaveResult объекта.

load функция не принимает никаких параметров и должны возвращать обещание , которое разрешается в ModelArtifacts опротестовать. Это тот же самый объект , который передается save .

См BrowserHTTPRequest для примера того , как реализовать IOHandler.