caffe程序在运行前需要首先写solver配置文件,solver的主要作用就是交替调用前向(forword)算法和后向(backword)算法来更新参数,是一种迭代的优化算法。
目前caffe中优化算法有:
1.Stochastic Gradient Descent (type: “SGD”),
2.AdaDelta (type: “AdaDelta”),
3.Adaptive Gradient (type: “AdaGrad”),
4.Adam (type: “Adam”),
5.Nesterov’s Accelerated Gradient (type: “Nesterov”)
6.RMSprop (type: “RMSProp”)
在编写Solver文件时,通过设置type类型来选择。
例程minst的Solver文件如下:
# The train/test net protocol buffer definition
net: "examples/mnist/lenet_train_test.prototxt"
# test_iter specifies how many forward passes the test should carry out.
# In the case of MNIST, we have test batch size 100 and 100 test iterations,
# covering the full 10,000 testing images.
test_iter: 100
# Carry out testing every 500 training iterations.
test_interval: 500
# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
# The learning rate policy
lr_policy: "inv"
gamma: 0.0001
power: 0.75
# Display every 100 iterations
display: 100
# The maximum number of iterations
max_iter: 10000
# snapshot intermediate results
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
# solver mode: CPU or GPU
solver_mode: GPU
对其每一步的理解为:
net: "examples/mnist/lenet_train_test.prototxt"
这一步主要为说明对哪个网络需要优化,其网络结构在代码目录中的配置文件proto中。
test_iter: 100
在minst例程中,测试数据为10000,而我们设置每个批次(batch size)的数量为100,故总共需要迭代100次才能够运行完总测试数据。故其为迭代的次数,与batch size一起理解。
test_interval: 500
测试间隔,每训练多少次需要测试一次。
base_lr: 0.01
初始化学习速率。
momentum: 0.9
上一次梯度更新的权值,一般取值在0.5-0.99之间,通常设为0.9,可以让使用SGD的深度学习方法更加稳定以及快速。
weight_decay: 0.0005
损失函数中参数的正则化系数(权重衰减项),防止过拟合(过度复杂)的一个参数。
lr_policy: "inv"
gamma: 0.0001
power: 0.75
lr_policy为学习率在base_lr基础上变化的策略,目前有:
fixed: 保持base_lr不变.
- step: 如果设置为step,则还需要设置一个stepsize, 返回 base_lr * gamma ^ (floor(iter / stepsize)),其中iter表示当前的迭代次数
- exp: 返回base_lr * gamma ^ iter, iter为当前迭代次数
- inv: 如果设置为inv,还需要设置一个power, 返回base_lr * (1 + gamma * iter) ^ (- power)
- multistep: 如果设置为multistep,则还需要设置一个stepvalue。这个参数和step很相似,step是均匀等间隔变化,而multistep则是根据 stepvalue值变化
- poly: 学习率进行多项式误差, 返回 base_lr (1 - iter/max_iter) ^ (power)
- sigmoid: 学习率进行sigmod衰减,返回 base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))
display: 100
每测试100次显示一次。
max_iter: 10000
总共迭代的次数即总测试数据。
snapshot: 5000
快照,用于设置训练多少次后进行保存。
snapshot_prefix: "examples/mnist/lenet"
设置保存的路径。
solver_mode: GPU
设置选择GPU还是CPU进行计算。
snapshot_diff
是否保存梯度值,默认为false。
snapshot_format: 0
保存的类型。
debug_info: 0
打印调试的信息。
regularization_type: "L2"
规则化类型支持,与weight_decay一起对损失函数进行约束。