最近需要在他人代码基础上做修改,由于是caffe代码,那么需要花费一段时间来适应,把自己一些调参技巧总结出来,包括网上别人的经验。
Caffe相关超参含义
caffe网络结构的定义和其它平台列如pytorch、tensorflow相似,所以对于从别的平台转过来的我来说,理解caffe中的相关超参能让我快速上手caffe。
- net:网络结构的配置文件
- lr_policy:学习率更新策略
- base_lr:初始学习率
- gamma:学习率降低的倍数
- iter_size:网络参数更新间隔
- stepsize:学习率更新间隔
- average_loss:取最近iters的平均值
- display:打印信息的间隔
- max_iter:最大迭代次数
- momentum:动量值
- weight_decay:权重衰减的正则化参数
- snapshot:模型保存间隔
- snapshot_prefix:模型保存路径及文件名前缀
- solver_mode:GPU或者CPU方式
调参经验
- finetune时,记得固定网络前几层,只训练后面部分(有跨连接层时,记得锁住它的梯度回传),因为网络底层学习的细节信息在很多任务都是通用的,往往发生改变的都是高层需要学习的语义信息,最终整个网络再一起训练。
- finetune时,也可以把网络后面部分学习率增大,前面学习率不变(相比上一种方式效果往往更好)。
- 一般使用高斯分布初始化参数权重(图像处理界中有三个无脑用:xavier,relu,3x3)。
- 网络已收敛,可以学习率乘以0.1继续学习,直到loss不在下降。
- caffe中,use_global_stats==true时,会强制使用模型中存储的BatchNorm层均值和方差参数,而非基于当前batch(随机初始化开始训练用false,加载预训练权重可用true)。
- 常用超参设置,学习率取0.001,weight decay取0.005或者0.0005;momentum取0.9;caffe中一般层卷积lr_mult为1、decay_mult为1,bias为false;输出层的bias为true,bias的lr_mult为2、decay_mult为0;BatchNorm的lr_mult都为0;Scale的lr_mult都为0;Deconvolution的lr_mult、decay_mult都为0。
- caffe中需要固定网络底层所有权重时,在梯度回传需要终止的层里加入参数:propagate_down:0,指不会往下传递梯度信息;假若要固定某一个layer的权重,把此layer的lr_mult置为0,指此layer不更新权重。
- 网络学习的主要内容在底层与高层,少量中间层。
- 验证方案可行性时,可以再验证集上快速训练,查看效果。
- 可以发现在目前很多计算机视觉任务中,网络结构一般都只有三次下采样,采用空洞卷积保持同样感受野,与以前的图片分类任务不同,因为目前很多任务都是pixel级别,需要更多的保留空间信息。
- SGD搭配momentum刚开始快下降,后期震荡下降(隔段时间会出现新的最低loss)且收敛超级慢,但是能收敛到非常好的效果,适用于最终效果(精调SGD,手动调学习率)。
- Adam收敛一直很快,效果也不错,但结果不一定有SGD精调的好,适用于快速验证模型。
- 可以尝试先Adam再SGD的策略,Adam中有三个超参:一阶动量momentum 0.9,二阶动量momentum2 0.999,防零除数delta 1e-8
Finetune经验
需要把ResNet101上的效果效果迁移到ResNet50上去(res4削去后18层,use_global_stats都为true),使用SGD优化,手动调学习率:
- 前三个stage网络层的学习率不变(lr_mult: 1),后两个stage网络层的学习率*10(lr_mult: 10),基础学习率降低10倍(乘以0.1,即由5e-8变成5e-9)。
- 第一阶段:基础学习率5e-9,迭代次数3000
第二阶段:基础学习率5e-10,迭代次数4000
第三阶段:基础学习率5e-11,迭代次数5000 - 统一整个网络层的学习率(lr_mult: 1),基础学习率5e-11,迭代次数5000。