В Keras.js работа с данными происходит преимущественно через тензоры,
которые представляют собой многомерные массивы чисел с определённой
формой. Для дальнейшей обработки в стандартном JavaScript часто
требуется преобразовать тензор в обычный массив, совместимый с методами
Array или TypedArray.
Тензор в Keras.js является объектом, инкапсулирующим данные модели в
формате Float32Array или Int32Array, в
зависимости от типа данных. Ключевые свойства тензора:
[2, 3] означает матрицу 2x3.float32,
int32 и др.Эти свойства позволяют преобразовывать тензор в структуры данных, привычные для JavaScript, без потери информации о размерности.
tensor.dataSync()Метод возвращает данные тензора в виде плоского массива. Возвращаемый
тип — TypedArray (Float32Array или
Int32Array), что позволяет эффективно работать с
числами:
const tensor = new KerasJS.Tensor([2, 3], new Float32Array([1, 2, 3, 4, 5, 6]));
const flatArray = tensor.dataSync(); // Float32Array(6) [1, 2, 3, 4, 5, 6]
Данный метод синхронный и блокирует поток до полной загрузки данных.
tensor.data()Асинхронный аналог dataSync(), возвращает промис,
который разрешается в TypedArray. Используется для работы с
большими тензорами или при необходимости не блокировать основной
поток:
tensor.data().then(array => {
console.log(array); // Float32Array(6) [1, 2, 3, 4, 5, 6]
});
Асинхронный подход особенно полезен при работе с WebGL-бэкендом, где данные хранятся на GPU.
Полученный из тензора плоский массив можно превратить в вложенные массивы с исходной формой, используя рекурсивную функцию:
function reshapeArray(flatArray, shape) {
if (shape.length === 0) return flatArray[0];
const result = [];
const size = shape[0];
const restShape = shape.slice(1);
const step = restShape.reduce((a, b) => a * b, 1);
for (let i = 0; i < size; i++) {
result.push(reshapeArray(flatArray.slice(i * step, (i + 1) * step), restShape));
}
return result;
}
const tensor = new KerasJS.Tensor([2, 3], new Float32Array([1, 2, 3, 4, 5, 6]));
const flatArray = tensor.dataSync();
const nestedArray = reshapeArray(flatArray, tensor.shape);
// nestedArray = [[1, 2, 3], [4, 5, 6]]
Этот подход позволяет полностью восстановить исходную структуру тензора в привычных JavaScript-массивов.
Плоские массивы, получаемые из тензоров, обычно имеют тип
Float32Array или Int32Array. Для дальнейшей
работы с методами Array их можно преобразовать в обычный
массив:
const normalArray = Array.from(flatArray);
При этом сохраняется порядок элементов, но массив уже поддерживает
все стандартные методы Jav * aScript: map,
filter, reduce и др.
Преобразование тензоров в обычные массивы особенно важно при
интеграции с библиотеками визуализации (Chart.js,
D3.js) или при отправке данных на сервер через JSON:
const dataForChart = reshapeArray(tensor.dataSync(), tensor.shape);
const jsonData = JSON.stringify(dataForChart);
Таким образом обеспечивается совместимость Keras.js с любыми
инструментами, которые не работают с TypedArray.
Для больших тензоров рекомендуется:
tensor.data() для
предотвращения блокировки UI.Понимание этих методов преобразования является основой для работы с Keras.js в реальных проектах, где данные часто нужно интегрировать с другими JavaScript-инструментами или отправлять на фронтенд в формате JSON.