1. solver中的参数
net: "models/bvlc_alexnet/train_val.prototxt"
test_iter: 1000 # 与batch_size结合起来
test_interval: 1000 # 每1000次进行一次测试
base_lr: 0.01 # 开始的学习率
lr_policy: "step" # 学习率的drop是以gamma在每一次迭代中
gamma: 0.1
stepsize: 100000 # 每stepsize的迭代降低学习率:乘以gamma
display: 20 # 没display次打印显示loss
max_iter: 450000 # train 最大迭代max_iter
momentum: 0.9 #
weight_decay: 0.0005 #
snapshot: 10000 # 每迭代snapshot次,保存一次快照
snapshot_prefix: "models/bvlc_reference_caffenet/caffenet_train" #快照保存地址
solver_mode: CPU # 使用的模式是CPU
其中重要的几个参数:
-
test_iter*batch_size=数据集的大小(epoch),执行完一次全部数据,称为一个epoch
-
base_lr
lr_policy
gamma
stepsize
这几个参数结合一起理解base_lr初始学习率,一般在0.01~0.001之间
lr_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)))
-
momentum:0.9
上一次梯度更新的权重
-
weight_decay:0.005
正则项,权重衰减,防止过拟合
-
type:SGD
优化算法选择
到目前为止,caffe总共提供了六种优化方法:- Stochastic Gradient Descent (type: “SGD”),
- AdaDelta (type: “AdaDelta”),
- Adaptive Gradient (type: “AdaGrad”),
- Adam (type: “Adam”),
- Nesterov’s Accelerated Gradient (type: “Nesterov”) and
- RMSprop (type: “RMSProp”)
train.prototxt
layer { # 数据层
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN # 表明这是在训练阶段才包括进去
}
transform_param { # 对数据进行预处理
mirror: true # 是否做镜像
crop_size: 227 #对图片进行裁剪
# 减去均值文件
mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
}
data_param { # 设定数据的来源
source: "examples/imagenet/ilsvrc12_train_lmdb"
batch_size: 256
backend: LMDB
}
}
-
lr_mult
学习率,但是最终的学习率需要乘以solver.prototxt 配置文件中的 base_lr .如果有两个 lr_mult, 则第一个表示 weight 的学习率,第二个表示 bias 的学习率 一般 bias 的学习率是 weight 学习率的2倍
-
decay_mult
权值衰减,为了避免模型的over-fitting,需要对cost function加入规范项。
wi←wi−η∂E∂wi−ηλwi -
num_output
卷积核(filter)的个数 -
kernel_size
卷积核的大小。如果卷积核的长和宽不等,需要用 kernel_h 和 kernel_w 分别设定
-
stride
卷积核的步长,默认为1。也可以用stride_h和stride_w来设置。 -
pad
扩充边缘,默认为0,不扩充扩充的时候是左右、上下对称的,比如卷积核的大小为5*5,那么pad设置为2, 则四个边缘都扩充2个像素,即宽度和高度都扩充了4个像素,这样卷积运算之后的特征图就不会变小。 也可以通过pad_h和pad_w来分别设定。
-
weight_filler
权值初始化。 默认为“constant”,值全为0.
很多时候我们用”xavier”算法来进行初始化,也可以设置为”gaussian”
weight_filler {
type: "gaussian"
std: 0.01
}
- bias_filler
偏置项的初始化。一般设置为”constant”, 值全为0。
bias_filler {
type: "constant"
value: 0
}
-
bias_term
是否开启偏置项,默认为true, 开启 -
group
分组,默认为1组。如果大于1,我们限制卷积的连接操作在一个子集内。
卷积分组可以减少网络的参数,至于是否还有其他的作用就不清楚了。每个input是需要和每一个kernel都进行连接的,但是由于分组的原因其只是与部分的kernel进行连接的如: 我们根据图像的通道来分组,那么第i个输出分组只能与第i个输入分组进行连接。
-
pool
池化方法,默认为MAX。目前可用的方法有 MAX, AVE, 或 STOCHASTIC -
dropout_ratio
丢弃数据的概率