首页 文章

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

提问于
浏览
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('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 回答

  • 0

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

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

    这意味着您的应用程序现在将瓶颈功能视为输入,而不是图像 . 而那些瓶颈特征是512个元素的向量 .

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

相关问题