在每次的网络训练当中,网络配置参数的设置会直接影响到我们训练的速度,精确度等,因此如何设置网络超参数极其重要,本文主要对网络配置文件中的一些参数进行详细解读。以下为网络配置文件solver.prototxt。
train_net: "models/VGGNet/VOC0712/SSD_300x300/train.prototxt"
test_net: "models/VGGNet/VOC0712/SSD_300x300/test.prototxt"
test_iter: 1
test_interval: 10000
base_lr: 0.001
display: 10
max_iter: 120000
lr_policy: "multistep"
gamma: 0.1
momentum: 0.9
weight_decay: 0.0005
snapshot: 80000
snapshot_prefix: "models/VGGNet/VOC0712/SSD_300x300/VGG_VOC0712_SSD_300x300"
solver_mode: GPU
device_id: 0
debug_info: false
snapshot_after_train: true
test_initialization: false
average_loss: 10
stepvalue: 80000
stepvalue: 100000
stepvalue: 120000
iter_size: 1
type: "SGD"
eval_type: "detection"
ap_version: "11point"
上述网络配置文件中,train_net以及test_net表示路径,相对和绝对路径均可。
test_iter表示迭代次数,注意:该参数与test.prototxt文件内的batch_size相关,例如现有10000张测试照片,若batch_size=8,那么test_iter=10000/8,原因是每次向网络中传输8张,那么共需要10000/8轮才将测试集完全覆盖。
test_iterval表示测试间隔,注意:该参数是针对训练过程中的迭代次数而言,例如max_iter=10000,假如test_iterval=1000,相当于每进行1000次训练,网络测试一次,每次测试使用所有测试集来计算Accuacy,结合上面的test_iter来说。比如我们的test_iterval=1000,那么每训练1000次后,往网络里输入测试集,一共10000张测试照片,每次传输8张。
base_lr表示基础学习率,因为是base,就意味着它是一个基数,训练网络中fc层的lr_step可能是2倍的base_lr。
display表示每隔多少次在terminal中显示一次状态。
max_iter表示最大迭代次数,是针对训练数据而言。max_iter * train_batch_zise(train images;设置太小,会不收敛,精确度很低;太大会振荡,浪费时间具体参照test_iter以及test_interval的解释。
lr_policy表示学习率的变化策略,一般有step,mutilstep等等,根据该项的不同,还需要在后面的stepsize进行设置。下面为学习率的变化策略:
- 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))))
gamma是inv类学习率策略的参数。
momentum表示上一次梯度更新在本次梯度更新中所占的权重,主要是用来防止梯度下降过快,出现梯度爆炸等,具体讲解请看公式。
weight_decay表示权重的衰减率,该项是为了防止出现过拟合。
snapshot表示每隔多少次保存当前训练的model.
solver_mode表示选择GPU训练还是CPU训练。
device_id表示设备索引号,从0开始.0,1,2,3
debug_info:true or false,表示是否输出训练日志信息,默认为false
average_loss表示每10次迭代平均一下loss
iter_size:1,读取batchsize_itersize个图像才进行gradient decent,显存不够的同学可以把batchsize减半,建议每次的batchsize为2,4,8,16,32,64.
ap_version:"11point"表示计算Average Precision的方法。VOC2007采用11point方式计算AP。
希望以上对各位同学有所帮助,另外 有关深度学习网络的具体讲解可参照吴恩达深度学习网络课程的笔记:https://blog.csdn.net/weixin_41399111/article/details/82734417