学习文章:https://www.cnblogs.com/denny402/category/759199.html 特别好
参考文章:https://blog.csdn.net/cham_3/article/details/72141753
利用Caffe进行深度神经网络训练第一步需要搞懂几个重要文件:
1、solver.prototxt文件
2、train_val.prototxt文件
3、train.sh文件
一、solver.prototxt文件
solver这个文件主要存放模型训练所用到的一些超参数:
caffe程序运行必带的一个参数就是solver配置文件。运行代码一般为
caffe train --solver=*_slover.prototxt
在Deep Learning中,往往loss function是非凸的,没有解析解,我们需要通过优化方法来求解。solver的主要作用就是交替调用前向(forward)算法和后向(backward)算法来更新参数,从而最小化loss,实际上就是一种迭代的优化算法。
Solver的流程:
1.设计好需要优化的对象,以及用于学习的训练网络和用于评估的测试网络。(通过调用另外一个配置文件prototxt来进行)
2. 通过forward和backward迭代的进行优化来跟新参数。
3. 定期的评价测试网络。 (可设定多少次训练后,进行一次测试)
4. 在优化过程中显示模型和solver的状态
在每一次的迭代过程中,solver做了这几步工作:
1、调用forward算法来计算最终的输出值,以及对应的loss
2、调用backward算法来计算每层的梯度
3、根据选用的slover方法,利用梯度进行参数更新
4、记录并保存每次迭代的学习率、快照,以及对应的状态。
net: net: "ECO_Lite.prototxt" = 指定待训练模型结构文件,即train_val.prototxt
# testing parameter
test_iteration: 3000 = 指定测试时进行的迭代次数
test_interval: 1000 = 测试间隔,即每隔多少次迭代进行一次测试
test_initialization: false = 指定是否进行初始测试,即模型未进行训练时的测试
# output
display: 20 = 每隔几次迭代显示一次结果
average_loss: 20 =相当于做了一个平滑. 控制台打印训练loss时, 当前loss为最近20个iteration的loss的平均数. 仅仅是为了显示好看, 不影响训练.
snapshot: 1000 = 快照,每隔几次保存一次模型参数
snapshot_prefix: "snapshots/ECO_Lite_kinetics" = 保存模型文件的前缀,可以是路径
debug_info: false = 指定是否打印调试信息,这里有对启用该功能的输出作介绍
#https://blog.csdn.net/cham_3/article/details/67638308
# learning rate
base_lr: 0.001 = 指定基本学习率
lr_policy: "step" = 学习率变更策略
#https://blog.csdn.net/cham_3/article/details/52640668
gamma: 0.1 = 学习率变更策略需要用到的参数
power := 同上
stepsize: 24000 = 学习率变更策略Step的变更步长(固定步长)
stepvalue := 学习率变更策略Multistep的变更步长(可变步长)
max_iter: 60000 = 模型训练的最大迭代次数
iter_size: 3 #在显存不够用时很管用,它产生的效果是forward iter_size次后才backpropogate一次, 相当于将batch_size增大了iter_size倍.
简单来说, real batch_size = batch_size * iter_size.每执行一次solver.step(1), 会执行batch_size * iter_size次forward与1次backward.
https://www.zhihu.com/question/37270367
# parameter of SGD
solver_type: NESTEROV = solver优化策略,即SGD、Adam、AdaGRAD、RMSProp、NESTROVE、ADADELTA等
momentum: 0.9 = 动量,这是优化策略(Adam, SGD, … )用到的参数
momentum2: = 优化策略Adam用到的参数
weight_decay: 0.0005 = 权重衰减率
clip_gradients: 40 = 固定梯度范围
# GPU setting
solver_mode: GPU = 指定训练模式,即GPU/CPU
device_id: = 指定设备号(使用GPU模式),默认为0
richness: 100