419. Rainforest Connection Species Audio Detection | rfcx-species-audio-detection
感谢组织者、Kaggle 以及所有在这次比赛中分享想法和代码的人。我学到了很多,我相信你们中的许多人也是如此,我想我会分解我的方法,因为我知道许多参赛者找不到使用假阳性标签的方法。我很激动能在比赛中获得我的第一枚金牌(而且是单人金牌),所以这是我至少能做的!
在宏观层面上,我的方法如下:
这逐渐增加了我可以处理的数据量,直到我从每个录音中至少有 2 个帧具有已识别的 TP 和/或 FP。不断增长的数据多样性使后续模型能够更好地泛化。
固定窗口
我使用了一个以 TP/FP 为中心的 5 秒窗口。为了在测试集上进行预测,我使用了步长为 2.5 秒的重叠窗口。这确保了训练集和测试集的输入具有相同的预处理。取所有这些窗口中每个类别的最大值。对于某些提交,我使用了前 3 个预测的平均值,但这似乎没有显著改变 LB 分数。
不可知损失
也许已经存在一个更好的术语,但这是我对以半监督方式同时使用 TP 和 FP 的方法的称呼。我们在未标记数据中面临的问题是,任何频谱图都可能包含多个类别,因此将除给定标签以外的所有目标设置为 0 会惩罚其他类别的真阳性。我们只能确定一个类别存在或不存在,损失需要反映这一点。所以我从损失计算中排除了所有不确定的目标。在目标张量中,TP 为 1,而 FP 为 0。未标记的类别给定为 0.5。然后从损失计算中排除这些值。所以如果我们有 5 个类别(我们有 24 个,但我在这里节省空间),并且这个时间窗口包含类别 0 的 TP 和类别 3 的 FP:
y = torch.Tensor([1., 0.5, 0.5, 0., 0.5])
在损失计算中:
preds = model(inputs)
preds[targets==0.5] = 0
loss = BCEWithLogitsLoss(preds, targets)
loss.backward()
因此,模型对大多数潜在标签是“不可知”的。这允许模型构建不同类别的引导特征表示,而不会无意中被给予假阴性。这种方法给了我明显更好的 LB 分数。
0.5 这个数字是任意的,可以是除 0 或 1 以外的任何值:要点是未标记类别产生的损失总是恒定的。请注意,这种类型的原地操作在执行反向传播时与 nn.Sigmoid 或其功能等效项不兼容,因此您需要通过 torch.nn.BCEWithLogitsLoss() 使用原始 logits。
ResNeSt
我发现 EfficientNet 在这次比赛中表现惊人地差,而我所有最好的分数都来自 ResNeSt 的变体 (https://github.com/zhanghang1989/ResNeSt),论文可在 此处 获取。
对于 3 通道输入,我使用了带有 power 1、power 2 和 delta 函数的 librosa mel 频谱图来捕获时间信息。对于某些模型,我尝试了单一的 power-1 频谱图、delta 和 delta-delta 特征。虽然预处理更快,但我发现对分数没有影响。
我还将其作为编码器整合到了 SED 架构中。这在训练期间显示了非常有希望的指标,虽然遗憾的是我没有时间运行一个完全收敛的例子,但它的包含仍然帮助了我的分数。在未来的比赛中,这可能是一个非常有用的模型。ResNeSt 本身只接受 3 通道输入,并且没有内置函数来提取特征,所以我不得不重新调整它以使其正常工作:如果有人感兴趣,我将很快上传一个包含该模型的脚本。