Я пытаюсь преобразовать модель 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).