396. SIIM-ISIC Melanoma Classification | siim-isic-melanoma-classification
哇,真没想到能获得这个名次。但我非常激动,终于拿到了我的单人金牌,并完成了通往 Grandmaster(特级大师)的旅程。这次我很庆幸能在榜单变动中受益,毕竟之前在 PANDA 比赛中吃了亏。感谢所有的组织者,也祝贺所有其他的获奖者和参与者。
今年,我实现了两个里程碑:1)我从医学院毕业,成为了一名医生;2)我成为了 Kaggle 竞赛 Grandmaster。实际上,我刚作为医生开始实习,每周工作 70-80 小时,所以没有太多时间投入到这场比赛中。关键在于建立一套流程,让我能快速迭代实验,这样我可以在早上开始实验,去上班,回来后再分析结果。长话短说,对于那些刚起步的人,坚持下去。投入时间和精力。不断参赛,阅读获胜者的解决方案,反复学习。
我必须感谢我在之前比赛中的队友 @felipekitamura、@alexandrecc 和 @jamesphoward。我也要感谢 Kaggle 社区,我从参与中学到了很多。
还要特别感谢 @cdeotte 分享的所有见解。我使用了他的三重分层(triple stratified)数据集来划分我的交叉验证数据。
起初,我使用 HOSTKEY 提供的 GTX 1080 Ti GPU 训练模型。我无法让多 GPU 训练正常工作,所以我只能在单张 11GB 1080 Ti 上尝试 8-16 的批次大小。我的 CV 分数不是很高,通常 5 折平均分在 0.92 左右,LB 结果也类似。TPU 内核表现非常好(至少在公共 LB 上),我认为这部分归功于增加了批次大小。那时,我切换到了我的 4x Quadro RTX6000 24GB 设置,以利用更多的 GPU 显存和多 GPU 训练。我的目标是在最大化特定骨干网络图像分辨率的同时达到 64 的批次大小(如果显存不足,我会退而求其次使用 BS 32 配合 2 步梯度累积)。
我尝试了 EfficientNet、SE-ResNeXt 和 ResNeSt 系列的几种骨干网络。我还尝试了 BiT-ResNet(Google 最近发布的)。EfficientNet 在 CV 上表现更好,所以我决定在比赛的剩余时间里坚持使用 EfficientNets。我使用 1080 Ti GPU 来实验不同的骨干网络,保持所有其他超参数不变。有些人问当我切换到更大的 GPU 并增加批次大小/更改图像分辨率时,这是否仍然适用。我确实在更大的 GPU 上简要比较了骨干网络,结果似乎是一致的(EfficientNet > 其他所有)。
我实验了从剪枝过的 EfficientNet-B3 到 EfficientNet-B8 不同大小的骨干网络,使用了 https://github.com/rwightman/pytorch-image-models 的实现。对于较小的骨干网络,我尝试了更高的分辨率(高达 1024 x 1024),而对于 EfficientNet-B8,我降到了 384 x 384。每个骨干网络的图像大小是根据训练时能使用 64 批次大小(16/GPU)来选择的。我发现高分辨率下较小的 EfficientNets 效果不佳。对我来说最好的模型是 EfficientNet-B6(使用 noisy student 权重初始化)和 EfficientNet-B7,图像分辨率分别为 512 x 512 和 640 x 640,所以我之后只使用了这两个。
我的基础模型是标准的卷积神经网络骨干网络加线性分类头。我使用了带有可训练参数 p 的广义平均池化(我不确定这是否比平均池化或最大池化更好,因为我从一开始就使用了 GeM)。我还按照 @qishenha 在一个获胜的 NLP 解决方案中的实现,使用了多样本 dropout。
我觉得更细粒度的类别会产生更好的特征表示,有助于提高性能。大多数黑色素瘤是深色的(罕见的无色素性黑色素瘤除外),因此将它们与良性痣区分开来可能是最具挑战性的任务。2019 年的数据都有辅助诊断,包括痣,而 2020 年数据的大部分是未知的。
我仅在 2019 年数据上训练了一个模型,使用诊断结果作为目标。然后,我将此模型应用于 2020 年数据。我的主要重点是将未知样本标记为痣或非痣,因为我知道它们不是黑色素瘤。为了找到将图像标记为痣的阈值,我使用了 2019 年模型对已知标签为痣的 2020 年数据预测值的第 5 百分位数。
现在,所有 2019 年和 2020 年的数据