仅使用 Kaggle Kernels 获得第 21 名的方案
仅使用 Kaggle Kernels 获得第 21 名的方案
作者:Ahmet Erdem
比赛排名:第 21 名
我要非常感谢 @seesee,他非常慷慨地分享了他的笔记本:https://www.kaggle.com/c/bengaliai-cv19/discussion/134161。我原本不打算参加这次比赛,因为我没有 GPU,但在最后一周,看到这些优秀的内核后,我决定加入。我在这次比赛中只能使用 2x30 TPU 小时。
基线模型在公共排行榜上的得分是 0.9708。在此基础上,我做了以下改进:
- 我知道训练集和验证集的随机划分并不能代表真实测试集的划分方式,但我懒得去改它。我只是记在心里这一点。
- 每个类别对评估指标的贡献是相等的。因此,在取最大值之前,我将预测结果乘以逆类别频率。这在公共排行榜上带来了 0.007 的提升。(验证集上提升了约 0.003)
- 我将主干模型从 Efficientnet B3 改为 B4。这带来了 0.002 的提升。
- 我将数据增强从 mixup 改为 cutmix,使用了这里的实现:https://www.kaggle.com/cdeotte/cutmix-and-mixup-on-gpu-tpu。我只是更新了它,使其以矩形而不是正方形进行切割(并修复了一个小错误,我认为是)。感谢 @cdeotte 提供这个优秀的内核。cutmix 没有提高我的排行榜分数,但提高了本地验证分数。
- 我改变了学习率策略。逐渐降低学习率给了我 0.007 的提升。我本可以利用得更多,但 TPU 运行时间限制为 3 小时。如果我有更高的限制,我可能会进入金牌区。或者恰恰相反,拥有一个欠拟合的模型让我在最终 shake-up 中受益。
- 我在整个数据集上运行模型,而不是 80% 的训练划分。这带来了 0.001 的提升。
- 我融合了最后两次不同种子的运行结果。这给了我 0.001 的提升。
- 考虑到我的划分不具有代表性,并且从乘以逆类别频率中获得的收益比预期的要多,我决定通过 weight = np.power(weight, 1.2) 来进一步利用这一点。这将公共排行榜提高了 0.0006,但似乎对私有集的提升更大。可能是因为私有集中有更多未见过的字形。
所以,仅在一周内使用 Kaggle Kernels 就有可能获得第 21 名。仔细阅读讨论和内核足以获得这个名次左右的位置。对于前 10 名,通常需要更多的创造力。