454. G2Net Gravitational Wave Detection | g2net-gravitational-wave-detection
我们决定分两篇文章发布,以使内容更加聚焦和简洁。
DSP(数字信号处理)部分请参考:https://www.kaggle.com/c/g2net-gravitational-wave-detection/discussion/275507
在最开始,我们尝试了不同的输入:
在应用 20Hz 高通滤波器后,对堆叠通道输入进行一维卷积很快就产生了不错的验证分数。而且做实验也容易得多,因为在单块 GPU 上训练耗时不到 1 小时。模型非常简单,只是一堆 conv-bn-silu 块和最大池化层。对于卷积,我们使用的卷积核大小(按块划分)为 64 -> 32 -> 16 -> 8。
在那个阶段,我们使用的数据增强为:
这种方法通过单个 5 折模型在 Public LB 上获得了 0.877 的分数。
对于没有合成数据的 Conv1D,SGD 优于 AdamW
尽管模型容量很低,但模型很快就过拟合了,通常在 20 个 epoch 之后,大约耗时 30 分钟。
切换到带有权重衰减和 Nesterov 动量的 SGD 将 LB 分数提高到了 0.880。其他优化器如带有任意权重衰减的 AdamW、MadGrad 效果都较差。
当时生成的合成数据集还不够好,我们觉得 1D 模型还有改进空间。
遵循 Inception V3 的方法,我们在每个卷积块中添加了不同的卷积核大小,起始块的卷积核大小为 32、64、128。
这使我们在 LB 上从 0.88 提升到了 0.881。
下一步是尝试更多的卷积核大小,因为从 DSP 理论来看这也是合理的。类似 Inception 的块包含 5 种不同的卷积核(16, 32, 64, 128, 256),这使我们获得了 0.8823 的单模型 LB 分数。
一个小的集成模型将 LB 分数提高到了 0.883。
增加更多的卷积核大小并没有提高 CV/LB 分数。
# Conv1D 模型的主要构建块
class ConcatBlockConv5(nn.Module):
def __init__(self, in_ch, out_ch, k, act=nn.SiLU):
super().__init__()
self.c1 = conv_bn_silu_block(in_ch, out_ch, k, act)
self.c2 = conv_bn_silu_block(in_ch, out_ch, k * 2, act)
self.c3 = conv_bn_silu_block(in_ch, out_ch, k // 2, act)
self.c4 = conv_bn_silu_block(in_ch, out_ch, k // 4, act)
self.c5 = conv_bn_silu_block(in_ch, out_ch, k * 4, act)
self.c6 = conv_bn_silu_block(in_ch * 5 + in_ch, out_ch, 1, act)
def forward(self, x):
x = torch.cat([self.c1(x), self.c2(x), self.c3(x), self.c4(x), self.c5(x), x], dim=1)
x = self.c6(x)
return x
超参数: