Я создал файл .mlmodel на основе пользовательской модели PyTorch CNN, преобразовав сначала модель PyTorch в ONNX, а затем в CoreML с помощью onnx_coreml. Используя фиктивные данные (массив 3 x 224 x 224, где каждое отдельное значение равно 1,0), я убедился, что модель PyTorch, модель ONNX (выполняется с использованием бэкэнда Caffe) и модель CoreML (с использованием coremltools) дают одинаковые результаты. ,
Однако, когда я импортирую ту же модель в Xcode и запускаю ее на телефоне, даже используя фиктивные данные, выходные данные модели не совпадают.
Устройство, которое я использую, похоже, не имеет значения (я пробовал на iPhone от XS Max до SE). Все работают под управлением iOS 12.2 и используют Xcode 10.2.1
Вот код (в Swift), который я использую для создания фиктивных данных и получения прогноза из моей модели:
let pixelsWide = Int(newImg.size.width)
let pixelsHigh = Int(newImg.size.height)
var pixelMLArray = try MLMultiArray(shape: [1, 1, 3, 224, 224], dataType: .float32)
for y in 0 ..< pixelsHigh {
for x in 0 ..< pixelsWide {
pixelMLArray[[0,0,0,x,y] as [NSNumber]] = 1.0
pixelMLArray[[0,0,1,x,y] as [NSNumber]] = 1.0
pixelMLArray[[0,0,2,x,y] as [NSNumber]] = 1.0
}
}
do {
let convModel = CNNModel()
var thisConvOutput = try convModel.prediction(_0: pixelMLArray)._1161
} catch { print("Error") }
Я проверил правильность тегов ввода и вывода и т. Д. И т. Д.
Это работает гладко, но первые три значения thisConvOutput:
[0,000139, 0,000219, 0,003607]
Для сравнения, первые три значения, использующие модель PyTorch:
[0,0002148, 0,00032246 и 0,0035419]
И точно такая же .ml-модель с использованием coremltools:
[0,00021577, 0,00031877, 0,0035404]
Короче говоря, не имея опыта работы со Swift, мне интересно, что я делаю что-то глупое в инициализации / заполнении моего "pixelMLArray", чтобы запустить его через модель в Xcode на моем устройстве, так как .mlmodel получается из coremltools очень близки к результатам, которые я получаю с помощью PyTorch. Кто-нибудь может помочь?