onnx模型修改:去掉Dropout层

文章目录

    • 尝试1:强行设置dropout层train mode为False
    • 尝试2:找到onnx模型中的dropout, train mode设置为False
    • 尝试3:直接删除dropout层,连接其输入输出
    • 结语

最近训练模型使用了tinyvit,性能挺强的:
image.png

但是导出onnx时,会提示dropout层的train mode被设置为True了。

UserWarning: ONNX export mode is set to TrainingMode.EVAL, but operator 'dropout' is set to train=True. Exporting with train=True.

这个警告如果只是使用onnxruntime去推理的话,可以不用处理,但是如果使用openvino则会在转换模型时失败。因为导出的onnx中出现了Dropout层,一般的推理框架是不支持推理的时候用dropout的。
image.png

尝试1:强行设置dropout层train mode为False

for m in torch_model.modules():if isinstance(m, torch.nn.Dropout):m.training = False

问题依旧

尝试2:找到onnx模型中的dropout, train mode设置为False

做这个尝试的本意是先设置为False, 再用onnx-simplify去优化一把,理论上会把dropout层去掉。


# 遍历模型的所有Dropout节点, 找到所有的training mode节点名称
training_mode_inputs=[]
for node in model.graph.node:if node.op_type == 'Dropout':# 获取Dropout节点的training_mode输入(假设是最后一个输入)training_mode_input = node.input[-1]# 检查这个输入是否指向之前找到的值为True的常量节点training_mode_inputs.append(training_mode_input)# 遍历所有初始化器
for initializer in model.graph.initializer:# 检查初始化器是否是我们要找的training_mode输入if initializer.name in training_mode_inputs:# 假设这个初始化器是一个布尔值,我们将其修改为False# 注意:ONNX中的布尔值是以int64类型存储的,0表示False,1表示True# initializer.data_type = onnx.TensorProto.INT64initializer.int64_data[:] = [0]  # 修改为False
from onnx import helper
new_initializers = []for initializer in model.graph.initializer:if initializer.name in training_mode_inputs:# 创建一个新的TensorProto对象,值为Falsenew_initializer = helper.make_tensor(name=initializer.name,  # 保持原来的名称data_type=onnx.TensorProto.BOOL,dims=initializer.dims,  # 保持原来的维度vals=[0]  # 设置值为False(在ONNX中用0表示))new_initializers.append(new_initializer)else:new_initializers.append(initializer)# 替换原来的初始化器列表
# Clear existing initializers
model.graph.ClearField('initializer')
# Add the new initializers
model.graph.initializer.extend(new_initializers)

理想很丰满,现实很骨感···并没有发生什么变化

尝试3:直接删除dropout层,连接其输入输出

dropout层在推理的时候也没什么用,直接删除,然后连接上原dropout的输入输出层就好了

import onnx
from onnx import helper# 加载模型
onnx_model = onnx.load(model_path)
graph = onnx_model.graph# 找到 Dropout 层
nodes_to_remove = [node for node in graph.node if node.op_type == 'Dropout']# 删除 Dropout 层并重新连接
for node in nodes_to_remove:input_name = node.input[0]output_name = node.output[0]# 找到所有使用 Dropout 输出作为输入的节点for next_node in graph.node:for i, input_name in enumerate(next_node.input):if input_name == node.output[0]:next_node.input[i] = node.input[0]# 从图中移除 Dropout 节点graph.node.remove(node)# 保存修改后的模型
# check if the model is valid
onnx.checker.check_model(onnx_model)
onnx.save(onnx_model, 'tinyvit_11m_sim_replace.onnx')

成功了,模型的dropout层都被删除了。
image.png

结语

虽然尝试了好几种方式···不过这些具体的代码我基本都是问的copilot,不得不说代码助手减轻了好多工作。
f77d79a3b79d6d9849231e64c8e1cdfa~tplv-dy-resize-origshort-autoq-75_330.jpeg

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

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

相关文章

超细毛搭配超宽设计,一款更呵护牙龈的牙刷

牙龈敏感的时候,刷牙特别难受,最近试了试惠百施(EBISU)65孔宽头软毛牙刷,感觉它的口腔护理体验很不错。这款牙刷的设计独特,采用宽头设计,一次就能刷两排牙齿,极大地提高了清洁效率。…

RS232自由转Profinet协议网关模块连接1200PLC与扫码枪通讯及手动清零案例

一、RS232和Profinet这两种通讯接口的特点和应用场景: RS232是一种串行通讯接口标准,常用于连接计算机和外部设备,传输速率较低但稳定可靠。Profinet则是一种工业以太网通讯协议,具有高速、实时性强的特点,适用于工业…

C/C++语言通过动态链表实现按需内存分配和使用(Linux Ubuntu 24.04环境)

我认为比较理想的内存使用方式应该实现这几个特性: 1. 分配一块能满足大多数情况下需求的内存,比如80%的情况下都不需要再次分配内存。 2. 对另外20%需要较多内存的情况,可以通过动态链表按需追加新的内存块。 3. 要对总共消耗的内存有一个…

【C语言】解决C语言报错:Dangling Pointer

文章目录 简介什么是Dangling PointerDangling Pointer的常见原因如何检测和调试Dangling Pointer解决Dangling Pointer的最佳实践详细实例解析示例1:释放内存后未将指针置为NULL示例2:返回指向局部变量的指针示例3:指针悬空后继续使用示例4&…

引领未来:AI Native与物联网(IoT)的革命性融合

引领未来:AI Native与物联网(IoT)的革命性融合 在数字化转型的浪潮中,AI Native作为一种新兴的软件开发模式,正逐渐成为推动技术创新的核心力量。与此同时,物联网(IoT)技术通过连接物理世界与数字世界,不断扩展其应用…

