我从头开始训练 GoogLeNet 模型。但它并没有给我带来有希望的结果。
作为替代方案,我想在我的数据集上对 GoogLeNet 模型进行微调。有谁知道我应该遵循什么步骤?
假设您正在尝试进行图像分类。这些应该是微调模型的步骤:
1.分类层
原本的分类层"loss3/classifier" https://github.com/BVLC/caffe/blob/master/models/bvlc_googlenet/train_val.prototxt输出 1000 个类别的预测(它是mum_output
设置为 1000)。您需要用适当的新图层替换它num_output
。替换分类层:
- 更改图层的名称(这样当您从caffemodel文件中读取原始权重时,就不会与该图层的权重发生冲突)。
- Change
num_output
您尝试预测的正确数量的输出类。
- 请注意,您需要更改所有分类层。通常只有一个,但 GoogLeNet 恰好有三个:"loss1/classifier" https://github.com/BVLC/caffe/blob/master/models/bvlc_googlenet/train_val.prototxt#L904, "loss2/classifier" https://github.com/BVLC/caffe/blob/master/models/bvlc_googlenet/train_val.prototxt#L1667 and "loss3/classifier" https://github.com/BVLC/caffe/blob/master/models/bvlc_googlenet/train_val.prototxt.
2. Data
您需要使用要微调的新标签创建一个新的训练数据集。例如,参见这个帖子 https://stackoverflow.com/a/31431716/1714410关于如何制作 lmdb 数据集。
3. 您想要多大程度的微调?
微调模型时,您可以训练所有模型的权重,也可以选择固定一些权重(通常是较低/较深层的过滤器)并仅训练最顶层的权重。这个选择取决于您,通常取决于可用的训练数据量(您拥有的示例越多,您可以微调的权重就越多)。
每层(保存可训练参数)都有param { lr_mult: XX }
。该系数决定了这些权重对 SGD 更新的敏感程度。环境param { lr_mult: 0 }
意味着你固定了这一层的权重,它们在训练过程中不会改变。
编辑你的train_val.prototxt
因此。
4.运行咖啡
Run caffe train
但为其提供 caffemodel 权重作为初始权重:
~$ $CAFFE_ROOT/build/tools/caffe train -solver /path/to/solver.ptototxt -weights /path/to/orig_googlenet_weights.caffemodel
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)