ValueError: Не знаю, как перевести оп Unsqueeze при запуске преобразованной модели PyTorch

Я сталкиваюсь с проблемами, пытаясь использовать модель PyTorch, экспортированную как модель ONNX с Caffe2. Вот мой экспортный код

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 является последней версией (попытка сборки из source, pip и conda). Все дали одинаковый результат.

0 ответов

Попробуйте разобраться в этом, если вам нужно отредактировать пакет с именем onnx-caffe2, чтобы добавить отображение ч / б Unsqueeze в ExpandDims https://github.com/onnx/onnx/issues/1481

Ищите ответ:

Я обнаружил, что эквивалентность Caffe2 для Unsqueeze в ONNX - это 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, хотя.

Другие вопросы по тегам