这实际上是我在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('Model Path',image_input_names ='data',class_labels ='class path')
然而,在将CoreML模型复制到Xcode之后,它请求具有形状512,1,1的多阵列(我猜这是由于神经网络的图像阵列格式化而发生的)还有其他几个帖子提到使用特定的版本的keras,tensorflow和python(2.7)提到here这没有改变这个问题 .
在Apple Developer论坛中,他们建议将转换代码更改为以下行:
coreml_model = coremltools.converters.keras.convert('Model path',input_names ='data',image_input_names ='data',is_bgr = True,class_labels ='Class path')
这实际上似乎改变了一些东西,但是现在我无法将我的keras模型转换为CoreML模型,得到这个特定的错误:
ValueError:图像输入不支持通道值512
现在似乎问题在于卷积神经网络的代码 . 有人认为这可能是由于keras的dim_ordering(在我的情况下是最后一个通道)和/或输入形状 . 但是,至少input_shape看起来像一个图像 .
Anyone has an idea how to change the input from multi array to an image successfully?
提前感谢任何建议 .
2 回答
看起来您创建的模型不接受图像而是接受512个元素的矢量,因为第一个“真实”图层是密集图层,密集(或完全连接图层)采用1维矢量作为输入,而不是2-维度图像 .
但是这里存在一个更大的问题:你使用瓶颈功能对VGG16进行了微调,这是可以的 . 但是要对新图像进行预测,您需要整个模型,即不仅是您训练过的小分类器模型,还有所有VGG16层 . 但是你没有转换整个模型,只转换分类器部分 .
这意味着您的应用程序现在将瓶颈功能视为输入,而不是图像 . 而那些瓶颈特征是512个元素的向量 .
我添加了同样的问题(在VGG16中使用),并且由于这篇文章和Matthijs Hollemans的回答弄清楚了:你必须保存整个模型,包括VGG16层 .
在我的代码中,我只保存顶级模型 .
以下是我要解决的问题:
用:
base_model是没有顶层的基础模型(VGG16)
top_model是您的顶级模特
在我的情况下像这样: