392. Prostate cANcer graDe Assessment (PANDA) Challenge | prostate-cancer-grade-assessment
首先,感谢组织者 @wouterbulten,据我所知收集这样的数据集并不容易。其次,感谢我的队友 @rvslight、@aksell7、@ruozha001,他们与我一起努力工作。第三,祝贺 @iafoss 获得单人金牌,感谢他分享了令人难以置信的图块(tile)想法,也感谢所有在这次比赛中努力工作的参与者。
我们在排名变动中遭受了挫折,从第3名跌至第20名,但我认为我们的方法相当有趣。我们选定的提交方案在公开集(0.921)和私有集(0.927)上都表现相当不错且平衡,仅使用了4个模型。
首先,我将简要描述我使用简单图块的方法的重要细节,该方法可以生成 0.927 的单模型单折私有分数。我的主要思想是保持简单,应用注意力机制,并使用足够的数据增强以避免过拟合标签噪声。我的纯 PyTorch 代码已在 GitHub 上发布:https://github.com/Shujun-He/PANDA(请参阅 layer1test4maxmeanwuncertainty 文件夹以获取纯 PyTorch 流程,稍后我会清理和更新)。稍后,我将详细介绍我们解决方案中的分割部分。
我们最好的私有分数(未被选中)是通过集成 5 个模型(2 个简单图块模型和 3 个分割图块模型)并使用中值平均(中间 3 个)实现的。最好的简单图块(由 iafoss 的图块函数提供)设置是 36x256x256,任何高于 36 的数字也可以。
自从 iafoss 发布了他的图块想法后,我立即想到使用注意力机制,这样网络就可以学习不同图块的重要性,并根据每个 WSI(全切片图像)的图块集进行预测。这里有时使用完整的 Transformer Encoder 层,有时仅使用 nn.MultiheadAttention + Mish 激活函数。此外,ResNeXt50 在这次比赛中被证明要好得多。
在数学上,每个图块通过主干网络后变成一个特征向量,Transformer Encoder 层仅对这些特征向量集进行操作。这里可以添加 2D 位置编码,但根据我对前列腺癌诊断的阅读,我认为这不重要。这里我们通常使用 model=512 和 nhead=8,与原始 Transformer 论文的默认设置相同。
实际上,我通过在主干网络之上添加多个注意力分类器来使用多任务学习:
class MultiheadAttentionClassifier(nn.Module):
def __init__(self, num_classes, out_features, ninp, nhead, dropout, attention_dropout=0.1):
super(MultiheadAttentionClassifier, self).__init__()
self.attention = nn.MultiheadAttention(ninp, nhead, dropout=attention_dropout)
self.classifier = nn.Linear(ninp*2, num_classes)
self.dropout = nn.Dropout(dropout)
self.mish = Mish()
def forward(self, x):
x = x.permute(1, 0, 2)
x, _ = self.attention(x, x, x)
x = self.mish(x)
x = x.permute(1, 0, 2)
max_x, _ = torch.max(x, dim=1)
x = torch.cat([torch.mean(x, dim=1), max_x], dim=-1)
x = self.dropout(x)
x = self.classifier(x)
return x
这总是比仅使用 ISUP 分级带来更好的 CV 收敛效果,而且 LB(排行榜)总是高于 CV,所以我坚持使用多任务学习。