Класс Tensor: конструктор, поля type, data, dims

Tensor является ключевым объектом для работы с данными в ONNX Runtime Web. Он представляет собой многомерный массив данных фиксированного типа, который используется для передачи входных и получения выходных данных моделей ONNX в среде JavaScript.

Конструктор Tensor

Конструктор класса имеет следующую форму:

new ort.Tensor(type, data, dims)

Параметры:

  • type — строка или константа, указывающая тип данных элементов тензора. Поддерживаются типы, соответствующие ONNX, например:

    • 'float32'
    • 'int32'
    • 'bool'
    • 'string' Тип определяет размер памяти, выделяемой под каждый элемент, и влияет на совместимость с моделью.
  • data — массив данных (TypedArray или обычный массив JavaScript). Для числовых типов рекомендуется использовать Float32Array, Int32Array и другие TypedArray, так как они обеспечивают эффективное хранение и быстрый доступ к элементам. Длина массива должна соответствовать произведению размеров, указанных в dims.

  • dims — массив целых чисел, описывающий форму тензора. Например, [3, 224, 224] задаёт трёхмерный тензор с 3 каналами и размерностью 224×224. Количество элементов в массиве data должно строго соответствовать произведению всех значений в dims.

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

const data = new Float32Array(3 * 224 * 224);
const tensor = new ort.Tensor('float32', data, [3, 224, 224]);

Поля класса Tensor

type

Содержит строковое представление типа данных тензора.

Примеры значений:

tensor.type; // 'float32'

Это поле используется для проверки совместимости с входами и выходами модели, а также для правильного выделения памяти и преобразования данных.

data

Хранит сами данные тензора в виде массива. Для числовых типов предпочтительно использовать TypedArray:

tensor.data[0]; // доступ к первому элементу
tensor.data.length; // количество элементов

Обращение к data напрямую позволяет считывать и модифицировать значения, применять математические операции, нормализацию или преобразования перед подачей на модель.

dims

Содержит массив с размерностями тензора:

tensor.dims; // [3, 224, 224]

Используется для интерпретации одномерного массива data как многомерного массива. Например, при работе с изображениями dims определяет количество каналов и высоту/ширину изображения.

Важные аспекты использования

  • Совпадение размеров: произведение всех элементов dims должно точно соответствовать длине массива data. Несоответствие приведёт к ошибкам при выполнении модели.
  • Эффективность: использование TypedArray ускоряет вычисления и снижает потребление памяти по сравнению с обычными массивами.
  • Совместимость с моделью: тип type должен совпадать с ожидаемым типом данных входного или выходного тензора модели. Попытка передать, например, float32 вместо int32 может вызвать исключение.

Пример работы с моделью

Создание входного тензора и подача его в сессию ONNX Runtime Web:

const session = await ort.InferenceSession.create('model.onnx');
const inputTensor = new ort.Tensor('float32', new Float32Array(1 * 3 * 224 * 224), [1, 3, 224, 224]);

const feeds = { input: inputTensor };
const results = await session.run(feeds);

const outputTensor = results.output;
console.log(outputTensor.data.length);
console.log(outputTensor.dims);

В этом примере Tensor используется для передачи данных в модель и получения выходных значений, демонстрируя, как type, data и dims взаимодействуют с ONNX Runtime Web для точного и эффективного обмена данными.