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

Posted

技术标签:

【中文标题】我应该如何使用预训练模型优化神经网络以进行图像分类【英文标题】:How should I optimize neural network for image classification using pretrained models 【发布时间】:2018-02-25 05:47:08 【问题描述】:

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

结构: image-> vgg(1*1000 维度), xception(1*1000 维度)->(1*2000 维度) 作为输入-> 1024 个神经元-> 512 个神经元-> 40 维输出-> softmax

但是,使用这种结构,我只能达到 30% 左右的准确率。所以我的问题是如何优化我的网络结构以实现更高的准确性?我是深度学习的新手,所以我不确定我当前的设计是否“正确”。我真的很期待你的建议

【问题讨论】:

您是否对模型的顶层(即 1024 和 512 个神经元的层)进行了微调?还是您只是使用初始值进行预测? This 可能会帮助您使用瓶颈功能并微调预训练网络的顶层。 @Yu-Yang 当然,我对模型进行了微调,我训练了 500 批模型,每批 100 张图像,但准确度停止增长 30% 嗨@sunnwmy:您能更具体地了解您的数据吗?您要对哪种图像进行分类?你有多少样品?还请发布精简代码,尤其是来自您的***/密集 NN。 keras 新手,但 Antonio Gulli 和 Sugit Pal 的这本书提供了一些关于如何在 keras 中优化模型的想法。 (使用 KERAS 进行深度学习) 【参考方案1】:

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

    增加训练时间并降低学习率。它可能会在非常糟糕的局部最优处停止。 添加可以为大量类提取特定特征的附加层。 为每个类(“是”或“否”输出类)创建多个二类深度网络。这将使每个网络对每个类别都更加专业,而不是训练一个网络来学习所有 40 个类别。 增加训练样本。

【讨论】:

非常感谢您的建议。训练多个二分类深度网络确实是一个好方法,我会尽快尝试【参考方案2】:

我不完全确定我了解您的网络架构,但有些部分对我来说并不合适。

有两种主要的迁移学习场景:

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

提示 #1:只使用一个预训练网络。

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

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

提示 #3:保持早期预训练层不变。

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

这种架构更类似于我看到的解决相同问题的架构,并且更有可能达到高精度。

【讨论】:

您好 Maxim,非常感谢您的建议和建议。我已经尝试过第一种方法“ConvNet 作为固定特征提取器”。我使用 VGG16(去掉了最上面的 fc 层)将所有图像转换为 4096D 向量,然后训练一个具有 1024 个神经元的单层网络来进行分类。不幸的是,经过足够多的训练后,准确率仍然低于 30%。我现在正在编写第二种方式“微调 ConvNet”,希望这种方式可行。 我建议你再写一个问题并提供尽可能多的细节。 VGGNet 应该很快就能提供更好的准确度,这听起来像是实现中的一个错误。

以上是关于我应该如何使用预训练模型优化神经网络以进行图像分类的主要内容,如果未能解决你的问题,请参考以下文章

4. 使用预训练的PyTorch网络进行图像分类

深度学习笔记:利用预训练模型之特征提取训练小数据集上的图像分类器

手把手写深度学习(13):如何利用官方预训练模型做微调/迁移学习?(以Resnet50提取图像特征为例)

手把手写深度学习(14):如何利用官方预训练模型做微调/迁移学习?(以Resnet50提取图像特征为例)

23个系列分类网络,10万分类预训练模型,这是飞桨PaddleClas百宝箱

Pytorch多分类问题实战