美文网首页
ONNX删除节点、更换输出节点

ONNX删除节点、更换输出节点

作者: Koap | 来源:发表于2024-10-10 17:42 被阅读0次

背景

最近在AXERA M55H工具链做一个语义分割模型量化。
AXERA官方文档表示argmax只能接在conv算子后,而我的deeplabv3+模型最后两个节点是resize上采样接argmax。
试了一下模型转换(编译、量化成M55H支持的.joint模型),果然在执行argmax相关操作时报错。
于是只能手动将onnx文件的argmax节点删除,在后处理来做argmax了。

ONNX删除节点

由于模型只有结尾处有一个argmax节点,所以直接找到op_type == "ArgMax"的节点将其删除即可。

node_to_rm = next(node for node in model.graph.node if node.op_type == "ArgMax")
model.graph.node.remove(node_to_rm)
onnx.save(model, dst_model)

此时用生成的新model推理会报错,大概错误信息是output节点不在graph中。
查了一些资料发现model.graph.output和model.graph.node是平行的存在,也就是说输出节点是区别于中间节点独立存储在model.graph.output中的。(输入节点也类似)
上述的操作删除了最后一个argmax节点,但是没有删除输出节点。并且,一个graph必须包含1个以上的输入和输出节点。所以我们需要删除原有的输出节点并创建新的,即更换输出节点。

ONNX更换输出节点

model.graph.output是一个list,包含所有输出节点。
目前包含一个输出节点,就是之前的经过argmax的分割特征图。
输出节点跟普通节点的数据结构不同,它包含了节点名、输出的数据结构等信息,
因此只需要在现有节点基础上进行如下修改即可: (也可以通过onnx.helper创建新的节点)

node_to_out = next(node for node in model.graph.node if node.output == node_to_rm.input)  # 找到删除节点的上游节点,作为输出节点的前置
out = model.graph.output[0]       # 在原来的输出节点基础上改即可
out.name = node_to_out.output[0]  # 修改为新的输出节点名字
out.type.tensor_type.shape.dim[1].dim_value = 4   # 该维度指channel数,argmax以后为1,改为4,因为该模型有4类,onehot表示
out.type.tensor_type.elem_type = 1    # 1表示float32, 经过argmax后是7,表示int64

附录: onnx的elem_type

elem_type: 1 --> float32
elem_type: 2 --> uint8
elem_type: 3 --> int8
elem_type: 4 --> uint16
elem_type: 5 --> int16
elem_type: 6 --> int32
elem_type: 7 --> int64
elem_type: 8 --> string
elem_type: 9 --> boolean
elem_type: 10 --> float16
elem_type: 11 --> float64
elem_type: 12 --> uint32
elem_type: 14 --> uint64
elem_type: 15 --> complex128
elem_type: 16 --> bfloat16
from: https://blog.csdn.net/weixin_43945848/article/details/122474749

相关文章

  • tensorflow 模型转onnx模型

    首先训练模型时要定义好输出节点的名字。这里https://github.com/onnx/tutorials/bl...

  • 简单使用k8s

    设置kubectl命令补齐 获取集群节点信息 设置输出不同的格式 获得、修改节点标签 添加节点标签 删除节点标签 ...

  • 简单使用k8s

    设置kubectl命令补齐 获取集群节点信息 设置输出不同的格式 获得、修改节点标签 添加节点标签 删除节点标签 ...

  • 红黑树删除节点调整

    删除节点情况1:被删除节点是黑+黑节点;被删除的节点是左节点,被删除节点的兄弟节点是红色 1解决方案:1将被删除节...

  • neo4j-delete语法

    删除节点、关系或路径 删除单个节点 删除所有节点和关系 删除节点和它的关系 只删除关系

  • 第119天 煤油灯纹理-遮罩01

    一、油漆基础色 1、添加基础节点 2、打组,取消节点连接,将输入与输出,连接,然后删除之前的节点,将组节点,命名为...

  • ONNX Runtime 源码阅读:模型结点串行执行顺序的确定

    概要 ONNX模型中的结构是一个有向图,包含了很多节点。每个节点执行一个特定的操作,最终就得到了推理结果。ONNX...

  • Web-API-03

    节点操作 删除节点 node.removeChild() 方法从 node节点中删除一个子节点,返回删除的节点。 ...

  • 十四、二叉搜索树--删除节点、clear和contains方法、

    删除节点 -- 叶子节点 当删除节点是叶子节点,则直接删除 当叶子节点是左子树(node == node.pare...

  • DOM操作-节点操作

    创建节点 创建属性节点 插入节点 删除节点 remove() 该节点包含的所有后代节点都会被删除 返回被已删除的节...

网友评论

      本文标题:ONNX删除节点、更换输出节点

      本文链接:https://www.haomeiwen.com/subject/ciiwrjtx.html