作者: He XingChen
最后更新: 2026-08-08

数据增强总览

SeisPolarity 提供灵活的数据增强系统,包含多种技术以提高模型鲁棒性并处理不平衡数据集。

基本用法

使用 GenericGenerator

 1from seispolarity import WaveformDataset, GenericGenerator
 2from seispolarity import Demean, Normalize, RandomTimeShift
 3
 4# 加载数据集
 5dataset = WaveformDataset(path="data.hdf5", name="SCSN", preload=False)
 6
 7# 创建带增强的生成器
 8generator = GenericGenerator(dataset)
 9generator.add_augmentations([
10    Demean(),
11    Normalize(amp_norm_type="peak"),
12    RandomTimeShift(max_shift=10)
13])
14
15# 获取 dataloader
16loader = generator.get_dataloader(batch_size=256, num_workers=4)

使用 BalancedPolarityGenerator

用于带极性标签的不平衡数据集:

 1from seispolarity import BalancedPolarityGenerator
 2from seispolarity import Demean, Normalize
 3
 4generator = BalancedPolarityGenerator(
 5    dataset,
 6    strategy="polarity_inversion"  # 或 "min_based"
 7)
 8generator.add_augmentations([
 9    Demean(),
10    Normalize()
11])

可用的增强方法

1. Demean(去均值)

去除波形的均值。

1from seispolarity import Demean
2
3augmentation = Demean()

参数:无

2. Normalize(归一化)

按振幅对波形进行归一化。

 1from seispolarity import Normalize
 2
 3# 按峰值振幅归一化
 4augmentation = Normalize(amp_norm_type="peak")
 5
 6# 按 RMS 归一化
 7augmentation = Normalize(amp_norm_type="rms")
 8
 9# 按最大绝对值归一化
10augmentation = Normalize(amp_norm_type="max")

参数:

  • amp_norm_type:归一化类型(“peak”、“rms”、“max”)

3. RandomTimeShift(随机时间平移)

对波形进行随机时间平移。

1from seispolarity import RandomTimeShift
2
3# 最多平移 10 个采样点
4augmentation = RandomTimeShift(max_shift=10)

参数:

  • max_shift:最大平移采样点数(默认:10)

4. RandomPPickShift(随机 P 波到时平移)

随机移动 P 波相位拾取位置。

1from seispolarity import RandomPPickShift
2
3# 最多平移 5 个采样点
4augmentation = RandomPPickShift(max_shift=5)

参数:

  • max_shift:最大平移采样点数(默认:5)

5. BandpassFilter(带通滤波)

对波形应用带通滤波。

1from seispolarity import BandpassFilter
2
3# 应用 1-20 Hz 带通滤波
4augmentation = BandpassFilter(freqmin=1.0, freqmax=20.0)

参数:

  • freqmin:最小频率(Hz)

  • freqmax:最大频率(Hz)

  • corners:滤波器阶数(默认:4)

  • zerophase:是否使用零相位滤波(默认:True)

6. Detrend(去趋势)

去除波形的线性趋势。

1from seispolarity import Detrend
2
3augmentation = Detrend()

参数:

  • type:去趋势类型(“linear” 或 “constant”)

7. PolarityInversion(极性反转)

随机反转波形极性。

1from seispolarity import PolarityInversion
2
3# 50% 的反转概率
4augmentation = PolarityInversion(p=0.5)

参数:

  • p:极性反转概率(默认:0.5)

8. DifferentialFeatures(差分特征)

从波形计算差分特征。

1from seispolarity import DifferentialFeatures
2
3augmentation = DifferentialFeatures()

参数:无

9. ChangeDtype(数据类型转换)

改变波形的数据类型。

1from seispolarity import ChangeDtype
2
3# 转换为 float32
4augmentation = ChangeDtype(dtype="float32")

参数:

  • dtype:目标数据类型(“float32”、“float64” 等)

10. Stretching(拉伸)

随机拉伸或压缩波形。

1from seispolarity import Stretching
2
3# 最多拉伸 10%
4augmentation = Stretching(max_stretch=0.1)

参数:

  • max_stretch:最大拉伸因子(默认:0.1)

11. DitingMotionLoss

用于 DiTing 基于运动模型的损失函数。

1from seispolarity import DitingMotionLoss
2
3loss_fn = DitingMotionLoss()

平衡采样

极性反转策略

该策略构建一个上、下、未知样本等比例分布的平衡数据集。

1from seispolarity import BalancedPolarityGenerator
2
3generator = BalancedPolarityGenerator(
4    dataset,
5    strategy="polarity_inversion"
6)

