参考:胡超伟博客
caffe模型需要两个最重要的参数文件:网络模型和参数模型,分别是*.prototxt和*.solver.prototxt文件。
本节介绍参数模型文件说明,网络模型文件说明参考《caffe网络模型配置说明》
利用caffe训练神经网络时,需要配置solver.prototxt文件里边的参数,示例代码如下
net: "examples/mnist/lenet_train_test.prototxt" //网络模型的目录,文件路径要从caffe的根目录开始
test_iter: 100 //迭代100次,test_iter×batch_size=需要训练的图片总数
test_interval: 500 //每训练500次,进行一次测试
base_lr: 0.01 //基础学习率
momentum: 0.9 //上一次梯度更新的权重
type: SGD //优化算法选择,默认SGD
weight_decay: 0.0005 //权重衰减项,防止过拟合
lr_policy: "inv" //对基础学习率进行调整的策略,如果设置为inv,还需要设置一个power, 返回base_lr * (1 + gamma * iter) ^ (- power)
gamma: 0.0001
power: 0.75
display: 100 //每训练100次,在屏幕上显示一次。如果设置为0,则不显示。
max_iter: 20000 //最大迭代次数。这个数设置太小,会导致没有收敛,精确度很低。设置太大,会导致震荡,浪费时间。
snapshot: 5000 //用于设置训练多少次后进行保存
snapshot_prefix: "examples/mnist/lenet" //保存路径
solver_mode: GPU //设置运行模式
solver的流程如下:
1、调用train_val.prototxt设计优化对象、训练网络和测试网络;
2、通过forward和backward迭代优化更新参数;
3、根据test_interval定期评价测试网络;
4、优化过程中显示模型和solver的状态;
每一步迭代,solver的工作如下:
1、调用forward算法来计算最终的输出值,以及对应的loss;
2、调用backward算法来计算每层的梯度;
3、根据选用的solver方法,利用梯度进行参数更新;
4、保存并记录每次迭代的学习率、快照和对应的状态;
现将文件中的参数意义说明如下
base_lr
初始学习率,用来设置基础学习率,在迭代的过程中,可以对基础学习率进行调整
lr_policy
这个参数是用来表示学习率随着时间是如何变化的,在开始训练模型时,一般采用高的学习速率,因为高的学习速率,优化速度快;但是到达某个节点后会变得充满随机性,此时需要降低学习速率,这样才能以较低的学习速率到达损失函数的更低点。
- “step”——需要设置stepsize。根据gamma参数和stepsize参数来降低学习率,base_lr * gamma ^ (floor(iter / stepsize))。iter是当前迭代次数。学习率每迭代stepsize次变化一次。
- “multistep”——与step类似,step的学习率是均匀等间隔变化,而multistep则是根据stepvalue值变化,需要设置stepvalue。
- “fixed”——学习率base_lr保持不变。
- “inv”——学习率变化公式为base_lr * (1 + gamma iter) ^ (- power),如果设置了inv,还需要设置一个power
- “exp”——学习率变化公式为base_lr x gamma ^ iter
- “poly”——学习率以多项式形式衰减,到最大迭代次数时降为0。学习率变化公式为base_lr \ (1 - iter/max_iter) ^ (power)。
- “sigmoid”——学习率以S型曲线形式衰减,学习率变化公式为base_lr * (1 / (1 + exp(-gamma * (iter - stepsize))))
gamma
这个参数表示学习率每次的变化程度,值为实数。
stepsize
这个参数表示什么时候应该进行训练的下一过程,值为正整数。主要用在lr_policy为step的情况。学习率变化规律我们设置为随着迭代次数的增加,慢慢变低。总共迭代25000次,变化5次的情况下,将stepsize设置为:25000/5=5000;即每迭代5000次,降低一次学习率; stepsize不能太小,如果太小会导致学习率再后来越来越小,达不到充分收敛的效果。stepvalue
这个参数表示什么时候应该进行训练的下一过程,值为正整数。主要用在lr_policy为multistep的情况max_iter
这个参数表示训练神经网络迭代的最大次数,值为正整数。这个参数如果设置太小的话,会导致没有收敛,精确度很低momentum
这个参数表示在新的计算中要保留的前面的权重数量,值为真分数,通常设为0.9。momentum是梯度下降法中一种常用的加速技术。如果上一次的momentum(即v)与这一次的负梯度方向是相同的,那这次下降的幅度就会加大;若相反则抑制。所以这样做能够达到加速收敛的过程weight_decay
这个参数表示对较大权重的惩罚(正则化)因子。值为真分数。权重衰减,主要是为了防止过拟合solver_mode
这个参数用来表示求解神经网络的模式——值为CPU or GPU。snapshot
这个参数用来表示每迭代多少次就应该保存snapshot的model和solverstate,值为正整数。snapshot_prefix
这个参数用来表示保存snapshot时model和solverstate的前缀,值为带引号的字符串。net
这个参数表示训练网络所在的位置,值为带引号的字符串。test_iter
这个参数表示每个test_interval进行多少次test迭代,值为正整数。测试的批次数,这个参数要与batch_size结合起来理解,例如:mnist数据集中测试样本总数为10000,一次执行全部数据效率很低,因此,我们将测试数据分几个批次来执行。假定我们设置batch_size为100,则需要迭代100次才能将10000个数据全部执行完,因此,将test_iter设置为100。执行完一次全部数据,称之为一个epochtest_interval
这个参数表示什么时候进行数据的测试,值为正整数。测试间隔,每训练多少次进行一次测试。
比如我的训练正负样本各2000,总共:4000;batch_size:16;将所有样本处理完一次(一个epoch)需要: 4000/16=250次迭代才能完成;所以将test_interval设置为300,即处理完一次所有的训练数据后才去进行测试。这个数要大于等于250。如果想迭代100代(100个epoch),则最大迭代次数为25000。
display
这个参数用来表示什么时候将输出结果打印到屏幕上,值为正整数,表示迭代次数。如果设置为0,则不显示type
这个参数表示训练神经网络采用的反向传播算法,值为带引号的字符串,目前caffe有六种优化方法,可选的值有:- Stochastic Gradient Descent “SGD”——随机梯度下降,默认值。
- AdaDelta “AdaDelta”——一种”鲁棒的学习率方法“,是基于梯度的优化方法。
- Adaptive Gradient “AdaGrad”——自适应梯度方法。
- Adam “Adam”——一种基于梯度的优化方法。
- Nesterov’s Accelerated Gradient “Nesterov”——Nesterov的加速梯度法,作为凸优化中最理想的方法,其收敛速度非常快。
- RMSprop “RMSProp”——一种基于梯度的优化方法。
batchsize
每迭代一次,网络训练图片的数量,例如:如果你的batchsize=256,则你的网络每迭代一次,训练256张图片;则,如果你的总图片张数为1280000张,则要想将你所有的图片通过网络训练一次,则需要1280000/256=5000次迭代。
epoch
表示将所有图片在你的网络中训练一次所需要的迭代次数,如上面的例子:5000次;我们称之为 一代。所以如果你想要你的网络训练100代时,则你的总的迭代次数为max_iteration=5000*100=500000次;
max_iteration
网络的最大迭代次数如上面的500000次;同理,如果max_iteration=450000,则该网络被训练450000/5000=90代。