solver 是caffe的核心之重,它是整个模型运行的参数配置文件。运行代码一般为:
#caffe train --solver=*_solver.prototxt
在DL中,损失函数(loss function)是非凸的,没有解析解,我们需要通过优化的方法来求解。solver的作用就是交替调用前向(forward)算法和后向(backward)算法来更新参数,从而最小化损失(loss),实际上就是一种迭代的优化算法。
接下来,我们看一个实例:
net:"examples/myfile/train_val.prototxt" //设置深度网络模型。每一个模型就是一个net,需要在一个专门的配置文件中对net进行配置,每个net由许多的layer所组成。上面这句代码就是设置训练网络的,网络模型文件配置,即examples/myfile/文件下的train_val.prototxt里面的配置。
batchsize //每迭代一次,网络训练图片的数量,例如:如果你的batchsize=256,则你的网络每迭代一次,训练256张图片;则,如果你的总图片张数为1280000张,则要想将你所有的图片通过网络训练一次,则需要1280000/256=5000次迭代。
epoch //表示将所有图片在你的网络中训练一次所需要的迭代次数,如上面的例子:5000次;我们称之为 一代。所以如果你想要你的网络训练100代时,则你的总的迭代次数为max_iteration=5000*100=500000次;
test_iter:10 //这个要与train layer 中的batch_size结合起来理解。训练数据中测试样本总数为400,一次性执行全部数据的效率太低,因此我将测试数据分成几个批次来执行,每个批次的数量就是batch_size。本文,我将batch_size设置为40,则需要迭代10次才能将400个数据全部执行完。因此test_iter设置为10.执行完一次全部数据,称之为一个epoch.
test_interval: 50 //测试间隔。也就是每训练50次,才进行一次测试。
base_lr:0.001
lr_policy:"step"
gamma:0.1
stepsize:100
//这四行可以放在一起理解,用于学习率的设置。只要是梯度下降法来求解优化,都会有一个学习率,也叫步长。base_lr用于设置基础学习率,在迭代的过程中,可以对基础学习率进行调整。怎样进行调整,就是调整的策略,由lr_policy来设置。
lr_policy可以设置为下面这些值,相应的学习率的计算为:
fixed:保持base_lr不变
step:如果设置为step,则还需要设置一个stepsize,返回base_lr*gamma^(floor(iter/stepsize)),其中iter表示当前的迭代次数
exp:返回base_lr*gamma^iter,iter为当前迭代次数
inv:如果设置为inv,还需要设置一个power,返回base_lr*(1+gamma*iter)^(-power)
multistep:如果设置为multistep,则还需要设置一个stepvalue。这个参数和step很相似,step是均匀等间隔变化,而multistep则是根据stepvalue值变化
poly:学习率进行多项式误差,返回base_lr(1-iter/max_iter)^(power)
sigmoid:学习率进行sigmoid衰减,返回base_lr(1/(1+exp(-gamma*(iter-stepsize))))
momentum:0.9 //上一次梯度更新的权重。
display:20 //训练20次,在屏幕显示一次。如果设置为0,则不显示。
max_iter:500 //最大迭代次数。这个参数设置太小,会导致没有收敛,精确度很低。设置太大,会导致震荡,浪费时间。
snapshot:40
snapshot_prefix:"examples/myfile"
//保存快照。将训练出来的model和solver状态进行保存,snapshot用于设置训练多少次后进行保存,默认为0,不保存。snapshot_prefix:设置保存路径。还可以设置snapshot_diff,是否保存梯度值,默认为false,不保存。
weight_decay:0.005 //权重衰减项,防止过拟合的一个参数。
solver_mode:GPU //设置运行模式。默认为GPU,如果你没有GPU,则需改成CPU,否则会出错。
注意:以上的所有参数均为可选参数,都有默认值,根据solver(type)方法的不同,还有一些其他的参数,大家根据自己的需要自己设置。
参考:https://blog.csdn.net/qq_27923041/article/details/55211808