ONNX Runtime Web предоставляет возможности для выполнения моделей машинного обучения непосредственно в браузере или в среде Node.js с использованием JavaScript. Работа с тензорами — одна из ключевых операций при предобработке данных, постобработке результатов и оптимизации вычислений. Рассмотрим основные методы манипулирования тензорами: слайсинг, изменение формы и транспонирование.
Слайсинг (вырезка подмассива) позволяет извлечь подмножество данных
из тензора без копирования всех данных. В ONNX Runtime Web используется
метод tensor.data для получения доступа к сырым данным и
методы Tensor для создания новых тензоров с нужными
срезами.
Пример слайсинга:
import * as ort from 'onnxruntime-web';
const tensor = new ort.Tensor('float32', new Float32Array([1,2,3,4,5,6]), [2,3]);
// tensor.shape = [2,3]
const slicedData = tensor.data.slice(1, 5); // извлекаем элементы с 1 по 4
const slicedTensor = new ort.Tensor('float32', slicedData, [2,2]); // новая форма
Ключевые моменты:
tensor.data хранится линейный массив значений,
независимо от формы тензора.Изменение формы позволяет преобразовать тензор без изменения порядка
данных в памяти. Метод new ort.Tensor с другой формой
применяется для reshape.
Пример изменения формы:
const tensor = new ort.Tensor('float32', new Float32Array([1,2,3,4,5,6]), [2,3]);
// Изменим форму на [3,2]
const reshapedTensor = new ort.Tensor('float32', tensor.data, [3,2]);
Особенности:
Транспонирование меняет порядок осей многомерного тензора, что часто
требуется для соответствия формату данных модели. В ONNX Runtime Web нет
встроенного метода transpose, поэтому реализуется через
индексацию и копирование данных вручную.
Пример транспонирования 2D тензора:
function transpose2D(tensor) {
const [rows, cols] = tensor.dims;
const result = new Float32Array(rows * cols);
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
result[c * rows + r] = tensor.data[r * cols + c];
}
}
return new ort.Tensor('float32', result, [cols, rows]);
}
const tensor = new ort.Tensor('float32', new Float32Array([1,2,3,4,5,6]), [2,3]);
const transposed = transpose2D(tensor); // форма [3,2]
Особенности:
Эти техники позволяют гибко управлять данными, подготавливать их для моделей и оптимизировать вычисления в браузере или Node.js, обеспечивая совместимость с требованиями ONNX Runtime Web и минимизируя ошибки, связанные с несоответствием формы тензоров.