这实际上是我在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看起来像一个图像。
任何人都知道如何将多个阵列的输入成功更改为图像?
提前感谢任何建议。
答案 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 = 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'))