Конвертация моделей с помощью tensorflowjs_converter

TensorFlow.js предоставляет инструментарий для переноса моделей, обученных в Python с использованием TensorFlow или Keras, в формат, совместимый с JavaScript. Одним из ключевых инструментов является tensorflowjs_converter, который обеспечивает конвертацию моделей в формат TensorFlow.js, позволяя использовать их в браузере или на сервере Node.js.


Установка и подготовка

Для работы с tensorflowjs_converter требуется установленный Python и пакет TensorFlow.js. Установка производится через pip:

pip install tensorflowjs

После установки в системе становится доступна команда tensorflowjs_converter, позволяющая преобразовывать модели.


Поддерживаемые форматы моделей

tensorflowjs_converter умеет работать с различными типами моделей:

  1. Keras HDF5 (.h5) Полный файл модели, включающий структуру сети и веса. Пример: model.h5.

  2. SavedModel TensorFlow Формат, создаваемый функцией model.save('path') в TensorFlow 2.x. Содержит граф вычислений и веса модели.

  3. TF Hub Modules Поддерживается конвертация некоторых модулей из TensorFlow Hub в формат TensorFlow.js.

Ключевой момент: при конвертации важно учитывать, что некоторые операции и слои Keras могут не поддерживаться в TensorFlow.js. Необходимо проверять совместимость перед конвертацией.


Конвертация Keras модели в формат TensorFlow.js

Базовый синтаксис команды:

tensorflowjs_converter \
    --input_format=keras \
    path/to/model.h5 \
    path/to/tfjs_model
  • --input_format=keras указывает исходный формат модели.
  • path/to/model.h5 — путь к файлу модели Keras.
  • path/to/tfjs_model — путь, куда будут сохранены конвертированные файлы.

При успешной конвертации создается директория с:

  • model.json — описание архитектуры модели и метаданных.
  • group1-shard\*of\*.bin — бинарные файлы весов модели.

Конвертация модели TensorFlow SavedModel

Если модель сохранена в формате SavedModel, команда будет выглядеть так:

tensorflowjs_converter \
    --input_format=tf_saved_model \
    --output_format=tfjs_graph_model \
    path/to/saved_model \
    path/to/tfjs_model
  • --output_format=tfjs_graph_model создаёт модель в виде графа, пригодного для выполнения в браузере или Node.js.
  • Можно добавить параметр --signature_name=serving_default для указания конкретной сигнатуры входа-выхода.

Дополнительные параметры

--quantization_bytes — уменьшение размера модели через квантование весов. Примеры:

  • 1 — веса в 1 байт (8 бит), максимальная компрессия.
  • 2 — веса в 2 байта (16 бит).
  • 4 — без сжатия (32 бита, стандартный формат).

Пример использования:

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

--skip_op_check — пропуск проверки поддерживаемых операций, полезно при наличии экспериментальных слоёв.

--control_flow_v2 — включение поддержки динамического графа TensorFlow 2.x с контролем потока.


Типовые ошибки при конвертации

  1. Не найден Keras файл Убедиться, что указанный путь корректен и файл .h5 существует.

  2. Несовместимые слои Некоторые кастомные или редкие слои Keras не поддерживаются. В этом случае требуется либо их замена на стандартные, либо создание кастомного слоя в TensorFlow.js через tf.layers.Layer.

  3. Ошибка версий Конвертер работает корректно при совпадении версий TensorFlow в Python и TensorFlow.js. Желательно использовать последние стабильные версии.


Интеграция в проект Keras.js

После конвертации:

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

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

async function predict(inputData) {
    const model = await loadModel();
    const inputTensor = tf.tensor(inputData);
    const output = model.predict(inputTensor);
    return output.array();
}

Важные моменты:

  • tf.loadLayersModel используется для моделей, конвертированных из Keras.
  • Для моделей типа Graph (tfjs_graph_model) используется tf.loadGraphModel.
  • Все веса и структура модели загружаются асинхронно, необходимо использовать async/await для работы с моделью.

Практические советы

  • Перед конвертацией рекомендуется уменьшить размер модели через pruning или квантование, особенно если она предназначена для браузера.
  • Проверять входные и выходные формы тензоров после конвертации — иногда типы данных могут не совпадать.
  • Для кастомных слоёв Keras создавать отдельные функции в JavaScript, соответствующие их логике, чтобы модель оставалась функциональной после загрузки.
  • Использовать --split_weights_by_layer для больших моделей, чтобы облегчить загрузку и кэширование в браузере.

Оптимизация размера и скорости работы

  1. Квантование весов — уменьшает память и ускоряет загрузку.
  2. Разделение весов по слоям — ускоряет потоковую загрузку через сеть.
  3. Минимизация кастомных слоёв — повышает совместимость с TensorFlow.js и уменьшает необходимость дополнительного кода на стороне клиента.

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