Преобразование модели

TensorFlow.js поставляется с множеством предварительно обученных моделей, готовых к использованию в браузере — их можно найти в нашем репозитории моделей . Однако вы могли найти или создать модель TensorFlow в другом месте, которую хотели бы использовать в своем веб-приложении. TensorFlow.js предоставляет для этой цели конвертер моделей. Преобразователь TensorFlow.js состоит из двух компонентов:

  1. Утилита командной строки, которая преобразует модели Keras и TensorFlow для использования в TensorFlow.js.
  2. API для загрузки и выполнения модели в браузере с помощью TensorFlow.js.

Преобразуйте свою модель

Конвертер TensorFlow.js работает с несколькими форматами моделей:

SavedModel : это формат по умолчанию, в котором сохраняются модели TensorFlow. Формат SavedModel задокументирован здесь .

Модель Keras: модели Keras обычно сохраняются в виде файла HDF5. Подробнее о сохранении моделей Keras можно прочитать здесь .

Модуль TensorFlow Hub : это модели, которые были упакованы для распространения на TensorFlow Hub, платформе для обмена и обнаружения моделей. Библиотеку моделей можно найти здесь .

В зависимости от того, какой тип модели вы пытаетесь преобразовать, вам потребуется передать преобразователю различные аргументы. Например, предположим, что вы сохранили модель Keras с именем model.h5 в каталоге tmp/ . Чтобы преобразовать вашу модель с помощью конвертера TensorFlow.js, вы можете запустить следующую команду:

$ tensorflowjs_converter --input_format=keras /tmp/model.h5 /tmp/tfjs_model

Это преобразует модель в /tmp/model.h5 и выводит файл model.json вместе с двоичными файлами веса в tmp/tfjs_model/ .

Подробнее об аргументах командной строки, соответствующих разным форматам модели, можно прочитать в файле README конвертера TensorFlow.js .

В процессе преобразования мы просматриваем граф модели и проверяем, поддерживается ли каждая операция TensorFlow.js. Если это так, мы записываем график в формат, который может использовать браузер. Мы пытаемся оптимизировать модель для обслуживания в Интернете, разбивая веса на файлы размером 4 МБ, чтобы браузеры могли кэшировать их. Мы также пытаемся упростить сам граф модели, используя проект Grappler с открытым исходным кодом. Упрощение графа включает в себя объединение смежных операций, устранение общих подграфов и т. д. Эти изменения не влияют на выходные данные модели. Для дальнейшей оптимизации пользователи могут передать аргумент, который указывает преобразователю квантовать модель до определенного размера в байтах. Квантование — это метод уменьшения размера модели за счет представления весов меньшим количеством битов. Пользователи должны следить за тем, чтобы их модель сохраняла приемлемую степень точности после квантования.

Если мы столкнемся с неподдерживаемой операцией во время преобразования, процесс завершится ошибкой, и мы распечатаем имя операции для пользователя. Не стесняйтесь сообщать о проблеме на нашем GitHub , чтобы сообщить нам об этом — мы пытаемся реализовать новые операции в ответ на запросы пользователей.

Лучшие практики

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

Запустите свою модель

После успешного преобразования вашей модели вы получите набор файлов веса и файл топологии модели. TensorFlow.js предоставляет API-интерфейсы загрузки модели, которые можно использовать для извлечения этих ресурсов модели и выполнения логического вывода в браузере.

Вот как выглядит API для конвертированного модуля TensorFlow SavedModel или TensorFlow Hub:

const model = await tf.loadGraphModel(‘path/to/model.json’);

А вот как это выглядит для конвертированной модели Keras:

const model = await tf.loadLayersModel(‘path/to/model.json’);

API tf.loadGraphModel возвращает tf.FrozenModel , что означает, что параметры фиксированы, и вы не сможете точно настроить свою модель с новыми данными. API tf.loadLayersModel возвращает tf.Model, которую можно обучить. Для получения информации о том, как обучить tf.Model, обратитесь к руководству по моделям поездов .

После преобразования рекомендуется несколько раз выполнить вывод и измерить скорость вашей модели. У нас есть отдельная страница бенчмаркинга, которую можно использовать для этой цели: https://tensorflow.github.io/tfjs/e2e/benchmarks/local-benchmark/index.html . Вы можете заметить, что мы отбрасываем измерения из начального прогрева — это связано с тем, что (в общем) первый вывод вашей модели будет в несколько раз медленнее, чем последующие выводы из-за накладных расходов на создание текстур и компиляцию шейдеров.