如何修改已有的ONNX模型

摘要:
简单来说,我们只需要学习如何将大象放入冰箱:1.打开冰箱门,使用onnx:onnx_model=onnx的原生界面。负载(onnx路径)图=onnx模型。图形,以便我们可以加载模型并获取图形信息。2.在这一步中,有相对较多的选择。例如,可以删除一些节点、修改一些节点和添加一些节点。删除:这是最简单的,只需一句话

简单来说,我们只需要学习一下把大象如何放进冰箱的就行了:

如何修改已有的ONNX模型第1张

1、把冰箱门打开

使用onnx的原生接口:

onnx_model = onnx.load(onnx_path)
graph = onnx_model.graph

这样我们就可以将模型load出来,并且到到graph信息。

2、把大象放进去

这一步相对来说选择就比较多了,比如你可以选择删除一些节点,修改一下节点,增加一些节点。

删除:这个是最容易的,直接一句话 graph.node.remove(xxx_node)

修改:举个例修改一下input的名称

for input_node in onnx_model.graph.input:
    if 'input_xxx' == input_node.name:
        print("change input data name")
        input_node.name = 'data'

就是拿到某个属性或者信息,然后直接修改就行了。

增加:举个例增加一组图像预处理操作(减均值,除方差)

这一步稍微复杂一点,我们首先要生成一个node或者tensor,然后将这个node或者tensor加入graph中,然后选择性的增加一个node来操作刚刚加入graph的node或者tensor。

首先我们生成一个tensor,就是需要减去的均值

sub_const_node = onnx.helper.make_tensor(name='const_sub',
                      data_type=onnx.TensorProto.FLOAT,
                      dims=[1],
                      vals=[-127.5])

然后我们将刚刚生成的tensor插入graph中

graph.initializer.append(sub_const_node)

然后我们再增加一个减均值的node

sub_node = onnx.helper.make_node(
                'Add',
                name='pre_sub',
                inputs=['data', 'const_sub'],
                outputs=['pre_sub'])

然后将node加入graph中

graph.node.insert(0, sub_node)

仿造这样的流程我们继续加入除以方差的操作

# 插入mul
mul_const_node = onnx.helper.make_tensor(name='const_mul',
                      data_type=onnx.TensorProto.FLOAT,
                      dims=[1],
                      vals=[1.0 / 127.5])
 
graph.initializer.append(mul_const_node)

sub_node = onnx.helper.make_node(
               'Mul',
               name='pre_mul',
               inputs=['pre_sub', 'const_mul'],
               outputs=['pre_mul'])
graph.node.insert(1, sub_node)

这样操作之后,我们还需要一步,就是将第一个卷积层的输入改动一下:

# 第一层卷积的输入修改
 for id, node in enumerate(graph.node):
     for i, input_node in enumerate(node.input):
         if 'data' == input_node:
             node.input[i] = 'pre_mul'

这样能我们加入node或者tensor的过程基本就结束了

3、把冰箱门关上

这一步我们就可以简单的重组一下graph,然后save模型就行了

graph = onnx.helper.make_graph(graph.node, graph.name, graph.input, graph.output, graph.initializer)
info_model = onnx.helper.make_model(graph)
onnx_model = onnx.shape_inference.infer_shapes(info_model)
 
onnx.checker.check_model(onnx_model)
onnx.save(onnx_model, onnx_path.replace('nopre', 'fix'))

完事我们就拿到一个修改过的模型了,找一个人脸的模型来示例一下:

如何修改已有的ONNX模型第2张

红圈就是增加的节点,当然你也可以增加其它节点。注意按照onnx的op要求实现就行了,给一个参考的路径:

https://github.com/onnx/onnx/blob/master/docs/Operators.md​github.com/onnx/onnx/blob/master/docs/Operators.md

出处:如何修改已有的ONNX模型 - 知乎 (zhihu.com)

免责声明:文章转载自《如何修改已有的ONNX模型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Apktool下载与安装 windows环境python之SQLAlchemy下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Perl函数及参数介绍

子例程,函数  子例程,函数的作用域是指在程序中能够看到它的位置范围。子例程是全局的,可以放在脚本中的任意位置,甚至放在其他脚本文件中。当使用来自其他文件的子例程时,应当使用关键字do,require或use将它加载到脚本里。若要调用一个子例程,用户可以在子例程前加上&符号,或在子例程前加上do关键字,也可以在子例程名后面加上一组括号。如果使用了向...

使用Electron构建跨平台的抓取桌面程序

谈起桌面应用开发技术, 我们会想到.Net下的WinForm, Java下的JavaFX以及Linux下的QT. 这些技术对于Web应用程序员来说一般比较陌生, 因为大多Web应用程序员的开发技能是前端的JavaScript和后端的Java,PHP等语言. 如果Web应用程序员想开发桌面应用怎么办? 主流的桌面应用开发技术的学习曲线不低, 上手比较困难....

部署CentOS,集成Mysql、Nodejs、Nginx

1. Mysql安装 Step 1 安装源 https://dev.mysql.com/downloads/repo/yum/ 选择:Red Hat Enterprise Linux 8 / Oracle Linux 8 (Architecture Independent), RPM Package 这个download 跳转的页面对着No thanks,...

torch笔记合集

Torch笔记 import torch import numpy as np import torch.nn as nn a_np = np.random.rand(10,100) numpy知识回顾 a_np.dtype # 数据类型 a_np.ndim #维度个数 a_np.shape # 形状 整数元祖 a_np.dtype=np.int...

三、Electron + Webpack + Vue 搭建开发环境及打包安装 ---- 打包electron应用

目录 Webpack + Vue 搭建开发环境及打包安装 ------- 打包渲染进程 Electron + Webpack  搭建开发环境及打包安装 ------- 打包主进程 Electron + Webpack + Vue 搭建开发环境及打包安装 ---- 打包electron应用 三、打包Election App 应用   在之前的节中已经写...

汇编指令mov、add、sub、jmp

mov:寄存器,数据 mov:寄存器,寄存器 mov:寄存器,内存单元 mov:段寄存器,内存单元 mov:内存单元,寄存器 mov:内存单元,段寄存器 mov:段寄存器,寄存器 mov:寄存器,段寄存器 add:寄存器,数据 add:寄存器,寄存器 add:内存单元,寄存器 add:寄存器,内存单元 sub:寄存器,数据 sub:寄存器,寄存器 sub:...