Coreml转换的KERAS模型请求多阵列输入而不是Xcode中的图像



这实际上是我在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'))  

最新更新