ONNX Runtime Web (ORT Web) является мощным инструментом для выполнения моделей машинного обучения непосредственно в браузере. Одним из ключевых аспектов работы с ORT Web является корректная подготовка входных данных — тензоров, соответствующих ожиданиям модели. Несоответствие типов и форм тензоров является одной из наиболее частых причин ошибок при использовании библиотеки.
Каждый вход модели в ONNX имеет строго определённый тип данных. Типы тензоров в ONNX включают:
Несоответствие типа возникает, если передать тензор
другого типа. Например, если модель ожидает float32, а
передан int32, ORT Web выбросит ошибку на этапе
session.run() с сообщением о несоответствии типов.
const inputTensor = new ort.Tensor('int32', new Int32Array([1, 2, 3]), [3]);
Если модель ожидает float32, необходимо привести
данные:
const inputTensor = new ort.Tensor('float32', new Float32Array([1.0, 2.0, 3.0]), [3]);
Выделение ключевых моментов:
Array по умолчанию не имеет строгого типа.Форма тензора — это массив, определяющий размеры по каждой оси.
Например, [1, 3, 224, 224] — это тензор для изображения с
одной картинкой, 3 каналами, размером 224×224.
Основные правила:
session.run().Пример ошибки формы:
const inputTensor = new ort.Tensor('float32', new Float32Array(150528), [1, 3, 224, 223]);
// Ошибка: количество элементов (150528) не соответствует форме [1, 3, 224, 223] (1*3*224*223 = 149,856)
Правильный вариант:
const inputTensor = new ort.Tensor('float32', new Float32Array(150528), [1, 3, 224, 224]);
Ключевые моменты:
console.log(inputTensor.dims) помогает
выявлять несоответствия.-1 в ONNX) требуют дополнительной
логики для вычисления конкретных размеров.Для безопасной работы с ORT Web рекомендуется реализовать функции проверки типов и форм:
function createTensor(data, expectedType, expectedShape) {
let typedArray;
switch (expectedType) {
case 'float32': typedArray = new Float32Array(data); break;
case 'int32': typedArray = new Int32Array(data); break;
case 'int64': typedArray = BigInt64Array.from(data.map(BigInt)); break;
default: throw new Error(`Unsupported tensor type: ${expectedType}`);
}
const expectedLength = expectedShape.reduce((a, b) => a * b, 1);
if (typedArray.length !== expectedLength) {
throw new Error(`Tensor length ${typedArray.length} does not match expected shape ${expectedShape}`);
}
return new ort.Tensor(expectedType, typedArray, expectedShape);
}
Преимущества такой проверки:
Многие модели требуют входного тензора с размерностью
[batch, channels, height, width]. Частой ошибкой является
передача тензора без батча, например [3, 224, 224] вместо
[1, 3, 224, 224]. Для ORT Web это критично, так как
библиотека строго соблюдает спецификацию ONNX.
Пример корректного батча:
const batchTensor = new ort.Tensor('float32', new Float32Array(1 * 3 * 224 * 224), [1, 3, 224, 224]);
Вывод: даже если данные визуально корректны, отсутствие первой оси батча может привести к ошибке выполнения.
Типичные сообщения ORT Web:
TypeError: Expected input type float32 but received int32ShapeError: Tensor length does not match shapeRuntimeError: Invalid input shapeПричины ошибок:
Array вместо
TypedArray.Правильная подготовка тензоров минимизирует такие ошибки и позволяет ORT Web эффективно выполнять вычисления без аварийных остановок.
Если требуется, могу подготовить следующий раздел с практическими примерами динамических форм, масок и батчевой обработки в ONNX Runtime Web.