修改onnx模型输出示例

2023-10-26

前言

在这里插入图片描述
如图是netron(github链接)软件中打开的onnx模型,可以看到右边模型的最终输出结果是分类值predict_0而非概率值,那么如何获取中间过程的概率值,或者说怎么把右边的图砍掉一截变成左边的图呢?

代码

读入模型

import onnx
onnx_model = onnx.load("xxx.onnx")
graph = onnx_model.graph

首先以图的形式读入你的模型,图一般包括node(节点),initializer(初始化),input(输入),output(输出)四部分,全部打印出来的话非常长,在这里我们主要涉及到删除节点和修改输出两部分。

查看output
在这里插入图片描述
打印output,发现其中的主要信息为name和elem_type两部分。
使用netron选中上一层节点即identity,查看详细信息。
在这里插入图片描述
可以看到上一层节点的输出名即为output的输出名,这两个需要保持一致。
同时elem_type=7,表示输出类型为int64(参照我上一篇文章),这个也需要和上一层节点输出的类型保持一致。

删除node节点

nodes = graph.node
for i in range(len(nodes)):
    print(i,nodes[i])

由于是修改输出,我们只关心最后的几个节点。
在这里插入图片描述
argmax函数不用说了,是经典转化为0,1输出的函数,那么要取概率值肯定在argmax之前,mul是相乘,乘什么我们需要用netron打开模型查看mul节点如下:
在这里插入图片描述
乘0,1矩阵,应该是要转为2列方便进行后续处理,那么我们只要取A的值,也就是上一层节点输出的"add_result_0"就行了。
也就是说,删除序号为261,262,263,264的节点:

graph.node.remove(nodes[264])
graph.node.remove(nodes[263])
graph.node.remove(nodes[262])
graph.node.remove(nodes[261])

倒着顺序删除,再次打印节点:
在这里插入图片描述
完成删除。

修改output

graph.output[0].name = 'add_result_0'
graph.output[0].type.tensor_type.elem_type = 1

由于add_result_0输出的值为float32,因此需要在output中修改elem_type为对应的数据类型,1为float32,更多类型查看我上一篇文章。

结果比较

onnx.save(onnx_model, 'modify_xxx.onnx')

先保存模型,再调用onnx runtime进行模型调用:

import onnxruntime as rt
sess = rt.InferenceSession("modify_xxx.onnx")
onnx_pred = sess.run() #具体里面填什么根据你的模型填,此处为伪代码

在这里插入图片描述
和未修改之前的模型比较:
在这里插入图片描述
发现修改后的模型概率值大于0的都被分类成了1,小于0的都被分类成了0,表示我们这次修改取得了成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修改onnx模型输出示例 的相关文章