自编码器笔记

编码器解码器自编码器 先压缩特征,再通过特征还原。 判断还原的和原来的是否相等 encode data 在一个“潜在空间”里。它的用途是“深度学习”的核心-学习数据的特征并简化数据表示形式以寻找模式。 变分自编码器: 1. 首先、假设输入数据是符合正态分布…

tiny-redis 项目可能的问题

https://build-your-own.org/redis/ 事件循环怎么实现的 首先我将连接包装为一个 Connect 类,它包含了 socket fd,读写缓冲区,连接状态(这个连接是发送数据还是接收数据)等成员属性 我会在全局维护一个从 socket fd…

003 选择排序

文章目录 先挑最值,再把剩下的挑最值,再把剩下的挑最值。。。 -- 排序函数 function selectionSort(arr) -- 外层循环,从数组的第一个元素开始,对每个元素进行排序 for i 1, #arr do -- 假设当前位置的元素是最小的 local …

LCR 060. 前 K 个高频元素

给定一个整数数组 nums 和一个整数 k &#xff0c;请返回其中出现频率前 k 高的元素。可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2] 示例 2: 输入: nums [1], k 1 输出: [1] 提示&#xff1a; 1 < nums.length < 105k 的取值范…

【SQL Server点滴积累】Setup SQL Server 2008 Database Mirror (二)

【SQL Server点滴积累】Setup SQL Server 2008 Database Mirror (一)-CSDN博客今天分享SQL Server 2008 R2搭建数据库镜像(Database Mirror)https://blog.csdn.net/ncutyb123/article/details/139749117?spm1001.2014.3001.5501本篇Blog基于以上Blog步骤进行SQL Server 2008 R…

python03——文件操作(new)

“变量”open&#xff08;‘文件路径’&#xff0c;‘模式’&#xff09; //注意加引号 “变量”.write( ) //write函数是写的是字符串&#xff0c;如果你写的东西不是字符串&#xff0c;要写成write&#xff08;str&#xff08;。。&#xff09;&#xff09; “变量”.read…

vue3学习教程第四十节(pinia的用法注意事项解构store)

pinia 主要包括以下五部分&#xff0c;经常用到的是 store、state、getters、actions 以下使用说明&#xff0c;注意事项&#xff0c;仅限于 vue3 setup 语法糖中使用&#xff0c;若使用选项式 API 请直接查看官方文档&#xff1a; 一、前言&#xff1a; pinia 是为了探索 vu…

03_意向锁

意向锁&#xff08;Intention Lock&#xff09; 文章目录 意向锁&#xff08;Intention Lock&#xff09;简介类型原理意向锁加锁流程锁兼容矩阵使用场景示例总结扩展&#xff1a;意向锁和共享锁排他锁的加锁流程假设的场景和前提已加锁的情况新的加锁请求加锁流程锁的兼容性矩…

力扣算法-9.回文数

9.回文数 个人思考 首先从示例2可以看出符号也算在整数这个整体内&#xff0c;可以先判断整数若为负数则返回false其次很容易就会想到遍历两次&#xff0c;从头以及从尾&#xff0c;遍历得到的结果相比较&#xff0c;相同则为回文数 public class Alee9 {public static void …

OpenResty的安装及高级使用

OpenResty的安装及高级使用 1. OpenResty的安装1.1. 二进制版本安装1.2. 源码方式安装2. 日志打印header和body3. 替换body体字符串1. OpenResty的安装 OpenResty的中文站点:https://openresty.org/cn/    OpenResty的英文站点:https://openresty.org/en/ 1.1. 二进制版本…

【linux基础】后台执行命令,防止中断nohup

前台运行与后台运行&#xff1a;前台运行&#xff0c;就是运行过程一直在屏幕输出。 目的&#xff1a;1. 提交至后台 & 2.防止中断 nohup 1.终端上不要有大量的log出现&#xff0c;后台运行 (1) & 程序后台运行 #脚本、修改权限 vi test.sh chmod 777 test.sh#后…

ArcGIS Pro SDK (三)Addin控件 3 事件功能类

22 ArcGIS Pro 放置处理程序 目录 22 ArcGIS Pro 放置处理程序22.1 添加控件22.2 Code 23 ArcGIS Pro 构造工具23.1 添加控件23.2 Code 24 ArcGIS Pro 表构造工具24.1 添加控件24.2 Code 22.1 添加控件 22.2 Code 放置处理程序可以实现文件拖动放置、TreeVIew、ListBox等控件拖…

极速安装的艺术:使用 Mamba 革新你的 Conda 环境管理

标题&#xff1a;极速安装的艺术&#xff1a;使用 Mamba 革新你的 Conda 环境管理 引言 在数据科学和机器学习领域&#xff0c;Conda 是一个广受欢迎的包管理器和环境管理器。然而&#xff0c;随着项目规模的增长&#xff0c;Conda 在处理大量依赖时可能会显得缓慢。Mamba&am…

水下机器人ArduSub 固件常用参数

目前最新版的ArduSub 固件是4.1.2&#xff0c;本文的参数是基于这个版本的固件 SURFACE_DEPTH&#xff1a;水表深度读数 当水下机器人在水面时&#xff0c;水压传感器将读取的深度数据&#xff08;以厘米为单位&#xff09;&#xff0c;这个相当于抵消零偏 单位&#xff1a;…

ArcGIS批量设置多图层的三调地类符号

​​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 01需求说明 这次我们要实现的是将多个地类图层批量符号化。比如将多个三调地类图斑批量符号化。 ​ 有什么好方法呢 &#xff1f; 我们可以将一个图层利用三调符号库进行…