繁体   English   中英

GoogLeNet模型的微调

[英]Fine Tuning of GoogLeNet Model

我从头开始训练GoogLeNet模型。 但这并没有给我带来可喜的结果。
另外,我想对数据集上的GoogLeNet模型进行微调。 有人知道我应该遵循什么步骤吗?

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

1.分类层

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

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

2.资料

您需要使用要微调的新标签创建新的训练数据集。 见,例如, 这篇文章就如何使一个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已经发布了一个很好的教程,可以使用Caffe对Googlenet进行微调,因此我只想给出一些建议和技巧,以针对一般情况进行微调。

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

  1. 新数据集很小,与原始数据集相似。
  2. 新数据集很小,但与原始数据集不同(大多数情况下)
  3. 新数据集很大,并且与原始数据集相似。
  4. 新数据集很大,但不同于原始数据集。

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

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

如果否,我们需要检查数据是否与原始数据集有很大不同? 如果非常相似,我们可以微调完全连接的神经网络或使用SVM进行微调 但是,如果它与原始数据集有很大不同,我们可能需要微调卷积神经网络以提高泛化性

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM