348. RSNA Intracranial Hemorrhage Detection | rsna-intracranial-hemorrhage-detection
代码更新
代码地址: http://github.com/antorsae/rsna-intracranial-hemorrhage-detection-team-bighead
我们的解决方案由许多相当弱的模型(大多数CV分数在0.07x左右)组成,通过L2堆叠(5折)进行训练,使用了 xgboost 和 catboost,最后通过平均进行集成。
我们总共训练了约50个模型(10种架构/损失函数 * 5折)。
下表总结了每种模型的架构、折数和训练用的GPU:

未高亮显示的架构(前五个)是使用 fastai v1 实现的,取一项研究的3个连续切片(512x512),并将它们输入到带有全连接头的普通架构中,输出 6*3 = 18 个logits。训练进行了15个epoch,使用1-cycle策略。批量大小根据GPU内存使用情况动态分配最大化。我们使用随机旋转和翻转作为数据增强。
损失函数是这3个切片的加权平均值,给予中心切片更高的重要性:
W_LOSS = 0.1
GENERAL_WEIGHTS = FloatTensor([2., 1., 1., 1., 1., 1.])
general_weights_3slices = torch.cat([GENERAL_WEIGHTS * W_LOSS, GENERAL_WEIGHTS, GENERAL_WEIGHTS * W_LOSS])
def weighted_loss(pred:Tensor,targ:Tensor)->Tensor:
return F.binary_cross_entropy_with_logits(pred, targ.float(), general_weights_3slices.to(device=pred.device))
我们决定使用 fastai v2 主要是因为增强操作在GPU上进行,而我们的一些电脑在进行增强时遇到了CPU瓶颈,使用 fastai v2 后不再有这个问题。
红色高亮显示的架构我们按上述方式实现,但有以下区别:
uint8 的范围)。SUBDURAL_WEIGHTS = FloatTensor([.8, .4, .4, .4, .4, 4.])
subdural_weights_3slices = torch.cat([SUBDURAL_WEIGHTS * W_LOSS, SUBDURAL_WEIGHTS, SUBDURAL_WEIGHTS * W_LOSS])
def subdural_loss(pred:Tensor,targ:Tensor)->Tensor:
return F.binary_cross_entropy_with_logits(pred, targ.float(), subdural_weights_3slices.to(device=pred.device))
模型训练完成后,我们使用TTA(测试时增强)运行OOF(袋外)预测,重复10次。我们将这10次TTA预测的均值和标准差作为每种架构的输入,输入到 xgboost 和 catboost 中,包括中心切片和周围切片的数据。
训练了两个L2模型:xgboost 和 catboost,然后简单地进行平均。我们提交了一次仅包含 fastai v1 模型的结果(因为它们完成得更快),另一次则使用了两者。