onnx模型的修改与调试demo

主要参考:
模型部署入门教程(五):ONNX 模型的修改与调试
第五章:ONNX 模型的修改与调试

使用netron 可视化模型

读写onnx

构造onnx

创建一个描述线性函数 output = ax+b 的onnx模型。 需要两个节点,第一个节点计算 c = ax ,第二个节点计算 output = c+b
整体输入: a、 x、 b,输出output

import onnx
from onnx import helper
from onnx import TensorProto
# 输入 输出
a = helper.make_tensor_value_info('a', TensorProto.FLOAT, [10, 10])
x = helper.make_tensor_value_info('x', TensorProto.FLOAT, [10, 10])
b = helper.make_tensor_value_info('b', TensorProto.FLOAT, [10, 10])
output = helper.make_tensor_value_info('output', TensorProto.FLOAT, [10, 10])
# 节点
mul = helper.make_node('Mul', ['a', 'x'], ['c'])
add = helper.make_node('Add', ['c', 'b'], ['output'])
# 构建计算图
graph = helper.make_graph([mul, add], 'linear_func', [a, x, b], [output])  # 节点、图名称、输入张量信息,输出张量信息
model = helper.make_model(graph)
# 确认是否满足onnx模型标准
onnx.checker.check_model(model)
print(model)
# 模型保存
onnx.save(model, 'linear_func.onnx')

out:

ir_version: 9
graph {node {input: "a"input: "x"output: "c"op_type: "Mul"}node {input: "c"input: "b"output: "output"op_type: "Add"}name: "linear_func"input {name: "a"type {tensor_type {elem_type: 1shape {dim {dim_value: 10}dim {dim_value: 10}}}}}input {name: "x"type {tensor_type {elem_type: 1shape {dim {dim_value: 10}dim {dim_value: 10}}}}}input {name: "b"type {tensor_type {elem_type: 1shape {dim {dim_value: 10}dim {dim_value: 10}}}}}output {name: "output"type {tensor_type {elem_type: 1shape {dim {dim_value: 10}dim {dim_value: 10}}}}}
}
opset_import {version: 19
}

onnx runtime 运行模型,查看是否正确

import onnxruntime 
import numpy as np sess = onnxruntime.InferenceSession('linear_func.onnx') 
a = np.random.rand(10, 10).astype(np.float32) 
b = np.random.rand(10, 10).astype(np.float32) 
x = np.random.rand(10, 10).astype(np.float32) output = sess.run(['output'], {'a': a, 'b': b, 'x': x})[0] assert np.allclose(output, a * x + b) 

读取并修改 onnx

import onnx 
model = onnx.load('linear_func.onnx') node = model.graph.node 
node[1].op_type = 'Sub' onnx.checker.check_model(model) 
onnx.save(model, 'linear_func_2.onnx') 

调试ONNX模型

子模型提取

ONNX 官方为开发者提供了子模型提取(extract)的功能。子模型提取,顾名思义,就是从一个给定的 ONNX 模型中,拿出一个子模型。这个子模型的节点集、边集都是原模型中对应集合的子集。让我们来用 PyTorch 导出一个复杂一点的 ONNX 模型,并在它的基础上执行提取操作:

import torchclass Model(torch.nn.Module):def __init__(self):super().__init__()self.convs1 = torch.nn.Sequential(torch.nn.Conv2d(3, 3, 3),torch.nn.Conv2d(3, 3, 3),torch.nn.Conv2d(3, 3, 3))self.convs2 = torch.nn.Sequential(torch.nn.Conv2d(3, 3, 3),torch.nn.Conv2d(3, 3, 3))self.convs3 = torch.nn.Sequential(torch.nn.Conv2d(3, 3, 3),torch.nn.Conv2d(3, 3, 3))self.convs4 = torch.nn.Sequential(torch.nn.Conv2d(3, 3, 3),torch.nn.Conv2d(3, 3, 3),torch.nn.Conv2d(3, 3, 3))def forward(self, x):x = self.convs1(x)x1 = self.convs2(x)x2 = self.convs3(x)x = x1 + x2x = self.convs4(x)return xmodel = Model()
input = torch.randn(1, 3, 20, 20)torch.onnx.export(model, input, 'whole_model.onnx')

这个模型的可视化结果如下图所示:

