返回列表

7th place solution summary

339. Recursion Cellular Image Classification | recursion-cellular-image-classification

开始: 2019-06-27 结束: 2019-09-26 药物研发 数据算法赛
第7名方案总结

第7名方案总结

作者: nosound (团队: Double Strand)
比赛: Recursion Cellular Image Classification

感谢 Recursion 和 Kaggle 组织了这场独特而充满挑战的比赛!当我决定参加这场比赛时,数据和组织的质量给我留下了深刻印象,仅这个美丽的网站就给了我很大的动力。GCP 和 TPU 的额度对我来说也是不可或缺的,希望未来能看到更多这样的资源。发现的泄漏被 Kaggle 处理得很顺畅,特别感谢 Sohier Dane。同时感谢 Giulia Savorgnan 报告了第二次泄漏。

我很幸运能和 Yuval 组队参加这次比赛。他的模型得分在很长一段时间内都保持在前列,而我在比赛后期才做出了有意义的贡献。我至今仍无法理解他是如何在这场比赛中投入如此多的精力,既要全职工作,又要准备并在8月底参加 UTMB 171公里超级马拉松。他因伤在50公里后退赛,但在我眼里,这已经是超人类的坚韧程度了。

设置

我所有的模型都是用 pytorch 和 TPU 训练的,并且正好用光了我所有的600美元免费 GCP 额度。我在这篇文章中描述了我的设置。尽管整体训练速度不错,但在 pytorch 中使用 TPU 的体验还是很艰难的。主要问题是训练几个小时后会意外挂起。有时这很烦人,我甚至开始怀疑自己的人生选择。Pytorch/XLA 的工作人员在论坛上试图提供帮助,但目前我认为 Pytorch/XLA 还没有完全准备好用于生产环境(但我仍然很乐意在下一次比赛中获得免费的 TPU!)。

模型

从一开始我就使用 resnet50,没有机会成功尝试其他模型。事后看来,这对本次比赛来说是一个不错的选择。Yuval 使用了其他主干网络,我相信他会在另一篇文章中描述他的工作。

  • Resnet50 主干网络
  • ArcFace (m=0.2, s=30, 512个特征),从训练开始就“按原样”使用,不做调整。这是原始文章中的原始实现。
  • 从原始 512x512 图像中裁剪出 384x384 的图像,带有随机平移、翻转和全角度旋转(albumentations 包)
  • 按实验和通道对图像进行归一化,并带有小的随机化
  • 不使用 well、plate 和 experiment 元信息。
  • 3个折,每个折包含完整的实验
  • 一起训练大约10个 epoch,然后针对每种细胞类型训练单独的模型。
  • 每个 site 被视为一个单独的样本
  • Adam 优化器,学习率递减
  • HUVEC-05 被移除,因为它与 HUVEC 测试实验差异太大
  • HUVEC-18 被移至训练集

除了上述标准结构外,我的模型还有3个特殊功能。我没有做过有无这些功能的严格对比,但我感觉第一个给了我很大的提升,第二个和第三个则带来了一些较小的改进(但确实缺少与常规伪标签的公平对比)。

  1. 使用测试集训练。模型在所有训练、测试和控制图像上一起训练,预测1139个类别(1108 + 31个对照)。对于测试图像,我将其 softmax 输出作为 log-loss 的目标。在这种情况下,可以证明 softmax 之前特征的梯度为零,也就是说,这些样本没有影响。这在直觉上是合理的,我将预测的概率分布作为目标——根据 log-loss,这已经是完美的预测了。但随后我根据我们掌握的丰富结构信息修改了每个样本的目标概率向量——这在本次比赛中是非常独特的。首先,plates 泄漏,除了277个分量外,其他分量都被置零。其次,每组277个样本中每个 sirna 只出现一次。这第二点并不容易强制执行,但作为损失函数中的软约束,效果相当不错。另外一点,验证集数据也在训练集中,带有隐藏的 sirnas,以模拟与测试集相似的环境。还有一点,ArcFace 在这里效果不好,所以对测试/验证样本关闭了它。最后一点,我认为这种方法通常可以被认为是一种动态类型的伪标签。
  2. ArcFace 特征的