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语言报错:Dangling Pointer

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

自编码器笔记

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

【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(‘文件路径’,‘模式’) //注意加引号 “变量”.write( ) //write函数是写的是字符串,如果你写的东西不是字符串,要写成write(str(。。)) “变量”.read…

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

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

力扣算法-9.回文数

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

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

前台运行与后台运行:前台运行,就是运行过程一直在屏幕输出。 目的:1. 提交至后台 & 2.防止中断 nohup 1.终端上不要有大量的log出现,后台运行 (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等控件拖…

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

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

Stable Diffusion 3 正式开源,超强文生图模型 SD3-M 上线,赶紧来试试吧!

前言 我们都知道 Stable Diffusion 3 是一款强大的文生图模型,拥有20亿参数,因其高效的推理速度和卓越的生成效果而备受瞩目。 近日,Stability AI在推特上宣布正式开源了 Stable Diffusion 3 Medium(SD3-M) 权重&…

Dooprime外汇:如何高效规划家庭理财?从哪里开始?

摘要: 家庭理财是每个家庭都必须面对的重要课题。合理的理财规划不仅能提高家庭的生活质量,还能为未来的生活提供保障。然而,许多人在面对复杂的理财选项和信息时感到无从下手。本文将从不同角度详细分析如何进行高效的家庭理财规划&#xf…

【Playwright+Python】手把手带你写一个自动化测试脚本

如何使用代理方式打开网页 在 playwright.chromium.launch() 中传入 proxy 参数即可,示例代码如下: 1、同步写法: from playwright.sync_api import sync_playwrightproxy {server: http:/127.0.0.1:8080}def run():with sync_playwright(…

Kafka精要

Apach Kafka 是一款分布式流处理框架,用于实时构建流处理应用。它有一个核心 的功能广为人知,即 作为企业级的消息引擎被广泛使用 kafka设计 Kafka 将消息以 topic 为单位进行归纳 将向 Kafka topic 发布消息的程序成为 producers. 将预订 topics 并消…

Linux内核开发-编写一个proc文件

0.前言 上一章(点击返回上一章)完成了一个内核模块的编写,实现了在内核运行时的动态加载和卸载。 在模块的开发调测过程中或者模块运行过程中,可能需要打印内核模块的变量的值或者想要动态开关模块的运行日志打印,那么…

小盒子跑大模型!基于算能BM1684X+FPGA平台实现大模型私有化部署

当前,在人工智能领域,大模型在丰富人工智能应用场景中扮演着重要的角色,经过不断的探索,大模型进入到落地的阶段。而大模型在落地过程中面临两大关键难题:对庞大计算资源的需求和对数据隐私与安全的考量。为应对这些挑…

springcloud-gateway include-expression 配置说明

在开发过程中遇到的一些配置问题,记录下来以供参考 spring-gateway版本是2.2.9-release,使用的spring cloud dependence 是 Hoxton.SR12 在依赖eureka 服务发现并自动将发现服务器加入到router中的时候,需要指定对应的服务进行添加,根据文档…

postman国内外竞争者及使用详解分析

一、postman简介 Postman 是一款广泛使用的 API 开发和测试工具,适用于开发人员和测试人员。它提供了一个直观的界面,用于发送 HTTP 请求、查看响应、创建和管理 API 测试用例,以及自动化 API 测试工作流程。以下是 Postman 的主要功能和特点…

linux的CP指令

实现 CP 指令 src 源文件 des 目标文件 执行流程: 打开源文件( src ) open 打开目标文件( des ) open 写入目标文件 write 读取 src 文件到缓存数组 read 关闭目标文件和源文件 close ./a.out src.c de…