在这里插入图片描述
在官网上,对节点进行了标号,然后方便提取,但是我在根据官网的知道写序号时,报错,keyError:22 。
然后将 序号,改成了 netron 上查看的块的output。
在这里插入图片描述
提取:

import onnxonnx.utils.extract_model('whole_model.onnx', 'partial_model.onnx', ['22'], ['28'])

报错,keyerror 22 .

修改为:

import onnxonnx.utils.extract_model('whole_model.onnx', 'partial_model.onnx', ['/convs1/convs1.1/Conv_output_0'], ['/Add_output_0'])

提取后如下:
在这里插入图片描述

添加额外输出

onnx.utils.extract_model('whole_model.onnx', 'submodel_1.onnx', ['/convs1/convs1.1/Conv_output_0'], ['/convs3/convs3.1/Conv_output_0', '31'])

在这里插入图片描述

添加冗余输入

# 添加冗余输入
import onnx
onnx.utils.extract_model('whole_model.onnx', 'submodel_2.onnx', ['/convs1/convs1.1/Conv_output_0','input.1'], ['/Add_output_0'])

在这里插入图片描述

输出onnx中间节点的值

在使用 ONNX 模型时,最常见的一个需求是能够用推理引擎输出中间节点的值。这多见于深度学习框架模型和 ONNX 模型的精度对齐中,因为只要能够输出中间节点的值,就能定位到精度出现偏差的算子。我们来看看如何用子模型提取实现这一任务。

方法跟添加额外输出类似
在这里插入图片描述

问题

  1. "这里 make_graph 的节点参数有一个要求:计算图的节点必须以拓扑序给出。

拓扑序是与有向图的相关的数学概念。如果按拓扑序遍历所有节点的话,能保证每个节点的输入都能在之前节点的输出里找到(对于 ONNX 模型,我们把计算图的输入张量也看成“之前的输出”)。"
啥意思?
解决: 用节点的 output 代替拓扑序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/354046.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

7. JVM调优实战及常量池详解

JVM性能调优 1. 阿里巴巴Arthas详解1.1 Arthas使用 本文是按照自己的理解进行笔记总结,如有不正确的地方,还望大佬多多指点纠正,勿喷。 课程内容: 1、阿里巴巴Arthas调优工具详解 2、GC日志详解与调优分析 3、Class常量池与运行…

线程同步(一)

上篇文章讲述了什么是线程,以及在Linux系统下线程的相关操作 线程(Linux系统实现)_小梁今天敲代码了吗的博客-CSDN博客 本文将继续讲述线程的相关知识——线程同步 目录 1.线程同步的概念 2.线程不同步可能会发生什么 3.线程同步方式 …

816墨盒计算机无法与,西通PG-815、CL-816兼容墨盒和总结

推荐产品:西通PG-815、CL-816兼容墨盒 参考售价:黑色65元/个,彩色80元/个 产品特点:彩色打印也出色 产品特色:佳能原装墨盒贵是众所周知的,特别是中低端喷墨打印机的墨盒更贵,而且价格贵的同时容…

HP C6602A墨盒驱动

背景 现有一型号为HP C6602A的墨盒,需要研究其驱动方式,并使用合适的微控制器对其进行控制。 工作内容 一、 研究墨盒的驱动 墨盒的驱动原理和方法参考了现有开源项目InkShield的理论部分。由于HP C6602A是一款商业墨盒,HP公司并不提供技…

android 调用支付宝充值,提示系统繁忙,4000

今天在做支付宝充值的时候,遇到一个问题,如下图: 找了老半天的错误,没有找到错误在哪里了,上网半天也没有找到与之相关的错误,最后还是请教了一个大神,才知道错误的原因,代码&#x…

支付宝充值话费

充值流程: 进入充值页面---->输入手机号---->输入/选择充值金额----->进入支付方式页----->选择支付方式------>密码输入 ------>push/短信消息,充值成功

【经验教程】支付宝怎么充值手机话费?

支付宝怎么充值手机话费? 1、打开手机支付宝,并选择支付宝充值中心; 2、打开支付宝充值中心后,默认读取支付宝绑定的手机号码或修改成指定的手机号码充值; 3、选择要充值的金额,并完成支付; 4、…

springboot接入支付宝支付

在springboot项目中接入支付宝支付 一、在官网申请开通二、编写代码 一、在官网申请开通 进入支付宝开放平台 支付宝扫码登录注册,填写相关信息。 因为我们是开发者,所以支付宝给我们提供一个完整的沙箱环境,只要登录开放平台就会给我们提供…

