我注意到,对新数据集的CNN进行的大多数微调仅在“最后”完全连接(fc)层完成。从较低的fc层微调CNN
我对从“第一个”完全连接层进行微调感兴趣:也就是说,我想使用卷积和合并图层的中级特征(假设它是在ImageNet上训练的),但是将所有fc图层适合我的新数据集。
理论上和实践中,这是什么效果?是否有可能为我的新数据集学习更合适的一组参数?
我注意到,对新数据集的CNN进行的大多数微调仅在“最后”完全连接(fc)层完成。从较低的fc层微调CNN
我对从“第一个”完全连接层进行微调感兴趣:也就是说,我想使用卷积和合并图层的中级特征(假设它是在ImageNet上训练的),但是将所有fc图层适合我的新数据集。
理论上和实践中,这是什么效果?是否有可能为我的新数据集学习更合适的一组参数?
从理论上讲,您调整得越深,模型越适合您的数据。所以,如果你可以调整整个模型 - 越好。
那么,有什么问题,你必须问,为什么不每个人都调整整个模型?首先,微调整个模型需要大量的参数,为了适当地训练数百万个参数而没有过度拟合的风险,你必须有很多新的训练样例。在大多数情况下,微调时,只有少数注释样本用于新任务,因此无法对整个模型进行微调。其次,微调整个模型花费的时间要比训练顶层fc层要长得多。因此,如果您只有很少的时间和预算,您只需对顶层fc图层进行微调。
就你而言,如果你有足够的样本,你可以微调前两个fc层。根据我的经验,最好先微调顶层,然后在顶层单独完成一些迭代之后再一起微调顶层两层。
ConvNet中FC层的目的仅仅是为您的问题执行分类。你可以使用最后一个Conv/Pooling层的最终平坦输出作为工程特征,并将其放在另一个机器学习模型中,它会产生相同的效果。
这意味着FC层在大多数情况下获得的参数非常具体(取决于数据),并且在大多数情况下不可转让。
因此,每当人们对预先训练好的模型进行微调时,他们几乎总是将FC层放在顶层。
现在你可以从这里2种方式。
冻结大部分模型的重点在于,我们假设模型已经知道基本的东西,比如边缘检测和来自较早的conv层的颜色。现在我们调整最后几层来解决我们的问题。我们选择了一个小的学习率,这样我们就不会搞坏模型已经学到的东西。
我们在将FC层与预先训练好的模型相匹配之前训练FC层的原因仅仅是为了节省训练时间,更重要的是确保我们不会对Conv层做出太多改变并最终结束配件。
非常感谢!我在想。我有100个类别的近150万图像,我认为这不是一个微不足道的数量。这会足够多来训练2〜3 fc层并且仍然避免过度配合吗? – ytrewq
@CosmicRabbitMediaInc看起来足以训练整个网络。祝你好运 – Shai