363. Bengali.AI Handwritten Grapheme Classification | bengaliai-cv19
感谢 Kaggle 和 Bengali.ai 举办了这场比赛。祝贺所有的获奖者以及所有让讨论区保持活跃和鼓舞人心的参与者,特别感谢 @haqishen, @pestipeti, @hengck23, @ildoonet, @bibek777, @machinelp 提供了充满想法的有趣讨论。特别感谢 @iafoss 提供的入门 notebook,以及 @drhabib 发布的以往比赛解决方案的详细代码,我对此非常依赖。
这是我在 Kaggle 两年来的第一枚比赛奖牌。公开排行榜的成绩来自单个模型。由于缺乏硬件资源,我的大部分代码都是在 Kaggle Kernels 上训练的(这就是为什么我称之为“经济实惠”的方法 ;p)。
我将图像调整为 240x240x1 并进行了零填充。使用了简单的增强方法,如 crop_resize(裁剪调整大小)、image_wrapping(图像包裹)、rotations(旋转)和 image_lightening(图像增亮)。
我尝试了 5折交叉验证 (5 fold CV),而在提交的 notebook 中,我对数据集进行了 80-20 的划分。
我尝试了讨论区分享的大部分想法,使用 EfficientNet-B1 作为模型主干(取自 EfficientNet Pytorch),并根据 @iafoss 的入门 kernel 进行了一些修改。由于 Kaggle kernel 的运行时间限制在 32000 秒,EfficientNet-B3 及更大的模型计算成本过高,无法在有限时间内得到充分训练。
虽然 MixUp 和 Cutmix 数据增强看起来很有前景,但对我来说没有带来实质性的提升。它们需要更多的训练轮次,这在我的情况下是完全不可行的。
根据以往比赛讨论的建议,维护实验日志文件是有帮助的。我简单地创建了实验日志,但在选择最终提交方案时,它反而让我感到困惑,而不是有所帮助。
比赛初期,硬件的缺乏对我来说是一个重大打击,公开排行榜没有进步也让人气馁。那些没有提交任何结果而被浪费的时间本可以被更关键地利用。我计算了每一个轮次的时间,然后用 32000 秒除以它,以便让模型训练更长的时间。我使用了半精度,并且不得不将代码中的 Mish 激活函数 替换为 ReLU 以加快计算速度(这给了我几乎额外一个轮次的时间)。