返回列表

24th place solution - Post processing(+0.013 Private LB)

363. Bengali.AI Handwritten Grapheme Classification | bengaliai-cv19

开始: 2019-12-19 结束: 2020-03-16 计算机视觉 数据算法赛
第24名方案 - 后处理 (+0.013 Private LB)

第24名方案 - 后处理 (+0.013 Private LB)

作者:statsu
比赛排名:第24名

首先,我要感谢主办方举办了一场非常有趣的比赛。感谢所有的Kaggler们!通过讨论,我学到了很多东西。

我的方案使用了一个简单的集成模型和后处理来最大化宏召回率(macro recall)。后处理通过向模型输出的logits添加偏置项来实现。如果没有后处理,我就无缘奖牌区了😭。

以下是方案的概览:

推理标签

首先,深度学习模型计算出logits。作为后处理步骤,将最优偏置加到logits上。然后对logits使用argmax推断出估计的标签。

推理流程图

模型

该模型是五个模型的集成。所有训练数据都用于学习。由于我的时间和计算资源有限,我做的交叉验证非常少。

  • 模型 1, 2, 3, 4
    • Seresnext50_32x4d(使用ImageNet预训练模型)
    • 图像大小 128x128
    • 三个线性头(输出分别为 grapheme root logit (168), Vowel diacritic logit (168), Consonant diacritic logit (168))
    • Mish激活函数,Drop block
    • 交叉熵损失
    • AdaBound优化器
    • 针对每个模型更改以下参数
    • Manifold mixup (alpha, layer), ShiftScaleRotate, Cutout
  • 模型 5
    • Seresnext50_32x4d(使用ImageNet预训练模型)
    • 图像大小 137x236
    • 三个线性头(输出分别为 grapheme root logit (168), Vowel diacritic logit (168), Consonant diacritic logit (168))
    • Mish激活函数,Drop block
    • 交叉熵损失
    • AdaBound优化器
    • Manifold mixup (alpha, layer), ShiftScaleRotate, Cutout

后处理偏置的计算

由于模型是使用交叉熵损失训练的,它通常不会最大化宏召回率。因此,我考虑使用一个添加到logit上的偏置来优化宏召回率。最优偏置是使用实数编码遗传算法计算的,过程如下:

搜索最优偏置流程
  • 计算所有训练数据的logit。
  • 使用实数值遗传算法计算偏置以最大化宏召回率。
  • 使用数据增强后的所有训练数据计算logit。
  • 使用实数值遗传算法计算偏置以最大化宏召回率。
  • 将上述偏置取平均值以获得最终偏置。

在估计测试数据时,使用从训练数据计算出的上述偏置。

最优偏置应用

关于实数编码遗传算法的英文文献不多。我认为以下链接对实现有帮助:
https://github.com/statsu1990/Real-coded-genetic-algorithm

CMA-ES与实数编码遗传算法类似,并且有大量的英文文献。因此,您可以尝试CMA-ES。

分数 (Public LB / Private LB)

单模型

  • model1 (无偏置): 0.9689 / 0.9285
  • model2 (无偏置): 0.9680
同比赛其他方案