【问题标题】:Fatal Error when implementing a Keras Model converted to a CoreML model in an iOS app在 iOS 应用程序中实现转换为 CoreML 模型的 Keras 模型时出现致命错误
【发布时间】:2020-03-13 03:29:01
【问题描述】:

我正在制作一个 iOS 应用,它使用在 Keras 中开发并转换为 CoreML 模型的深度学习模型。我使用的是从 Apple 网站下载的 Resnet50 CoreML 模型,该应用程序运行正常,但是当我实施该模型时,当我从照片库中选择图像或使用应用程序中的相机拍照时,我开发了一个错误。这是与 CoreML 模型相关的代码以及我得到的错误: 这是用于将 Keras 模型转换为 CoreML 模型的代码:

output_labels = ['0', '1']

coreml_model = coremltools.converters.keras.convert('Costume.h5', input_names=['image'],
                                                class_labels=output_labels, image_input_names='image',
                                                output_names=['output'])

print(coreml_model)  # Check that input type is imageType

# Metadata for XCode
coreml_model.author = 'Author'
coreml_model.short_description = 'Some Description'
coreml_model.input_description['image'] = 'Takes as input an image'
coreml_model.output_description['output'] = 'Prediction of image'

coreml_model.save('Costume.mlmodel')

我不知道如何解决这个错误,提前谢谢! 这是我的 Keras 模型:

model = Sequential()

# Hidden Layer 1
model.add(Conv2D(128, 3, 3, border_mode='same', input_shape=input_shape, activation='relu'))
model.add(Conv2D(64, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

# Hidden Layer 2
model.add(Conv2D(128, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(256, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

# Hidden Layer 3
model.add(Conv2D(64, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(256, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(64, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

# Hidden Layer 4
model.add(Conv2D(32, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(256, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(256, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))

model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))

model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
          optimizer=RMSprop(lr=0.0001),
          metrics=['accuracy'])

model.summary()

【问题讨论】:

  • request.results 的实际类型是什么?您在此错误消息中显示的只是它不是VNVClassificationObservation 对象的数组,但这并没有告诉我们它是什么。另外,调试输出窗格中是否有错误消息?
  • request.results 应该是VNClassificationObservation 的数组,但我不知道我遇到的错误是什么类型。这是调试输出窗格中的错误消息:“来自调试器的消息:发送 k 数据包失败”。 @MatthijsHollemans
  • 实际上,当我停止应用程序时会出现该调试消息,因此与错误无关。在此之前唯一显示的是帖子中提到的致命错误。 @MatthijsHollemans
  • 我问的不是request.results 应该是什么,而是它是什么。 ;-) 在保护语句之前添加一个print(request.results) 并查看它打印出来的内容。
  • 我使用 Resnet50 和 Costume 模型添加了print(request.results。使用 Resnet50 模型,它会在选择图片后打印出许多分类,将它们从最佳置信度到最差置信度排序,例如:[ 8AD478FE-3A1B-416F-96BB-FE886CD107DF requestRevision=1 confidence=0.533675 ​​" dam, dike, dyke" 并且它继续使用不同的分类,并且使用 Costume 模型打印出 nil,这可能是导致错误的原因。知道为什么会发生这种情况吗?谢谢! @MatthijsHollemans

标签: ios xcode keras coreml coremltools


【解决方案1】:

我找到了解决问题的方法,所以我将其发布,以防将来有人遇到同样的问题。您需要更改以下内容:

model.add(Dense(1))
model.add(Activation('sigmoid'))

model.add(Dense(2))
model.add(Activation('softmax'))

还要记得把损失从binary_crossentropy改成categorical_crossentropy

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 2017-12-10
    • 2021-04-30
    • 2023-03-15
    • 2017-11-12
    • 2020-01-24
    • 2019-04-02
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多