第20名方案(我如何在无效的事情上花费了大量时间)
第20名方案(我如何在无效的事情上花费了大量时间)
作者:Jonathan McKinney | 比赛排名:第20名
感谢组织者和这场有趣的基于物理的竞赛。
我对 @junkoda 和 @shunrcn 发布的解决方案(目前为止)的创造力(和简洁性)印象深刻,我相信后面还会有更多精彩内容。
同样感谢 Kaggle 社区成为如此伟大的竞争对手。
解决方案:
训练
- 使用 pyfstat 生成 2 万个带有基于测试数据间隙的信号。
- 真实数据与假数据的比例与测试集中相同(假数据的标准差大致恒定)。
- 所有真实类型的数据均通过从测试数据中采样生成(例如开始时间、持续时间、随时间变化的标准差)。
- 将高斯随机复数噪声添加到复数信号中,并将直接实数噪声添加到幅度中。
- 忽略 h0,仅根据信号与噪声的总功率以归一化方式将信号添加到噪声中。信号功率从 360x360 下肉眼勉强可见降低到 10 倍以下。
- 约 20 万个训练样本,Adam 优化器,余弦调度器,batch size = 32*4。
训练与测试
- 将时间数据填充至 5760,将数据进行分箱以使其均匀分布。
- 通过从测试数据中移除所有线性或其他斑点噪声来清洗数据(非常有效且快速)。
- 用周围的噪声水平填充所有数据的间隙。
- 计算绝对值以及 H1 乘以 L1 的复共轭(相当于 FFT 空间中的互校正)。
- 通过 np.mean(类似于 avgpool)降维至 360x360 以帮助降低噪声。
- 归一化。
模型
- tf_efficientnet_b5_ns,20-30 轮,5 折交叉验证。
- 无数据增强。
- Mixup(这是避免过拟合所必需的,其他人也是这样看的吗?)
- 对各种种子进行 TTA(测试时增强)以填充间隙之间的噪声(担心模型会对噪声簇过拟合)。
- 融合了最佳单模型、该最佳模型的 15 个 5 折 TTA 以及大内核模型。
- 令人欣慰的是,CV 分数与公开分数非常吻合。
我错误地认为没有帮助的事情
- 按时间点归一化。我太快地否定了它,认为信号的强度会变化,这会让事情变得更难。我那样想完全错了。感谢 @ren4yu。
失败或没有帮助的事情:
- 将其视为功率分数的回归问题(没有帮助)。
- replknet 大内核模型(没有帮助)。
- 更大的图像尺寸,360x720 和 360x1440(没有帮助)。
- 去噪 VAE,给定噪声+信号,以信号为目标(完全无法学习,即使在低分辨率下)。
- Stable Diffusion(他们训练的 VAE 在我们的噪声水平下完全失效)。
- resnet18(对我来说完全不起作用)。
- mixnet_m(表现还可以)。
- mixnet_l(表现还可以)。
- convmixer_768_32(表现还可以,但很慢)。
- vit_base_patch16_224 和 vit_relpos_small_patch16_224(本以为 ViT 会识别补丁序列,但对我来说完全失败了,可能是使用上有 bug)。
- large_kernel (链接) 但去掉了不需要的 avgpool。尝试了各种内核大小,没什么真正有帮助。模型还行,但比 efficientnet 弱。
- 分别对假数据和真实数据进行训练(结果稍微差一点)。
- 添加噪声作为增强(没有帮助)。
- 类似 BH-BH 案例和其他比赛中使用的 BiLSTM + Conv 方法(isft -> sft 并不完美,即使匹配 pyfstat sft,肉眼可见的信号也很容易在 isft 过程中丢失,因此时间序列方法可能会失败,所以放弃了)。
- 正如 @vslaykovsky 所说,下载真实数据以查找与真实测试数据匹配的片段。我