世界热讯:pytorch模型转onnx模型的方法详解
目录
学习目标学习大纲学习内容1 . pytorch 转 onnx2 . 运行onnx模型3.onnx模型输出与pytorch模型比对总结学习目标
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——输入节点名称。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
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 模型的运行效率明显优于原 PyTorch 模型,这似乎是源于 ONNX 模型生成过程中的优化,这也导致了模型的生成过程比较耗时,但整体效率依旧可观。
此外,根据对 ONNX 模型和 PyTorch 模型运行结果的统计分析(误差的均值和标准差),可以看出 ONNX 模型的运行结果误差很小、基本可靠。
内容参考:https://zhuanlan.zhihu.com/p/422290231
总结
到此这篇关于pytorch模型转onnx模型的文章就介绍到这了,更多相关pytorch模型转onnx模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 1联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 2亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 3现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 4如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 5AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 6转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 7充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 8好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 9名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 10亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战