您好,登錄后才能下訂單哦!
這篇文章主要介紹“pytorch模型怎么轉onnx模型”,在日常操作中,相信很多人在pytorch模型怎么轉onnx模型問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”pytorch模型怎么轉onnx模型”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
前提條件:需要安裝onnx 和 onnxruntime,可以通過 pip install onnx 和 pip install onnxruntime 進行安裝
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——輸入節點名稱。default=None。
output_names——輸出節點名稱。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')
檢查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中設定的一致
import numpy as np np.testing.assert_allclose(torch_result[0].detach().numpu(),onnx_result,rtol=0.0001)
如前所述,經驗表明,ONNX 模型的運行效率明顯優于原 PyTorch 模型,這似乎是源于 ONNX 模型生成過程中的優化,這也導致了模型的生成過程比較耗時,但整體效率依舊可觀。
此外,根據對 ONNX 模型和 PyTorch 模型運行結果的統計分析(誤差的均值和標準差),可以看出 ONNX 模型的運行結果誤差很小、基本可靠。
到此,關于“pytorch模型怎么轉onnx模型”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。