Python 使用带有CoreML的PyTorch模型时输入尺寸重塑

Python 使用带有CoreML的PyTorch模型时输入尺寸重塑,python,pytorch,coreml,onnx,onnx-coreml,Python,Pytorch,Coreml,Onnx,Onnx Coreml,我在PyTorch中有一个seq2seq模型,我想用CoreML运行它。将模型导出到ONNX时,输入尺寸固定为导出期间使用的张量的形状,并再次从ONNX转换为CoreML 导入火炬 从onnx\u coreml导入转换 x=火炬。一个((32,1,1000))#N x C x W 模型=模型() torch.onnx.export(型号,x,'example.onnx') mlmodel=convert(model='example.onnx',最小ios部署\u target='13') sa

我在PyTorch中有一个seq2seq模型,我想用CoreML运行它。将模型导出到ONNX时,输入尺寸固定为导出期间使用的张量的形状,并再次从ONNX转换为CoreML

导入火炬
从onnx\u coreml导入转换
x=火炬。一个((32,1,1000))#N x C x W
模型=模型()
torch.onnx.export(型号,x,'example.onnx')
mlmodel=convert(model='example.onnx',最小ios部署\u target='13')
save('example.mlmodel')
对于ONNX导出,可以导出动态维度-

torch.onnx.export(
    model, x, 'example.onnx',
    input_names = ['input'],
    output_names = ['output'],
    dynamic_axes={
        'input' : {0 : 'batch', 2: 'width'},
        'output' : {0 : 'batch', 1: 'owidth'},
    }
)
但是当转换到
CoreML
-

RuntimeWarning:您将无法在此核心ML模型上运行predict()。基本异常消息为:编译模型错误:“编译器错误:找到大小为零的Blob:

对于CoreML中的推断,我希望批次(第一个)和宽度(最后一个)维度要么是动态的,要么能够静态地更改它们


这可能吗?

通过为输入指定
动态轴,可以在ONNX中将输入的尺寸设置为动态

torch.onnx.export(
模型
x,,
'example.onnx',
#将名称指定给要在动态_轴中引用的输入
#您的模型只有一个输入:x
输入名称=[“输入”],
#定义哪些维度应该是动态的
#尺寸标注的名称是可选的,但建议使用。
#只能是:{“输入”:[0,2]}
动态_轴={“输入”:{0:“批次”,2:“宽度”}
)

现在,导出的模型接受大小为[批次,1,宽度]的输入,其中批处理和宽度是动态的。

谢谢,这对ONNX转换有效,但CoreML对结果图不满意-我已经用细节更新了问题。我对CoreML一无所知,但有可能它不支持ONNX的所有功能。但从中判断,动态维度应该可以工作。它您的模型可能有一些特定的地方,这在使用动态尺寸标注时会导致问题。