调参技巧
转自调参技巧
- 网络能深则深。宽度小时,尽可能加深网络深度,并在加深的过程中增大网络宽度。
- 使用小卷积核。小卷积核有利于网络走向更深,具有更好的识别鲁棒性。
- 前面几层下采样的频率高一点,中间层下采样频率降低,并使用不下采样的方法提高深度。前面几层下采样密度大:微弱精度损失换取速度提升。最终能够下采样的最大深度的层的感受野,由数据集中最大有意义物体的尺寸决定,最大感受野应该覆盖数据集中最大有意义的物体。
越靠前分辨率降低越快,中间一定要加深
- shortcut connection里,如果没有concat,用add。
- 网络最后完全可以使用不采样的空洞卷积来做,尤其是分割。
最后面不要再下采样了,考虑使用aspp来融合不同尺度的感受野
- 转置卷积可用上采样+卷积来替代。
- 先训一个大模型然后裁剪,也许比直接训一个小模型性能好。
- 能用可分离卷积替代的卷积一定要替代,一般除了第一个卷积,都能替代,替代完后考虑给替代可分离的通道数乘以2,因为可分离卷积的参数和计算量都是线性增长的,这样做依然有速度增益。同样的道理适用于2+1分离卷积。
计算量线性增长,可以控制通道数和depth multiplier,代价小
- inception或者shortcut connection或者dense connection其实都相当于ensemble模型,考虑结合使用,shortcut connection的使用几乎是无痛的。
- 感受野也不是越大越好(大感受野意味着更多的语义信息),对于某些low-level的任务而言,比如图像降噪,感受野可能也就局部patch大小,对于low-level而言,下采样的意义更小,尽可能少使用下采样。
- 对于low-level而言,感受野不用太大,具体指去噪,去马赛克,图像增强,和关键点等任务。
- 对于检测,anchor层不一定要有三层,同一层按照需求可以设定的aspect ratio和size都是可选的,比如blazeface把所有anchor集中在一层,这个要按照需求设计。bifpn真的有用。
- batchnorm一定要用,如果你是多机多卡,也可以考虑同步的batchnorm。
- metric learning(图像比对)一般说来是batchsize更大会性能更好,因为这样能采样到的正负样本对的范围更大。
- 如果你的一阶段检测模型得不到好的分类结果,考虑两阶段,先检测再分类。
- 检测模型里的预训练模型是有用的,至少能提升前景背景的检测区分度。
- 如果你的分类精度不够是因为有两类或者多类太相近造成的,考虑使用其他softmax,比如amsoftmax。
各种魔改的softmax能更好的增大类间差距。
- 如果你的分类精度不够是样本不均衡造成的,考虑使用focal loss。
- 不要只看精度,考虑其他metrics,并始终以上线后的可视化效果为最终评判标准。
- 尽可能使用全卷积网络来做landmark,不要直接用fc回归,回归真的不太稳定。
- 一定要做图像亮度变换增强,亮度鲁棒性会更好,但是要结合你的数据的亮度分布自适应的调整。
- 在不改动网络backbone的基础上,多尝试一些新的loss,工程上的代价并不大。