【问题标题】:Fine Tuning of GoogLeNet ModelGoogLeNet 模型的微调
【发布时间】:2016-08-18 21:05:14
【问题描述】:

我从头开始训练 GoogLeNet 模型。但这并没有给我带来有希望的结果。
作为替代方案,我想在我的数据集上对 GoogLeNet 模型进行微调。有谁知道我应该遵循哪些步骤?

【问题讨论】:

    标签: machine-learning deep-learning computer-vision conv-neural-network caffe


    【解决方案1】:

    假设您正在尝试进行图像分类。这些应该是微调模型的步骤:

    1。分类层

    原始classification layer "loss3/classifier" 输出 1000 个类别的预测(mum_output 设置为 1000)。您需要将其替换为具有适当num_output 的新层。更换分类层:

    1. 更改层的名称(这样当您从 caffemodel 文件中读取原始权重时,不会与该层的权重发生冲突)。
    2. num_output 更改为您尝试预测的正确数量的输出类。
    3. 请注意,您需要更改所有分类层。通常只有一个,但 GoogLeNet 恰好有三个:"loss1/classifier""loss2/classifier""loss3/classifier"

    2。数据

    您需要使用要微调的新标签创建一个新的训练数据集。例如,请参阅this post,了解如何制作 lmdb 数据集。

    3。您想要多广泛的微调?

    在微调模型时,您可以训练所有模型的权重或选择固定一些权重(通常是较低/较深层的过滤器)并仅训练最顶层的权重。这个选择取决于您,它通常取决于可用的训练数据量(您拥有的示例越多,您可以负担得起微调的权重越多)。
    每一层(包含可训练参数)都有param { lr_mult: XX }。该系数决定了这些权重对 SGD 更新的敏感程度。设置param { lr_mult: 0 } 意味着你修复了这一层的权重,并且在训练过程中它们不会改变。
    相应地编辑您的train_val.prototxt

    4。运行咖啡

    运行 caffe train,但为其提供 caffemodel 权重作为初始权重:

    ~$ $CAFFE_ROOT/build/tools/caffe train -solver /path/to/solver.ptototxt -weights /path/to/orig_googlenet_weights.caffemodel 
    

    【讨论】:

    • 非常感谢 Shai 的回复。你能告诉我如何获得预训练的 GoogLeNet 模型吗?我使用下面给出的链接下载预训练模型。 dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel
    • @AshutoshSingla 看看 caffe 模型动物园
    • 我进行了微调,但结果并不乐观。在 1000 次迭代后,我只能获得 50% 的准确度。我的训练数据集有 3k 图像,验证有 1k 图像,评估有 1k 图像。我将 base_lr 设置为 0.001,将 max_itr 设置为 10000。这个精度是正常的还是我做错了什么?如果需要,我还可以分享我在文件中所做的更改。 @shai 你有什么建议吗?
    • @AshutoshSingla 你必须更具体。如果您有新问题,请ask
    【解决方案2】:

    与过去的手动功能相比,微调是一个非常有用的技巧,可以实现有希望的准确度。 @Shai 已经发布了一个很好的使用 Caffe 对 Googlenet 进行微调的教程,所以我只是想给出一些针对一般情况进行微调的建议和技巧。

    大多数时候,我们面临一个任务分类问题,新数据集(例如Oxford 102 flower datasetCat&Dog)有以下四种常见情况CS231n

    1. 新数据集较小,与原始数据集相似。
    2. 新数据集很小,但与原始数据集不同(最常见的情况)
    3. 新数据集很大,与原始数据集相似。
    4. 新数据集很大,但与原始数据集不同。

    在实践中,大多数时候我们没有足够的数据来从头开始训练网络,但对于预训练模型来说可能已经足够了。无论我上面提到哪些情况,我们唯一需要关心的是我们是否有足够的数据来训练 CNN?

    如果是,我们可以从头开始训练 CNN。然而,在实践中,从预训练模型中初始化权重仍然是有益的。

    如果不是,我们需要检查数据是否与原始数据集有很大不同?如果非常相似,我们可以微调全连接神经网络或fine-tune with SVM。但是,如果它与原始数据集有很大不同,我们可能需要fine-tune the convolutional neural network to improve the generalization

    【讨论】:

      猜你喜欢
      • 2016-09-24
      • 2023-03-30
      • 2017-10-30
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2021-10-21
      相关资源
      最近更新 更多