2

我注意到,对新数据集的CNN进行的大多数微调仅在“最后”完全连接(fc)层完成。从较低的fc层微调CNN

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

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

回答

3

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

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

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

+0

非常感谢!我在想。我有100个类别的近150万图像,我认为这不是一个微不足道的数量。这会足够多来训练2〜3 fc层并且仍然避免过度配合吗? – ytrewq

+0

@CosmicRabbitMediaInc看起来足以训练整个网络。祝你好运 – Shai

0

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

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

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

现在你可以从这里2种方式。

  1. 使用上一个Conv/Pooling层的最终平坦输出作为问题的提取特征,并在其上训练ML模型。如果您的数据集较小或与预先训练的模型不相似,则通常使用此方法。
  2. 使用上述方法获取提取的特征,然后使用它们来训练FC神经网络。一旦你在预训练模型的最后一个conv/pooling层(不要忘记去除orignal FC层)上达到一个体面的精确度,现在冻结(参数是固定的,不会改变训练)大部分预先训练的模型,只允许训练最后几个conv层。现在训练整个网络以非常小的学习速度进行训练。

冻结大部分模型的重点在于,我们假设模型已经知道基本的东西,比如边缘检测和来自较早的conv层的颜色。现在我们调整最后几层来解决我们的问题。我们选择了一个小的学习率,这样我们就不会搞坏模型已经学到的东西。

我们在将FC层与预先训练好的模型相匹配之前训练FC层的原因仅仅是为了节省训练时间,更重要的是确保我们不会对Conv层做出太多改变并最终结束配件。