onnx转模型时遇到错误onnx.onnx_cpp2py_export.checker.ValidationError的解决思路
onnx转模型时遇到错误onnx.onnx_cpp2py_export.checker.ValidationError的解决思路
- 报错
- 分析和解决办法
报错
转onnx模型时遇到的报错提示为:
onnx.onnx_cpp2py_export.checker.ValidationError: Nodes in a graph must be topologically sorted, however input '905' of node: name: Conv_272 OpType: Conv is not output of any previous nodes.
分析和解决办法
错误的原因是在模型检查时发现有些节点的输入在前,输出在后,比如在节点的output ‘905’ 之前就出现了input ‘905’,这肯定是不符合onnx模型格式的;
onnx.onnx_cpp2py_export.checker.ValidationError: 图中的节点必须按拓扑排序,但是节点的输入“905”:名称:Conv_272 OpType:Conv 不是任何先前节点的输出。
在Netron软件中可视化看不出先后顺序,需要将模型的节点打印出来才能看到。
import onnx
from onnx import helper, TensorProto, numpy_helper# 载入原来的ONNX模型
model_path = 'model.onnx'
model = onnx.load(model_path)
print(model.graph.node)
将打印结果保存下来分析后发现input “905”出现的确实比output “905”要早,问题就出现在这;
解决办法可以参考下面的方法,先把该节点node保存到new_nodes,然后删除node后再重新添加new_nodes即可解决出场顺序的问题;
for i in range(len(model.graph.node)):node = model.graph.node[i]if node.op_type == 'Conv':if node.input[0] == "905":print("input 905 所在节点为: ", i)new_nodes = nodemodel.graph.node.remove(node)if node.output[0] == "905":print("output 905 所在节点为: ", i)model.graph.node.insert(i+1, new_nodes)break