返回列表

Current first place solution write-up

377. Flower Classification with TPUs | flower-classification-with-tpus

开始: 2020-02-10 结束: 2020-05-11 计算机视觉 数据算法赛
当前第一名解决方案分享

当前第一名解决方案分享

作者:kvr777
发布时间:2020-05-12

免责声明

我不经常阅读比赛论坛,结果错过了几天前禁止使用外部数据集(我使用的是 @kirillblinov 分享的数据集)的信息。因此,我的解决方案很有可能没有资格获奖(但我请求组织方予以确认)。不过,我有了一些有趣的发现,也许这对其他参赛者来说会很有趣。

首先,我要感谢组织者提供了在这个比赛中测试和评估 TPU 技术的好机会。另外,我要感谢那些做出巨大贡献的参赛者:@hengck23 分享了新颖的想法、实验和外部数据集,@cdeotte 发布了很棒的笔记本并为 TPU 内核适配了数据增强方法,以及 @kirillblinov 处理并分享了外部数据集。

我参加这次比赛的主要目标是了解如何使用免费的 TPU 内核以及免费使用时的限制是什么。我决定使用 tensorflow 而不是 pytorch,特别是因为有一个专门为 TPU 内核适配模型的优秀代码库:https://github.com/tensorflow/tpu/tree/master/models/official。这就是我的计划,以下是我实验的结果。

免费 TPU 内核的技术挑战

  1. 我发现最常见的问题是 “file system scheme [local] is not implement” 错误。你无法在本地驱动器或 google drive 上保存文件(检查点、日志)。相反,输入数据和输出需要使用 google cloud storage (GCS)。主要是因为这个事实,我没有使用 tensorflow github repo 中的模型——它们基于 tf 1.x(efficientnet 模型),而且训练期间需要 GCS 上的磁盘空间来存储临时检查点。
  2. 第二个问题是一些有用的图像处理工具(例如数据增强)从 tensorflow 2.0 核心中移除并放到了 tensorflow-addons (tfa) 中。但是 tfa 在 kaggle kernel TPU 上无法正常工作。这个问题由 @cdeotte 解决了,他提供了兼容 kaggle TPU 内核的主要增强代码。
  3. 第三个问题与 tensorflow 有关:对于每种模型,你必须使用不同的 tf 版本:例如,经典的 resnets 类模型已移植到 tf 2.x,而 efficientnet 模型只能在 tf 1.x 下工作。当我尝试在 tf.compat.v1 模式下使用这些模型(使用付费 GCS)时,收到了多个弃用警告,而且训练结果很差。
  4. 最后一个有趣的问题——一些有用的功能(如混合精度训练)在 TPU 上的 TF 2.1 版本中无法工作。但是它在任何 TF 2.2 版本上都能正常工作。但 TF 2.2 版本不稳定,并提供了一些其他错误(我可以修复)。

最后,我决定使用 tf2 keras。由于未知原因,Keras 允许将检查点保存在本地内核磁盘上,拥有适用于 tf 2.X 的预训练模型,并且它被本次比赛的其他参赛者广泛使用。

解决方案技巧与窍门

  1. 数据。 我使用了由 @hengck23 准备并由 @kirillblinov 改编的外部数据集。我的实验表明 openimage 和 inaturalist 会降低准确性,所以我删除了它们。我使用了 512 和 331 尺寸的图片。此外,通过混合精度训练,我可以对所有模型架构使用大批次(192)。
  2. 预处理。 我尝试了 autoaugment、randaugment(基础是 tf 1.X 的官方 tensorflow 实现,然后为带有 TPU 的 tf 2.X 改编了代码)以及不使用任何增强的训练。我的实验表明,对于大数据集,最好不要使用任何增强。
  3. 模型选择。 我尝试了所有主要的 efficientnet 架构。对我来说最好的是带有 noisy-student 预训练权重的 b5 和 b6 架构(非常感谢 @pavel92)。经典的 resnets(50 和 101)以及 se-resnext 50-101 都不如 efficientnet。
  4. 模型训练。 我尝试了不同的交叉验证策略:5 折训练、训练-验证分割、无验证训练。正如许多参赛者所指出的,无验证训练在公共排行榜上提供更高的分数,我的最终解决方案包括在没有验证部分的情况下训练的模型。我使用了带有 warmup 的指数衰减学习率调度器。
  5. 集成。 由于我决定采用激进的训练策略(无增强、无交叉验证),集成对于避免在私有排行榜上惨败至关重要。我训练了最佳架构(b5、b6、b7)的不同图片尺寸,尝试结合 effnet 和 seresnext 模型。获胜的组合是三个模型:B5-512、B5-331 和 B6-512。该解决方案也在公共 LB 上提供了我的最佳分数。

结果,我想说虽然 TPU 内核有一些限制和小错误,但对于计算能力有限的研究人员来说是一个很好的机会。在大多数计算机视觉比赛中,我使用一台笔记本电脑 GPU(8gb)和 google colab gpu。通常在本地计算一天的模型可以在 TPU 上在一小时或更短的时间内处理完。这项技术是 Kaggle 比赛的一个伟大的平衡器,它也可以促进深度学习