363. Bengali.AI Handwritten Grapheme Classification | bengaliai-cv19
感谢 Bengali.ai 和 Kaggle 举办了这场有趣的比赛,因为它不仅仅是简单的计算机视觉模型集成。感谢 pytorch、pytorch-lightning、apex 和 pytorchcv 的作者和贡献者,让我的生活更轻松。
致谢 & 关于 Grandmaster 的笔记
我很荣幸终于成为了竞赛 Grandmaster。在过去的两年里,我学到了大量的技巧,如果没有大家慷慨分享的顶级解决方案以及我一路上有幸遇到的才华横溢的队友,这一切都不可能实现。
我的解决方案是同一个模型(seresnext50 配合自定义头)的简单 bagging(不同的随机种子)。LB 分数的大幅提升来自于对辅音变音目标的重新设计。LB 的微小提升来自于后处理调整,如阈值处理和寻找最接近的训练样本。
我没有调整图像大小,我唯一做的是用每张图像的均值和标准差对其进行归一化,因为我在之前的比赛中体验到了这种做法带来的良好正则化效果。
骨干网络
我使用了一个普通的 seresnext50,但调整了第一层以替换图像缩放并适应单通道输入。我通过更改输入单元并将步幅从 (2,2) 减小到 (1,2) 来实现这一点。
from pytorchcv.model_provider import get_model as ptcv_get_model
backbone = ptcv_get_model('seresnext50_32x4d', pretrained=True)
backbone = backbone.features
backbone.init_block.conv = nn.Conv2d(1, 64, kernel_size=(7, 7), stride=(1, 2))
颈部网络
与 maciejsypetkowski 的解决方案相同 https://www.kaggle.com/c/recursion-cellular-image-classification/discussion/110543
头部网络
所以我使用的整体架构如下所示:

训练
损失函数
现在谈谈我解决方案的关键方面。我意识到所有模型在辅音变音 3(下文缩写为 cons3)上的表现都很差,尤其是容易将其与 cons4 混淆。所谓“差”,我是指决定性的差:召回率仅为 89%,而其他辅音类别为 99%。起初,我只是在治标不治本,就像其他几个团队所做的那样,例如,将低置信度的预测从高频类 cons4 转移到低频类 cons3,从而利用宏召回率指标的定义,这带来了不错的 LB 提升(0.9900 ->