返回列表

15th place solution (0.047) --- Close but no Cigar!

348. RSNA Intracranial Hemorrhage Detection | rsna-intracranial-hemorrhage-detection

开始: 2019-09-18 结束: 2019-11-13 医学影像分析 数据算法赛
第15名方案 (0.047) --- 功亏一篑!

第15名方案 (0.047) --- 功亏一篑!

作者:akensert (队长), Neuron Engineer, Nguyen Quan Anh Minh
排名:第15名

我看到许多前10名的选手已经发布了他们的解决方案,但我们仍然想分享我们的方案!

原因之一是我们[最佳]解决方案的起点确实是公共Kernel。感谢我的队友,我们在此基础上增加了 albumentation 的数据增强功能(放在 _read() 中),以及更大的输入尺寸和更多的训练轮数(这些都很显而易见)。学习率调度也做了一些调整,但基本上就是这些!

然后作为“下一阶段”,我们使用了[大约]一打模型进行集成(除了 InceptionV3,还包括 B2-B6、Xception 和 InceptionResnetV2)。ResNe(X)ts 对我们不起作用(或者更确切地说,对我不起作用),所以它们没有包含在这个特定的提交中。

下面是从我们单独训练的模型(分数约为 0.068-0.074)中尽可能榨取性能的方法,这最终让我们在公共 LB 上达到了 0.058。

四个(或三个)层面的平均(群体智慧在起作用!):

我们有 3 个独立的集成:(I) 混合架构(90/10 训练/验证分割),(II) 6折交叉验证 B4,以及 (III) 6折交叉验证 InceptionResNetV2。

对于集成中的每一个:

  • (1). 所有模型的单独预测是每个轮次预测(即快照预测)的加权平均值。权重通过 scipy.optimize.minimize 进行优化,从而为每个模型生成一个预测矩阵(M x N_classes)。
  • (2). 现在每个模型的预测也被平均了(但没有优化权重,因为我们这里没有验证集)。现在我们在公共 LB 上的分数约为 0.065。
  • (3). 每一个可能的验证预测数据点(来自 (1))都被用来训练两个序列模型(2层 LSTM 和 2层 GRU;见图(感谢我的队友 @ratthachat :-))),然后这些模型被用来“修正”/预测测试集的预测结果。目标 Y 是真实标签(N_classes=6),输入是每个 StudyID 切片的预测序列(按 ImagePosition3 从低到高排序),并包含 ImagePosition3 的浮点值(N_slices=60, N_features=6+1)。这一步真正提升了我们的对数损失:我们就这样从 0.065 提升到了 0.059!每个序列模型(RNN)训练了 35 个轮次,并且像 (1) 一样,我们使用 scipy.optimize.minimize 来计算所有 35 个轮次预测的加权平均值(所以再次使用了“平均快照预测方法”;这对我们来说效果非常好)。

循环结束 :-)

Model Architecture Diagram

我们现在有了 3 个集成预测(3 个提交文件),它们被简单平均后提交给了 Kaggle!

总而言之,我们使用了非常标准的模型,配合大量的平均和良好的后处理。

不幸的是(对我们来说),我们没能一路冲进前 10 名,但我们仍然非常感谢这次比赛!你知道的,建立了友谊等等!

另外,大家干得漂亮!:-)

同比赛其他方案