Baseline总结经过数据准备、数据增强、模型构建、模型验证和迭代4个阶段,基本得到了一个相当不错的模型。使用改进后的模型得到测试结果,去网站提交,结果只有0.625准确率。发现在测试集上的效果与在验证集上的效果有很大的不同。很容易认为测试集和验证集的分布不会有差异。如果是,有没有办法解决这种差异。现在的问题是如何提高网络的泛化性能。加入一些tricks后,训练集的准确率可以达到99%,但是验证集的准确率基本稳定在71%左右,无法进一步提升。当模型无法进一步改进时,你应该回到数据本身,可以检查错误分类的样本并对其进行一些统计。对数据做了一些改进。对于传统的图像分类网络,输入图像的大小对网络的最终结果影响不大。在这个任务中,需要同时对图片中的所有数字进行分类,并强制网络的输出识别出对应的数字。所以实际上,网络需要自动学习哪个位置对应哪个字符。因此,分类网络实际上是强位置敏感的。为了尝试解决这个问题,我在YOLOV3中使用了一个技巧,每10个epoch改变一次图像的大小。这里,我只改变了图片的宽度(因为文字主要是水平分布的)。重新训练了resnet18和mobilenetv2。模型集成介绍模型集成是提高分数的有效方式,主要包括bagging、stacking和boosting。Bagging:这种方法通常考虑同质弱学习器,并行学习这些弱学习器,并按照某种确定性的平均过程将它们组合起来。Boosting,这种方法通常考虑同质弱学习器。它以高度自适应的方式顺序学习这些弱学习器(每个基础模型都依赖于先前的模型),并根据某种确定性策略将它们组合起来。Stacking,这种方法通常考虑异构弱学习器,并行学习它们,通过训练一个“元模型”将它们组合起来,根据不同弱模型的预测结果输出最终的预测结果。视觉任务中常用的集成方法Dropout也称为dropout方法,即在训练过程中,随机丢弃一些神经元,相当于每次都训练不同的模型。它也可以看作是一种综合学习方法。SnapShotSnapShot是一种在不增加额外训练成本的情况下获取多个网络模型的方法。它在训练过程中学习率处于最低点时保存网络的权重,最终得到对应于不同局部最小值的网络。快照需要结合学习率循环调整策略。下图展示了学习率余弦衰减策略。snapShot会在每个学习率调整周期结束时进行快照,即保存当前模型权重。上图中学习率的最小值是5e-4,使用在这样的极值(0.1到5e-4,M次)之间波动的学习率调度背后的理论是当有多个局部极值时训练模型小值。不断降低学习率将迫使模型停留在次优的局部最小值。因此,我们使用非常高的学习率来逃避当前的局部最小值,并尝试找到另一个可能更好的局部最小值。最后,为保存的多个模型投票或抵押。TTATTA(测试时间增强)是一种后处理方法。在测试阶段,对每张图片进行n次数据增强,分别得到n个结果,最后投票得到最终的预测结果。其思想与集成学习基本一致,也可以看成是一种集成方法。总结模型只能决定精度的下限,数据才能决定精度的上限。在模型训练之前,我们需要对数据有一定的了解,这可以帮助我们选择合适的模型和合适的参数;当模型的进一步改进遇到瓶颈时,我们仍然需要回到数据本身,分析错误分类的样本,看看是否能发现一些模式。设置随机种子非常重要,我们需要确保可重现的结果。因为网络模型的随机性太大,每次训练都会产生完全不同的模型。图形可视化或者好的日志对我们的结果分析过程有很大的帮助,推荐使用tensorboard。另外,每次保存模型的时候,模型的配置参数也都保存了,尤其是模型迭代了很多次之后,保存的模型很多,他们也不一定清楚。在整定参数的过程中,控制变量尤为重要,一次只改变一个变量。每次调整都可以手动记录或以日志形式保存。在硬件受限的情况下,推荐使用Snapshot和TTA模型整合的方式。最后通过三个训练好的模型进行stacking,达到了0.91的acc。虽然本次比赛的整体难度不高,但想要取得更好的成绩,难度还是很大的。得到这样的结果有点意外。但不管成绩如何,更多的收获可能是在模型迭代过程中对调参和数据理解的一些理解和收获。参考[1]常用模型集成方法介绍:bagging、boosting、stacking
