返回列表

10th place - Pure Magic Solution

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

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

第10名 - Pure Magic 方案

作者: Igor Krashenyi (Grandmaster)
团队成员: Oleg Panichev, Sorceress

恭喜所有的获胜者,感谢主办方和Kaggle举办了如此有趣的比赛。非常感谢我的队友,你们是最棒的!

概览

我们所有的模型都使用 512x512x6 的图像进行训练。我们在每个 epoch 为每个样本随机采样一个站点。我们所有的模型都是双头的。
第一个头:分类头,输出层有 1139 个神经元。
第二个头:嵌入层。

挑战

验证集的构建。
特定实验(如 U2OS-4)效果不佳。

CNN 验证策略

我们注意到特定的实验类型与其他类型的表现差异很大。我们为模型选择了最难的实验,并以此为基础构建验证集。

训练增强

  • 翻转(水平、垂直)
  • 旋转90度 (rot90)
  • 转置
  • 平移 (0.25) 并进行 101 反射填充
  • 任意旋转 (-180, 180)
  • Cutout (32x32, 2个孔)
  • 噪声 (高斯、localvar、泊松、椒盐、斑点)
  • CLAHE (对比度受限的自适应直方图均衡化)
  • Gamma 校正 (0.9, 1.1)

数据预处理

逐通道处理:(img - img.mean()) / (img.std() + 1e-6)

我们注意到,由于使用了大量的数据增强,会出现 true_division 警告。这个警告会导致 BatchNorm 层表现异常,所以我们使用了这个技巧来防止除以零。

模型训练

我们使用 NVidia Apex 和 Pytorch 1.2 在 8x1080ti GPU 服务器上训练了 110 个 epoch。根据模型的不同,训练耗时 1-3 天。

我们没有使用过采样。

由于迭代时间较长,我们没有使用任何 K-Fold 训练。我们本想在比赛快结束时进行训练,但没有足够的时间。

优化器

SGD

学习率调度器

初始学习率 0.1,
5 个 epoch 的预热,
每 40 个 epoch 学习率衰减 0.1 倍。

损失函数

分类使用平滑交叉熵,嵌入使用 Center Loss。

模型

我们的最终模型是在训练数据 + 伪标签上训练的 Senet154。
为了生成伪标签,我们使用了 SeNet154, SeResnext50, SeResnext101, Polynet, EfficientNet-b6, ResNeXt101-wsl 的集成模型。

测试时增强 (TTA)

output = (model(img1) + model(img2) + model(img1.flip(2)) + model(img1.flip(3)) + model(img2.flip(2)) + model(img2.flip(3))) / 6

后处理

饥饿实验 重新校准和板 重新校准。

无效或效果相近的尝试

  • Mix-up, manifold mixup
  • ArcFace
  • Last stride 1
  • Focal Loss
  • XGBoost 集成
  • 基于嵌入距离的度量搜索
  • GeM (Generalized Mean Pooling)
  • 不同的优化器,如 Adam, Radam, Ranger 等。
  • ResNeXt101-wsl 的表现比预期差。
同比赛其他方案