golang对接支付宝支付

本文采用沙箱环境 1. 开启沙箱 文档:https://docs.open.alipay.com/200/105311/ 沙箱地址:https://openhome.alipay.com/platform/appDaily.htm 2. 生成应用公钥和秘钥(已弃用) 本文中的签名方法默认为 RSA2,采用支…

Flutter支付宝支付

_。插件选型: 1.tobias 2.flutter_alipay 3.alipay_kit 4.sy_flutter_alipay 因为flutter项目的flutter sdk是2.53 有空安全,所以排除掉三年没更新的sy_flutter_alipay, flutter_alipay排除掉的原因是本项目的dart sdk版本太低不支持…

如何测试支付宝手机充值的这个功能,写出测试用例

有人在面试软件测试的时候,被问到如何测试支付宝手机充值的这个功能,写出测试用例。 其实无论测试什么,我们首先的需要梳理软件业务的流程,来看看支付宝充值都有哪些流程? 首先,面试官如果给出的是这样一…

p2p银行充值功能模块 支付宝调用

银行充值简介 用户要想要投标的话,那么需要往p2p平台上进行充值 使用支付宝沙箱 调用支付宝充值接口进行测试 用户余额页面展示用户的余额 点击充值调用跳转到银行充值页面 输入密码,密码正确调转到支付宝支付平台 登录账号密码进行充值 充值成功记录到…

抓包抖音充值接口,实现微信支付宝充值抖币收款通道

前段时间搞了个抖音充值的通道,现在搞个YY充值的。 接下来这段时间的安排就是把各个这种平台的充值接口全分析一遍做成接口。 相比抖音的充值抖币接口,yy充值y币的风控就小很多,可以忽略不计,所以开发上也顺利很多。 把调用的相…

SpringBoot源码分析:SpringBoot整合Tomcat(三)

一、概述 SpringBoot整合Tomcat整体启动流程如下图,接下来我们就按照改流程分析SpringBoot中内嵌Tomcat的启动流程。 二、启动流程 通过AbstractApplicationContext.refresh方法进入AbstractApplicationContext.onRefresh方法。 之后进入子类ServletWebServerAppl…

Django对接支付宝实现支付宝充值金币功能

很多网站里都有金币、积分之类的虚拟货币,获取这些往往需要充值。那么问题来了,如何在Django中对接支付宝实现支付宝充值金币的功能呢?网上很多资料都是电商的,那些都会带有订单系统之类比较复杂,而充值金币功能不需要…

抓包抖音充值页面实现微信支付宝充值抖币,可提供api

抖币充值系统重写升级: 1.支持配置扫码配置多个CK 2.支持生成 微信/支付宝 支付二维码 扫码充值 3.支持 微信/支付宝 APP 直接唤醒充值 体验如下: 需要的小伙伴可私信 留言! 整个开发流程思路是以下几步: 1.抓包分析抖音的充值的整个流程&#xff0…

如何使用支付宝充值美区App store的礼品卡

如何使用支付宝充值礼品卡 可能很多人不知道,支付宝可以给美区App Store 充钱,无需信用卡直接购买美区 Apple ID、Google Play、Spotify、Hulu礼品卡,下面就给大家介绍怎么购买 1.城市切换为:旧金山(国际-> 北美洲…

p2p金融项目+支付宝充值

目录 前言 下载服务端SDK 时序图: 按照支付宝时序图的过程去做: 第一步: 第二步--2:生成充值记录(状态:充值中) 第四步:调支付宝的支付接口 第七八步:&#xff0…

RecyclerView实现仿支付宝充值界面

参考博客&#xff1a;https://www.jianshu.com/p/b4bb52cdbeb7 非常感谢上面这位博主的博客给了我非常好的灵感&#xff01;&#xff01;&#xff01; 下面我就先贴一下效果图&#xff1a; 布局代码&#xff1a; <?xml version"1.0" encoding"utf-8"…

JAVA端实现支付宝充值

2019独角兽企业重金招聘Python工程师标准>>> 前言&#xff1a;用户充值到平台 GitHub地址&#xff1a;https://github.com/wubiaowp/SpringCloud2.0.git 一、申请开发者账号-APPID、商户私钥、支付宝公钥、配置回调地址&#xff08;配置沙箱环境-测试&#xff09; 二…