阿里天池太阳黑子分类--赛道一方案分享(0.908第十名)
对于原始数据,转换为.jpeg图片存储,这样可以将原始6G的数据压缩到不到600M.同时也方便可视化.原始数据包含黑白两种图,而且是灰度图,也就是只有一个通道.所以为了能够一次性的 用上所有数据,自然而然的想到将两个单通道的图片组合到一起,输入为两个通道,但为了契合xception,resnet等网络的预训练模型,第三个通达最好予以填充.这里考虑使用白图或者黑图填补,当然也可以尝试其它方式的黑白组合,譬如两张图相加,或者两张图片先拼接,再resize等 这部分的代码在dataset.py里面(里面定义了dataloader:包含三个类sunDataset,sunDatasetTest,sunDatasetInfer) sunDataset是训练和验证的数据dataloader,里面实现了黑白图片的读取合并,数据增强等。sunDatasetTest是为进行TTA(测试时增强)的方便而重写的.sunDatasetInfer则是为了方便推理而构建的.
这个十分重要,因为这个数据集很容易过拟合,训练精度很快就到99.9...但验证集精度很难提升,所以缓解过拟合就成为重中之重,本方案的数据增强很多,利用了albumentation库,详情可参见dataset.py里面的增强模块.(其实这也导致了一个问题,训练很慢,性能瓶颈不在gpu反而在cpu和内存)
除了torchvision官方实现的一些经典网络,还尝试了其它众多网络,最终敲定了Xception,MobileNet-v2,SE-resnet50这几个.对于网络的结构并没有进行更改,基本是原生网络.因为发现自己瞎改不如不改.
因为训练只需要10个poch左右,即使多个网络多次训练的时间成本并不高,所以还采取了K折交叉验证的方式.训练数据被分成了5折.但要注意每一次分割训练数据都得防止数据泄露(很重要!!!).k折的好处有:能看到验证效果,不至于盲选模型,利用了全部数据,模型泛化能力更强.
学习率采取指数下降策略,训练12个epoch,每个epoch进行一次验证,保存最好模型.由于数据增强策略的应用,batch不适宜太大,8或者16即可.输入图像尺寸224x224 图像标准化系数(各个通道的均值和方差提前计算得到,这个也蛮重要的,不能一味采取网上常用的在ImageNet或者coco上得到的结果,因为这个数据集是黑白图,和coco等数据集完全不同).
对于训练数据采取了多种增强手段,但在推理时,可以利用不同的增强手段得到不同的结果,然后各个结果再进行投票
三个模型,每个模型训练5折交叉验证,主要产生15个结果,最后对15个结果进行投票产生最终结果.参见:merge_model.py
因为每四天才能提交一次,而且比赛后半程才匆匆参赛,所以根本来不及测试哪个模型好,那种trick奏效,只能模型融合一把梭!!! 而且最后一周对这个比赛失去了兴致,对于各种细节没有来得及优化,最终结果也差强人意。一些优化方向:加入抗锯齿化(kaggle大佬常用), 高阶数据增强策略(如mixup),针对评分指标的优化(beta类的F1score为王,所以这里是可以操作一番的,只要有耐心还是可以的