tensorflowjs_converter: установка и использование

Для работы с TensorFlow.js и конвертации моделей из Python необходимо установить пакет tensorflowjs. В среде Node.js это делается через npm:

npm install @tensorflow/tfjs
npm install -g tensorflowjs

Пакет @tensorflow/tfjs обеспечивает возможность создавать, обучать и запускать модели непосредственно в браузере или в Node.js. Утилита tensorflowjs_converter позволяет преобразовывать модели из форматов TensorFlow SavedModel, Keras HDF5 и других в формат, совместимый с TensorFlow.js.

После установки доступ к утилите осуществляется через командную строку:

tensorflowjs_converter --help

Вывод команды показывает все доступные параметры конвертации, включая указание формата исходной модели, пути к директории с моделью и назначения.


Основные форматы моделей и поддерживаемые типы

TensorFlow.js поддерживает три ключевых формата исходных моделей:

  1. Keras HDF5 (.h5) Модели, созданные с помощью Keras, могут быть напрямую преобразованы в формат TensorFlow.js. Пример конвертации:

    tensorflowjs_converter \
      --input_format=keras \
      model.h5 \
      tfjs_model

    В результате в директории tfjs_model создаются файлы model.json и бинарные файлы с весами (*.bin).

  2. TensorFlow SavedModel Формат, используемый в TensorFlow для сохранения графа и весов. Поддерживает как CPU, так и GPU-версии. Конвертация:

    tensorflowjs_converter \
      --input_format=tf_saved_model \
      --output_format=tfjs_graph_model \
      saved_model_dir \
      tfjs_model

    Здесь tfjs_graph_model — это формат, оптимизированный для выполнения графа в браузере.

  3. TF Hub Modules Некоторые модели можно загружать напрямую из TensorFlow Hub, после чего конвертировать с помощью команды, аналогичной SavedModel.

Ключевые параметры конвертера:

  • --input_format — формат исходной модели (keras, tf_saved_model, tf_hub).
  • --output_format — формат выходной модели (tfjs_layers_model, tfjs_graph_model).
  • --quantization_bytes — позволяет уменьшить размер весов (1, 2, 4 байта), что полезно для веб-приложений.
  • --skip_op_check — пропуск проверки поддерживаемых операций, если модель содержит нестандартные слои.

Конвертация Keras-модели с оптимизацией

Для веб-приложений важна производительность и размер загружаемой модели. Пример конвертации с уменьшением точности весов до 2 байт:

tensorflowjs_converter \
  --input_format=keras \
  --output_format=tfjs_layers_model \
  --quantization_bytes=2 \
  model.h5 \
  tfjs_model

После конвертации структура папки выглядит следующим образом:

tfjs_model/
├── group1-shard1of1.bin
├── model.json

Файл model.json содержит описание слоев и пути к бинарным весам. Браузер загружает только JSON, после чего подгружает весовые файлы по мере необходимости.


Конвертация SavedModel с сохранением структуры графа

Для сложных моделей, использующих TensorFlow Operations, применяется графовый формат:

tensorflowjs_converter \
  --input_format=tf_saved_model \
  --output_format=tfjs_graph_model \
  saved_model/ \
  tfjs_graph_model/

Если модель содержит кастомные слои или операции, может потребоваться параметр --skip_op_check. В случае ошибок несовместимости слоев рекомендуется проверить наличие поддерживаемых операций на официальной странице документации TensorFlow.js.


Интеграция с браузером и Node.js

После конвертации модели подключаются через стандартные API TensorFlow.js:

В браузере:

import * as tf from '@tensorflow/tfjs';

async function loadModel() {
    const model = await tf.loadLayersModel('tfjs_model/model.json');
    return model;
}

В Node.js:

const tf = require('@tensorflow/tfjs-node');

async function loadModel() {
    const model = await tf.loadLayersModel('file://tfjs_model/model.json');
    return model;
}

Использование loadLayersModel применяется для моделей, конвертированных из Keras, тогда как loadGraphModel применяется для графовых моделей SavedModel.


Особенности и рекомендации

  • Размер модели: оптимизация веса через --quantization_bytes значительно сокращает загрузку для веб-клиента.
  • Совместимость слоев: некоторые слои TensorFlow не поддерживаются в TensorFlow.js. Для нестандартных слоев необходимо использовать кастомные функции или переписывать архитектуру.
  • Кеширование и lazy-loading: при работе с большими моделями рекомендуется загружать веса по частям и использовать tf.io.browserFiles для локальных файлов в браузере.
  • Обновление моделей: каждая конвертация создаёт новый формат JSON и веса, поэтому при изменении исходной модели требуется повторная конвертация.

Отладка и проверка модели после конвертации

После конвертации важно проверить корректность работы модели:

const input = tf.zeros([1, 224, 224, 3]);
const output = model.predict(input);
output.print();

Если выходные данные соответствуют ожиданиям, конвертация прошла успешно. Для графовых моделей можно использовать TensorFlow.js визуализаторы графов или интеграцию с TensorBoard через Node.js.


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