caffe参数模型配置说明

参考:胡超伟博客

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;

扫描二维码关注公众号,回复: 1870513 查看本文章

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。执行完一次全部数据,称之为一个epoch

test_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代。

猜你喜欢

转载自blog.csdn.net/zong596568821xp/article/details/80907404