通过ONNX从PyTorch转换到CoreML时缺少权重向量

通过ONNX从PyTorch转换到CoreML时缺少权重向量,pytorch,coreml,onnx,onnx-coreml,Pytorch,Coreml,Onnx,Onnx Coreml,我试图通过ONNX将PyTorch模型转换为CoreML,但是ONNX-->CoreML转换缺少权重向量 我遵循的是做出以下声明的教程: 步骤3:将模型转换为CoreML 它与运行convert功能一样简单。生成的对象是coremltools MLModel对象,您可以将其保存到文件中,然后在XCode中导入。 cml=onnx\u coreml.convert(模型) 不幸的是,当我尝试这样做时,它失败得可怕 这是我的密码: #convert.py 进口火炬 导入torch.onnx 从tor

我试图通过ONNX将PyTorch模型转换为CoreML,但是ONNX-->CoreML转换缺少权重向量

我遵循的是做出以下声明的教程:

步骤3:将模型转换为CoreML 它与运行
convert
功能一样简单。生成的对象是coremltools MLModel对象,您可以将其保存到文件中,然后在XCode中导入。
cml=onnx\u coreml.convert(模型)

不幸的是,当我尝试这样做时,它失败得可怕

这是我的密码:

#convert.py
进口火炬
导入torch.onnx
从torch.autograd导入变量
导入onnx
从onnx\u coreml导入转换
从沙漏\模型导入沙漏
型号1
火炬型号=沙漏(接头数量=14,尺寸=256)
state_dict=torch.load(“沙漏模型”{}.model.format(模型号))
火炬型号。负载状态指令(状态指令)
火炬车模型列车(错误)
torch_model.eval()
#模型的虚拟输入
x=变量(torch.randn(1,3256256,dtype=torch.float32))
#导出模型
onnx\u filename=“test\u hourglass.onnx”
torch\u out=torch.onnx.export(torch\u型号,x,onnx\u文件名,export\u参数=False)
#在ONNX模型中重新加载
onnx\u model=onnx.load(onnx\u文件名)
#检查IR是否形成良好
onnx.checker.check\u模型(onnx\u模型)
#打印图形的可读表示形式
graph=onnx.helper.printable_图(onnx_model.graph)
打印(图形)
coreml_模型=转换(onnx_模型,
添加自定义图层=真,
image\u input\u name=[“input”],
图像输出名称=[“输出”])
coreml\u model.save('test\u hourglass.mlmodel'))
以下是
打印(图形)
行给出的内容

图形火炬jit导出(
%0[浮动,1x3x256x256]
%1[浮动,64x3x5x5]
%2[浮动,64]
%3[浮动,64x64x5x5]
%4[浮动,64]
%5[浮动,64x64x5x5]
%6[浮动,64]
%7[浮动,64x64x5x5]
%8[浮动,64]
%9[浮动,64x64x5x5]
%10[浮动,64]
%11[浮动,64x64x5x5]
%12[浮动,64]
%13[浮动,64x64x5x5]
%14[浮动,64]
%15[浮动,64x64x1x1]
%16[浮动,64]
%17[浮动,14x64x1x1]
%18[浮动,14]
) {
%19=Conv[dictions=[1,1],group=1,kernel_shape=[5,5],pads=[2,2,2],strips=[1,1]](%0,%1,%2)
%20=Relu(%19)
%21=MaxPool[kernel_shape=[4,4],pads=[0,0,0,0],strips=[4,4]](%20)
%22=Conv[dictions=[1,1],group=1,kernel_-shape=[5,5],pads=[2,2,2],strips=[1,1]](21,%3,%4)
%23=Relu(%22)
%24=MaxPool[kernel_shape=[4,4],pads=[0,0,0,0],strips=[4,4]](23)
%25=Conv[dictions=[1,1],group=1,kernel_-shape=[5,5],pads=[2,2,2],strips=[1,1]](24,%5,%6)
%26=Relu(%25)
%27=Conv[dictions=[1,1],group=1,kernel_-shape=[5,5],pads=[2,2,2],strips=[1,1]](26,%7,%8)
%28=Relu(%27)
%29=Conv[dictions=[1,1],group=1,kernel_-shape=[5,5],pads=[2,2,2],strips=[1,1]](28%9%10)
%30=Relu(%29)
%31=上采样[高度\比例=4,模式='最近',宽度\比例=4](%30)
%32=添加(%31,%23)
%33=Conv[dictions=[1,1],group=1,kernel_shape=[5,5],pads=[2,2,2],strips=[1,1](%32,%11,%12)
%34=Relu(%33)
%35=上采样[高度\比例=4,模式='最近',宽度\比例=4](%34)
%36=添加(%35,%20)
%37=Conv[dictions=[1,1],group=1,kernel_shape=[5,5],pads=[2,2,2],strips=[1,1](%36,%13,%14)
%38=Relu(%37)
%39=Conv[dictions=[1,1],group=1,kernel_shape=[1,1],pads=[0,0,0,0],strips=[1,1]](38%,15%,16)
%40=Relu(%39)
%41=Conv[dictions=[1,1],group=1,kernel_shape=[1,1],pads=[0,0,0,0],strips=[1,1]](40%,17%,18)
%42=Relu(%41)
返回%42
}
这是错误消息:

1/24:转换节点类型Conv
回溯(最近一次呼叫最后一次):
文件“convert.py”,第38行,在
图像输出名称=[“输出”])
文件“/Users/stephenf/Developer/miniconda3/envs/pytorch/lib/python3.6/site packages/onnx_coreml/converter.py”,第396行,转换格式
_转换_节点(生成器、节点、图形、错误)
文件“/Users/stephenf/Developer/miniconda3/envs/pytorch/lib/python3.6/site packages/onnx\u coreml/\u operators.py”,第994行,在转换节点中
返回转换器(生成器、节点、图形、错误)
文件“/Users/stephenf/Developer/miniconda3/envs/pytorch/lib/python3.6/site-packages/onnx\u-coreml/\u-operators.py”,第31行,in-convert\u conv
“在图形初始值设定项中找不到权重张量:{}”。格式(权重\名称,)
文件“/Users/stephenf/Developer/miniconda3/envs/pytorch/lib/python3.6/site packages/onnx\u coreml/\u error\u utils.py”,第71行,缺少初始值设定项
格式(node.op_类型,node.inputs[0],node.outputs[0],err_消息)
ValueError:Conv类型的op中缺少初始值设定项错误,输入名称为0,输出名称为19。错误消息:在图形初始值设定项中未找到权重张量:1
据我所知,重量张量
%1[FLOAT,64x3x5x5]
缺失。这就是我保存模型的方式:

torch.save(model.state\u dict(),“沙漏模型”{}.model.format(历元))
ONNX可以很好地加载它——这只是我从ONNX转换到CoreML的步骤

如果您能帮我解决这个问题,我们将不胜感激。我肯定我做了很多错事,但我现在只需要把这个东西出口


谢谢,

您正在使用
export\u params=False
调用
torch.onnx.export
,如上所述,它正在保存没有实际参数张量的模型体系结构。最近的文档没有对此进行详细说明,但我们可以假设,由于未找到
权重张量
错误,您将得到

尝试使用
export_params=True
,您应该可以看到保存的模型的大小是如何显著增加的

很高兴它有帮助

Andres

嗨,我不是CoreML专家,但您在调用时是否尝试过
export_params=True