CoreML转换的keras模型在Xcode中请求多数组输入而不是图像

时间:2017-12-08 04:28:53

标签: image multidimensional-array keras coreml multiclass-classification

这实际上是我在Stackoverflow上的第一篇文章,我对机器学习很新。我目前正在尝试使用VGG16训练卷积神经网络以进行简单的图像分类任务。 它基于本教程:http://www.codesofinterest.com/2017/08/bottleneck-features-multi-class-classification-keras.html。 我的目标是将此模型转换为CoreML并将其用于iOS上的图像分类。

经过一番努力,我能够通过使用以下转换线将Keras模型成功转换为CoreML模型:

  

coreml_model = coremltools.converters.keras.convert('模型路径',image_input_names ='数据',class_labels ='类路径')

然而,在将CoreML模型复制到Xcode之后,它会请求一个形状为512,1,1的多阵列(我想这是由于神经网络的图像阵列格式化而发生的) 还有其他一些帖子提到使用特定版本的keras,tensorflow和python(2.7)提到here很重要 这没有改变这个问题。

在Apple Developer论坛中,他们建议将转换代码更改为以下行:

  

coreml_model = coremltools.converters.keras.convert('模型路径',input_names ='数据',image_input_names ='数据',is_bgr = True,class_labels ='课程路径')

这实际上似乎改变了一些东西,但是现在我无法将我的keras模型转换为CoreML模型,得到这个特定的错误:

  

ValueError:图像输入不支持通道值512

现在似乎问题在于卷积神经网络的代码。一些人认为这可能是由于keras的dim_ordering(在我的情况下是最后一个通道)和/或输入形状。但是,至少input_shape看起来像一个图像。

任何人都知道如何将多个阵列的输入成功更改为图像?

提前感谢任何建议。

2 个答案:

答案 0 :(得分:0)

看起来你创建的模型不接受图像,而是接受512个元素的矢量,因为第一个"真实"图层是密集图层,密集(或完全连接的图层)将1维向量作为输入,而不是二维图像。

但是这里有一个更大的问题:你使用瓶颈功能微调了VGG16,这没关系。但是要对新图像进行预测,您需要整个模型,即不仅是您训练过的小分类器模型,还有所有VGG16层。但是你并没有转换整个模型,只转换了分类器部分。

这意味着您的应用现在需要瓶颈功能作为输入,而不是图像。而那些瓶颈特征是512个元素的载体。

答案 1 :(得分:0)

我添加了相同的问题(在VGG16中使用),并且由于这篇文章和Matthijs Hollemans的回答而得以解决:您必须保存整个模型,包括VGG16层。

在我的代码中,我只保存了顶级模型。

这是我要解决的问题:

# add the model on top of the convolutional base  
fullModel = Model(inputs=base_model.input, outputs=top_model(base_model.output))  

与:

  • base_model是没有顶层的基本模型(VGG16)
  • top_model是您的顶级模特

在我的情况下是这样的:

base_model = applications.VGG16(include_top=False, weights='imagenet', input_shape=(img_width, img_height, 3))  
....  
top_model = Sequential()  top_model.add(Flatten(input_shape=train_data.shape[1:]))  
top_model.add(Dense(256, activation='relu'))  
top_model.add(Dropout(0.5))  
top_model.add(Dense(num_classes, activation='softmax'))