Ошибка преобразования модели onnx в mlmodel с пользовательским вводом - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь преобразовать модель Pytorch в .mlmodel. поэтому сначала я конвертирую файл .pth в файл .onnx, затем файл .onnx в файл .mlmodel.

Размер моего ввода: (1,3,299,299)

Вот мой код для конвертации:

class DenseNet(nn.Module):
    def __init__(self):
        super(DenseNet, self).__init__()

        # get the pretrained DenseNet model
        densenet = models.densenet161(pretrained=True)

        # freeze the gradients to avoid training
        for i, param in enumerate(densenet.parameters()):
            param.requires_grad_(False)

        # transfer learning procedure
        # take everything before the 12th layer of the densenet
        modules = list(densenet.children())[0][:12]
        self.densenet = nn.Sequential(*modules)

        # transfer the classifier
        self.classifier1 = nn.Linear(in_features=2208, out_features=4096)
        self.classifier2 = nn.Linear(in_features=4096, out_features=2887)

        # relu activation
        self.prelu = nn.PReLU()

        # dropout
        self.dropout = nn.Dropout(p=0.5)

        # max pool
        self.avg_pool = nn.AvgPool2d(kernel_size=7)

    def forward(self, x):

        # get the features from the original VGG
        features = self.densenet(x)
        # flat the features
        features = self.avg_pool(features).squeeze()
        # out
        features = self.dropout(self.prelu(self.classifier1(features)))
        logits = self.classifier2(features)
        return logits


def load_checkpoint(checkpoint_path):
    checkpoint = torch.load(checkpoint_path,map_location="cpu")
    model = DenseNet()
    model.load_state_dict(checkpoint)
    return model

model = load_checkpoint('model.pth')
dummy_input = torch.randn(1, 3, 299, 299, device='cpu')
torch.onnx.export(model, dummy_input, "model_output.onnx")

Этот скрипт успешно выполняется, в то время как скрипт .onnx to .mlmodel выдает мне ошибку.

Вот скрипт, который я использую:

import sys
from onnx import onnx_pb
from onnx_coreml import convert

model_in = 'model_output.onnx'
model_out = 'model_output.mlmodel'

model_file = open(model_in, 'rb')
model_proto = onnx_pb.ModelProto()
model_proto.ParseFromString(model_file.read())
coreml_model = convert(model_proto)
coreml_model.save(model_out)

Этот скрипт выдаёт мне следующие ошибки:

570/574: преобразование типа узла MatMul Traceback (последний вызов был последним): Файл "densenet.py", строка 84, в coreml_model = convert (model_proto) Файл "/home/ubuntu/anaconda3/envs/py36/lib/python3.6/site-packages/onnx_coreml/converter.py", строка 458, в конвертации _convert_node (строитель, узел, граф, ошибка) Файл "/home/ubuntu/anaconda3/envs/py36/lib/python3.6/site-packages/onnx_coreml/_operators.py", строка 1755, в _convert_node return converter_fn (строитель, узел, граф, ошибка) Файл "/home/ubuntu/anaconda3/envs/py36/lib/python3.6/site-packages/onnx_coreml/_operators.py", строка 1091, в _convert_matmul return err.unsupported_op_configuration (компоновщик, узел, график, «размещение осей, несовместимое с CoreML») Файл "/home/ubuntu/anaconda3/envs/py36/lib/python3.6/site-packages/onnx_coreml/_error_utils.py", строка 56, в unsupported_op_configuration «Ошибка при преобразовании операции типа: {}. Сообщение об ошибке: {} \ n» .format (node.op_type, err_message,) Ошибка типа: Ошибка при преобразовании операции типа: MatMul. Сообщение об ошибке: CoreML несовместимое размещение оси

Но когда я изменяю размер фиктивного ввода в pth для модели onnx на

dummy_input = torch.randn (10, 3, 299, 299, устройство = 'процессор')

или любое число больше 1. Превосходно работает. Но мне нужно, чтобы входное изображение было одноцветным с размером (299 299).

...