Слайсинг, изменение формы и транспонирование на стороне JS

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 хранится линейный массив значений, независимо от формы тензора.
  • Для многомерных тензоров слайсинг требует вычисления индексов вручную или использования утилитарных функций для многомерных массивов.
  • Создание нового тензора после слайсинга требует указания корректной формы.

Изменение формы (Reshape)

Изменение формы позволяет преобразовать тензор без изменения порядка данных в памяти. Метод 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]);

Особенности:

  • Количество элементов должно совпадать с исходным тензором.
  • Порядок элементов сохраняется: данные считываются по строкам при линейной индексации.
  • Reshape позволяет подготавливать данные для моделей с другой ожидаемой размерностью входа.

Транспонирование тензоров

Транспонирование меняет порядок осей многомерного тензора, что часто требуется для соответствия формату данных модели. В 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]

Особенности:

  • Транспонирование многомерных тензоров (>2D) требует генерации всех индексов с перестановкой осей.
  • Производительность зависит от размера тензора, поэтому для больших данных предпочтительно минимизировать копирование.
  • Правильная индексация при перестановке осей критична для сохранения соответствия данных.

Практические рекомендации

  1. Минимизация копирования данных: операции слайсинга и транспонирования создают новые массивы, что может увеличить потребление памяти. По возможности использовать view-подходы или ограничивать размер подматриц.
  2. Явная проверка формы: перед изменением формы проверять, совпадает ли количество элементов, чтобы избежать ошибок выполнения модели.
  3. Утилиты для многомерных операций: для 3D и 4D тензоров рекомендуется использовать небольшие вспомогательные функции для генерации индексов и перестановки осей.
  4. Соответствие форматов модели: многие ONNX-модели требуют конкретной конфигурации осей (например, NCHW или NHWC для изображений), транспонирование на стороне JS помогает адаптировать данные без изменения модели.

Эти техники позволяют гибко управлять данными, подготавливать их для моделей и оптимизировать вычисления в браузере или Node.js, обеспечивая совместимость с требованиями ONNX Runtime Web и минимизируя ошибки, связанные с несоответствием формы тензоров.