379. Herbarium 2020 - FGVC7 | herbarium-2020-fgvc7
首先,我要感谢主办方团队和 Kaggle 举办了如此有趣的比赛,同时也感谢我的队友(@dattran2346、@moewie94)的辛勤工作和贡献。
我们使用了 EfficientNet B3/4/5(Noisy Student 版本),输入为原始图像尺寸(320x320, 380x380, 456x456),以及 Inception V4 和 SEResNeXt50,图像尺寸为 448x448,作为我们的骨干网络。
对于 EfficientNets,我们首先从第 4、5 和 6 块提取特征图,通过单压缩多激励模块(OSME)进行前向传播,然后进行池化并将它们连接成一个“局部”特征向量。接着使用 ArcFace(s=16, m=0.1) 损失 + BNNeck 组合,以“头部”块特征作为输入,帮助我们的模型学习更好的“全局”表示。
该流程通过交叉熵损失(无标签平滑)和熵损失进行端到端的联合训练;在推理时,我们对 3 个分类器的 logits(局部分类器、ArcFace 和 BNNeck)取平均值。
我们采用了类似于第 4 名团队的两阶段训练方法。在第一阶段,仅使用频率最高的前 5000 个类别的样本。在获得良好的模型(以验证集 f1-score 衡量)后,我们使用权重压印技巧为剩余的 27093 个类别初始化分类器权重,然后重新训练整个网络直到收敛。以下是我们的训练配置:
ResizeShorterSide(random.randint(img_size + 32, img_size + 128)), RandomCrop(img_size), RandAugment(num_ops=2, magnitude=random.randint(1, 11)), RandomErasing()我们在此报告了一些未经任何后处理的单模型分数:
我们采用了去年 RSNA 挑战赛中这个 notebook 中的代码和思路,并对其进行了修改,构建了一个简单的 2 层堆叠网络来组合单模型的预测结果。该堆叠集成获得了公榜分数 0.85505 和私榜分数 0.84180。
KERNEL_SIZE = 9
NUM_CHANNELS = 128
class StackingCNN(nn.Module):
def __init__(self, num_models, num_channels=NUM_CHANNELS):
super(StackingCNN, self).__init__()
self.base = nn.Sequential(OrderedDict([
('conv1', nn.Conv2d(1, num_channels,
kernel_size=(