Конвертация из SavedModel

TensorFlow.js предоставляет возможность загружать и использовать модели, созданные с помощью TensorFlow в Python. Для этого необходимо выполнить конвертацию модели из формата SavedModel или Keras H5 в формат, совместимый с TensorFlow.js. Этот процесс позволяет интегрировать модели машинного обучения прямо в веб-приложения на JavaScript.


Установка инструмента конвертации

Для конвертации используется пакет tensorflowjs. Установка осуществляется через npm:

npm install -g @tensorflow/tfjs-converter

Проверка версии инструмента:

tensorflowjs_converter --version

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


Форматы моделей TensorFlow.js

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

  1. Layers Format Используется для моделей Keras (HDF5 или SavedModel). В результате конвертации создаются файлы:

    • model.json — описание архитектуры сети и метаданных.
    • *.bin — веса модели в бинарном формате.
  2. Graph Model Format Используется для низкоуровневых графовых моделей TensorFlow. После конвертации создаются:

    • model.json — JSON-структура графа.
    • *.bin — веса модели.

Конвертация из SavedModel чаще всего относится к формату Graph Model, особенно если модель была обучена с использованием функционального API TensorFlow или низкоуровневого API.


Конвертация из SavedModel

SavedModel — это основной формат сохранения моделей TensorFlow, включающий:

  • Метаданные модели (saved_model.pb или saved_model.pbtxt)
  • Веса (variables/variables.data-00000-of-00001 и variables/variables.index)
  • Информацию о подписи функций для предсказаний

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

tensorflowjs_converter \
  --input_format=tf_saved_model \
  --output_format=tfjs_graph_model \
  --signature_name=serving_default \
  --saved_model_tags=serve \
  /путь/к/saved_model \
  /путь/к/tfjs_model

Пояснение параметров:

  • --input_format=tf_saved_model — указывает на исходный формат.
  • --output_format=tfjs_graph_model — формат для TensorFlow.js.
  • --signature_name — имя подписи, которая используется для вызова модели (по умолчанию serving_default).
  • --saved_model_tags — теги модели (обычно serve для продакшн-моделей).
  • Первый путь — директория с исходным SavedModel.
  • Второй путь — директория для сохранения модели в формате TensorFlow.js.

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


Преобразование моделей с несколькими входами и выходами

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

tensorflowjs_converter \
  --input_format=tf_saved_model \
  --output_format=tfjs_graph_model \
  --signature_name=my_signature \
  --saved_model_tags=serve \
  /путь/к/saved_model \
  /путь/к/tfjs_model

Список доступных сигнатур можно получить через Python:

import tensorflow as tf
model = tf.saved_model.load("/путь/к/saved_model")
print(list(model.signatures.keys()))

Это позволяет точно выбрать, какая функция будет использоваться для инференса в веб-приложении.


Использование конвертированной модели в TensorFlow.js

После конвертации модель можно загружать в JavaScript через API TensorFlow.js:

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

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

async function predict(model, inputTensor) {
  const output = model.execute(inputTensor);
  return output;
}

Особенности работы с графовыми моделями:

  • Входные данные должны быть тензорами с правильной формой.
  • Выходные данные могут быть массивом тензоров, если модель имеет несколько выходов.
  • Для предобработки данных часто используют функции TensorFlow.js, такие как tf.tensor, tf.image.resizeBilinear и т. д.

Оптимизация модели перед конвертацией

Для уменьшения размера модели и ускорения загрузки в веб-приложениях можно использовать quantization при конвертации:

tensorflowjs_converter \
  --input_format=tf_saved_model \
  --output_format=tfjs_graph_model \
  --quantize_float16 \
  /путь/к/saved_model \
  /путь/к/tfjs_model
  • --quantize_float16 — уменьшает точность весов до 16 бит, что сокращает размер почти в два раза.
  • Также доступна --quantize_uint8 для 8-битной квантизации.

Эта оптимизация особенно полезна для мобильных браузеров и ограниченных по памяти устройств.


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

После конвертации важно убедиться, что модель работает корректно:

  1. Сравнить предсказания исходной TensorFlow модели и конвертированной версии на нескольких тестовых примерах.
  2. Проверить форму входных и выходных тензоров.
  3. При необходимости скорректировать сигнатуры и порядок каналов изображений.

Конвертация из SavedModel в TensorFlow.js позволяет использовать мощные модели Python прямо в веб-браузерах и Node.js, обеспечивая высокую совместимость и эффективность инференса без необходимости в серверной поддержке Python.