Преобразование данных в тензоры из TypedArray

Keras.js — это библиотека для выполнения моделей Keras непосредственно в браузере с использованием JavaScript и WebGL. Одним из ключевых этапов работы с ней является правильная подготовка входных данных. Данные для нейронной сети должны быть представлены в формате тензоров, а TypedArray обеспечивает эффективное хранение числовых массивов в памяти браузера.


TypedArray и его роль в работе с Keras.js

TypedArray — это набор объектов JavaScript, предоставляющий доступ к массивам фиксированного типа, таким как Float32Array, Int32Array или Uint8Array. Преимущества TypedArray:

  • Быстрая обработка числовых данных — прямое взаимодействие с памятью, минуя лишние преобразования.
  • Совместимость с WebGL — Keras.js использует GPU для ускорения вычислений, и TypedArray напрямую передаются в буферы WebGL.
  • Фиксированный размер элементов — упрощает предсказуемое управление памятью.

Типичный массив JavaScript (Array) не подходит для эффективной работы с Keras.js, так как он хранит элементы как объекты и требует дополнительной конверсии.


Создание тензора из TypedArray

В Keras.js тензор представляется объектом KerasJS.Tensor. Для создания тензора из TypedArray необходимо указать следующие параметры:

  • data — сам массив типа TypedArray.
  • shape — массив, определяющий размерность тензора.
  • dtype — тип данных ('float32' или 'int32'), соответствующий TypedArray.

Пример создания тензора из Float32Array:

const inputData = new Float32Array([0.1, 0.2, 0.3, 0.4]);
const inputShape = [2, 2]; // 2 строки, 2 столбца
const tensor = new KerasJS.Tensor({ data: inputData, shape: inputShape, dtype: 'float32' });

Ключевые моменты:

  • Размер массива data должен соответствовать произведению всех измерений shape.
  • Тип dtype должен совпадать с типом TypedArray (Float32Array'float32', Int32Array'int32').

Преобразование стандартных массивов в TypedArray

Если исходные данные представлены обычным массивом JavaScript, их необходимо преобразовать в TypedArray перед созданием тензора:

const array = [1, 2, 3, 4, 5, 6];
const typedArray = new Float32Array(array);
const tensor = new KerasJS.Tensor({ data: typedArray, shape: [2, 3], dtype: 'float32' });

Использование TypedArray напрямую улучшает производительность, особенно при больших объемах данных.


Пример работы с изображениями

Для обработки изображений в Keras.js часто используется Uint8Array или Float32Array. Если изображение представлено в формате RGB:

  1. Извлекается массив пикселей из <canvas> или ImageData.
  2. Преобразуется в Float32Array и нормализуется (деление на 255 для приведения значений к диапазону [0, 1]).
  3. Формируется тензор с нужной размерностью [batch, height, width, channels].

Пример:

const imageData = context.getImageData(0, 0, width, height);
const pixels = new Float32Array(imageData.data.length / 4 * 3);

for (let i = 0, j = 0; i < imageData.data.length; i += 4, j += 3) {
  pixels[j] = imageData.data[i] / 255;     // R
  pixels[j + 1] = imageData.data[i + 1] / 255; // G
  pixels[j + 2] = imageData.data[i + 2] / 255; // B
}

const tensor = new KerasJS.Tensor({ data: pixels, shape: [1, height, width, 3], dtype: 'float32' });

Такое преобразование обеспечивает корректное соответствие формата данных требованиям Keras.js.


Проверка размерности и типа тензора

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

  1. Размерность shape соответствует ожидаемой модели.
  2. Тип dtype совпадает с типом данных.
  3. Длина массива data равна произведению всех измерений shape.
if (tensor.data.length !== tensor.shape.reduce((a, b) => a * b)) {
  throw new Error('Неправильная размерность тензора');
}

Использование батчей

Keras.js требует, чтобы входные данные имели батч-размер. Даже для одного примера необходимо добавлять измерение батча:

const singleExample = new Float32Array([0.5, 0.6, 0.7, 0.8]);
const tensor = new KerasJS.Tensor({ data: singleExample, shape: [1, 2, 2], dtype: 'float32' });

Отсутствие батча может привести к ошибкам при вызове model.predict().


Рекомендации по оптимизации

  • Использовать Float32Array для всех числовых данных, так как WebGL лучше всего оптимизирован для 32-битных чисел.
  • Минимизировать количество промежуточных копий массивов — преобразование обычного массива в TypedArray один раз достаточно для всей предобработки.
  • Выравнивать размерность данных под требования модели ([batch, height, width, channels] для изображений, [batch, features] для табличных данных).

TypedArray — основа эффективной работы с Keras.js, обеспечивающая корректное и быстрое создание тензоров, совместимых с WebGL. Их правильное использование напрямую влияет на производительность и стабильность модели в браузере.