caffe——solver及其配置

来源:互联网 发布:linux系统是什么 编辑:程序博客网 时间:2024/06/06 07:29

caffe——solver及其配置
solver算是caffe的核心的核心,它协调着整个模型运作。caffe程序运行必带的是solver配置文件。运行代码一般为

#caffe train --solver=*_solver.prototxt
在DL中,往往loss function是非凸的,没有解析解,我们只能通过优化方法来求解。solver主要作用就是交替调用前向算法和后向算法更新参数,从而最小化loss,实际上是一个迭代优化算法。

目前caffe提供了6种优化方法求解最优参数,在solver配置文件中,通过设置type类型来选择。
Stochastic Gradient Descent(type:”SGD”)
AdaDelta(type:”AdaDelta”)
Adaptive Gradient(type:”AdaGrad”)
Adam(type:”Adam”)
Nesterov’s Accelerated Gradient(type:”Nesterov”)
RMSprop(type:”RMSProp”)
具体每种方法介绍,在以后文章中会详细分析,本文着重介绍solver配置文件。
Slover的流程:
1 设计好需要优化的对象,以及用于学习的寻来拿网络和用于评估的测试网络。
2 通过forward 和backward迭代进行优化更新参数
3 定期的评价测试网络(可以设定多少次寻来拿后,进行一次测试)
4 在优化过程中显示模型和solver状态
在每一次迭代过程中,solver做了以下几步工作:
1 调用forward算法来计算最终的输出值,以及对应的loss
2 调用backward算法来计算每层的梯度
3 根据选用的solver方法,利用梯度进行参数更新
4 记录并保存每次迭代的学习率,快照,以及对应状态。
实例:

net:"examples/mnist/lenet_train_test.prototxt"test_iter:100test_interval:500base_lr:0.01momentum:0.9type:"SGD"weight_cecay:"0.0005"lr_policy:"inv"gamma:0.0001power:"0.75"display:"100"max_iter:20000snapshot:5000snapshot_prefix:"examples/mnist/lenet"solver_mod:CPU

解释:

net:"examples/mnist/lenet_train_test.prototxt"

深度网络模型的文件路径。注意:文件路径要从caffe的根目录开始,其他所有配置都这样。
也可用train_net和test_net来对训练模型和测试模型分别设定:

train_net: "examples/hdf5_classification/logreg_auto_train.prototxt"test_net: "examples/hdf5_classification/logreg_auto_test.prototxt"

第二行

test_iter:100

这个要与test layer中的batch_size结合起来理解。mnist数据额式样本总数为10000,一次执行全部数据效率很低,因此我们将数据分成几个批次来执行,每个批次数量就是batch_size。假设我们设置batch_size为100,则需要迭代100次才能将10000个数据执行完,因此test_iter设置为100。执行完一次全部数据,称为一个epoch。

test_interval:500

测试间隔,每训练500次,才进行一次测试。

base_lr:0.01lr_policy:"inv"gamma:0.0001power:0.75

这四行放在一起用于学习率的设置。base_lr用于设置基础学习率,在迭代过程中,可以对基础学习率进行调整。调整策略由lr_policy来设置。
lr_policy可以设置为以下这些值,相应的学习率为:
-fixed: 保持base_lr不变
-step: 如果设置为step则还需要设置一个stepsize,返回base_lr*gamma^(floor(iter/stepsize)),其中iter表示当前迭代次数。
-exp:返回base_lr*gamma^iter,ietr为当前迭代次数
-inv: 需要设置一个power,返回base_lr(1+gamma*iter)^(-power)
-multistep: 如果设置为,multistep,则还需要设置一个stepvalue。这个参数和step很相似,step是均匀等间隔变化,multistep是根据stepvalue值变化。
-sigmoid: 学习率进行sigmoid衰减,返回base_lr(1/(1+exp(-gamma*(iter-stepsize))))
multistep示例:

base_lr:0.01momentum:0.9weight_decay:0.0005#the learning rate policylr_policy:"multistep"gamma:0.9stepvalue:5000stepvalue:7000stepvalue:8000stepvalue:9000stepvalue:9500
接下来参数:
momentum:0.9

上一次梯度更新的权重,具体可参看下一篇文章

typeSGD
优化算法选择,默认是SGD
weight_decay:0.0005
权重衰减项,防止过拟合的一个参数
display:100
每训练100次,在屏幕上显示一次,入设置为0,则不显示
max_iter:20000
最大迭代次数,设置太小欠拟合,设置太大会导致震荡,浪费时间。
snapshot:5000snapshot_prefix:"examples/mnist/lenet"

快照,将训练出来的model和solver状态进行保存,snapshot用于设置训练多少次后进行保存,默认为0,不保存。下边一行设置保存路径。
还可以设置snapshot_diff,是否保存梯度值,默认为false,不保存。
也可以设置snapshot_format,保存的类型,有两种选择:HDF5和BINARYPROTO,默认为BINARYPROTO。
slover_mode:CPU
设置运行模式,默认为GPU。

原创粉丝点击