solver配置说明
前面我们介绍了卷积神经网络中主流的数据层,卷积层,全连接层,池化层,激活函数层,归一化层,dropout层,softmax层。分析每一层的配置及意义的目的主要是为了便于设计出适合自己的网络。然后根据自己的任务需要定义合适的损失函数。当搭建出自己的网络并确定网络的损失函数后,下一个关键问题便是训练网络,下面我们将重点集中到训练网络的过程。
caffe
中关于训练网络中最为重要的一个文件便是solver
配置文件。我们首先看一看lenet
中定义的solver
配置文件
1 |
|
设置网络定义文件位置
1 | net: "examples/mnist/lenet_train_test.prototxt" |
设置网络定义文件位置,也可以分别设定train
和test
如下所示:
1 | train_net: "examples/hdf5_classification/logreg_auto_train.prototxt" |
设置测试迭代次数
1 | test_iter: 100 |
这个要与test layer
中的batch_size
结合起来理解。mnist
数据中测试样本总数为10000,一次性执行全部数据效率很低,因此我们将测试数据分成几个批次(batch_num
)来执行,每个批次的数量就是batch_size
。假设我们设置batch_size
为100,则需要迭代100次才能将10000个数据全部执行完。因此test_iter
设置为100。执行完一次全部数据,称之为一个epoch
。
总结
当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一个
epoch
。一般情况下在迭代的过程中需要使用多次epoch
防止模型欠拟合。在不能将数据一次性通过神经网络的时候,就需要将数据集分成几个
batch
(Number of batches,简记为batch_num
)。一个
batch
中的样本总数(Batch Size,简记为batch_size
)Iteration
是batch
需要完成一个epoch
的次数。记住:在一个epoch
中,batch_num
和Iteration
是相等的。比如对于一个有 2000 个训练样本的数据集。将 2000 个样本分成4个大小为 500 的batch_size
,那么完成一个epoch
需要 4 个iteration
,对应的batch_num
也是4。
设置测试间隔
1 | test_interval: 500 |
测试间隔。也就是每训练500次,才进行一次测试。
设置优化算法类型
1 | type: SGD |
常见的优化算法包括:SGD、Adagrad、RMSProp、AdaDelta、Adam等。组织结构如下图:
上图取自SGD算法比较
设置动量系数
1 | momentum :0.9 |
动量系数是设置r的大小
设置权重衰减系数
1 | weight_decay: 0.0005 |
$ w_i = w_i - \eta \frac{\partial L}{\partial w_i} - \eta \lambda w_i$ , $\eta \lambda w_i$为正则化项,weight_decay为正则化项的参数$\lambda $的大小。
设置显示周期
1 | display: 100 |
每训练100次,在屏幕上显示一次。如果设置为0,则不显示。
设置最大迭代次数
1 | max_iter: 20000 |
最大迭代次数,2W次就停止了
设置快照
1 | snapshot: 5000 |
快照。将训练出来的model
和solver
状态进行保存,snapshot
用于设置训练多少次后进行保存,默认为0,不保存。snapshot_prefix
设置保存路径。
还可以设置snapshot_diff
,是否保存梯度值,默认为false
,不保存。
也可以设置snapshot_format
,保存的类型。有两种选择:HDF5
和BINARYPROTO
,默认为BINARYPROTO
设置运行模式
1 | solver_mode: CPU |
设置运行模式。默认为GPU,如果你没有GPU,则需要改成CPU,否则会出错。
设置学习率调整策略
1 | base_lr: 0.01 # base_lr用于设置基础学习率 |
学习率调整的策略还包括
- fixed: 保持base_lr不变.
- step: 如果设置为
step
,则还需要设置一个stepsize
, 学习率为 $base_lr \times gamma ^ {(floor(\frac{iter} {stepsize}))}$,其中iter表示当前的迭代次数 - exp: 学习率为$base_lr \times gamma ^ {iter}$, iter为当前迭代次数
- inv: 如果设置为
inv
,还需要设置一个power
, 最终学习率为$base_lr \times (1 + gamma \times iter) ^ {(- power)}$ - multistep: 如果设置为
multistep
,则还需要设置一个stepvalue
。这个参数和step
很相似,step
是均匀等间隔变化,而multistep则是根据stepvalue
值变化。 - poly: 学习率进行多项式误差, 最终学习率为 $ base_lr \times (1 - \frac{iter}{max_iter}) ^ {power} $
- sigmoid: 学习率进行sigmod衰减,最终学习率为 $ base_lr \times ( \frac{1}{(1 + exp(-gamma \times (iter - stepsize)))})$