简述:
相信跑过caffe框架的同学都知道
一般进行训练,我们都需要如下几个文件/文件夹:
1)models文件夹 就是存放训练得到的模型,也就是保存网络中的各种W和b的参数
2)train-SE.sh 其实就是一个脚本文件,里面写上类似这样的:
/home/lincanran/caffe/.build_release/tools/caffe train -solver=/home/lincanran/cls_exp2/SE-ResNeXt-101-2/SE-ResNeXt-101_solver.prototxt -weights=/home/lincanran/cls_exp2/SE-ResNeXt-101-2/SE-ResNeXt-101.caffemodel --gpu 3
这样我们就没必要每次在终端输入这么长的指令去执行训练操作了,只需要进入到.sh文件所在的目录,然后执行:
sudo sh train-SE.sh
即可
3)SE-ResNeXt-101_solver.prototxt 就是跑模型的参数配置文件,下面会详细介绍
4)SE-ResNeXt-101.prototxt 就是定义网络模型结构的文件,一般都是由很多layer组成的
5)SE-ResNeXt-101.caffemodel 就是预训练好的模型,一般在训练开始时加上预训练模型会让你的模型收敛得更快,否则要从头开始训练会很慢,效果也不好
solver文件介绍:
solver文件是caffe的核心文件之一,其实它就是个参数的配置文件,里面可以自己设定许多训练时候用到的超参数,它协调着整个模型的运作。
caffe程序运行必带的一个参数就是solver配置文件。运行代码一般为:
其中slover部分就是:
-solver=*_slover.prototxt
solver文件具体参数详解:
我们打开solver.prototxt看看具体有哪些东西:
我们先来明确一下一些参数的定义:
1.对于 训练样本
假设一共有7500张训练图
batch_size:4 这个batch_size是在网络模型定义文件中修改的,即上面提到的SE-ResNeXt-101.prototxt中
也就是一次输入4张图进去训练(对于比较深的网络,可能一个batch_size就4/8/16这样子,否则GPU显存会占用很多,甚至会显示GPU out of memory,即显存不足,当然如果你有多卡的话,不妨把batch_size调大一些,这样你训练的速度会快很多)
将所有样本处理完一次(称为一代,即epoch)需要:7500/4=1875 次迭代才能完成
所以这里将 test_interval 可以设置为1875,即处理完一次所有的训练数据后,才去进行测试。所以这个数要大于等于1875.(不过也可以根据你自己需要去设置啦!我这里就设置成了5000,因为我用的是SE-ResNeXt-101的网络,有101层,如果每1875次去测一次的话,会花很多时间,所以没必要,你可以训练久一点,然后测一次,所以我这里就设置成5000了,你根据自己的需要去设,只要大于一代需要的迭代次数即可!)
如果想训练100代,则最大迭代次数为187500;
2. 对于 测试样本
同理,如果有2500个测试样本,batch_size同样为4,那么需要2500/4 = 625 次才能完整的测试一次。 所以 test_iter 为625。
3. 其他参数
搞懂了上面的图片数量和迭代次数的关系之后,下面的其他参数理解就相对容易些:
net: "/home/lincanran/cls_exp2/SE-ResNeXt-101-2/SE-ResNeXt-101.prototxt"
test_iter: 625
test_interval:5000
test_initialization: false
base_lr: 0.001
lr_policy: "poly"
power: 0.8
stepsize: 5000
max_iter: 110000
display: 100
momentum: 0.9
weight_decay: 0.0005
snapshot: 5000
solver_mode: GPU
snapshot_prefix: "/home/lincanran/cls_exp2/SE-ResNeXt-101-2/models/"
type: "Adam"
net: "/home/lincanran/cls_exp2/SE-ResNeXt-101-2/SE-ResNeXt-101.prototxt"
这里的net就是把你的网络模型结构的.prototxt的路径填上,训练时就会调用
test_iter: 625
这个在第2点的时候提过了,即完成一次测试需要的迭代次数
test_interval:5000
这个在第1点的时候提过了,即测试间隔
test_initialization: false
取值为true或者false,默认为true,就是刚启动就进行测试,false的话不进行第一次的测试
base_lr: 0.001
基础学习率(如果有预训练模型的话,这里的基础学习率一开始可以设得相对低一些,否则的话最好不要太低,不然收敛得很慢)
lr_policy: "poly"
学习率变化规律
其中可选参数如下:
“fixed”:固定学习速率,始终等于base_lr“step”:步进衰减,base_lr*gamma^(floor(iter/stepsize)) 需要提供gamma和stepsize参数“exp”:指数衰减,base_lr*gamma^(iter) 需要提供gamma参数“inv”:倒数衰减,base_lr*(1+gamma*iter)^(-power) 需要提供gamma和power参数“multistep”:多步衰减,与步进衰减类似,允许非均匀步进值(stepvalue) 需要提供stepvalue参数“ploy”:多项式衰减,在max_iter时达到0,base_lr*(1-iter/max_iter)^(power) 需要提供max_iter和power参数“sigmoid”:S形衰减,base_lr*(1/(1+exp^(-gamma*(iter-stepsize)))) 需要提供gamma和stepsize参数
power: 0.8
调节学习速率需要用到的参数
stepsize: 5000
”step”学习策略需要用到的参数,每隔stepsize降低学习速率,每隔stepsize,基础学习速率*gamma
max_iter: 110000
训练的最大迭代次数
display: 100
每隔display次打印一次loss
momentum: 0.9
冲量,灵感来自于牛顿第一定律,基本思路是为寻优加入了“惯性”的影响,这样一来,当误差曲面中存在平坦区的时候,SGD可以更快的速度学习
weight_decay: 0.0005
权重衰减量
snapshot: 5000
每迭代snapshot次,打印一次快照,即保存一次.caffemodel,.solverstate 模型
solver_mode: GPU
训练模式,可选,CPU,GPU 2种模式
snapshot_prefix: "/home/lincanran/cls_exp2/SE-ResNeXt-101-2/models/"
模型 .caffemodel,.solverstate保存的位置
type: "Adam"
采用哪一种优化算法
可选的参数如下:
Stochastic Gradient Descent (type: “SGD”)
AdaDelta (type: “AdaDelta”)
Adaptive Gradient (type: “AdaGrad”)
Adam (type: “Adam”)
Nesterov's Accelerated Gradient (type: “Nesterov”)
RMSprop (type: “RMSPorp”)
关于每种优化算法的具体介绍可参考:http://blog.csdn.net/renhanchi/article/details/77983345
还有其他我这里没有显示的参数也一并列出:
gamma: 0.1
学习率变化指数,即调节学习速率的因子