在C#工业应用中调用Python图像分类模型时遇形状不兼容错误
问题分析与解决方案
错误根源
错误信息Incompatible shapes: [1,1,1,32] vs. [1,200,150,3]明确说明:你在C#代码中选择的输入节点是卷积操作的输出节点(形状[1,1,1,32]),但喂入的是原始图像张量(形状[1,200,150,3]),两者形状完全不匹配,导致运算失败。
解决步骤
1. 获取模型的真实输入节点名称
在Python训练代码中,添加一行打印输入节点名称的代码:
print(model.input.name)
运行后会得到类似sequential_1_input:0的输出(注意去掉末尾的:0,只取节点名称部分,比如sequential_1_input)。
2. 修改C#代码中的输入节点
将C#代码里的输入节点替换为真实输入节点:
// 替换原来的input_op定义,这里的名称以Python输出为准 var input_op = graph.OperationByName("sequential_1_input");
3. 验证输入张量形状一致性
确保ImageToTensor函数中的imgHeight和imgWidth与Python训练时的img_height、img_width完全一致,不能有任何数值差异。
4. 确认输出节点名称(可选)
如果输出节点也存在名称错误,可以在Python中打印输出节点名称:
print(model.output.name)
再对应修改C#中的output_op定义。
修正后的核心代码示例
var modelfile = "D:\\Soft\\Soft\\C#\\LastVersion\\frozen_model.pb"; var labels = new[] { "ORANGE", "BANANA", "APPLE", "MIX" }; var graph = new Graph().as_default(); graph.Import(File.ReadAllBytes(modelfile)); using (var session = tf.Session(graph)) { var tensor = ImageToTensor(RutaImagen); // 使用正确的输入节点名称 var input_op = graph.OperationByName("sequential_1_input"); var output_op = graph.OperationByName("sequential_1/dense_1_2/Softmax"); var result = session.run(output_op.outputs[0], (input_op.outputs[0], tensor)); // 后续处理代码不变... }
内容的提问来源于stack exchange,提问作者AdanDA
相关产品推荐
相关产品推荐

