返回列表

3rd place solution

399. Cornell Birdcall Identification | birdsong-recognition

开始: 2020-06-15 结束: 2020-09-15 环境监测 数据算法赛
第3名解决方案

第3名解决方案

作者:Theo Viel | 排名:第3名

非常高兴能以第3名的成绩结束我的 Kaggle 特级大师 之旅,祝贺我的队友以及所有坚持到最后的人!

我们的解决方案主要有三个方面:数据增强、建模和后处理。

数据增强

数据增强是减少训练集和测试集之间差异的关键。我们首先随机裁剪 5 秒的音频,然后添加激进噪声增强:

  • 高斯噪声

信噪比高达 0.5。

  • 背景噪声

我们从这里提供的背景数据集中随机选择样本的 5 秒作为背景噪声。该数据集包含来自比赛数据的示例测试音频中没有鸟叫声的样本,以及从 Freesound 鸟类检测挑战赛中手动挑选的一些样本。

  • 改进的 Mixup

Mixup 创建了一个批次 x1 和其打乱版本 x2 的组合:x = a * x1 + (1 - a) * x2,其中 a 是通过 Beta 分布采样的。
然后,我们不使用 Mixup 的经典目标函数,而是将与 x 关联的目标定义为原始目标的并集。
这迫使模型正确预测两个标签。
Mixup 以 0.5 的概率应用,我使用 5 作为 Beta 分布的参数,这迫使 a 接近 0.5。

  • 改进的裁剪

除了随机选择裁剪区域外,还使用了基于包外置信度的裁剪方法。时间 t 处的置信度是在从 t 开始的 5 秒裁剪上预测的真实类别的概率。

建模

我们在最终融合中使用了 4 个模型:

  • resnext50 [Public LB 0.606 -> Private LB 0.675] - 使用额外的音频录音进行训练。
  • resnext101 [Public LB 0.606 -> Private LB 0.661] - 同样使用额外的音频录音进行训练。
  • resnest50 [Public LB 0.612 -> Private LB 0.641]
  • resnest50 [Public LB 0.617 -> Private LB 0.620] - 使用改进的裁剪方法训练

事实证明,使用更多数据进行训练是关键,而且我们的两个 ResNeSt 模型都在 Public LB 上过拟合了。感谢分享数据集的人们!

模型训练了 40 个 epoch(如果使用外部数据则为 30 个 epoch),使用线性调度器,预热比例为 0.05。对于小型模型,学习率为 0.001,批次大小为 64;对于 resnext101,这两个参数都除以了 2,以便在单张 2080Ti 显卡上运行。

我们没有可靠的验证策略,使用了分层 5 折交叉验证,预测是在验证音频的前 5 秒进行的。

后处理

我们使用 0.5 作为阈值 T

  • 第一步是将低于 T 的预测值置零
  • 然后,我们聚合预测结果
    • 对于站点 1 和 2,给定窗口的预测值与其两个相邻窗口的预测值相加。
    • 对于站点 3,我们使用最大值进行聚合
  • 保留概率高于 Tn 个最可能的鸟类
    • 对于站点 1 和 2,n = 3
    • 对于站点 3,n 根据音频长度选择。

代码

所有内容均已完全公开:

  • 推理:https://www.kaggle.com/theoviel/inference-theo?scriptVersionId=42527667
  • Kaggle 内核训练:https://www.kaggle.com/theoviel/training-theo-3(代码有点乱,但可以直接
同比赛其他方案