Типы данных: float32, int32, bool и другие

Keras.js — это библиотека, позволяющая запускать модели, обученные в Keras (Python), непосредственно в браузере с использованием JavaScript. Работа с типами данных является фундаментальной частью взаимодействия с моделями, поскольку неправильный тип может привести к некорректной обработке данных или к снижению производительности.

Основные типы данных

В Keras.js данные представлены с использованием Typed Arrays, что обеспечивает эффективность работы с массивами чисел и совместимость с WebGL при вычислениях на GPU.

  1. float32

    • Представляет числа с плавающей точкой одинарной точности.

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

    • Подходит для операций с CNN, RNN, Dense-слоями.

    • В JavaScript соответствует Float32Array.

    • Пример создания массива:

      const input = new Float32Array([0.1, 0.5, -0.3]);
  2. int32

    • Целые числа со знаком, 32-битная точность.

    • Используется для категориальных меток или индексов в эмбеддингах.

    • В Keras.js применяется в слоях, где важно целочисленное представление (например, Embedding, SparseCategoricalCrossentropy).

    • Соответствует Int32Array в JavaScript.

      const labels = new Int32Array([0, 2, 1, 3]);
  3. bool

    • Логические значения true или false.

    • Используется для масок или бинарных индикаторов.

    • В Typed Arrays JavaScript нет отдельного типа BoolArray, поэтому обычно применяют Uint8Array с 0/1.

      const mask = new Uint8Array([1, 0, 1, 0]);

Дополнительные типы

  • Uint8Array / Uint16Array / Uint32Array — беззнаковые целые числа различной разрядности. Используются в задачах обработки изображений, например, при нормализации пикселей.
  • Float64Array — числа с двойной точностью. В большинстве случаев не требуется для моделей Keras.js, так как WebGL работает с float32.
  • Int8Array / Int16Array — редко применяются, могут использоваться для компактного хранения весов или квантованных моделей.

Преобразование типов

При передаче данных в Keras.js необходимо строго соответствовать типу, который ожидает модель. Для преобразования между типами используется стандартная конструкция Typed Arrays:

const floatArray = new Float32Array(intArray); // int32 -> float32
const intArray = new Int32Array(floatArray);   // float32 -> int32

Важно помнить, что преобразование float32int32 может привести к потере дробной части, а преобразование int32float32 сохраняет точность до 24 бит значащих цифр.

Типы данных и производительность

Использование правильного типа данных критично для производительности:

  • float32 обеспечивает оптимальное взаимодействие с WebGL, ускоряя вычисления слоёв на GPU.
  • int32 и Uint8Array эффективны для хранения индексов и масок, снижая объем памяти.
  • Избыточное использование float64 значительно замедляет выполнение и увеличивает потребление памяти без заметного прироста точности.

Рекомендации по использованию типов

  • Для входных данных и весов моделей всегда предпочтительно float32.
  • Для категориальных меток и индексов слоёв эмбеддингов использовать int32.
  • Для бинарных масок и индикаторов применять bool или Uint8Array.
  • Для больших изображений или объемных данных рассмотреть беззнаковые типы (Uint8Array/Uint16Array) для экономии памяти.

Пример интеграции типов данных с Keras.js

import KerasJS from 'keras-js';

// Инициализация модели
const model = new KerasJS.Model({
  filepath: 'model.bin',
  gpu: true
});

// Создание входного массива float32
const inputData = new Float32Array([0.2, -0.1, 0.5, 0.7]);

// Передача данных в модель
model.ready().then(() => {
  const input = { input_1: inputData };
  return model.predict(input);
}).then(output => {
  console.log(output.output_1);
});

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

Заключение по типам

Правильный выбор типа данных напрямую влияет на точность вычислений, потребление памяти и скорость работы модели. В Keras.js оптимальная работа достигается сочетанием float32 для чисел с плавающей точкой, int32 для категориальных меток и Uint8Array для бинарных масок. Любое отклонение от рекомендуемых типов может вызвать ошибки или падение производительности, особенно при работе с большими моделями.