339. Recursion Cellular Image Classification | recursion-cellular-image-classification
恭喜所有的获胜者,感谢主办方和Kaggle举办了如此有趣的比赛。非常感谢我的队友,你们是最棒的!
我们所有的模型都使用 512x512x6 的图像进行训练。我们在每个 epoch 为每个样本随机采样一个站点。我们所有的模型都是双头的。
第一个头:分类头,输出层有 1139 个神经元。
第二个头:嵌入层。
验证集的构建。
特定实验(如 U2OS-4)效果不佳。
我们注意到特定的实验类型与其他类型的表现差异很大。我们为模型选择了最难的实验,并以此为基础构建验证集。
逐通道处理:(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 的集成模型。
output = (model(img1) + model(img2) + model(img1.flip(2)) + model(img1.flip(3)) + model(img2.flip(2)) + model(img2.flip(3))) / 6
饥饿实验 重新校准和板 重新校准。