420. Cassava Leaf Disease Classification | cassava-leaf-disease-classification
感谢 Makerere University AI Lab 和 Kaggle 组织了这次比赛。
这是我们的解决方案及代码,我们的方法基于良好的交叉验证(CV)划分策略,以及更好的数据增强、损失函数和优化方法来应对噪声标签问题。
数据集:2019年 + 2020年数据(输入尺寸 512)。
训练阶段:
验证阶段: 我们移除了 RandomResizedCrop,改用 CenterCrop + Resize(使用 cv2.INTER_AREA)。同时也没有使用 Snapmix。我们还应用了 TTA = 5(测试时增强)。
损失函数:我们尝试了 focal cosine loss、bi-tempered loss、SCE loss(当然也包括 label smoothing)。Bi-tempered loss 效果最好,参数设置为 t1 = 0.6, t2 = 1.2, label_smoothing=0.1, num_iters=5(我们参考了这个代码实现 bi-tempered loss)。
优化器:我们尝试了 Adam、Ranger、SAM。SAM 在我们的 CV 上效果最好(比 Adam 高 0.2-0.3%)。然而,它在 Public LB(公开排行榜)上并没有表现出好的结果。最终,我们选择了 Adam。
学习率调度器:我们使用了基于 Yolov5 代码和这篇论文技巧的 LR scheduler,初始 LR = 1e-4 -> 5e-4,lrf = 1e-2。
训练策略:我们在 5 个 epoch 后解冻主干网络。总训练 epoch 为 50。
主干模型:所有预训练模型都是 noisy-student 模型。我们使用 Timm 库尝试了 B0(作为基准)、B3、B4 和 resnext50。由于资源有限(最多 2x2080Ti 和 Colab Pro),在 CV 上 B4 的效果没能超过 B3。此外,我们也花了不少时间用 ViT 做实验,但没能取得任何突破。
一些技巧:我们在 yolov5 上应用了 EMA(指数移动平均)并开启了 fp16。使用 fp16 帮助我们节省了大量时间和计算资源。
听起来很简单。我们分别将 2020 年和 2019 年的数据划分为 5 折。在每次试验后,我们将 CV 表现最好和最差的折进行混合并重新划分,直到 CV 的差距不大于 0.4%(在 Colab Pro 上使用 B0 花了 4-5 天)。这帮助我们在最后的提交中提升了成绩。
以下是我们一些主要的实验结果。