524. G2Net Detecting Continuous Gravitational Waves | g2net-detecting-continuous-gravitational-waves
感谢主办方和组织者举办了如此具有挑战性的比赛!
我的解决方案基于 CNN。我融合了多种元素,但以下三项尤为重要:
我使用 PyFstat 生成了与测试数据具有相同时间戳范围、频率和振幅的数据。信号数据的信号深度 在 [1, 50] 范围内生成。各类数据的数量如下。
| 数据类型 | 数据数量 |
|---|---|
| 间隙噪声 | 3000 |
| 非平稳噪声 | 2983 |
| 信号 | 5400 |
通过对 H1 和 L1 分别执行以下处理,我创建了形状为 (C,H,W) = (2, 360, 127) 的图像。
sklearn.preprocessing.RobustScaler 对 H1 和 L1 的振幅平方进行归一化。
sklearn.preprocessing.RobustScaler,它对异常值具有鲁棒性。这是一个预测目标值和频率的多输出模型。
nn.BCEWithLogitsLossnn.CrossEntropyLossclass CustomModel(nn.Module):
def __init__(self, pretrained=True):
super().__init__()
self.net = timm.create_model("tf_efficientnet_b5_ap",
pretrained=pretrained,
num_classes=0,
in_chans=2)
# 减小第一层卷积的步幅
modules_iter = iter(self.net.modules())
for module in modules_iter:
if isinstance(module, torch.nn.Conv2d) and tuple(module.stride) == (2, 2):
break
module.stride = (1, 2)
# 目标
self.head1 = nn.Sequential(
nn.Linear(self.net.num_features, 1)
)
# 频率//50: 40-500Hz // 50
freq_div_n = 50
self.head2 = nn.Sequential(
nn.Linear(self.net.num_features, (500 // freq_div_n) - (40 // freq_div_n) + 1)
)
def forward(self, x, labels=None):
feat = self.net(x)
y1 = self.head1(feat)
y2 = self.head2(feat)
return y1[:,0], y2