您的位置:首页 > Web前端

[置顶] Caffe windows 下进行(微调)fine-tune 模型

2016-07-29 09:25 423 查看
小菜最近一直在学习caffe。今天小菜主要介绍一下如何在Caffe上微调网络(ps:小菜中间也出现了许多问题,不过很感谢网上的一些前辈的无私奉献),一般比较经典的深度学习模型是别人训练好的模型,例如分类模型主要是针对Imagenet的数据集进行分类的。为了适应我们自己特定的新任务(小菜的任务是分类),一般来说我们自己需要做的方向,比如在一些特定的领域的识别分类中,我们很难拿到大量的数据。因为像在ImageNet上毕竟是一个千万级的图像数据库,通常我们可能只能拿到几千张或者几万张某一特定领域的图像,比如识别衣服啊、标志啊、生物种类等等。在这种情况下重新训练一个新的网络是比较复杂的,而且参数不好调整,数据量也不够,因此fine-tuning微调就是一个比较理想的选择。

这里解释一下什么是fine-tuning:是在别人基于caffe训练好的模型(如caffenet,googlenet等)的基础上,利用别人训练好的模型的权重参数值,通过训练自己的图片集修改最后一层的(也就是softmax)的参数和输出类别,说白了就是网络层的前面层不变作为一个特征提取器,只改变最后一层作为一个分类器,最后的训练就相当于训练了一个适合自己需求的分类器。

微调网络,通常我们有一个初始化的模型参数文件,这里是不同于training from scratch,scrachtch指的是我们训练一个新的网络,在训练过程中,这些参数都被随机初始化,而fine-tuning,是我们可以在ImageNet上1000类分类训练好的参数的基础上,根据我们的分类识别任务进行特定的微调。由于ImageNet的输出的分类数是1000,小菜用了6类的图像进行分类,所以最后的输出需要由1000改为6。

另外还需要将fc8层进行改名改为自己的名字(小菜改为fc8-test),这样因为已训练好的模型中没有与新的层进行匹配的结果,因此就会以新的随机值初始化最新创建的层。小菜使用的网络模型是CaffeNet,是一个小型的网络,其实别的网络如GoogleNet也是一样的原理。那么这个任务的变化可以表示为:

 任务:分类

 类别数目:1000(ImageNet上1000类的分类任务)----->6(自己的特定数据集的分类任务)那么在网络的微调中,我们的整个流程分为以下几步:

Ø  准备好我们的训练数据和测试数据,分为训练集和测试集;

Ø  计算数据集的均值文件;

Ø  修改网络;

Ø  调整Solver的配置参数,通常学习速率和步长,迭代次数都要适当减少,可以参考前面的solver的详解进行调整;

Ø  启动训练;

1.准备数据集

这一点就不用说了,准备两个txt文件,放成list的形式,可以参考caffe学习系列中数据集的生成。图像路径之后一个空格之后跟着类别的ID,如下,这里记住ID必须从0开始,要连续,否则会出错,loss不下降,按照要求写就OK。小菜找了6类一共是600张图片,480张为train,120张为test,放在caffe-master/data/re/train和caffe-master/data/re/test。生成图像对应的train.txt和test.txt,接着生成对应的lmdb数据,小菜把这些文件都放在caffe-master/examples/myfile路径下。这个是训练的图像label,测试的也同理。

2.计算数据集的均值文件

因为集中特定领域的图像均值文件会跟ImageNet上比较General的数据的均值不太一样,生成的过程可以参考之前caffe生成均值文件的步骤。小菜最后生成的mean.binaryproto文件放在caffe-master/examples/myfile路径下。

3.调整网络层参数

参照Caffe上的例程,我用的是CaffeNet,首先在输入层data层,修改我们的source 和 meanfile, 根据之前生成的lmdb 和mean.binaryproto修改即可,最后一层的输出类别,也就是将deploy.prototxt文件中的最后的输出类别1000改为自己的输出类别(小菜是改为6了)并且需要加快最后一层的参数学习速率。首先修改名字,这样预训练模型赋值的时候这里就会因为名字不匹配从而重新训练,也就达成了我们适应新任务的目的。

调整学习速率,因为最后一层是重新学习,因此需要有更快的学习速率相比较其他层,因此我们将,weight和bias的学习速率加快10倍。原来是fc8,记得把跟fc8连接的名字都要修改掉。

4.修改Solver参数
可以参考前面的caffe学习系列中的solver的详解进行调整参数,原来的参数是用来training fromscratch,从原始数据进行训练的,因此一般来说学习速率、步长、迭代次数都比较大,在fine-tuning微调呢,也正如它的名字,只需要微微调整, 主要的调整有:test_iter从1000改为了100,因为数据量减少了,base_lr从0.01变成了0.001,这个很重要,微调时的基本学习速率不能太大,学习策略没有改变,步长从原来的100000变成了20000,最大的迭代次数也从450000变成了50000,动量和权重衰减项都没有修改,依然是GPU模型,网络模型文件和快照的路径根据自己修改
5.开始训练

首先你要从caffe zoo里面下载一下CaffeNet网络用语ImageNet1000类分类训练好的模型文件,名字是bvlc_reference_caffenet.caffemodel,这个模型可以去网上下载:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel,训练的命令如下:

Build/x64/Realse/caffe.exe  train --solver=examples/myfile/solver.prototxt --weights  examples/myfile/bvlc_refference_caffenet.caffemodel  --gpu 0

小菜这里将它写成一个脚本文件(xxx.sh),在cygwin下直接运行该脚本文件就行,小菜也建议大家一开始的时候可以自己多手动敲的运行,这样可以加强你的熟悉程度,后面可以写成脚本,因为写成脚本很方便,运行的时候只需要敲一行代码就行。最后达到的性能还不错accuray 是0.9,loss降的很低,这是小菜的caffe微调的初次体验,希望能帮到大家!finetune时应该用自己的数据集生成的均值文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: