0

这实际上是我在 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('模型路径',image_input_names = '数据',class_labels = '类路径')

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

在 Apple Developer 论坛中,他们建议将转换代码更改为以下行:

coreml_model = coremltools.converters.keras.convert('模型路径',input_names='data',image_input_names = 'data',is_bgr=True,class_labels = '类路径')

这实际上似乎改变了一些东西,但是现在我无法将我的 keras 模型转换为 CoreML 模型,得到这个特定的错误:

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

现在看来问题在于卷积神经网络的代码。一些人认为这可能是由于 keras 的 dim_ordering(在我的情况下是最后一个通道)和/或输入形状造成的。但是,至少 input_shape 看起来像图像。

任何人都知道如何将输入从多数组成功更改为图像?

提前感谢您的任何建议。

4

2 回答 2

1

看起来您创建的模型不接受图像,而是接受 512 个元素的向量,因为第一个“真实”层是密集层,密集层(或全连接层)将一维向量作为输入,而不是 2-维图像。

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

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

于 2017-12-08T09:55:08.913 回答
0

我添加了同样的问题(使用 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))  

和 :

  • 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'))  
于 2018-06-22T18:20:50.733 回答