1

我在尝试将 PyTorch 模型导出为带有 Caffe2 的 ONNX 模型时遇到问题。这是我的导出代码

the_model = torchvision.models.densenet121(pretrained=True)
garbage, model_inputs = preprocessing("test.jpg")
torch_out = torch.onnx._export(the_model,             
                           model_inputs,                       
                           "model_weights/chexnet-py.onnx",
                           export_params=True)

现在这是我的测试代码

model = onnx.load("model_weights/chexnet-py.onnx")
garbage, model_inputs = preprocessing("text.jpg")
prepared_backend = onnx_caffe2.backend.prepare(model)
W = {model.graph.input[0].name: model_inputs.numpy()}
c2_out = prepared_backend.run(W)[0]

这将返回以下错误

ValueError: Don't know how to translate op Unsqueeze when running    converted PyTorch Model

附加信息 pytorch 版本 1.0.0a0+6f664d3 Caffe2 是最新版本(尝试从源代码、pip 和 conda 构建)。都给出了相同的结果。

4

1 回答 1

1

如果您必须编辑名为 onnx-caffe2 的包以将映射 b/w Unsqueeze 添加到 ExpandDims https://github.com/onnx/onnx/issues/1481 ,请尝试调查一下

寻找答案:

我发现 ONNX 中 Unsqueeze 的 Caffe2 等效项是 ExpandDims,并且在 onnx_caffe2/backend.py 中的第 121 行附近有一个特殊映射,用于那些仅在名称和属性名称上不同的运算符,但不知何故 Unsqueeze 没有出现在那里(不知道为什么)。所以我在 _renamed_operators 和 _per_op_renamed_attrs 字典中手动添加了它的映射规则,代码如下所示:

_renamed_operators = {
    'Caffe2ConvTranspose':   'ConvTranspose',
    'GlobalMaxPool':         'MaxPool',
    'GlobalAveragePool':     'AveragePool',
    'Pad':                   'PadImage',
    'Neg':                   'Negative',
    'BatchNormalization':    'SpatialBN',
    'InstanceNormalization': 'InstanceNorm',
    'MatMul':                'BatchMatMul',
    'Upsample':              'ResizeNearest',
    'Equal':                 'EQ',
    'Unsqueeze':             'ExpandDims',  # add this line
}

_global_renamed_attrs = {'kernel_shape': 'kernels'}
_per_op_renamed_attrs = {
    'Squeeze':              {'axes': 'dims'},
    'Transpose':            {'perm': 'axes'},
    'Upsample':             {'mode': ''},
    'Unsqueeze':            {'axes': 'dims'},  # add this line
}

一切都按预期工作。

我不是 OP,不过要感谢 OP。

于 2019-04-09T13:52:38.983 回答