在 iOS 应用程序中实施转换为 CoreML 模型的 Keras 模型时出现致命错误
Fatal Error when implementing a Keras Model converted to a CoreML model in an iOS app
我正在制作一个 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()
我找到了我的问题的解决方案,所以我将其发布以防将来有人遇到同样的问题。您需要更改以下内容:
model.add(Dense(1))
model.add(Activation('sigmoid'))
到
model.add(Dense(2))
model.add(Activation('softmax'))
并且还记得将损失从 binary_crossentropy
更改为 categorical_crossentropy
。
我正在制作一个 iOS 应用程序,它使用在 Keras 中开发并转换为 CoreML 模型的深度学习模型。我使用的是从 Apple 网站下载的 Resnet50 CoreML 模型,该应用程序运行完美,但是当我实施该模型时,当我从照片库中选择图像或在应用程序中使用相机拍照时,出现错误。这是与 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()
我找到了我的问题的解决方案,所以我将其发布以防将来有人遇到同样的问题。您需要更改以下内容:
model.add(Dense(1))
model.add(Activation('sigmoid'))
到
model.add(Dense(2))
model.add(Activation('softmax'))
并且还记得将损失从 binary_crossentropy
更改为 categorical_crossentropy
。