神经网络训练中的一些tricks

持续更新。。。

总结一些关于神经网络训练的trick,玄学调参。。。

1.数据

训练数据是最重要的,尽可能的去除那些脏数据可以大幅提升精度,比如那些标注不规范的gt等等,当然这个很费精力

2.网络结构
  • 一般情况下加深或者加宽网络结构都会带来精度的提升,至少不会下降,如果出现下降可以考虑检查网络结构的初始化是否有问题
  • conv,bn,relu是常用的套件,bn可以保证网络较好的收敛,让值不易过大或者过小,如果过小经过relu之后会产生大量的0,影响训练效果。
  • con1*1有着降维的作用,还有点bn的效果,那种modulation的感觉
  • 有时候可以通过使用空洞卷积使得网络在不增加stride的情况下增大感受野,这个如果在pytorch中设置也很简单,比如将torch.nn.Conv2d中的dilation参数设置为2或者其他数字即可,默认值为1

3.初始化

网络层初始化的方法很重要,不然很可能导致网络训练朝着意想不到的方向一去不复返。。

  • 一般卷积层采用kaiming_init,xavier_init,normal_init,不一定哪个好,用的时候可以尝试尝试,有时候采用normal_init效果反而更好
  • 全连接层的初始化一般采用normal_init,即正态分布,注意:这里的方差一定要尽量设置小一点,比如0.01,曾经因为设置为1导致网络一直达不到效果。。。主要是因为经过全连接层之后的特征值一般都很大(正数或者负数的绝对值),不利于训练,而且在经过relu之后又会产生大量的0值

4.预训练模型

加载预训练的模型很重要,

  • 尽量加载大数据集预训练之后的,比如可以加载COCO预训练的模型就不去加载ImageNet的,
  • 加载了预训练模型之后也有很多因素需要考虑,比如需要冻结哪些stage值得研究,加载之后的学习率等参数设置,加载预训练模型之后的学习率可以稍微设置小一点

5.数据集分析
  • 数据增强很重要,一般都会采用翻转,根据我的经验,水平翻转大多数的时候比竖直翻转要好,有时候甚至加入了竖直翻转精度反而降低了。有时候看起来有效的数据增强实验证明确实没有效果的,比如我在做有雾图像的目标检测的时候,尝试去雾操作反而不行,最后好像改变图像的色度,对比度,饱和度效果会稍微好一点,总之就是要多尝试,推荐一个数据增强的常用工具https://blog.csdn.net/breeze_blows/article/details/103236808
  • 训练和测试的时候设置的图像尺寸可以根据实际情况尽可能的大,但是由于显存的限制,导致batchsize过小甚至为1,可以考虑采用crop操作。另外采用多尺度训练与测试一般有效
  • 可以通过分析数据集中gt的宽高比,设置合适的base_anchor的宽高比。
  • 目标检测的话各个类别之间的数目是否均衡,有时候加上了数目少的类别进入训练反而会影响其他类别的精度,可以考虑通过数据增强扩充数目少的类别

6.训练结果
  • 不一定最后一个epoch得到的结果就是最好的,但是最后一个epoch的效果肯定也不差
  • 记录每一次训练模型时候设置的主要参数,便于与后续实验对比,最好用一个excel表格进行记录对比
  • 保证实验结果的可复现性,即同样的参数,数据集训练出来的模型精度应该相差无几,有时候可以通过固定一些随机化种子来保证精度稳定。

7.其他

没事多看看系列:
https://www.zhihu.com/question/25097993
https://www.zhihu.com/question/41631631

猜你喜欢

转载自blog.csdn.net/breeze_blows/article/details/102450345