You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C++中用ONNX推理TensorFlow训练模型时输入形状为-1如何解决

ONNX Runtime读取模型输入形状为-1的修复方案

问题根因

你从TensorFlow转换得到的ONNX模型包含动态维度(通常为batch维度),ONNX Runtime返回的-1表示该维度支持可变长度,无法直接用于创建固定形状的Tensor,因此触发创建失败报错。

修复方案

方案1:运行时手动覆盖动态维度值

在读取到inputShape后,遍历替换所有负数值为实际推理的维度值即可,修改后的核心代码如下:

Ort::Env env;
Ort::Session session{env,model_path, Ort::SessionOptions{} };

Ort::AllocatorWithDefaultOptions allocator;
auto* inputName = session.GetInputName(0, allocator);
std::cout << "Input name: " << inputName << "\n";
auto* outputName = session.GetOutputName(0, allocator);
std::cout << "Output name: " << outputName << "\n";
auto inputShape = session.GetInputTypeInfo(0).GetTensorTypeAndShapeInfo().GetShape();

// 新增:替换动态维度为实际值
for (size_t i = 0; i < inputShape.size(); ++i) {
    if (inputShape[i] < 0) {
        // 第0位为batch维度,单样本推理填1
        if (i == 0) inputShape[i] = 1;
        // 特征维度,和输入的5个值匹配,填5
        else inputShape[i] = 5;
    }
}

std::vector<float> inputValues = {1, 2, 3, 4, 5 }; 

auto memoryInfo = Ort::MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeCPU);

auto inputOnnxTensor = Ort::Value::CreateTensor<float>(memoryInfo, 
    inputValues.data(), inputValues.size(), 
    inputShape.data(), inputShape.size());
    
// 补全array的模板参数,避免编译/运行错误
std::array<const char*, 1> inputNames = { inputName };
std::array<const char*, 1> outputNames = { outputName };

auto outputValues = session.Run(
    Ort::RunOptions{ nullptr },
    inputNames.data(), &inputOnnxTensor, 1,
    outputNames.data(), 1);    

方案2:导出ONNX时固定输入形状

在TensorFlow转ONNX阶段直接固定输入形状,从根源消除动态维度:

  • 若使用tf2onnx工具转换,添加参数--input-shape input_1:[1,5]即可导出固定形状的模型
  • 若使用Python API转换,在tf.onnx.convert接口中指定input_signature参数,声明输入形状为固定值

校验规则

修改完成后需要确认维度乘积和输入元素数一致:inputShape各元素相乘结果必须等于inputValues.size(),本次场景中1*5=5,和输入的元素数匹配,符合要求。


内容的提问来源于stack exchange,提问作者JINU RAJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 18:51:03