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

Image CoreML转换的keras模型请求多数组输入,而不是Xcode中的图像,image,multidimensional-array,keras,coreml,multiclass-classification,Image,Multidimensional Array,Keras,Coreml,Multiclass Classification,这实际上是我在Stackoverflow上的第一篇文章,我对机器学习还很陌生。我目前正在尝试使用VGG16为简单的图像分类任务训练卷积神经网络。 它基于本教程:。 我的目标是将此模型转换为CoreML,并将其用于iOS上的图像分类 经过一番努力,我能够通过使用以下转换线成功地将Keras模型转换为CoreML模型: coreml\u model=coremltools.converts.keras.convert('model Path',image\u input\u name='data',

这实际上是我在Stackoverflow上的第一篇文章,我对机器学习还很陌生。我目前正在尝试使用VGG16为简单的图像分类任务训练卷积神经网络。 它基于本教程:。 我的目标是将此模型转换为CoreML,并将其用于iOS上的图像分类

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

coreml\u model=coremltools.converts.keras.convert('model Path',image\u input\u name='data',class\u labels='class Path')

但是,将CoreML模型复制到Xcode后,它会请求一个形状为512,1,1的多数组(我猜这是由于神经网络的图像数组格式造成的) 还有其他几篇文章提到使用keras、tensorflow和python(2.7)的特定版本很重要 这并没有改变问题

在Apple开发者论坛上,他们建议将转换代码更改为以下行:

coreml\u model=coremltools.converts.keras.convert('model path',input\u names='data',image\u input\u names='data',is\u bgr=True,class\u labels='class path')

事实上,这似乎改变了一些东西,但是现在我无法将我的keras模型转换为CoreML模型,出现了以下具体错误:

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

现在看来问题在于卷积神经网络的编码。一些人认为,这可能是由于keras的dim_顺序(这是我的案例中的最后一个通道)和/或输入形状造成的。但是,至少输入的形状看起来像一个图像

有人知道如何将多阵列输入成功更改为图像吗?


提前感谢您的建议。

您创建的模型似乎不接受图像,而是512个元素的向量,因为第一个“真实”层是密集层,密集层(或完全连接的层)以一维向量作为输入,而不是二维图像

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

这意味着您的应用程序现在希望瓶颈功能作为输入,而不是图像。这些瓶颈特性是512个元素向量。

我添加了相同的问题(在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))  
与:

  • 基本模型是没有顶层的基本模型(VGG16)
  • 顶级模特是你的顶级模特吗
在我的例子中,类似这样的情况:

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'))  

我在看输入是如何形成的,你是对的。但是,图像似乎是通过以下代码以形状(1,1512)的数组加载的:瓶颈特征验证=模型。预测特征生成器(生成器,预测大小验证)np.save('瓶颈特征验证.npy',瓶颈特征验证))我是否必须解决此问题和/或实际更改第一层模型。添加(Dense(10,activation='relu'))在新预测的情况下,我是否必须添加VGG16层并像以前一样保存?如果您想使用此模型在iOS上对图像进行预测,则必须添加VGG16层(不包括顶层)然后是您自己的分类器层,并将整个内容转换为核心ML。