Pytorch模型转onnx模型实例
如下所示:
importio
importtorch
importtorch.onnx
frommodels.C3AEModelimportPlainC3AENetCBAM
device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")
deftest():
model=PlainC3AENetCBAM()
pthfile=r'/home/joy/Projects/models/emotion/PlainC3AENet.pth'
loaded_model=torch.load(pthfile,map_location='cpu')
#try:
#loaded_model.eval()
#exceptAttributeErroraserror:
#print(error)
model.load_state_dict(loaded_model['state_dict'])
#model=model.to(device)
#datatypenchw
dummy_input1=torch.randn(1,3,64,64)
#dummy_input2=torch.randn(1,3,64,64)
#dummy_input3=torch.randn(1,3,64,64)
input_names=["actual_input_1"]
output_names=["output1"]
#torch.onnx.export(model,(dummy_input1,dummy_input2,dummy_input3),"C3AE.onnx",verbose=True,input_names=input_names,output_names=output_names)
torch.onnx.export(model,dummy_input1,"C3AE_emotion.onnx",verbose=True,input_names=input_names,output_names=output_names)
if__name__=="__main__":
test()
直接将PlainC3AENetCBAM替换成需要转换的模型,然后修改pthfile,输入和onnx模型名字然后执行即可。
注意:上面代码中注释的dummy_input2,dummy_input3,torch.onnx.export对应的是多个输入的例子。
在转换过程中遇到的问题汇总
RuntimeError:FailedtoexportanONNXattribute,sinceit'snotconstant,pleasetrytomakethings(e.g.,kernelsize)staticifpossible
在转换过程中遇到RuntimeError:FailedtoexportanONNXattribute,sinceit'snotconstant,pleasetrytomakethings(e.g.,kernelsize)staticifpossible的错误。
根据报的错误日志信息打开/home/joy/.tensorflow/venv/lib/python3.6/site-packages/torch/onnx/symbolic_helper.py,在相应位置添加print之后,可以定位到具体哪个op出问题。
例如:
在相应位置添加
print(v.node())
输出信息如下:
%124:Long()=onnx::Gather[axis=0](%122,%121),scope:PlainC3AENetCBAM/Bottleneck[cbam]/CBAM[cbam]/ChannelGate[ChannelGate]#/home/joy/Projects/models/emotion/WhatsTheemotion/models/cbam.py:46:0
原因是pytorch中的tensor.size(1)方式onnx识别不了,需要修改成常量。
以上这篇Pytorch模型转onnx模型实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。