在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
相关产品推荐
相关产品推荐

