【问题标题】:fine-tuning a CNN from a lower fc layer从较低的 fc 层微调 CNN
【发布时间】:2015-12-08 18:43:00
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    理论上,您微调的越深,您的模型就越适合您的数据。所以,如果你能对整个模型进行微调——那就更好了。

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

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

    【讨论】:

    • 非常感谢!我想知道。我有近 150 万张图片,有 100 个类别,我认为这不是一个小数目。这是否足以训练 2~3 个 fc 层并仍然避免过度拟合?
    • @CosmicRabbitMediaInc 看起来足以训练整个网络。祝你好运
    【解决方案2】:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      相关资源
      最近更新 更多