【问题标题】:CNN : Fine tuning small network vs feature extracting from a big networkCNN:微调小型网络与从大型网络中提取特征
【发布时间】:2018-03-08 17:23:15
【问题描述】:

详细说明:在什么情况下微调小型网络(例如 SqueezeNet)的所有层会比特征提取或仅微调大型网络的最后 1 或 2 个卷积层(例如 inceptionV4)表现更好?

我的理解是两者所需的计算资源有点可比。我记得在paper 中读到过极端选项,即微调 90% 或 10% 的网络比 50% 等更温和的选项要好得多。那么,在无法进行广泛试验时,默认选择应该是什么?

任何过去的实验和对其结果的直观描述、研究论文或博客都会特别有帮助。谢谢。

【问题讨论】:

    标签: tensorflow computer-vision deep-learning conv-neural-network


    【解决方案1】:

    我在训练 SqueezeNet 等模型方面没有太多经验,但我认为只微调大型网络的最后 1 或 2 层要容易得多:您不必广泛搜索许多最佳超参数。使用 LR finder 和来自 fast.ai 的循环学习率,迁移学习开箱即用的效果非常好。

    如果您想在训练后进行快速推理,则最好训练 SqueezeNet。如果新任务与 ImageNet 非常不同,也可能会出现这种情况。

    来自http://cs231n.github.io/transfer-learning/的一些直觉

    • 新数据集很小,与原始数据集相似。由于数据很小,由于过度拟合的问题,对 ConvNet 进行微调并不是一个好主意。由于数据与原始数据相似,我们预计 ConvNet 中的更高级别特征也与该数据集相关。因此,最好的办法可能是在 CNN 代码上训练一个线性分类器。
    • 新数据集很大并且与原始数据集相似。由于我们拥有更多数据,因此我们可以更有信心在尝试对整个网络进行微调时不会过度拟合。
    • 新数据集很小,但与原始数据集有很大不同。由于数据很小,最好只训练线性分类器。由于数据集非常不同,最好从网络顶部训练分类器,其中包含更多特定于数据集的特征。相反,从网络早期某处的激活中训练 SVM 分类器可能会更好。
    • 新数据集很大,与原始数据集有很大不同。由于数据集非常大,我们可以预期我们有能力从头开始训练 ConvNet。然而,在实践中,使用来自预训练模型的权重进行初始化通常仍然是有益的。在这种情况下,我们将有足够的数据和信心对整个网络进行微调。

    【讨论】:

    • 那么如果我有一个类似的数据集,大到可以调整大约 1m 的squeezenet 参数,但不足以训练 inceptionv4 或 vgg?
    • 如果您想进行快速推理,请训练squeezenet。对于具有大型网络的许多应用程序来说,推理仍然足够快,因此您需要真正关心它才能选择这种方式。如果任务相似,它很可能会产生更好的结果,微调 Inception 或 VGG 的最后几层。几层?做一些交叉验证:) 没有明确的规则,只有训练神经网络的常识和经验。
    • “微调 Inception 或 VGG 的最后几层可以产生更好的结果”——我的直觉告诉我:(
    • 这个想法是你已经有一个非常好的特征提取器(卷积层)来解决手头的问题(任务类似),你只需要训练一个利用这些特征的新分类器(特征好的话很容易得到一个好的分类器)
    猜你喜欢
    • 2017-06-14
    • 2012-07-10
    • 1970-01-01
    • 2021-11-14
    • 2021-02-14
    • 2020-12-02
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多