Skip to content

Files

Failed to load latest commit information.

Latest commit

 Cannot retrieve latest commit at this time.

History

History

Sunspot

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

TianChi-Sunsport

阿里天池太阳黑子分类--赛道一方案分享(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这几个.对于网络的结构并没有进行更改,基本是原生网络.因为发现自己瞎改不如不改.

K折交叉验证

因为训练只需要10个poch左右,即使多个网络多次训练的时间成本并不高,所以还采取了K折交叉验证的方式.训练数据被分成了5折.但要注意每一次分割训练数据都得防止数据泄露(很重要!!!).k折的好处有:能看到验证效果,不至于盲选模型,利用了全部数据,模型泛化能力更强.

训练验证策略

学习率采取指数下降策略,训练12个epoch,每个epoch进行一次验证,保存最好模型.由于数据增强策略的应用,batch不适宜太大,8或者16即可.输入图像尺寸224x224 图像标准化系数(各个通道的均值和方差提前计算得到,这个也蛮重要的,不能一味采取网上常用的在ImageNet或者coco上得到的结果,因为这个数据集是黑白图,和coco等数据集完全不同).

测试时增强策略(TTA)

对于训练数据采取了多种增强手段,但在推理时,可以利用不同的增强手段得到不同的结果,然后各个结果再进行投票

最终结果投票产生

三个模型,每个模型训练5折交叉验证,主要产生15个结果,最后对15个结果进行投票产生最终结果.参见:merge_model.py

总结

因为每四天才能提交一次,而且比赛后半程才匆匆参赛,所以根本来不及测试哪个模型好,那种trick奏效,只能模型融合一把梭!!! 而且最后一周对这个比赛失去了兴致,对于各种细节没有来得及优化,最终结果也差强人意。一些优化方向:加入抗锯齿化(kaggle大佬常用), 高阶数据增强策略(如mixup),针对评分指标的优化(beta类的F1score为王,所以这里是可以操作一番的,只要有耐心还是可以的