随机推荐

  • Eclipse 语言包下载

    1 登陆http www eclipse org babel downloads php 选择你的eclipse版本 2 找到IDE中文补丁包 INDIGO的地址如下 http download eclipse org technology
  • Maven(六) eclipse 使用Maven deploy命令部署构建到Nexus

    转载于 http blog csdn net jun55xiu article details 43051627 1 应用场景 SYS UTIL 系统工具 项目部署 构建成JAR包 SYS UTIL XXX jar 存储到Nexus私服上
  • spring boot 使用application.properties 进行外部配置

    application properties大家都不陌生 我们在开发的时候 经常使用它来配置一些可以手动修改而且不用编译的变量 这样的作用在于 打成war包或者jar用于生产环境时 我们可以手动修改环境变量而不用再重新编译 spring b
  • python里的pypi是干什么用的_【python工具篇】pip和pypi

    PyPI the Python Package Index The Python Package Index is a repository of software for the Python programming language T
  • HTTP中GET,POST和PUT的区别

    一 HTTP中定义了以下几种请求方法 1 GET 2 POST 3 PUT 4 DELETE 5 HEAD 6 TRACE 7 OPTIONS 二 各个方法介绍 1 GET方法 对这个资源的查操作 2 DELETE方法 对这个资源的删操作
  • 电脑检测不到第二个显示器的解决方法

    一般是因为显示适配器被失效了 右击开始菜单 选择 设备管理器 再选择 显示适配器 这时图标上一般会带上感叹号 右击后选择禁用 再选择启用就能检测到第二个显示器
  • 第一个跑马灯实验

    如何新建一个工程 1 打开工程模板 删除其他不重要的库文件 把main 函数里的内容删除 不用的外设固件库文件可以删掉 节省编译时间 rcc 时钟使能 usart 串口 复用映射 setbits 设置高电平 resetbits 低电平 2
  • 「PAT甲级真题解析」Advanced Level 1006 Sign In and Sign Out

    PAT Advanced Level Practice 1006 Sign In and Sign Out 如果对你有帮助 要点个赞让我知道喔 文章目录 问题分析 完整描述步骤 伪代码描述 完整提交代码 问题分析 题目给出一组学生进入机房的
  • 计量经济学及Stata应用 陈强 第八章自相关习题8.3

    8 3使用数据集gasoline dta估计美国1953 2004年的汽油需求函数 考虑如下回归 其中 被解释变量lgasq为人均汽油消费量的对数 解释变量lincome为人均收入的对数 lgasp为汽油价格指数的对数 lpnc为新车价格指
  • ROS建模仿真(1)-创建机器人模型

    ROS建模仿真 1 创建机器人模型 创建catkin creat pkg功能包 创建机器人描述文件 创建launch文件 创建catkin creat pkg功能包 创建机器人描述文件 创建launch文件 创建catkin creat p
  • Mac OS上使用ffmpeg的“血泪”总结

    标题真不是夸张 这几天在整理视频相关的处理流程 为了获得一些性能数据 打算在自己的MacBook Pro 上面装ffmepg 这一折腾4 5天就过去了 有些问题 在解决之后就豁然开朗了 没有解决之前 真的是百思不得其解 中间就好像隔着一层纱
  • AF_INET和AF_PACKET区别

    http blog csdn net kzm2008 article details 5372834 man 7 ip man 7 packet Packet sockets are used to receive or send raw
  • 单片机蓝桥杯——定时中断实现数码管显示、按键判断

    1 1ms定时中断T0 控制数码管显示 1 关于中断 关于定时中断的初始化函数可直接在STC ISP软件上生成 如下图所示 注意 初始化函数中并没有打开EA和ET0 需要自己加上 2 关于数码管显示 数码管段码 segCode 0 segC
  • Flutter提供者模式说明

    在本文中 我们将介绍Flutter中的Provider模式 Google的工作小组建议使用提供程序模式 他们还在Flutter的Pragmatic State Management中的 Google I O 2019上进行了介绍 其他一些模
  • Nginx的Gzip压缩

    Nginx的Gzip压缩 Nginx开启Gzip压缩功能 可以使网站的css js xml html 文件在传输时进行压缩 提高访问速度 进而优化Nginx性能 在Nginx配置文件中可以配置Gzip的使用 相关指令可以在http区域 se
  • Java流程控制--分支结构

    Java流程控制 分支结构 if 单分支 结构 if 条件表达式 这个表达式的结果是布尔值 要么是false 要么是true 如果上面 中的表达式返回结果是true 那么执行 中代码 如果上面 中的表达式返回结果是false 那么不执行 中
  • Unity的Audio组件命令有哪些

    Unity 的 Audio 组件命令有以下几种 Play 播放音频 Pause 暂停音频 UnPause 取消暂停音频 Stop 停止播放音频 SetScheduledStartTime 设置音频开始播放的时间 SetScheduledEn
  • SpringBoot使用Redisson做延迟队列案列(超详细)

    背景 有些场景下 需要延迟触发一些任务 比如 延迟几秒钟发送短信或者邮件 某些业务系统回调 需要延时几秒钟后回调 当然 实现延时触发的方式有很多 我这里采用 redisson 的 RDelayedQueue 一是因为接入简单 二是没有分布式
  • post使用form-data和x-www-form-urlencoded的本质区别

    一是数据包格式的区别 二是数据包中非ANSCII字符怎么编码 是百分号转码发送还是直接发送 一 application x www form urlencoded 1 它是post的默认格式 使用js中URLencode转码方法 包括将na
  • 修改onnx模型输出示例

    前言 如图是netron github链接 软件中打开的onnx模型 可以看到右边模型的最终输出结果是分类值predict 0而非概率值 那么如何获取中间过程的概率值 或者说怎么把右边的图砍掉一截变成左边的图呢 代码 读入模型 import