GoogLeNet 模型微调

Fine Tuning of GoogLeNet Model

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

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

1。分类层

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

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

2。数据

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

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

微调模型时,您可以训练所有模型的权重或选择固定一些权重(通常是 lower/deeper 层的过滤器)并仅训练最顶层的权重。这个选择取决于你,它通常取决于可用的训练数据量(你拥有的示例越多,你可以微调的权重就越多)。
每层(包含可训练参数)都有 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 

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

在大多数情况下,我们面临新数据集(例如 Oxford 102 flower dataset or Cat&Dog) has following four common situations CS231n:

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

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

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

如果不是,我们需要检查数据是否与原始数据集有很大不同?如果非常相似,我们可以直接微调全连接神经网络或者fine-tune with SVM. However, If it is very different from original dataset, we may need to fine-tune the convolutional neural network to improve the generalization.