Computer vision 从较低的fc层微调CNN

Computer vision 从较低的fc层微调CNN,computer-vision,neural-network,convolution,deep-learning,caffe,Computer Vision,Neural Network,Convolution,Deep Learning,Caffe,我注意到,CNN在新数据集上的大多数微调只在“最后一个”完全连接(fc)层上进行 我感兴趣的是从“第一个”完全连接的层进行微调:也就是说,我希望使用卷积层和池层中的中级功能(假设它在ImageNet上经过培训),然后将所有fc层适配到我的新数据集 在理论上和实践中,这会产生什么样的影响?它有可能为我的新数据集学习一组更合适的参数吗?理论上,微调越深,模型越适合数据。因此,如果你能对整个模型进行微调,效果会更好 那么,你一定会问,为什么不每个人都对整个模型进行微调呢? 首先,微调整个模型涉及大量的

我注意到,CNN在新数据集上的大多数微调只在“最后一个”完全连接(fc)层上进行

我感兴趣的是从“第一个”完全连接的层进行微调:也就是说,我希望使用卷积层和池层中的中级功能(假设它在ImageNet上经过培训),然后将所有fc层适配到我的新数据集


在理论上和实践中,这会产生什么样的影响?它有可能为我的新数据集学习一组更合适的参数吗?

理论上,微调越深,模型越适合数据。因此,如果你能对整个模型进行微调,效果会更好

那么,你一定会问,为什么不每个人都对整个模型进行微调呢?
首先,微调整个模型涉及大量的参数,为了正确地训练数百万个参数而不存在过度拟合的风险,必须有大量新的训练示例。在大多数情况下,微调时,新任务只有很少几个带注释的示例,因此无法对整个模型进行微调。
第二,微调整个模型所需的时间比只训练顶层fc层要长得多。因此,如果您没有多少时间和预算,您只需微调顶层fc层


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

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

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

因此,每当人们在预先训练好的模型上进行微调时,他们几乎总是在顶部转储FC层

现在你可以走两条路了

  • 使用最后一个Conv/Pooling层的最终平坦输出作为问题的提取特征,并在其上训练一个ML模型。如果数据集较小或与预先训练的模型不相似,则通常使用此方法
  • 用上述方法提取特征,然后用它们训练一个FC神经网络。一旦达到了相当高的精度,将其堆叠在预训练模型的最后一个conv/pooling层之上(别忘了移除原始FC层)。现在冻结(参数保持不变,训练时不改变)大多数预训练模型,只允许训练最后几个conv层。现在训练整个网络以很小的学习率进行训练
  • 冻结大部分模型的关键是,我们假设模型已经从早期的conv层知道了边缘检测和颜色等基本内容。现在,我们对问题的最后几层进行微调。我们选择了一个小的学习率,这样我们就不会把模型已经学到的东西搞砸


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

    非常感谢你!我在想。我有将近150万张100个类的图片,我认为这不是一个小数目。这是否足够训练2~3个fc层,并且仍然避免过度装配?@CosmicRabbitMediaInc看起来足够训练整个网络。祝你好运