从较低的fc层微调CNN

时间:2015-09-12 07:40:09

标签: computer-vision neural-network convolution deep-learning caffe

我注意到CNN对新数据集的大多数微调只在“最后”完全连接(fc)层上完成。

我对从“第一个”完全连接的层进行微调感兴趣:也就是说,我想使用卷积和池化层的中级特征,(假设它是在ImageNet上训练的)但是然后适合所有fc图层到我的新数据集。

理论上和实践中,这个的假设效果是什么?是否可能为我的新数据集学习更合适的参数集?

2 个答案:

答案 0 :(得分:3)

理论上,您调整得越深,您的模型就越适合您的数据。所以,如果你可以微调整个模型 - 那就更好了。

那么,有什么问题,你必须问,为什么不是每个人都对整个模型进行微调? 首先,对整个模型进行微调涉及大量参数,为了正确训练数百万个参数而不存在过度拟合的风险,您必须拥有大量新的训练样例。在大多数情况下,当进行微调时,您只有很少的注释样本用于新任务,因此您无法负担整个模型的微调。 其次,微调整个模型比仅训练顶级fc层要花费更长的时间。因此,如果你没有时间和预算,你只需要调整顶层fc层。

在您的情况下,如果您有足够的样本,您可以微调前两个fc图层。根据我的经验,最好先对顶层进行微调,然后在仅在顶层进行一些迭代后再对前两个进行微调。

答案 1 :(得分:0)

ConvNet中FC层的目的只是为您的问题执行分类。您可以使用上一个Conv / Pooling图层的最终展平输出作为工程特征,并将其放入另一个机器学习模型中,它会产生相同的效果。

这意味着在大多数情况下FC层学习的参数非常具体问题(取决于数据),并且在大多数情况下不可转移。

因此,每当人们对预先训练过的模型进行微调时,他们几乎总是将FC层倾倒在顶部。

现在你可以从这里走2路。

  1. 使用上一个Conv / Pooling图层的最终展平输出作为问题的提取要素,并在其上训练ML模型。如果您的数据集很小或与预训练模型不相似,则通常使用此方法。
  2. 使用上述方法获取提取的特征,然后使用它们训练FC神经网络。一旦你获得了一个不错的精确度堆栈,它就会在预训练模型的最后一个conv / pooling层之上(不要忘记删除orignal FC层)。现在冻结(参数在训练中保持不变并且不改变)大多数预训练模型并且仅允许训练最后几个转换层。现在训练整个网络以很小的学习率进行训练。
  3. 冻结大部分模型的全部意义在于我们假设模型已经知道了早期转换层中边缘检测和颜色等基本内容。现在我们为我们的问题微调最后几层。我们选择了一个较小的学习率,这样我们就不会搞砸模型已经学到的东西了。

    我们在将FC图层安装到预训练模型之前训练它们的原因只是为了节省训练时间,更重要的是确保我们不会对Conv图层进行太多更改并最终过度拟合。