Ash*_*gla 14 machine-learning computer-vision neural-network deep-learning caffe
我从头开始训练GoogLeNet模型.但它没有给我带来有希望的结果.
作为替代方案,我想在我的数据集上对GoogLeNet模型进行微调.有谁知道我应该遵循哪些步骤?
Sha*_*hai 28
假设您正在尝试进行图像分类.这些应该是微调模型的步骤:
原始分类层"loss3/classifier"输出1000个类的预测(它mum_output被设置为1000).您需要使用适当的新图层替换它num_output.替换分类层:
num_output为您尝试预测的正确数量的输出类. "loss1/classifier","loss2/classifier"和"loss3/classifier".您需要使用要微调的新标签创建新的训练数据集.例如,请参阅有关如何创建lmdb数据集的这篇文章.
微调模型时,您可以训练所有模型的权重或选择固定一些权重(通常是较低/较深层的过滤器)并仅训练最顶层的权重.这个选择取决于您,它通常取决于可用的训练数据量(您拥有的示例越多,您可以承担更多的权重).
每一层(包含可训练的参数)都有param { lr_mult: XX }.该系数确定这些权重对SGD更新的敏感程度.设置param { lr_mult: 0 }意味着您修复此图层的权重,并且在训练过程中不会更改它们.
相应地编辑你的train_val.prototxt.
运行caffe train但提供caffemodel权重作为初始权重:
~$ $CAFFE_ROOT/build/tools/caffe train -solver /path/to/solver.ptototxt -weights /path/to/orig_googlenet_weights.caffemodel
Run Code Online (Sandbox Code Playgroud)
与过去的手动功能相比,微调是实现有前途的精确度的非常有用的技巧.@Shai已经发布了一个使用Caffe微调Googlenet的好教程,所以我只想给出一些推荐和技巧,以便对一般情况进行微调.
在大多数情况下,我们面临一个任务分类问题,即新数据集(例如牛津102花数据集或Cat&Dog)有以下四种常见情况CS231n:
在实践中,大多数时候我们没有足够的数据来从头开始训练网络,但对于预训练的模型可能已经足够了.无论我提到哪种情况,我们唯一关心的是我们是否有足够的数据来训练CNN?
如果是,我们可以从头开始训练CNN.然而,在实践中,从预训练模型初始化重量仍然是有益的.
如果不是,我们需要检查数据是否与原始数据集非常不同?如果它非常相似,我们可以微调完全连接的神经网络或微调SVM.但是,如果它与原始数据集非常不同,我们可能需要微调卷积神经网络以改进泛化.