首页 > 编程语言 >编辑ONNX模型的python代码

编辑ONNX模型的python代码

时间:2022-12-16 22:00:37浏览次数:72  
标签:node tensor python ONNX 代码 onnx model type 节点

参考:(8条消息) 编辑ONNX模型的python代码_Alexa2077的博客-CSDN博客

编辑ONNX的python代码
一、ONNX模型的基本操作
1,加载ONNX模型
2,保存ONNX模型
3,OP节点列表
4,输入节点名称
5,输出节点名称
6,参数节点
二、ONNX模型的修改
1,修改内部的变量
2,创建tensor
3,增加OP节点
4,增加输入\输出tensor节点
5,增加参数节点
6,特殊节点-constant增加
7,读取ONNX的参数tensor格式,转换为numpy
三、例程
得到第一个Conv的节点信息
注意:
在运行程序的时候,记得安装onnx的环境,在pycharm里面切换到onnx的解释器。
关于onnx的更多信息可以查看:https://github.com/onnx
一、ONNX模型的基本操作
1,加载ONNX模型
 model = onnx.load("test.onnx") 

2,保存ONNX模型
 onnx.save(model, 'save_path.onnx') 

3,OP节点列表
 model.graph.node 是List, 可以增删改查 

4,输入节点名称
 model.graph.input 

5,输出节点名称
 model.graph.output 

6,参数节点
 model.graph.initializer 

二、ONNX模型的修改
1,修改内部的变量
可直接修改内部的变量,如改变任意OP名称或者属性。

model.graph.node[0].op_type= '自定义'
改变输入的batch=1,model.graph.input[0].type.tensor_type.shape.dim[0].dim_value=1

 

当然也可以采用下面方法创建新的节点插入

2,创建tensor
ONNX模型采用tensor与node(op)将整个网络构建起来,node中输入输出为tensor的名称,用来连接各个tensor,中间的节点tensor不用创建,网络的输入输出节点需要创建tensor。Tensor常用的2种创建方法,样例如下:

1) onnx.helper.make_tensor_value_info(name=output, elem_type=type, shape=[1,3,224])
仅根据形状创建,用于输入输出节点
2)onnx.helper.make_tensor(name='const_tensor', data_type,dims=values.shape,vals=values.flatten())),
根据numpy数据创建

3,增加OP节点

 函数:add_node = onnx.helper.make_node(op_type='Conv', inputs=input_names, outputs=output_names,name='conv1', **attribute) 

添加OP节点到图中:

model.graph.node.append(add_node)
model.graph.node.insert(insert_pos, add_node)

其中,input_names、output_names 是字符串数组,为tensor的名称,例如,input_names=[‘name1’, ‘name2’]

attribute是字典,如 attribute[‘eps’] = 0.0001

4,增加输入\输出tensor节点
函数:

output_node = onnx.helper.make_tensor_value_info(name=output, elem_type=type, shape=[1,3,224])
model.graph.output.append(output_node)

 

5,增加参数节点

params = numpy_helper.from_array(numpy, name='p_name')
model.graph.initializer.append(params)

 

6,特殊节点-constant增加
函数:

value=onnx.helper.make_tensor(name='const_tensor', data_type=1, dims=numpy_data.shape,vals=numpy_data.flatten()))
constant_node = onnx.helper.make_node(op_type='Constant', inputs=[], outputs=[output_name],name='constant1', value = value)

 


7,读取ONNX的参数tensor格式,转换为numpy

constant节点:onnx.numpy_helper.to_array(onnx_node.attribute[0].t)
initialize的参数:onnx.numpy_helper.to_array(params)

 

特别数值,若数值为1个数,则导出的非numpy格式,也是一个数值

三、例程
本文使用打开onnx模型的软件为netron,本文使用mobilenetv2-7.onnx模型,从官网的模型库中下载的。
onnx官网:https://onnx.ai/ 进行查找和下载

