通过了数据准备、数据加强、模型构建以及模型验证和迭代4个阶段,基本上获得了一个还不错的模型。git
使用改进后的模型获得测试结果, 去网站提交,结果只有0.625的准确率。发现测试集上的效果和验证集上的效果差距还挺大的。github
很容易想到的是测试集和验证集会不会存在分布上的差别。若是是, 有没有办法来解决这种差别。网络
如今的问题是如何提升网络的泛化性能。在加了一些tricks以后,训练集的精度已经能够达到99%,但验证集的精度基本上稳定在71%左右,没法再继续提高。当模型无法进一步改进时,就应该回到数据自己,能够检查一下误分类的样本,对其进行一些统计。针对数据进行一些改进。oop
对于常规的图像分类网络,输入的图像尺寸对于网络最终的结果不会有太大的影响。而这个任务中,须要同时对图片中的全部数字进行分类,而且强制网络的输出分别去识别对应相应的数字。那么其实网络须要去自动的学习,哪一个位置对应哪个字符。所以该分类网络实际上是有强烈的位置敏感的。性能
为了尝试解决这个问题,使用了YOLO V3中的一个trick,每10个epoch,改变一次图像大小,在这里,我只改变了图像的宽度(由于文字主要是横向分布的)。从新训练了resnet18和mobilenet v2。学习
模型集成是一种有效的涨分手段,主要包括bagging、stacking和boosting3类。测试
bagging: 该方法一般考虑的是同质弱学习器,相互独立地并行学习这些弱学习器,并按照某种肯定性的平均过程将它们组合起来。网站
boosting,该方法一般考虑的也是同质弱学习器。它以一种高度自适应的方法顺序地学习这些弱学习器(每一个基础模型都依赖于前面的模型),并按照某种肯定性的策略将它们组合起来。spa
stacking,该方法一般考虑的是异质弱学习器,并行地学习它们,并经过训练一个「元模型」将它们组合起来,根据不一样弱模型的预测结果输出一个最终的预测结果。blog
Dropout也叫丢弃法,即在训练过程当中,随机的丢弃一些神经元,至关于每一次都在train不一样的模型。它一样能够看作是一种集成学习方式。
SnapShot是一种不须要增长额外的训练成本就能获取多个网络模型的方式。它经过保存训练过程当中,学习率处于最低点位置时的网络权重,最后会获得对应不一样局部极小值的网络。
snapshot须要结合学习率周期调整策略,下图为学习率余弦衰减策略,snapShot会在每一个学习率调整的周期结束位置,拍快照,也就是保存当前模型权重。
上图中的学习率的最小值为5e-4,使用在这样的极端值(0.1至5e-4,M倍)之间波动的学习速率计划的背后理论是,训练模型时存在多个局部极小值。不断下降学习率会迫使模型停留在低于最佳的局部最小值位置。所以,咱们使用很高的学习率来逃避当前的局部最小值,并尝试找到另外一个可能更好的局部最小值。
最后对保存的多个模型进行voting或者staking。
TTA(test time augmentation)是一种后处理方式,测试阶段,对每张图片进行数据加强n次,分别获得n个结果,最后进行vote获得最终的预测结果。
其思路跟集成学习的思路基本一致,一样能够看作是一种集成方法。
最终经过训练的3个模型进行stacking,达到了0.91的acc。
此次比赛虽然总体难度不大,但想要取得比较好的成绩仍是挺难的,能获得这样的成绩仍是有点意外的。但抛开成绩,收获更多的多是在模型的迭代过程当中,对于调参的一些理解和收获以及对数据的认识。