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

TensorFlow.js предоставляет возможности для запуска и обучения моделей машинного обучения непосредственно в браузере или в среде Node.js. Одним из ключевых преимуществ является возможность использования уже обученных моделей, созданных с помощью Keras. Формат HDF5 (.h5) является стандартом для хранения весов и архитектуры моделей Keras. Для работы с такими моделями в TensorFlow.js требуется их конвертация в формат JSON с бинарными файлами весов (.bin).


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

Для конвертации моделей Keras в формат TensorFlow.js используется пакет @tensorflow/tfjs-converter. Установка через npm:

npm install -g @tensorflow/tfjs-converter

Также потребуется наличие Node.js версии не ниже 14 и установленного Python для работы с Keras.


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

Конвертация выполняется через команду tensorflowjs_converter. Стандартный синтаксис:

tensorflowjs_converter \
    --input_format keras \
    путь/к/модели/model.h5 \
    путь/к/выходной/директории

Параметры, которые важно учитывать:

  • --input_format keras — указывает, что исходная модель сохранена в формате Keras HDF5.
  • --output_format tfjs_layers_model — по умолчанию используется формат слоевой модели TensorFlow.js. Позволяет загрузить модель через tf.loadLayersModel.
  • --quantization_bytes — опционально, позволяет уменьшить размер весов модели за счёт квантования (1, 2 или 4 байта на вес).

Пример с квантованием для уменьшения размера весов:

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

После выполнения команды в указанной директории появятся:

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

Загрузка конвертированной модели в TensorFlow.js

После конвертации модель можно загрузить в браузере или Node.js.

Пример для браузера:

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

const model = await tf.loadLayersModel('/tfjs_model/model.json');

// Использование модели для предсказаний
const input = tf.tensor2d([[0.5, 0.8]]);
const prediction = model.predict(input);
prediction.print();

Пример для Node.js:

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

const model = await tf.loadLayersModel('file://tfjs_model/model.json');

const input = tf.tensor2d([[0.5, 0.8]]);
const prediction = model.predict(input);
prediction.print();

Обратите внимание на префикс file:// в Node.js, который указывает на локальный путь к модели.


Особенности конвертации сложных моделей

  1. Пользовательские слои (Custom Layers) Если модель содержит нестандартные слои, необходимо перед конвертацией определить их в Keras и при загрузке в TensorFlow.js реализовать их через объект tf.serialization.registerClass. Пример:
class MyCustomLayer extends tf.layers.Layer {
  constructor(config) {
    super(config);
  }

  call(input) {
    return input.mul(2);
  }

  static get className() {
    return 'MyCustomLayer';
  }
}

tf.serialization.registerClass(MyCustomLayer);

const model = await tf.loadLayersModel('/tfjs_model/model.json');
  1. Сложные функции активации Все функции активации, поддерживаемые Keras, совместимы с TensorFlow.js. Пользовательские функции необходимо реализовать через кастомный слой или кастомную функцию активации.

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

tensorflowjs_converter \
    --input_format keras \
    --weights_only \
    model.h5 \
    tfjs_weights

Проверка корректности модели

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

const input = tf.tensor2d([[0.1, 0.2]]);
const output = model.predict(input);
output.array().then(arr => console.log(arr));

Сравнение с результатами из Keras позволит выявить возможные расхождения.


Оптимизация размера модели

  • Квантование весов (--quantization_bytes) снижает размер без значительной потери точности.
  • Можно удалить слои Dropout или BatchNormalization при конвертации для ускорения работы в браузере.
  • Сжатие бинарных файлов весов через gzip или brotli ускоряет загрузку через сеть.

Интеграция в веб-приложения

Модель, конвертированная из Keras, интегрируется в фронтенд следующим образом:

  1. Разместить model.json и .bin файлы на сервере или CDN.
  2. Загрузить модель с помощью tf.loadLayersModel.
  3. Использовать модель для обработки данных, например, изображений через tf.browser.fromPixels или числовых массивов через tf.tensor.

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


Хотите, могу подробно расписать тонкости работы с пользовательскими слоями и активациями, которые чаще всего вызывают ошибки при конвертации из Keras HDF5 в TensorFlow.js. Это будет отдельный подглава с реальными примерами кода.