Caffe 进行模型训练,一般形式为:

#!/usr/bin/env bash
SOLVER=/path/to/solver.prototxt # 
GPUID=0
LOG=/path/to/train.log
TOOLS=/path/to/caffe/build/tools

echo "Starting to train"

$TOOLS/caffe train -solver $SOLVER \
        -weights /path/to/ptrtrained.caffemodel \
        -gpu $GPUID 2>&1 | tee ${LOG}

这里对 solver.prototxt 中的参数配置进行汇总说明. 具体可见 CAFFE_ROOT/src/caffe/proto/caffe.proto.

net: "/path/to/train_val.prototxt"

# test_iter: 每次测试的迭代次数,
# 一般 test_iter*batch_size=所有的 test 样本数.
# 一次测试可以覆盖全部的测试样本.
test_iter: 1000 

# test_interval: 训练时,每迭代 4000 次训练,进行一次测试.
test_interval: 4000

# test_initialization: 训练开始时是否先进行一次测试.
test_initialization: false

# display: 每迭代 40 次训练,在屏幕上打印一次训练日志,如 loss 状态等.
display: 40

# average_loss: 多次训练的 forward 的 loss,求平均值,并在屏幕上打印显示.
# Display the loss averaged over the last average_loss iterations.
# 相当于对 loss 值做了一个平滑. 
# 屏幕打印的当前训练 loss, 实际上是最近 20 次迭代的loss的平均值.不影响训练.
average_loss: 40

# base_lr: 训练的基础学习率 lr,一般在 finetune 时,会设置较小的值.
# 再根据特定的优化算法,对 lr 进行调整.
# lr 过大,训练会难收敛;
# lr 过小,训练收敛速度会比较慢.
base_lr: 0.01

# lr_policy: 学习率 lr 的衰减策略
# lr_policy="fixed" # 训练过程中学习率lr保持不变.
lr_policy: "step" # 与下面几个参数配合使用

# stepsize: 每 stepsize 次迭代,衰减学习率
stepsize: 320000
# gamma: 学习率 lr 衰减因子
gamma: 0.96
# 
momentum: 0.9

# weight_decay: 用于防止过拟合
weight_decay: 0.0002
# regularization_type:正则项,支持 L1 和 L2 正则化. 
# 由 weight_decay 决定.
regularization_type = "L2"

# clip_gradients:设置 clip_gradients>= 0 以对梯度参数进行剪枝,
# 避免参数的真实 L2 参数值太大.
clip_gradients: 60

# max_iter: 训练最大迭代次数,即网络何时停止训练.
# 迭代次数少,可能收敛不了;迭代次数过多,可能过拟合或训练震荡.
max_iter: 10000000

# iter_size: iter_size*batch_size=训练时的实际 batchsize.
# 可以用于解决由于 GPU 显存不足,而导致训练 batchsize 受限的问题,
# 相当于对 batch_size*iter_size 个样本进行 forward 后,才进行一次 backward.
# 在单次 batchsize 受限时,可以做到很大的 batch.
iter_size: 4

# snapshot:每 snapshot 次训练迭代,保存一次模型,相当于训练 checkpoints 保存.
snapshot: 40000
# snapshot_prefix:训练中间模型的保存路径和前缀
snapshot_prefix: "/path/to/caffe_train"
# snapshot_after_train:如果值为 false,则仅在训练完成后才保存一次模型.
snapshot_after_train: true


# type:优化算法
# 支持的有六种:"SGD","AdaDelta","AdaGrad","Adam","Nesterov","RMSProp"
type: "SGD"

# solver_mode:训练在 CPU 还是 CPU 上运行.
solver_mode: GPU
# device_id: 训练在哪个 GPU 上运行,默认为 0.
device_id: 0

# random_seed:如果值为非负数,则采用 Caffe 的随机数生成器进行初始化.用于结果复现.
# 默认,采用 system clock 的种子进行初始化.
random_seed: -1

# debug_info:打印网络的状态信息,有助于调试网路训练. 默认为 false.
debug_info: false

其中,几个参数部分的说明:

[1] - 学习率策略 lr_policy,可选:"step", "multistep","fixed","exp","poly","sigmoid".

[2] - 优化算法type:参见 Caffe - Solver 网络优化方法 - AIUAI

[3] - iter_size:用于显存不够的场景,其作用效果是forward计算 iter_size次迭代后才backpward一次,相当于将batch_size增大了iter_size倍. 简单来说, real batch_size = batch_size * iter_size.
每执行一次solver.step(1), 会执行batch_size * iter_size次forward与1次backward. 参考 caffe SolverParameter中的iter_size参数什么作用? - 知乎

Dtype loss = 0;
for (int i = 0; i < param_.iter_size(); ++i) 
{      
    //前向传播+后向传播      
    loss += net_->ForwardBackward();
}
loss /= param_.iter_size();
...
ApplyUpdate();
// 处理batchsize*itersize张图片后,才调用一次ApplyUpdate函数根据学习率、method(SGD、AdaSGD等)进行梯度下降.
Last modification:March 1st, 2019 at 02:52 pm