1. finetune
finetune的过程相当于继续训练,跟直接训练的区别是初始化的时候:
a.
直接训练是按照网络定义指定的方式初始化(如高斯随机初始化)
b.
finetune是用你已经有的参数文件来初始化(就是之前训练好的caffemodel)
./build/tools/caffe train -solver examples/money_test/fine_tune/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel |
2. 固定层参数
固定某层前参数,在该层加
propagate_down : 0
3.设置sover文件参数
gamma
这个参数表示学习率每次的变化程度,值为实数。
stepsize
这个参数表示什么时候应该进行训练的下一过程,值为正整数。主要用在lr_policy为step的情况。
stepvalue
这个参数表示什么时候应该进行训练的下一过程,值为正整数。主要用在lr_policy为multistep的情况。
max_iter
这个参数表示训练神经网络迭代的最大次数,值为正整数。
momentum
这个参数表示在新的计算中要保留的前面的权重数量,值为真分数,通常设为0.9。
weight_decay
这个参数表示对较大权重的惩罚(正则化)因子。值为真分数。
solver_mode
这个参数用来表示求解神经网络的模式——值为CPU or GPU。
snapshot
这个参数用来表示每迭代多少次就应该保存snapshot的model和solverstate,值为正整数。
snapshot_prefix:
这个参数用来表示保存snapshot时model和solverstate的前缀,值为带引号的字符串。
net:
这个参数表示训练网络所在的位置,值为带引号的字符串。
test_iter
这个参数表示每个test_interval进行多少次test迭代,值为正整数。
test_interval
这个参数表示什么时候进行数据的测试,值为正整数。
display
这个参数用来表示什么时候将输出结果打印到屏幕上,值为正整数,表示迭代次数。
type
这个参数表示训练神经网络采用的反向传播算法,值为带引号的字符串。可选的值有:
Stochastic Gradient Descent “SGD”——随机梯度下降,默认值。
AdaDelta “AdaDelta”——一种”鲁棒的学习率方法“,是基于梯度的优化方法。
Adaptive Gradient “AdaGrad”——自适应梯度方法。
Adam “Adam”——一种基于梯度的优化方法。
Nesterov’s Accelerated Gradient “Nesterov”——Nesterov的加速梯度法,作为凸优化中最理想的方法,其收敛速度非常快。
RMSprop “RMSProp”——一种基于梯度的优化方法。
r_policy 可以设置为下面这些值,相应的学习率的计算为:
- 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))))
note:
batch_size 尽量选8的倍数。
一个epoch的意思就是迭代次数*batch的数目 和训练数据的个数一样,就是一个epoch
一般在finetune时学习率一般设置在1e-5
4.画网络结构图
draw_net.py执行的时候带三个参数:
第1个参数:网络模型的prototxt文件
第2个参数:保存的图片路径及名字
第3个参数:–rankdir=x , x 有四种选项,分别是LR, RL, TB, BT,默认为LR 。用来表示网络的方向,分别是从左到右,从右到左,从上到小,从下到上。
具体步骤:
进入到caffe根目录里的python ,在终端输入:
python draw_net.py 1.prototxt original.png |
5.运行时生成.log文件
在caffe根目录下建立一个bash文件,写入以下:
#!/usr/bin/env sh
set -e
now=$(date +"%Y%m%d_%H%M%S")
/home/hulu/caffe_mul/build/tools/caffe \
train \
--solver=solver.prototxt \
-weights /home/hulu/vgg_face_recognition/ss2/webface_fr_tiny_vgg_iter_250000.caffemodel \
2>&1|tee train_$now.log &
6.画损失曲线图
1)先进入/home/hulu/caffe_mul/tools/extra路径
2)在命令行中运行./plot_training_log.py.example 0 save.png 1.log
7.caffe 数据
Caffe的数据接口主要有原始图像(ImageData), HDF5, LMDB/LevelDB。由于Caffe自带的图像转LMDB接口只支持但label,对于多label的任务,往往需要使用HDF5。
因为我用的输入数据比较多,为了方便起见,修改caffe-master使得ImageData支持多标签。