从较低的 fc 层微调 CNN

fine-tuning a CNN from a lower fc layer

我注意到 CNN 在新数据集上的大部分微调仅在 "last" 全连接 (fc) 层上完成。

我对 "first" 全连接层的微调很感兴趣:也就是说,我想按原样使用卷积层和池化层的中级特征,(假设它是在 ImageNet 上训练的) 但随后将所有 fc 层拟合到我的新数据集。

从理论上和实践上,这样做的预期效果是什么?是否有可能为我的新数据集学习一组更合适的参数?

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

所以,您一定会问,为什么不对整个模型进行微调?
首先,微调整个模型涉及很多很多参数,为了正确训练数百万个参数而没有过度拟合的风险,您必须有很多新的训练示例。在大多数情况下,在微调时,新任务只有很少的注释样本,因此您无力承担整个模型的微调。
其次,微调整个模型比只训练顶层 fc 层花费的时间要长得多。因此,如果您没有时间和预算,您只需微调顶部 fc 层。

在你的情况下,如果你有足够的样本,你可以微调顶部的两个 fc 层。根据我的经验,最好先微调顶层,然后在顶层单独完成一些迭代后一起微调顶层。

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

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

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

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

  1. 使用最后 Conv/Pooling 层的最终扁平化输出作为问题的提取特征,并在其上训练 ML 模型。如果您的数据集较小或与预训练模型不相似,则通常使用此方法。
  2. 用上面的方法得到提取出来的特征,然后用它们来训练一个FC神经网络。一旦你获得了不错的精度,就将它堆叠在预训练模型的最后 conv/pooling 层之上(不要忘记删除原始的 FC 层)。现在冻结(参数保持不变并且在训练时不改变)大部分预训练模型并且只允许训练最后几个 conv 层。现在训练整个网络以很小的学习率进行训练。

冻结大部分模型的全部意义在于我们假设模型已经从早期的卷积层中知道了基本的东西,比如边缘检测和颜色。现在我们针对我们的问题微调最后几层。我们选择了一个小的学习率,这样我们就不会弄乱模型已经学过的东西。

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