GoogLeNet模型的微调

时间:2016-04-25 12:52:05

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

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

2 个答案:

答案 0 :(得分:28)

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

1。分类层

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

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

    您需要使用要微调的新标签制作新的训练数据集。例如,请参阅this post有关如何创建lmdb数据集的信息。

    3。你想要的微调有多广泛?

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

    4。运行caffe

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

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

答案 1 :(得分:5)

与过去的手动功能相比,微调是一种非常有用的技巧,可以实现更高的精度。 @Shai已经发布了一个使用Caffe微调Googlenet的好教程,所以我只想给出一些推荐和技巧,以便对一般情况进行微调。

在大多数情况下,我们遇到的任务分类问题是新数据集(例如Oxford 102 flower datasetCat&Dog)有以下四种常见情况CS231n

  1. 新数据集很小,与原始数据集类似。
  2. 新数据集很小但与原始数据集(最常见的情况)不同
  3. 新数据集很大,与原始数据集类似。
  4. 新数据集很大但与原始数据集不同。
  5. 在实践中,大多数时候我们没有足够的数据来从头开始训练网络,但对于预先训练好的模型可能已经足够了。无论我在上面提到的哪种情况,我们唯一关心的是我们是否有足够的数据来训练CNN?

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

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