onnx模型的修改与调试demo

news2024/11/23 21:56:22

主要参考:
模型部署入门教程(五):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: 1
        shape {
          dim {
            dim_value: 10
          }
          dim {
            dim_value: 10
          }
        }
      }
    }
  }
  input {
    name: "x"
    type {
      tensor_type {
        elem_type: 1
        shape {
          dim {
            dim_value: 10
          }
          dim {
            dim_value: 10
          }
        }
      }
    }
  }
  input {
    name: "b"
    type {
      tensor_type {
        elem_type: 1
        shape {
          dim {
            dim_value: 10
          }
          dim {
            dim_value: 10
          }
        }
      }
    }
  }
  output {
    name: "output"
    type {
      tensor_type {
        elem_type: 1
        shape {
          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 torch

class 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 + x2
        x = self.convs4(x)
        return x

model = Model()
input = torch.randn(1, 3, 20, 20)

torch.onnx.export(model, input, 'whole_model.onnx')

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

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

import onnx

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

报错,keyerror 22 .

修改为:

import onnx

onnx.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://www.coloradmin.cn/o/612902.html

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

相关文章

造轮子--自己封装一个 start

背景 都说不要造轮子,但是青柠认为,有的时候,造个轮子,更有助于清楚详细的业务逻辑,所以咱也自己写一个轮子,搞个系统开发。大体思路就是先搭建基础框架,然后细写业务逻辑,会涵盖主…

图解HTTP书籍学习2

确保Web安全的HTTPS HTTP的缺点 ●通信使用明文(不加密),内容可能会被窃听 ●不验证通信方的身份,因此有可能遭遇伪装 ●无法证明报文的完整性,所以有可能已遭篡改 加密处理防止被窃听 通信的加密 一种方式就是…

【React】类组件,JSX语法,JSX原理,传递参数,条件渲染,列表渲染

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录 React使用组件(类组件)JSX语法书写规范JSX插入的内容JSX属性绑定JSX类绑…

前端基础(CSS)——css介绍 常用样式 案例—进化到Bootstrap——进化到Element-UI(未完待续)

目录 引出CSS相关1.css写在哪里?2.css的选择器【重要】(1)标签选择器---div{}(2)id选择器----#div01{}(3)类选择器---class"div01",.dav01{}(4)后代…

saas产品私有化(一) 缓存中间件适配

一.背景 名词解释:私有化一般指的是在对客交付过程中,客户由于自身数据敏感,成本控制等原因要求交付乙方将售卖的服务利用现有甲方的硬件设备或者云服务进行服务的部署. 面向场景:一般特制的是saas化的云服务软件提供商的对特殊客群的场景.其中saas行业中比较起步和规模比较大的…

流氓软件篡改微软EDGE浏览器主页面的那些伎俩

微软的EDGE浏览器很好用,但也很容易被绑架,在网上下载各类免费软件,只要你安装完,十有八九就给你把主页改成某某导航了。尽管打开EDGE直接进入360、毒霸、好123等链接对上网影响也不大,打开这些导航页面后,…

IMX6ULL裸机篇之I2C实验主控代码说明二

一. I2C实验 I2C实验内容: 学习如何使用 I.MX6U 的 I2C 接口来驱动 AP3216C,读取 AP3216C 的传感器数据。 I2C读写数据时序图: I2C写数据时序图如下: I2C读数据时序图如下: 二. I2C主控读写时序 1. 读数据与写数…

MMDetection学习记录(二)之配置文件

文件结构 config文件 在 config_base_ 文件夹下有 4 个基本组件类型,分别是:数据集(dataset),模型(model),训练策略(schedule)和运行时的默认设置(default runtime)。 命名风格 {model}_[model setting]_{backbone}_{neck}_[no…

微信小程序项目实例——密码管理器

今日推荐💁‍♂️ 自疫情后武林广场的音乐喷泉再次开启⛲⛲⛲ 坐在最佳视角下观赏了一场久违的表演🎆🎆🎆 🔮🔮🔮🔮🔮往期优质项目实例🔮🔮&…

在三台Linux虚拟机上完成构建集群的前置准备

前言 从现在开始进入到实操阶段,将要在VMware软件中创建多台Linux虚拟机,并进行系统设置。 需要同学们拥有前置知识: VMware的使用经验,知道什么是虚拟机并在VMware中创建过Linux虚拟机(CentOS系统) 熟…

go语言学习——8

文章目录 文件操作打开文件文件读取写文件判读文件或文件夹是否存在拷贝文件统计文件字符命令行参数flag包解析命令行参数 文件操作 os.File封装所有文件相关操作,File是一个结构体 打开文件 package mainimport ("fmt""os" )func main() {file…

重载运算符三个const的作用

const Point operator(const Point &point) const{ } 尝试去理解const,然后搞懂为什么这里放置const。 const 用于修饰其后面跟着的名字,使其为常量,不可被修改。 1.第一个const 的位置后面是函数返回值类型,表明函数返回的是常量&#…

Yolov8涨点神器:创新卷积块NCB和创新Transformer 块NTB,助力检测,提升检测精度

🏆🏆🏆🏆🏆🏆Yolov8魔术师🏆🏆🏆🏆🏆🏆 ✨✨✨魔改网络、复现前沿论文,组合优化创新 🚀🚀🚀小目标、遮挡物、难样本性能提升 🍉🍉🍉定期更新不同数据集涨点情况 本博客将具有部署友好机制的强大卷积块和变换块,即NCB和NTB,引入到yolo…

spring源码的简单梳理之bean的初始化过程

我们都知道spring中最核心的就是容器的概念,而交于spring管理的对象称为bean对象。在spring中我们这次以xml配置bean的方式进行简单模拟spring创建bean的初始化过程。 1、首先我们先来一起研究一下一个xml文件中bean的结构。 我们可以看到一个bean是一个标签所扩住…

【STM32CubeMX】WS2812彩灯

前言 有时间我就按照网上的时序推理了WS2812的传输时序。之前就推过时序了,但是当时时序好像没对,因为没用逻辑分析仪查看,就以为通过电片机的运行主频,在控制NOP,就能得到us级的延时控制,但是真实的情况是…

EBU6304 Software Engineering 知识点总结_5 项目管理_上

Software architecture 功能需求和软件架构关系紧密,非功能需求是软件架构的选择结果(好的架构运行效率高之类的)。可以以表格或图的形式,比如UML图。 设计难以更改。敏捷开发的早期阶段就是设计系统架构。 好处: …

MMDet3D——数据增强Pipline‘GlobalRotScaleTrans‘和‘RandomFlip3D‘的Pytorch逆变换实现

在点云的3D感知算法中,常用RandomFlip3D和GlobalRotScaleTrans的数据增强方式,这两个可以有效地增强模型的鲁棒性,提升模型的性能。 transforms[dict(typeRandomFlip3D,sync_2dFalse,flip_ratio_bev_horizontal0.5,flip_ratio_bev_vertical0.…

Qt问题:Qt槽函数是否支持内联?

Qt的信号和槽机制是基于Qt的元对象系统的,这个系统提供了一种在运行时获取对象信息的能力,如类名、信号和槽的数量和类型等。这个系统通过Qt的元对象编译器(moc)在编译时生成额外的代码来实现。 当一个信号被发射时,Q…

独立站电商优选的客服工具

遇到难题,寻找在线客服肯定是解决问题的首选途径了。但大多数独立站跨境电商网站的客服响应速度很难达到及时响应,一般普遍响应的时间从十几分钟到几小时、几十小时不等,甚至还有客服处于‘失联’状态。 去年黑五大促,Louella在某…

SpringCloud Alibaba Nacos学习

SpringCloud Alibaba Nacos 文章目录 SpringCloud Alibaba Nacos1 Nacos 是什么?2 服务提供者 service-provider-nacos 配置3 服务消费者:server-consumer-nacos 配置 1 Nacos 是什么? 一句话: Nacos 就是注册中心[替代 Eureka]配置中心[替代…