Image CoreML转换的keras模型请求多数组输入,而不是Xcode中的图像
这实际上是我在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_顺序(这是我的案例中的最后一个通道)和/或输入形状造成的。但是,至少输入的形状看起来像一个图像 有人知道如何将多阵列输入成功更改为图像吗?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',
提前感谢您的建议。您创建的模型似乎不接受图像,而是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。