我应该如何使用预训练模型优化神经网络进行图像分类

时间:2017-09-16 03:06:16

标签: image-processing machine-learning deep-learning keras classification

感谢您查看我的问题。我正在尝试基于一些预先训练的模型进行图像分类,图像应分为40类。我想使用VGG和Xception预训练模型将每个图像转换为两个1000维向量,并将它们堆叠成1 * 2000维度向量作为我的网络输入,并且网络具有40维输出。网络有2个隐藏层,一个有1024个神经元,另一个有512个神经元。

结构: 图像 - > vgg(1 * 1000尺寸),xception(1 * 1000尺寸) - >(1 * 2000尺寸)作为输入 - > 1024个神经元 - > 512个神经元 - > 40维输出 - > SOFTMAX

然而,使用这种结构我只能达到约30%的准确度。所以我的问题是,如何优化网络结构以获得更高的准确度?我不熟悉深度学习所以我不确定我目前的设计是“正确的”。我真的很期待你的建议

2 个答案:

答案 0 :(得分:3)

我不完全确定我了解您的网络架构,但有些内容并不适合我。

有两种主要的转学习方案:

  • ConvNet作为固定功能提取器。采用预训练网络(VGG和Xception中的任何一个都可以,不需要两者),删除最后一个完全连接的层(此层的输出是针对ImageNet等不同任务的1000级分数),然后处理其余的ConvNet作为新数据集的固定特征提取器。例如,在AlexNet中,这将为包含紧接在分类器之前的隐藏层的激活的每个图像计算4096-D向量。为所有图像提取4096-D代码后,为新数据集训练线性分类器(例如线性SVM或Softmax分类器)。

    提示#1:只接受一个预训练网络。

    提示#2:您的分类器不需要多个隐藏层。

  • 微调ConvNet 。第二种策略是不仅在新数据集上替换和重新训练ConvNet之上的分类器,而且还通过继续反向传播来微调预训练网络的权重。可以微调ConvNet的所有层,或者可以保留一些早期层(由于过度拟合问题)并且仅微调网络的某些更高级别部分。这是因为观察到ConvNet的早期特征包含更多通用特征(例如边缘检测器或颜色斑点检测器),这些特征应该对许多任务有用,但后来的ConvNet层逐渐变得更加特定于类的细节。包含在原始数据集中。

    提示#3:保持早期预训练层固定。

    提示#4:使用较小的学习率进行微调,因为您不想太快和太多地扭曲其他预训练层。

这种架构更像我所看到的解决同样问题的架构,并且有更高的机会达到高精度。

答案 1 :(得分:1)

当模型不合适时,您可以尝试几个步骤:

  1. 增加培训时间,降低学习率。它可能会停留在非常糟糕的局部最佳状态。
  2. 添加可以为大量类提取特定功能的其他图层。
  3. 为每个类创建多个两级深度网络(“是”或“否”输出类)。这将使每个网络更加专业化,而不是培训一个网络来学习所有40个课程。
  4. 增加训练样本。