对于这个卫星图像识别的任务来说,最好的数据增强方法是什么呢?显然是旋转和翻转。具体来说,我们对这个数据集一张图片先进行水平翻转得到两种表示,再配合0度,90度,180度,270度的旋转,可以获得一张图的八种表示。 以人类的先验来看,新的图片与原来的图片是属于同一个分布的,标签也不应该发生任何变化,而对于一个卷积神经网络来说,它又是8张不同的图片。比如下图就是某张图片的八个方向,光看这些我们都没办法判断哪张图是原图,但显然它们拥有相同的标签。 其他的数据增强方法就没那么好用了,我们挑几个分析: 亮度,饱和度,对比度随机变化:在这个比赛的数据集中,官方已经对图片进行了比较好的预处理,亮度、饱和度、对比度的波动都比较小,所以在这些属性上进行数据增强没有什么好处。 随机缩放:还记得我们在Overview和Data部分看到的信息吗?这些图片中的一个像素宽大概对应3.7米,也不应该有太大的波动,所以随机缩放不会有立竿见影的增强效果。 随机裁剪:我们观察到有些图片因为边上出现了一小片云朵,被标注了partly cloudy,如果随机裁剪有可能把这块云朵裁掉,但是label却仍然有partly cloudy,这显然是在引入错误的标注样本,有百害而无一利。同样的例子也出现在别的类别上,说明随机裁剪的方法并不适合这个任务。 一旦做了这些操作,新的图片会扩大原样本的分布,所以这些数据增强也就没有翻转、旋转那么优先。在最后的方案中,我们只用了旋转和翻转。并不是说其他数据增强完全没效果,只是相比旋转和翻转,它们带来的好处没那么直接。 3.9 增强数据集与训练迭代数 按照一般的做法,数据增强的流程是一个Epoch一个Epoch地训练整个训练集,每次对输入的样本进行随机的数据增强,这也是本次比赛大多数队伍的做法。 但是我们却采取了不同的做法,显著缩小了训练一个模型需要的时间,提高了我们在初期的方案迭代速度。首先,我们注意以下两个点: 1. 采用的旋转和90度倍数的翻转,很容易可以遍历完所有八个情况,所以样本量刚好就是扩充八倍;反之,像光照,饱和度,对比度这些状态连续的数据增强,很难提前预计样本量扩充多少倍才合理,所以必须在训练过程中不断地随机增强。 2. 模型如果第二次、第三次见到某个已经学得很好样本,有可能会过拟合到该样本,使验证集Loss反增。 所以我们预先生成了八种方向的样本,把训练集扩充了八倍,再随机打乱,再这些样本都只训练一遍就停止,相当于只跑了一个Epoch(当然这里的一个Epoch的时间等于原来八个Epoch)。 这样做之后就保证每个样本的8种方向都只被模型看过一遍,不给模型过拟合的机会,而且这样在时间上也节省了许多。如果是按正常的随机增强做法,可能你要等到很久之后才能把8个方向都随机到,而在此之前又会让模型多次见到同一样本的同一方向,atv直播,既浪费了时间,又增加了过拟合的风险。 在扩充的增强训练集上使用Adam优化器进行训练,我们观察到模型在过完整个增强训练集就收敛到一个接近最优的水平,然后继续训练下去验证集就会开始收敛或反增,这也支持了我们“只扫一遍”的想法大致是正确的。不过,有队友还是不满足于只扫一遍,于是就有了下面的改进。 3.10 猛降50倍学习率,再过一遍训练集 在Loss收敛的时候降低学习率继续训练,是深度学习一种常见的Trick。像我们上面那样只将训练集过一遍,会导致一些样本只在前期模型还很不稳定的时候被见过,并没有很好地被学习。所以我们也想到用降低学习率的方式,将训练集再过一遍。 一开始我们尝试了常见的做法,即降低10倍学习率,但发现还是会很快过拟合,所以就放弃了。直到后来我们队里有人试着将学习率降低50、100倍,可以让模型在过第二遍训练集的时候,既有第二次机会见到以前没学好的样本,又不会因为在已经学得很好的样本上过度训练而导致过拟合,将效果又提升了一截。 后面一直到比赛结束,我们都使用了这套做法,即用初始学习率将训练集过一遍,再降低50倍学习率训练第二遍,总的训练时间相当于原来的2 x 8 = 16个Epoch,相比之下,讨论区里面我们看到其他队伍采取传统的数据增强方法,需要跑上二三十个Epoch。所以这套方法极大地节省了我们模型迭代和方案验证的时间。 所以有的时候不是方法不行,只是你还不够用力。 3.11 测试时数据增强(TTA / Test Time Augmentation) 上面我们提到训练时怎么使用数据增强,但是测试时数据增强(TTA)也可以对预测效果进行很大的提升。 (责任编辑:本港台直播) |