Bengali.AI 总结
Bengali.AI Handwritten Classification
https://www.kaggle.com/c/bengaliai-cv19
比赛内容:孟加拉字符分类
赛题解析
每一个字符由三部分组成:
grapheme root (共168类)
vowel diacritics (共11类)
consonant diacritics (共7类)
比赛任务需要对每一个字符识别的三个元素类别,因此这个比赛的任务是很常见的CNN分类任务,只不过Bengali是三个类别的多类别分类比赛。这个比赛非常有意思,竟然让榜单shake的天翻地覆,过拟合A榜简直不要太简单:
普通模型可以A榜得分0.97~0.99;
A榜得分和本地CV一致,但与B榜不一致;
设想一下一个多类别分类任务,CNN精度竟然可以达到99%的准确率,所以对于绝大部分选手都是过拟合,99%的人都翻车了,随便提交一个baseline都可以达到银牌和铜牌;
为什么会有这么大的变化呢,原因在于训练集中字符标签的空间与测试集的空间是不一样的,也就是说在测试集会出现unseen的样本。
对于类别分布不一致的情况的,会导致CV和B榜成绩不一致,虽然在比赛期间已经有类似的帖子,但我本人并没有注意到:
https://www.kaggle.com/karishmakunder/validation-with-unseen
Solution: 1st Place
https://www.kaggle.com/c/bengaliai-cv19/discussion/135984
第一名思路:CycleGAN ZeroShot solutions,考虑所有类别的组合情况,共14784 (168 * 11 * 8) 种情况,这是首次GAN模型在Kaggle比赛中成功应用;
第一名将数据按照可见和不可见进行了划分:
模型1:Out of Distribution Detection Model
预测图像是Seen class,还是Unseen Class(与训练数据相比):使用模型类别输出的大小确定,如果所有类别的输出概率都很低,则是Unseen;反之则是Seen;
模型2:Seen Class Model
预测图像属于训练数据中Seen class对应的类别;
模型3:Unseen Class Model
分为两步:(1)生成新字符:使用ttf字体文件生成字符图像;(2)字符风格转换:使用CycleGAN将生成的字符在变换为比赛的风格;
第一名的方法非常清晰,通过ttf字体文件生成了unseen的样本,同时利用CycleGAN进行风格转换操作,这些都是认真分析赛题后做的。第一名整体的流程可以参考Model Overview图。
Solution: 2nd Place
https://www.kaggle.com/c/bengaliai-cv19/discussion/135966
Solution: 3rd Place
https://www.kaggle.com/c/bengaliai-cv19/discussion/135982
预训练模型: 使用hflip and vflip扩增3倍数据集;
for seen grapheme and unseen grapheme:
模型1:encoder>gem>bn>fc
模型2 :encoder>avg>bn>dropout>fc
arcface,用来类别距离检测unseen
encoder>avgpool>conv1d>bn
s 32(train), 1.0(test)
m 0.5
训练
seen 字符: 使用3倍数据集进行预训练,然后在原始数据集上进行finetune;
arcface and unseen 字符: 使用arcface在预训练上进行finetune
replace softmax with pc-softmax
loss function: negative log likelihood
SGD with CosineAnnealing
Stochastic Weighted Average
预测
use cosine similarity between train and test embedding feature
threshold: smallest cosine similarity between train and validation embedding feature
Solution: 4th Place
https://www.kaggle.com/c/bengaliai-cv19/discussion/136982
与3th思路类似,也是使用arcface预测unseen类别;使用特征距离来判断预测样本是seen还是unseen,然后分别使用模型分别预测;
Solution: 5th Place
https://www.kaggle.com/c/bengaliai-cv19/discussion/136129
3 heads, for consonant, vowel and root and
auxiliary for grapheme with arccos loss
root loss: CrossEntropy
consonant loss: Multi Binary Crossentropy
vowel loss : CrossEntropy
grapheme loss: ArcCos + CrossEntropy
挖掘consonant diacritic 3/4/6之间的关系,挖掘不同类的分布关系,转换为多个二分类,获得千分点的提升;
Solution: 6th Place
https://www.kaggle.com/c/bengaliai-cv19/discussion/136011
Solution: 7th Place
https://www.kaggle.com/c/bengaliai-cv19/discussion/135960
使用ttf生成47k额外的训练数据;
Solution: 8th Place
https://www.kaggle.com/c/bengaliai-cv19/discussion/135990
使用Arcface检测seen和unseen;
Solution: 10th Place
https://www.kaggle.com/c/bengaliai-cv19/discussion/136815
Solution: 14th Place
https://www.kaggle.com/c/bengaliai-cv19/discussion/136021
Solution: 24th Place
https://www.kaggle.com/c/bengaliai-cv19/discussion/136064
论坛上还有很多比赛总结,非常值得学习~
个人总结
没有免费的午餐:任何B榜得分虽然有一定运气,但还是实力说了算。所以要认真阅读比赛数据,不要有摸奖心思;
数据、模型和损失函数:为了精度,这三者都可以起作用;
评价函数和后处理:也会一定程度影响精度;
虽然这次比赛翻车了,但top选手都有各自的可取之处(让人大开眼界),所以无脑调参不可取,要从具体的数据分析,找到突破点;
也可以看下包佬对此次比赛的总结:
https://zhuanlan.zhihu.com/p/114131221
往期精彩回顾
适合初学者入门人工智能的路线及资料下载机器学习在线手册深度学习在线手册AI基础下载(pdf更新到25集)本站qq群1003271085,加入微信群请回复“加群”获取一折本站知识星球优惠券,请回复“知识星球”喜欢文章,点个在看