以lenet_solver.prototxt为例
#网络模型描述文件
#也可以用train_net和test_net来对训练模型和测试模型分别设定
#train_net: "xxxxxxxxxx"
#test_net: "xxxxxxxxxx"
net: "E:/Caffe-windows/caffe-windows/examples/mnist/lenet_train_test.prototxt"
#测试迭代的次数,这个参数要跟test_layer结合起来考虑,在test_layer中一个batch是100,而总共的测试图片是10000张
#所以这个参数就是10000/100=100
test_iter: 100
#每训练500次进行一次测试,每次测试都是以全部的测试集来测试
test_interval: 500
#学习率
base_lr: 0.01
#动力
momentum: 0.9
#type:SGD #优化算法的选择。这一行可以省略,因为默认值就是SGD,Caffe中一共有6中优化算法可以选择
#Stochastic Gradient Descent (type: "SGD"), 在Caffe中SGD其实应该是Momentum
#AdaDelta (type: "AdaDelta"),
#Adaptive Gradient (type: "AdaGrad"),
#Adam (type: "Adam"),
#Nesterov’s Accelerated Gradient (type: "Nesterov")
#RMSprop (type: "RMSProp")
#权重衰减项,其实也就是正则化项。作用是防止过拟合
weight_decay: 0.0005
#学习率调整策略
#如果设置为inv,还需要设置一个power, 返回base_lr * (1 + gamma * iter) ^ (- power),其中iter表示当前的迭代次数
lr_policy: "inv"
gamma: 0.0001
power: 0.75
#每训练100次屏幕上显示一次,如果设置为0则不显示
display: 100
#最大迭代次数
max_iter: 2000
#快照。可以把训练的model和solver的状态进行保存。每迭代5000次保存一次,如果设置为0则不保存
snapshot: 5000
snapshot_prefix: "E:/Caffe-windows/caffe-windows/examples/mnist/models"
#选择运行模式
solver_mode: GPU
首先说明一个概念:在caffe中的一次迭代iterration指的是一个batch,而不是一张图片。下面就主要说下几个概念
epoch:使用整个训练样本集传播一次.一次传播 = 一次前向传播 + 一次后向传播。但是考虑到内存不够用的问题,训练样本们往往并不是全都一起拿到内存中去训练,而是一次拿一个batch去训练,一个batch包含的样本数称为batch size。
iteration:使用batch size个样本传播一次。同样,一次传播=一次前向传播+一次后向传播。
test_iter: 在测试的时候,需要迭代的次数,即test_iter* batchsize(测试集的)=测试集的大小,测试集batchsize可以在prototx文件里设置
test_interval:interval是区间的意思,所有该参数表示:训练的时候,每迭代500次就进行一次测试。
caffe在训练的过程是边训练边测试的。训练过程中每500次迭代(也就是32000个训练样本参与了计算,batchsize为64),计算一次测试误差。计算一次测试误差就需要包含所有的测试图片(这里为10000),这样可以认为在一个epoch里,训练集中的所有样本都遍历以一遍,但测试集的所有样本至少要遍历一次,至于具体要多少次,也许不是整数次,这就要看代码,大致了解下这个过程就可以了。
eg. 我们有10000个训练样本,batch size为100,那么完成一次epoch就需要100个iteration。
但是在caffe中没有epoch这个概念
需要补充的是,在深度学习领域中,常用随机梯度下降算法(Stochastic Gradient Descent, SGD)训练深层结构,它有一个好处就是并不需要遍历全部的样本,当数据量非常大时十分有效。此时,可根据实际问题来定义epoch,例如定义10000次迭代为1个epoch,若每次迭代的batch_size设为256,那么1个epoch相当于过了2560000个训练样本。
一、weight decay(权值衰减)使用的目的是防止过拟合。在损失函数中,weight decay是放在正则项(regularization)前面的一个系数,正则项一般指示模型的复杂度,所以weight decay的作用是调节模型复杂度对损失函数的影响,若weight decay很大,则复杂的模型损失函数的值也就大。
二、momentum是梯度下降法中一种常用的加速技术。对于一般的SGD,其表达式为
x←x−α∗dx
,x沿负梯度方向下降。而带momentum项的SGD则写生如下形式:
v=β∗v−a∗dx
x←x+v
其中β即momentum系数,通俗的理解上面式子就是,如果上一次的momentum(即vv)与这一次的负梯度方向是相同的,那这次下降的幅度就会加大,所以这样做能够达到加速收敛的过程。(以上的推到,我不是很明白为何能加速,希望有大佬能解答)
三 、lr_policy
参考:图示caffe的solver中不同的学习策略(lr_policy)
// The learning rate decay policy. The currently implemented learning rate
// policies are as follows:
// - fixed: always return base_lr.
// - step: return base_lr * gamma ^ (floor(iter / step))
// - exp: return base_lr * gamma ^ iter
// - inv: return base_lr * (1 + gamma * iter) ^ (- power)
// - multistep: similar to step but it allows non uniform steps defined by
// stepvalue
// - poly: the effective learning rate follows a polynomial decay, to be
// zero by the max_iter. return base_lr (1 - iter/max_iter) ^ (power)
// - sigmoid: the effective learning rate follows a sigmod decay
// return base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))
//
// where base_lr, max_iter, gamma, step, stepvalue and power are defined
// in the solver parameter protocol buffer, and iter is the current iteration.
1、fixed 固定策略
故名思议就是学习率始终是一个固定值。
base_lr: 0.01
lr_policy: "fixed"
max_iter: 400000
fixed学习率的更新公式:lr=base_lr
fixed学习率曲线如下图所示:
2、step 均匀分步策略
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 30
max_iter: 100
step学习率的更新公式:lr=base_lr*gamma^(floor(iter/stepsize))
step学习率曲线如下图所示:
3、exp学习策略
base_lr: 0.01
lr_policy: "exp"
gamma: 0.1
max_iter: 100
exp学习率的更新公式:lr= base_lr*gamma^iter
exp学习率曲线如下图所示:
4、multistep 多分步或不均匀分步
base_lr: 0.01
lr_policy: "multistep"
gamma: 0.5
stepvalue: 1000
stepvalue: 3000
stepvalue: 4000
stepvalue: 4500
stepvalue: 5000
max_iter: 6000
multistep 学习率的更新公式:每一次学习率下降到之前的 gamma 倍
multistep 学习率曲线如下图所示:
5、inv 学习策略
base_lr: 0.01
lr_policy: "inv"
gamma: 0.1
power: 0.75
max_iter: 10000
inv 学习率的更新公式:base_lr * (1 + gamma * iter) ^ (- power)
inv 学习率曲线如下图所示:
其实,从公式中我们就可以看到,这种学习策略的优势就在于它使得学习率在每一次迭代时都减小,但每次减小又都是一个非常小的数,这样就省去的自己手动调节的麻烦。这种策略使用的也很普遍。
5、poly学习策略
base_lr: 0.01
lr_policy: "poly"
power: 0.5
max_iter: 10000
poly学习率的更新公式:lr = base_lr *(1 - iter/max_iter) ^ (power)
poly学习率曲线如下图所示:
学习率曲线的形状主要由参数 power 的值来控制。当 power = 1 的时候,学习率曲线为一条直线。当 power < 1 的时候,学习率曲线是凸的,且下降速率由慢到快。当 power > 1 的时候,学习率曲线是凹的,且下降速率由快到慢。
6、sigmoid学习策略
base_lr: 0.01
lr_policy: "sigmoid"
gamma: -0.001
stepsize: 5000
max_iter: 10000
sigmoid学习率的更新公式:lr = base_lr *( 1/(1 + exp(-gamma * (iter - stepsize))))
sigmoid学习率曲线如下图所示:
参数 gamma 控制曲线的变化速率。当 gamma < 0 时,才能控制学习率曲线呈下降趋势,而且 gamma 的值越小,学习率在两头变化越慢,在中间区域变化越快。
参考: