網站首頁 編程語言 正文
學習目標
1.掌握pytorch模型轉換到onnx模型
2.順利運行onnx模型
3.比對onnx模型和pytorch模型的輸出結果
學習大綱
- pytorch模型轉換onnx模型
- 運行onnx模型
- onnx模型輸出與pytorch模型比對
學習內容
前提條件:需要安裝onnx 和 onnxruntime,可以通過 pip install onnx 和 pip install onnxruntime 進行安裝
1 . pytorch 轉 onnx
pytorch 轉 onnx 只需要一個函數 torch.onnx.export
torch.onnx.export(model, args, path, export_params, verbose, input_names, output_names, do_constant_folding, dynamic_axes, opset_version)
參數說明:
- model——需要導出的pytorch模型
- args——模型的輸入參數,滿足輸入層的shape正確即可。
- path——輸出的onnx模型的位置。例如‘yolov5.onnx’。
- export_params——輸出模型是否可訓練。default=True,表示導出trained model,否則untrained。
- verbose——是否打印模型轉換信息。default=False。
- input_names——輸入節(jié)點名稱。default=None。
- output_names——輸出節(jié)點名稱。default=None。
- do_constant_folding——是否使用常量折疊(不了解),默認即可。default=True。
- dynamic_axes——模型的輸入輸出有時是可變的,如Rnn,或者輸出圖像的batch可變,可通過該參數設置。如輸入層的shape為(b,3,h,w),batch,height,width是可變的,但是chancel是固定三通道。
格式如下 :
1)僅list(int) dynamic_axes={‘input’:[0,2,3],‘output’:[0,1]}
2)僅dict<int, string> dynamic_axes={‘input’:{0:‘batch’,2:‘height’,3:‘width’},‘output’:{0:‘batch’,1:‘c’}}
3)mixed dynamic_axes={‘input’:{0:‘batch’,2:‘height’,3:‘width’},‘output’:[0,1]} - opset_version——opset的版本,低版本不支持upsample等操作。
import torch
import torch.nn
import onnx
model = torch.load('best.pt')
model.eval()
input_names = ['input']
output_names = ['output']
x = torch.randn(1,3,32,32,requires_grad=True)
torch.onnx.export(model, x, 'best.onnx', input_names=input_names, output_names=output_names, verbose='True')
2 . 運行onnx模型
檢查onnx模型,并使用onnxruntime運行。
import onnx
import onnxruntime as ort
model = onnx.load('best.onnx')
onnx.checker.check_model(model)
session = ort.InferenceSession('best.onnx')
x=np.random.randn(1,3,32,32).astype(np.float32) # 注意輸入type一定要np.float32!!!!!
# x= torch.randn(batch_size,chancel,h,w)
outputs = session.run(None,input = { 'input' : x })
參數說明:
- output_names: default=None
用來指定輸出哪些,以及順序
若為None,則按序輸出所有的output,即返回[output_0,output_1]
若為[‘output_1’,‘output_0’],則返回[output_1,output_0]
若為[‘output_0’],則僅返回[output_0:tensor] - input:dict
可以通過session.get_inputs().name獲得名稱
其中key值要求與torch.onnx.export中設定的一致
3.onnx模型輸出與pytorch模型比對
import numpy as np
np.testing.assert_allclose(torch_result[0].detach().numpu(),onnx_result,rtol=0.0001)
如前所述,經驗表明,ONNX 模型的運行效率明顯優(yōu)于原 PyTorch 模型,這似乎是源于 ONNX 模型生成過程中的優(yōu)化,這也導致了模型的生成過程比較耗時,但整體效率依舊可觀。
此外,根據對 ONNX 模型和 PyTorch 模型運行結果的統(tǒng)計分析(誤差的均值和標準差),可以看出 ONNX 模型的運行結果誤差很小、基本可靠。
內容參考:https://zhuanlan.zhihu.com/p/422290231
總結
原文鏈接:https://blog.csdn.net/weixin_38989668/article/details/123840882
相關推薦
- 2022-06-29 Qt?Design?Studio創(chuàng)建工程的實現方法_C 語言
- 2022-12-08 利用C語言編寫一個無限循環(huán)語句_C 語言
- 2022-11-15 python運行cmd命令行的3種方法總結_python
- 2022-01-10 egg作為后端接口,在前端調用
- 2022-04-03 Python中的tkinter庫簡單案例詳解_python
- 2022-04-10 SQL?server中提示對象名無效的解決方法_MsSql
- 2022-11-29 Rust?模式匹配示例詳解_Rust語言
- 2022-07-12 利用python語言實現將Excel表格中的一列放進另一個Excel
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支