使用topo_tailoring_infer_smoke_resnet18_704x384_fp16_2_Conv_161.onnx (netron.app)打开xxx.onnx文件
打开onnx模型如下图所示:

 

 


得到第一个Conv的节点信息

import onnx
model = onnx.load("mobilenetv2-7.onnx")
nodel_list = model.graph.node
input_list = model.graph.input
output_list = model.graph.output
initializer_list = model.graph.initializer
print(nodel_list[0])

 

运行之后,打印如下结果:

input: "input"
input: "475"
input: "476"
output: "474"
name: "Conv_0"
op_type: "Conv"
attribute {
name: "dilations"
ints: 1
ints: 1
type: INTS
}
attribute {
name: "group"
i: 1
type: INT
}
attribute {
name: "kernel_shape"
ints: 3
ints: 3
type: INTS
}
attribute {
name: "pads"
ints: 1
ints: 1
ints: 1
ints: 1
type: INTS
}
attribute {
name: "strides"
ints: 2
ints: 2
type: INTS
}

 


我们使用netron打开该模型的第一个Conv节点进行对照:
可以看到input,output,等等信息都可以得到,其他的修改部分按照上面给出的语法进行操作即可。
后面的操作就相当于对着List进行操作。

 

注意:
在运行程序的时候,记得安装onnx的环境,在pycharm里面切换到onnx的解释器。
关于onnx的更多信息可以查看:https://github.com/onnx

标签:node,tensor,python,ONNX,代码,onnx,model,type,节点
From: https://www.cnblogs.com/zhiminyu/p/16988373.html

相关文章

  • Python怎么引入不同的库?
    怎么引入不同的库?在线安装库1)pipinstall模块名2)国内源:清华:https://pypi.tuna.tsinghua.edu.cn/simple阿里云:http://mirrors.aliyun.com/pypi/simple/中国科技......
  • Python Tkinter界面应用开发-黄棒清-专题视频课程
    PythonTkinter界面应用开发—1773人已学习课程介绍        如果你想在Python中构建图形用户界面应用程序,Tkinter是一个的选择.,TkInter应用程序几乎可以在任何桌面......
  • python-参数化
    '''参数化的作用将多个测试代码相同只是测试数据不同,预期结果不同的测试用例,通过参数化的技术合并成一个测试用例使用方法先安装parameterized(设置-py......
  • 深入理解 Python 的对象拷贝和内存布局
    深入理解Python的对象拷贝和内存布局前言在本篇文章当中主要给大家介绍python当中的拷贝问题,话不多说我们直接看代码,你知道下面一些程序片段的输出结果吗?a=[1,2,......
  • Python函数/动态参数/关键字参数
     1.函数#函数语法:#函数名规范:小谢字母开头,不同字母下划线隔开(字母数字下划线)#def函数名():#函数体:希望函数做的事情1.1.无参函数#无参函数defmusic():......
  • 验证码案列的代码实现和细节处理
    代码实现:login.jsp<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>login</title><script>window.onload......
  • Python之Socket编程: 轻松连接你的应用程序
    前言什么是Socket?Python的Socket模块提供了一个标准的接口,可以让你使用网络连接来通信。Socket是一种网络通信技术,它提供了一个通用的接口来连接不同类型的网络,例......
  • python面向对象
    面向对象的三大特性:封装性,继承性,多态性。封装性封装隐藏了对象的属性和方法内部实现细节,仅对外提供公共访问方式,类的内部可以访问,外部不可以访问。封装格式:在变量或者方法前......
  • PYTHON 模块 - random
    1.1random模块用于生成随机数。1.2相关方法random.random()用于生成一个0到1的随机浮点数:0<=n<1.0>>>importrandom>>>random.random()0.6067277881757......
  • Git代码合并过程中解决代码冲突问题
    场景将功能分支feature-login合并到master分支 步骤1.切换到master分支gitcheckoutmaster2.将feature-login分支合并到mastergitmergefeature-login3......