当前位置: 代码迷 >> 综合 >> caffe深度学习【十三】:Caffe的 solver 参数详解
  详细解决方案

caffe深度学习【十三】:Caffe的 solver 参数详解

热度:13   发布时间:2023-12-18 21:05:08.0

简述:

相信跑过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 

学习率变化指数,即调节学习速率的因子