返回列表

5th place Solution: Pseudo-Labeling + Dig-MNIST training

353. Kannada MNIST | Kannada-MNIST

开始: 2019-09-18 结束: 2019-12-17 计算机视觉 数据算法赛
第5名方案:伪标签 + Dig-MNIST 训练

第5名方案:伪标签 + Dig-MNIST 训练

作者: ccchang | 排名: 第5名

非常感谢 Kaggle 和 @higgstachyon 举办这次比赛,这是一次很棒的学习经历,让我能从其他参赛者那里学到很多知识,祝贺所有的获奖者!

整体方法:

CNN(卷积神经网络)

对我有效的策略:

1. 5折交叉验证,结果取平均(或多数投票)

2. 图像增强:
平移、旋转、剪切和缩放。

3. 带有 Squeeze-and-Excitation Block(SE block)的 CNN
可以在我的 kernel 中找到一些简单的解释。

4. 通用训练技巧
学习率衰减、早停。

5. 对测试数据进行伪标签(最有效)

6. 训练 Dig-MNIST 数据集时的技巧
正如 帖子1帖子2 中所讨论的,你可能会发现如果直接将 Dig-MNIST 数据集添加到训练数据集中,模型的效果会变差。Dig-MNIST 数据集存在一些问题,例如边缘截断效应、非母语用户的书写风格等,这可能会导致原始模型的性能下降。

我的基线模型(仅使用 60k 训练数据训练)在训练集上获得了约 99.8% 的准确率,但在 Dig-MNIST 数据集上只有约 90% 的准确率。虽然很难在那剩余的 10% 图像上很好地泛化,但这也意味着你的模型仍然能够正确预测大部分图像。因此,我通过以下步骤利用 Dig-MNIST 进行训练:

  • (1) 训练一个基线模型(使用 60k 训练数据)。
  • (2) 使用模型对测试图像进行伪标签(现在你有 65k 训练数据)。
  • (3) 使用模型预测 Dig-MNIST 数据集,将分类正确的样本添加到训练集中(比如 9200 张图像,现在你有 74200 张训练数据)。
  • (4) 在新的训练数据集上训练新模型,用新模型替换基线模型。
  • (5) 重复步骤 (2) 到 (4),观察 Dig-MNIST 预测是否有改善。

流程图如下所示:

流程图

伪标签和 Dig-MNIST 数据集训练明显提高了我的 LB 分数:
从 (私有/公开):0.9890/0.9894 提升到了 0.99160/0.99120。

一些实现细节:

  • 优化器:Adam
  • 每折的最大 Epoch:200
  • 初始学习率:1e-3
  • 数据增强(在 PyTorch 中):
    torchvision.transform.RandomAffine(degree=15, translate=(0.25,0.25),scale=(0.7,1.1),shear=8)
  • 模型训练时间:在 PC(RTX 2080+i9-9900KF)上进行一次 5 折交叉验证训练大约需要 4 小时。

对我无效的策略:

1. 更多折数的交叉验证(高达 20 折)

2. 更多的图像增强:
ColorJitter(亮度、对比度...)会使模型变差。此外,你可能需要避免垂直翻转,因为这会导致相似数字(如 6 和 9)的错误分类。

3. 关键子类分类(0 和 1,6 和 9)

4. 在“原生”分类器之后进行分类
为了应对这篇 帖子

同比赛其他方案