数据增强总览
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)
工作原理:
每个 Up 和 Down 样本生成两个样本(原始 + 极性反转)
补充 Unknown 样本,使其数量与 (Up + Down) 样本总数一致
结果:均衡分布 - 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)
工作原理:
统计每个类别的样本数
确定最小数量
从每个类别中等量采样至最小数量
自定义增强
通过继承基类创建自定义增强:
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()
性能建议
顺序很重要:在其他增强之后应用归一化
谨慎使用:并非所有增强都适用于所有任务
验证:始终在未增强的数据上进行验证
监控损失:留意过度增强的迹象
数据集规模:小型数据集应使用更多增强
示例:带增强的完整训练
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 参考。