使用训练有素的CNN分类器并将其应用于其他图像数据集


11

你会如何优化一个预先训练 neural network将它应用到一个单独的问题?您是否将更多层添加到预训练模型中并在数据集上进行测试?

例如,如果任务是使用CNN墙纸组进行分类,那么我敢肯定,即使是猫和狗的图像分类器,也无法直接对经过图像猫和狗训练的预训练网络进行分类。

Answers:


15

是否阅读-转移学习不利吗?(感谢@media) (对我来说很有帮助,因此在此处添加此答案可以使之成为一个完整的答案...)

回答您的问题。(从这里开始)

转移学习是您想要的..

  • 例如,当我们接受深度学习任务时,涉及在图像数据集上训练卷积神经网络(Covnet),我们的第一个直觉是从头开始训练网络。但是,实际上,像Covnet这样的深度神经网络具有大量参数,通常在数百万范围内。在较小的数据集(一个小于参数数量的数据集)上训练Covnet会极大地影响Covnet的泛化能力,通常会导致过度拟合。

  • 因此,在实践中,通常会通过在我们已有的较小数据集上继续对其进行训练(即反向传播),从而对在大型网络(如ImageNet)上训练过的现有网络进行微调(1.2M标记图像)。假设我们的数据集在上下文上与原始数据集(例如ImageNet)没有太大不同,则经过预训练的模型将已经学习了与我们自己的分类问题相关的特征。

何时微调模型?

  • 通常,如果我们的数据集在上下文上与训练后的模型没有太大不同,我们应该进行微调。在像ImageNet这样的庞大而多样化的数据集上进行预训练的网络,可以捕获通用特征,例如其早期层中的曲线和边缘,这些特征与大多数分类问题相关且有用。

  • 当然,如果我们的数据集表示某个非常特定的领域,例如医学图像或中文手写字符,并且在该领域没有找到经过预先训练的网络,那么我们应该考虑从头开始训练网络。

  • 另一个问题是,如果我们的数据集很小,那么在一个小的数据集上微调预训练的网络可能会导致过度拟合,尤其是在网络的最后几层是完全连接的层的情况下(例如VGG网络)。从我的经验来看,如果我们有数千个原始样本,并且实施了常见的数据增强策略(平移,旋转,翻转等),那么微调通常会为我们带来更好的结果。

  • 如果我们的数据集确实很小,例如少于一千个样本,那么更好的方法是将中间层的输出优先于完全连接的层作为特征(瓶颈特征),并在模型顶部训练线性分类器(例如SVM)它。SVM特别擅长在小型数据集上绘制决策边界。

微调技术

以下是一些微调实施的一般准则:

  • 通常的做法是截断经过预训练的网络的最后一层(softmax层),并用与我们自己的问题相关的新的softmax层替换它。例如,ImageNet上的预训练网络带有一个带有1000个类别的softmax层。

  • 如果我们的任务是对10个类别进行分类,则网络的新softmax层将是10个类别,而不是1000个类别。然后,我们在网络上进行反向传播,以微调预训练的权重。确保执行交叉验证,以便网络能够很好地推广。

  • 使用较小的学习率来训练网络。由于我们期望与随机初始化的权重相比,预训练的权重已经非常好,因此我们不希望它们失真得太快和太大。一种常见的做法是使初始学习率比用于临时训练的学习率小10倍。

  • 冻结预训练网络的前几层的权重也是一种常见的做法。这是因为前几层捕获了与曲线图和边线等通用特征,这些特征也与我们的新问题有关。我们希望保持这些重量不变。相反,我们将使网络专注于在后续层中学习特定于数据集的功能。

在这种情况下,您需要再次训练它们,就好像我没记错,那么墙纸不是一类Image-net模型。也可以在这里做..)

我的答案来源是这些惊人课程的翻译。

如需进一步阅读,


如果您只是在进行特征提取,那么就不能对任何图层进行微调。是否有理由用线性分类器替换最后一个致密层?为什么不将其保留为新的致密层,而在保持所有底层冻结的同时进行重新训练呢?仅仅是因为训练线性分类器会比训练新的密集层更快?
CMCDragonkai '19

1
对于特征提取,不需要附加图层的图层,而是添加了一些图层(如“合并”和“形状调整”)以匹配暗淡并可能减小中间值。当然,训练线性模型比使用NN更快,但是您可以同时尝试两种方法,看看哪种方法最适合您的用例。取消冻结最后一个密集层并进行再培训以增加其他层数以解决您当前遇到的问题是一种常见的做法
Aditya
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.