工作原理:

  1. 每个 Up 和 Down 样本生成两个样本(原始 + 极性反转)

  2. 补充 Unknown 样本,使其数量与 (Up + Down) 样本总数一致

  3. 结果:均衡分布 - Up = 1/3,Down = 1/3,Unknown = 1/3

该策略推荐用于 Instance 和 Txed 数据集。

基于最小类策略

该策略从少数类中等量采样。

1from seispolarity import BalancedPolarityGenerator
2
3generator = BalancedPolarityGenerator(
4    dataset,
5    strategy="min_based"
6)

工作原理:

  1. 统计每个类别的样本数

  2. 确定最小数量

  3. 从每个类别中等量采样至最小数量

自定义增强

通过继承基类创建自定义增强:

 1from seispolarity.generate.augmentation import BaseAugmentation
 2
 3class CustomAugmentation(BaseAugmentation):
 4    def __call__(self, waveform, label):
 5        # 应用您的自定义变换
 6        augmented_waveform = self._apply_transformation(waveform)
 7        return augmented_waveform, label
 8
 9    def _apply_transformation(self, waveform):
10        # 您的变换逻辑
11        return waveform
12
13# 使用它
14generator = GenericGenerator(dataset)
15generator.add_augmentations([
16    CustomAugmentation()
17])

增强流水线

组合多种增强:

 1from seispolarity import (
 2    Demean,
 3    Normalize,
 4    RandomTimeShift,
 5    BandpassFilter,
 6    PolarityInversion
 7)
 8
 9generator = GenericGenerator(dataset)
10generator.add_augmentations([
11    Demean(),
12    Normalize(amp_norm_type="peak"),
13    BandpassFilter(freqmin=1.0, freqmax=20.0),
14    RandomTimeShift(max_shift=10),
15    PolarityInversion(p=0.5)
16])

数据预处理

标准预处理流水线

 1from seispolarity import (
 2    Demean,
 3    Detrend,
 4    Normalize,
 5    BandpassFilter
 6)
 7
 8generator = GenericGenerator(dataset)
 9generator.add_augmentations([
10    Detrend(type="linear"),
11    Demean(),
12    BandpassFilter(freqmin=1.0, freqmax=20.0),
13    Normalize(amp_norm_type="peak")
14])

训练与验证

 1# 训练:包含数据增强
 2train_generator = GenericGenerator(train_dataset)
 3train_generator.add_augmentations([
 4    Demean(),
 5    Normalize(),
 6    RandomTimeShift(max_shift=10),
 7    PolarityInversion(p=0.5)
 8])
 9
10# 验证:仅基础预处理
11val_generator = GenericGenerator(val_dataset)
12val_generator.add_augmentations([
13    Demean(),
14    Normalize()
15])

可视化

可视化增强后的样本

 1import matplotlib.pyplot as plt
 2import numpy as np
 3
 4# 获取原始和增强后的样本
 5original_waveform, label = dataset[0]
 6augmented_waveform, _ = generator[0]
 7
 8# 绘图
 9fig, axes = plt.subplots(2, 1, figsize=(10, 6))
10axes[0].plot(original_waveform[0])
11axes[0].set_title(f"Original (Label: {label})")
12axes[1].plot(augmented_waveform[0])
13axes[1].set_title("Augmented")
14plt.tight_layout()
15plt.show()

性能建议

  1. 顺序很重要:在其他增强之后应用归一化

  2. 谨慎使用:并非所有增强都适用于所有任务

  3. 验证:始终在未增强的数据上进行验证

  4. 监控损失:留意过度增强的迹象

  5. 数据集规模:小型数据集应使用更多增强

示例:带增强的完整训练

 1from seispolarity import WaveformDataset, GenericGenerator
 2from seispolarity.models import PPNet
 3from seispolarity.training import Trainer, TrainingConfig
 4from seispolarity import (
 5    Demean,
 6    Detrend,
 7    Normalize,
 8    BandpassFilter,
 9    RandomTimeShift,
10    PolarityInversion
11)
12
13# 加载数据集
14dataset = WaveformDataset(path="data.hdf5", name="SCSN")
15
16# 创建带增强的生成器
17generator = GenericGenerator(dataset)
18generator.add_augmentations([
19    Detrend(type="linear"),
20    Demean(),
21    BandpassFilter(freqmin=1.0, freqmax=20.0),
22    Normalize(amp_norm_type="peak"),
23    RandomTimeShift(max_shift=10),
24    PolarityInversion(p=0.3)
25])
26
27# 创建模型和训练器
28model = PPNet(num_fm_classes=3)
29config = TrainingConfig(
30    batch_size=256,
31    epochs=50,
32    learning_rate=1e-4,
33    device="cuda"
34)
35
36trainer = Trainer(model=model, dataset=generator, config=config)
37trainer.train()

详细的 API 文档请参见 API 参考。