Keras.js — это библиотека для выполнения моделей Keras непосредственно в браузере с использованием JavaScript и WebGL. Одним из ключевых этапов работы с ней является правильная подготовка входных данных. Данные для нейронной сети должны быть представлены в формате тензоров, а TypedArray обеспечивает эффективное хранение числовых массивов в памяти браузера.
TypedArray — это набор объектов JavaScript,
предоставляющий доступ к массивам фиксированного типа, таким как
Float32Array, Int32Array или
Uint8Array. Преимущества TypedArray:
Типичный массив JavaScript (Array) не подходит для
эффективной работы с Keras.js, так как он хранит элементы как объекты и
требует дополнительной конверсии.
В 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').Если исходные данные представлены обычным массивом 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:
<canvas> или
ImageData.Float32Array и нормализуется (деление
на 255 для приведения значений к диапазону [0, 1]).[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.
Перед передачей тензора в модель важно убедиться, что:
shape соответствует ожидаемой модели.dtype совпадает с типом данных.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-битных
чисел.[batch, height, width, channels] для изображений,
[batch, features] для табличных данных).TypedArray — основа эффективной работы с Keras.js, обеспечивающая корректное и быстрое создание тензоров, совместимых с WebGL. Их правильное использование напрямую влияет на производительность и стабильность модели в браузере.