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.pswp.cn/diannao/35101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35101.shtml
英文地址,請注明出處:http://en.pswp.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; 我們可以將一個圖層利用三調符號庫進行…