这实际上是我在stackoverflow上的第一篇文章,我对机器学习非常新。我目前正在尝试使用VGG16培训卷积神经网络,以进行简单的图像分类任务。它基于本教程:http://www.codesofinterest.com/2017/08/bottleneck-features-multi-class-classification-classification-keras.html。我的目标是将此模型转换为Coreml,并将其用于iOS的图像分类。
经过一段斗争,我能够通过使用以下转换线成功将KERAS模型转换为Coreml模型:
coreml_model = coremltools.converters.keras.convert('模型路径',image_input_names ='data',class_labels ='class path')
然而,将Coreml模型复制到Xcode之后,它要求具有形状512,1,1的Multiarray(我想这是由于神经网络的图像阵列格式而发生的)还有其他几篇文章提到,使用特定版本的Keras,Tensorflow和Python(2.7)很重要这没有改变问题。
在Apple开发人员论坛中,他们建议将转换代码更改为以下行:
coreml_model = coremltools.converters.keras.convert('模型路径',input_names ='data',image_input_names ='data',is_bgr = true,class_labels ='class ='class path')
这实际上似乎改变了某些东西,但是现在我无法将我的Keras模型转换为Coreml模型,获得了此特定错误:
valueerror:通道值512不支持图像输入
现在,这个问题似乎在于卷积神经网络的守则。有些人建议这可能是由于dim_ordering的KERAS(在我的情况下是最后的通道)和/或输入形状。但是,至少Input_shape看起来像图像。
任何人都有一个想法如何成功地将输入从多数组更改为图像?
预先感谢您的任何建议。
看起来您创建的模型不接受图像,而是512个元素的向量,因为第一个"真实"层是密集的层和密集的(或完全连接的层)以一维向量作为输入,而不是2维图像。
但是这里有一个更大的问题:您使用瓶颈功能微调VGG16,这是可以的。但是,要对新图像进行预测,您需要全部模型,即不仅是您训练的小分类器模型,还需要所有VGG16层。但是,您不会仅转换整个模型,而只能转换分类器部分。
这意味着您的应用现在期望瓶颈功能作为输入,而不是图像。这些瓶颈功能是512个元素向量。
我添加了相同的问题(usin 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))
with:
- 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'))