Создание тензора из Float32Array, Int32Array, BigInt64Array

ONNX Runtime Web (ORT Web) предоставляет высокопроизводительную платформу для выполнения моделей машинного обучения непосредственно в браузере или в Node.js. Ключевым аспектом работы с моделями является подготовка входных данных в формате тензоров, которые библиотека принимает для вычислений. В JavaScript для этого используется объект ort.Tensor.

Основы создания тензора

Тензор в ONNX Runtime Web определяется как объект, содержащий три основных свойства:

  1. Тип данных (type) – указывает на формат элементов, например, float32, int32 или int64.
  2. Форма (dims) – массив чисел, задающий размерность тензора.
  3. Данные (data) – одномерный массив значений соответствующего типа.

Синтаксис создания тензора выглядит следующим образом:

const tensor = new ort.Tensor(type, data, dims);
  • type – строка, определяющая тип данных элементов.
  • data – массив элементов (Float32Array, Int32Array, BigInt64Array).
  • dims – массив чисел, например [2, 3] для двумерного тензора 2×3.

Использование Float32Array

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

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

const data = new Float32Array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]);
const dims = [2, 3];
const tensorFloat = new ort.Tensor('float32', data, dims);

Особенности работы:

  • Размер массива data должен совпадать с произведением элементов массива dims (2×3 = 6 в примере).
  • Любая несовпадающая размерность вызовет ошибку при попытке выполнения модели.
  • Элементы Float32Array автоматически интерпретируются как 32-битные числа с плавающей точкой.

Использование Int32Array

Int32Array применяют для целочисленных входов и индексов, часто используемых в задачах классификации, NLP и при работе с масками.

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

const dataInt = new Int32Array([0, 1, 2, 3]);
const dimsInt = [2, 2];
const tensorInt = new ort.Tensor('int32', dataInt, dimsInt);

Особенности работы:

  • Элементы массива должны быть целыми числами.
  • Можно использовать для передачи категориальных индексов, масок или координат.
  • ORT Web автоматически проверяет тип данных и выбрасывает ошибку, если тип data не соответствует type.

Использование BigInt64Array

BigInt64Array предназначен для представления 64-битных целых чисел, что особенно важно для моделей, которые работают с большим диапазоном значений, превышающим 32-битное целое.

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

const dataBigInt = new BigInt64Array([1n, 2n, 3n, 4n]);
const dimsBigInt = [2, 2];
const tensorBigInt = new ort.Tensor('int64', dataBigInt, dimsBigInt);

Особенности работы:

  • В JavaScript для литералов BigInt необходимо использовать суффикс n.
  • Использование BigInt64Array обеспечивает корректную обработку больших чисел без потери точности.
  • Полезно для задач, где модель ожидает 64-битные идентификаторы или индексы.

Проверка корректности данных перед созданием тензора

Перед созданием тензора рекомендуется проверять следующие условия:

  1. Совпадение размера массива и произведения размерностей:
const expectedLength = dims.reduce((a, b) => a * b, 1);
if (data.length !== expectedLength) {
    throw new Error(`Несоответствие размеров: массив содержит ${data.length} элементов, ожидается ${expectedLength}`);
}
  1. Тип массива соответствует типу данных тензора:
  • float32Float32Array
  • int32Int32Array
  • int64BigInt64Array

Несоблюдение этих правил приведет к исключению во время инициализации или выполнения модели.


Прямое использование массивов JavaScript

Хотя ORT Web поддерживает TypedArray (Float32Array, Int32Array, BigInt64Array), можно использовать обычные массивы JavaScript. В этом случае ORT Web автоматически конвертирует их в соответствующий тип:

const dataJS = [1, 2, 3, 4];
const tensorFromJS = new ort.Tensor('float32', new Float32Array(dataJS), [2, 2]);

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


Выводы по созданию тензоров

  • Float32Array — стандарт для чисел с плавающей точкой.
  • Int32Array — удобен для целочисленных входов и индексов.
  • BigInt64Array — необходим для 64-битных целых чисел, особенно при работе с большими идентификаторами.
  • Всегда проверять соответствие размера данных и размерностей тензора.
  • TypedArray обеспечивает высокую производительность при работе с большими объемами данных.

Использование этих подходов позволяет корректно и эффективно формировать входные тензоры для ONNX Runtime Web, обеспечивая стабильное выполнение моделей и точность вычислений.