当前第一名解决方案分享
当前第一名解决方案分享
作者:kvr777
发布时间:2020-05-12
免责声明
我不经常阅读比赛论坛,结果错过了几天前禁止使用外部数据集(我使用的是 @kirillblinov 分享的数据集)的信息。因此,我的解决方案很有可能没有资格获奖(但我请求组织方予以确认)。不过,我有了一些有趣的发现,也许这对其他参赛者来说会很有趣。
首先,我要感谢组织者提供了在这个比赛中测试和评估 TPU 技术的好机会。另外,我要感谢那些做出巨大贡献的参赛者:@hengck23 分享了新颖的想法、实验和外部数据集,@cdeotte 发布了很棒的笔记本并为 TPU 内核适配了数据增强方法,以及 @kirillblinov 处理并分享了外部数据集。
我参加这次比赛的主要目标是了解如何使用免费的 TPU 内核以及免费使用时的限制是什么。我决定使用 tensorflow 而不是 pytorch,特别是因为有一个专门为 TPU 内核适配模型的优秀代码库:https://github.com/tensorflow/tpu/tree/master/models/official。这就是我的计划,以下是我实验的结果。
免费 TPU 内核的技术挑战
- 我发现最常见的问题是 “file system scheme [local] is not implement” 错误。你无法在本地驱动器或 google drive 上保存文件(检查点、日志)。相反,输入数据和输出需要使用 google cloud storage (GCS)。主要是因为这个事实,我没有使用 tensorflow github repo 中的模型——它们基于 tf 1.x(efficientnet 模型),而且训练期间需要 GCS 上的磁盘空间来存储临时检查点。
- 第二个问题是一些有用的图像处理工具(例如数据增强)从 tensorflow 2.0 核心中移除并放到了 tensorflow-addons (tfa) 中。但是 tfa 在 kaggle kernel TPU 上无法正常工作。这个问题由 @cdeotte 解决了,他提供了兼容 kaggle TPU 内核的主要增强代码。
- 第三个问题与 tensorflow 有关:对于每种模型,你必须使用不同的 tf 版本:例如,经典的 resnets 类模型已移植到 tf 2.x,而 efficientnet 模型只能在 tf 1.x 下工作。当我尝试在 tf.compat.v1 模式下使用这些模型(使用付费 GCS)时,收到了多个弃用警告,而且训练结果很差。
- 最后一个有趣的问题——一些有用的功能(如混合精度训练)在 TPU 上的 TF 2.1 版本中无法工作。但是它在任何 TF 2.2 版本上都能正常工作。但 TF 2.2 版本不稳定,并提供了一些其他错误(我可以修复)。
最后,我决定使用 tf2 keras。由于未知原因,Keras 允许将检查点保存在本地内核磁盘上,拥有适用于 tf 2.X 的预训练模型,并且它被本次比赛的其他参赛者广泛使用。
解决方案技巧与窍门
- 数据。 我使用了由 @hengck23 准备并由 @kirillblinov 改编的外部数据集。我的实验表明 openimage 和 inaturalist 会降低准确性,所以我删除了它们。我使用了 512 和 331 尺寸的图片。此外,通过混合精度训练,我可以对所有模型架构使用大批次(192)。
- 预处理。 我尝试了 autoaugment、randaugment(基础是 tf 1.X 的官方 tensorflow 实现,然后为带有 TPU 的 tf 2.X 改编了代码)以及不使用任何增强的训练。我的实验表明,对于大数据集,最好不要使用任何增强。
- 模型选择。 我尝试了所有主要的 efficientnet 架构。对我来说最好的是带有 noisy-student 预训练权重的 b5 和 b6 架构(非常感谢 @pavel92)。经典的 resnets(50 和 101)以及 se-resnext 50-101 都不如 efficientnet。
- 模型训练。 我尝试了不同的交叉验证策略:5 折训练、训练-验证分割、无验证训练。正如许多参赛者所指出的,无验证训练在公共排行榜上提供更高的分数,我的最终解决方案包括在没有验证部分的情况下训练的模型。我使用了带有 warmup 的指数衰减学习率调度器。
- 集成。 由于我决定采用激进的训练策略(无增强、无交叉验证),集成对于避免在私有排行榜上惨败至关重要。我训练了最佳架构(b5、b6、b7)的不同图片尺寸,尝试结合 effnet 和 seresnext 模型。获胜的组合是三个模型:B5-512、B5-331 和 B6-512。该解决方案也在公共 LB 上提供了我的最佳分数。
结果,我想说虽然 TPU 内核有一些限制和小错误,但对于计算能力有限的研究人员来说是一个很好的机会。在大多数计算机视觉比赛中,我使用一台笔记本电脑 GPU(8gb)和 google colab gpu。通常在本地计算一天的模型可以在 TPU 上在一小时或更短的时间内处理完。这项技术是 Kaggle 比赛的一个伟大的平衡器,它也可以促进深度学习