WGAN-GP生成轴承故障振动信号的工程实践

发布时间:2026/11/6 9:06:36
WGAN-GP生成轴承故障振动信号的工程实践 简介本资源是一个基于Wasserstein GANWGAN的1D信号生成项目面向机械故障诊断、智能运维及深度学习信号处理方向的研究者与工程师旨在解决轴承故障数据稀缺问题通过生成高质量振动信号辅助模型训练与算法验证。压缩包共19个文件含2个核心Python脚本train.py、test.py、9张训练过程可视化PNG图、2个MATLAB格式数据集data4train.mat、data_aug.mat、1个README说明文档及TensorFlow模型检查点文件.meta/.index/.data整体22.03MB结构清晰便于复现实验与二次开发。已有3388人学习下载资源提供完整训练流程、可调超参接口学习率、epoch数、采样间隔及多类故障信号选择支持x1–x9附带详细运行说明与环境依赖清单Python 3.5、TensorFlow GPU、NumPy/SciPy是开展时序信号生成研究的实用型开源实践方案。1. 故障信号生成不是“造数据”而是给诊断模型喂出带物理意义的振动波形你手头有一台轴承振动采集设备采回来几百组真实故障信号——但想训练一个鲁棒的智能诊断模型远远不够。标注成本高、故障工况难复现、小样本下模型容易过拟合……这时候GAN-1D 就不是个玩具模型而是一套能生成符合机械振动物理特性的1维时序信号的工程化工具。它不生成“看起来像”的噪声曲线而是用Wasserstein GANWGAN结构约束生成器输出的频谱包络、冲击周期性、衰减趋势等关键特征让合成信号在FFT、包络谱、Hilbert变换后能通过领域专家的“肉眼判据”。项目面向的是工业预测性维护场景下的算法工程师和嵌入式AI部署人员你不需要从零推导WGAN理论只要把实测的正常/内圈/外圈/滚动体故障振动片段.npy或.csv格式丢进去跑通训练脚本就能拿到可直接喂给CNN、LSTM或Transformer诊断模型的增强数据集。整个流程完全基于Python生态无硬件依赖单卡2060即可完成中小规模训练且生成器导出为ONNX后能在边缘端做轻量级信号仿真。2. 技术栈与架构设计为什么选WGAN而不是DCGAN或StyleGAN2.1 核心动机1D信号生成的三大硬约束生成1维振动信号和生成图像有本质区别时序连续性不可破坏图像像素可局部打乱但振动信号中相邻采样点存在强物理耦合生成器输出若出现突变阶跃会导致后续包络解调失败频域特性必须可解释诊断模型常依赖频谱峰值位置如BPFO/BPFI、边带间隔、谐波比等指标生成信号的FFT幅值谱需具备清晰主频合理谐波结构小样本稳定性要求高实际采集的某类故障可能仅3~5组有效样本每组4096点传统GAN易模式坍缩生成结果高度重复。WGAN通过Wasserstein距离替代JS散度梯度更平滑、训练更稳定其带梯度惩罚WGAN-GP的判别器强制满足Lipschitz约束天然抑制高频噪声震荡——这恰好匹配振动信号对“低频主导瞬态冲击”的建模需求。相比之下DCGAN的Sigmoid输出层易导致信号两端截断失真StyleGAN的AdaIN机制在1D序列上缺乏空间语义支撑反而引入无关相位扰动。2.2 整体模块划分与数据流向项目采用标准PyTorch实现目录结构精简但职责明确gan-1d/ ├── data/ # 原始数据存放支持.npy/.csv │ ├── normal/ # 正常轴承振动4096点/样本 │ ├── inner_fault/ # 内圈故障 │ └── outer_fault/ # 外圈故障 ├── models/ # 核心网络定义 │ ├── generator.py # 一维反卷积生成器含LeakyReLUBatchNorm1d │ └── critic.py # WGAN判别器即Critic无Sigmoid全卷积 ├── train.py # 主训练脚本含WGAN-GP梯度惩罚实现 ├── generate.py # 推理脚本支持批量生成保存为.npy ├── utils/ # 工具函数 │ ├── dataset.py # 自定义TensorDataset自动归一化到[-1,1] │ └── plot_utils.py # 时域/频域可视化含包络谱计算 └── configs/ # 配置文件yaml格式 └── default.yaml # batch_size: 64, lr_g: 1e-4, lr_c: 1e-4, n_critic: 5...提示所有网络层均使用nn.Conv1d而非nn.Linear避免全连接层破坏时序局部性生成器最后一层无激活函数配合输入数据归一化至[-1,1]保证输出动态范围可控。2.3 生成器Generator核心实现解析生成器采用5层转置卷积Transpose Conv1D输入为100维标准正态噪声向量z输出长度固定为4096点。关键设计在于上采样步长与核大小的协同# models/generator.py import torch.nn as nn class Generator(nn.Module): def __init__(self, latent_dim100, signal_length4096, ngf64): super().__init__() self.init_length signal_length // (2 ** 5) # 4096 - 128 self.ngf ngf # 先将噪声向量映射为1D特征图 self.linear nn.Sequential( nn.Linear(latent_dim, ngf * 8 * self.init_length), nn.LeakyReLU(0.2, inplaceTrue) ) # 5层反卷积上采样128 → 256 → 512 → 1024 → 2048 → 4096 self.main nn.Sequential( nn.ConvTranspose1d(ngf * 8, ngf * 4, 4, 2, 1, biasFalse), nn.BatchNorm1d(ngf * 4), nn.LeakyReLU(0.2, inplaceTrue), nn.ConvTranspose1d(ngf * 4, ngf * 2, 4, 2, 1, biasFalse), nn.BatchNorm1d(ngf * 2), nn.LeakyReLU(0.2, inplaceTrue), nn.ConvTranspose1d(ngf * 2, ngf, 4, 2, 1, biasFalse), nn.BatchNorm1d(ngf), nn.LeakyReLU(0.2, inplaceTrue), nn.ConvTranspose1d(ngf, ngf // 2, 4, 2, 1, biasFalse), nn.BatchNorm1d(ngf // 2), nn.LeakyReLU(0.2, inplaceTrue), nn.ConvTranspose1d(ngf // 2, 1, 4, 2, 1, biasFalse) # 输出通道1 ) def forward(self, z): x self.linear(z).view(-1, self.ngf * 8, self.init_length) return self.main(x).squeeze(1) # [B, 4096]逻辑说明init_length128是反卷积起点长度由4096/(2^5)确定确保5次×2上采样后精准达到目标长度每层ConvTranspose1d的kernel_size4, stride2, padding1构成标准2倍上采样等效于最近邻插值3×3卷积避免相位偏移BatchNorm1d作用于通道维度ngf*8稳定训练过程防止梯度爆炸最终squeeze(1)移除冗余通道维输出形状为[batch_size, 4096]与真实信号一致。2.4 判别器Critic与WGAN-GP梯度惩罚实现判别器为纯卷积结构无池化层通过步长控制感受野。WGAN-GP的关键在于对判别器施加梯度惩罚Gradient Penalty强制其Lipschitz连续# models/critic.py import torch import torch.nn as nn class Critic(nn.Module): def __init__(self, signal_length4096, ndf64): super().__init__() self.ndf ndf self.main nn.Sequential( # 输入[B, 1, 4096] nn.Conv1d(1, ndf, 4, 2, 1, biasFalse), # 4096→2048 nn.LeakyReLU(0.2, inplaceTrue), nn.Conv1d(ndf, ndf * 2, 4, 2, 1, biasFalse), # 2048→1024 nn.LeakyReLU(0.2, inplaceTrue), nn.Conv1d(ndf * 2, ndf * 4, 4, 2, 1, biasFalse), # 1024→512 nn.LeakyReLU(0.2, inplaceTrue), nn.Conv1d(ndf * 4, ndf * 8, 4, 2, 1, biasFalse), # 512→256 nn.LeakyReLU(0.2, inplaceTrue), nn.Conv1d(ndf * 8, 1, 4, 2, 1, biasFalse) # 256→128 → 输出标量 ) def forward(self, x): return self.main(x).view(-1) # [B] 标量输出 # train.py 中的梯度惩罚计算关键 def gradient_penalty(critic, real_data, fake_data, device): batch_size real_data.size(0) # 生成插值系数 ε ~ Uniform(0,1) alpha torch.rand(batch_size, 1, devicedevice) # 构造插值样本x_hat ε·real (1-ε)·fake x_hat (alpha * real_data (1 - alpha) * fake_data).requires_grad_(True) # 计算判别器对插值样本的输出 pred_hat critic(x_hat) # 对x_hat求梯度 gradients torch.autograd.grad( outputspred_hat, inputsx_hat, grad_outputstorch.ones_like(pred_hat), create_graphTrue, retain_graphTrue, only_inputsTrue )[0] # 计算梯度范数 ||∇_x_hat D(x_hat)||_2 gradients gradients.view(gradients.size(0), -1) gradient_norm torch.sqrt(torch.sum(gradients ** 2, dim1) 1e-12) # 惩罚项λ * (||∇||_2 - 1)^2 penalty ((gradient_norm - 1) ** 2).mean() return penalty参数说明lambda_gp10是WGAN-GP论文推荐值在configs/default.yaml中配置过大导致训练缓慢过小则约束失效gradients.view(...)将梯度展平为[B, 4096]再求L2范数确保每个样本独立计算1e-12是数值稳定项防止开方时出现负数该惩罚项加入判别器总损失loss_c -torch.mean(critic(real)) torch.mean(critic(fake)) lambda_gp * gp。3. 环境准备与端到端运行流程3.1 依赖安装与环境隔离项目依赖极简但版本兼容性需注意。推荐使用conda创建独立环境避免与系统PyTorch冲突# 创建Python3.8环境PyTorch 1.12对1D卷积优化更好 conda create -n gan1d python3.8 conda activate gan1d # 安装PyTorch根据CUDA版本选择此处以11.3为例 pip install torch1.12.1cu113 torchvision0.13.1cu113 -f https://download.pytorch.org/whl/torch_stable.html # 安装其他依赖 pip install numpy matplotlib scikit-learn pyyaml tqdm注意不要用pip install torch默认安装CPU版——WGAN训练在GPU上提速超8倍且ConvTranspose1d在CPU上存在隐式类型转换bug。3.2 数据准备从原始采集到标准化输入真实振动信号常含直流偏置、趋势项、工频干扰。GAN-1D要求输入为去趋势零均值归一化至[-1,1]的纯故障冲击序列。提供utils/preprocess_vibration.py辅助脚本# utils/preprocess_vibration.py import numpy as np from scipy import signal def preprocess_signal(raw_signal: np.ndarray, fs20480, cutoff1000) - np.ndarray: 对原始振动信号进行预处理 # 1. 去除线性趋势消除传感器漂移 detrended signal.detrend(raw_signal, typelinear) # 2. 带通滤波保留1kHz内故障特征频段可根据轴承型号调整 b, a signal.butter(4, [100, cutoff], btypeband, fsfs) filtered signal.filtfilt(b, a, detrended) # 3. 归一化到 [-1, 1] normed filtered / np.max(np.abs(filtered)) return normed # 示例处理单个CSV文件 if __name__ __main__: raw np.loadtxt(raw_data/inner_001.csv, delimiter,) proc preprocess_signal(raw, fs20480, cutoff1500) np.save(data/inner_fault/inner_001.npy, proc[:4096]) # 截取前4096点执行后确保data/inner_fault/下每个.npy文件形状为(4096,)且值域严格在[-1,1]内。可用以下命令快速校验python -c import numpy as np; dnp.load(data/inner_fault/inner_001.npy); print(d.shape, d.min(), d.max()) # 应输出(4096,) -1.0 1.03.3 启动训练参数调优与监控要点训练脚本train.py支持命令行参数覆盖配置文件python train.py \ --data_dir data/inner_fault/ \ --model_dir models/saved/inner_wgan/ \ --config configs/default.yaml \ --device cuda:0 \ --epochs 200 \ --batch_size 64 \ --lr_g 1e-4 \ --lr_c 1e-4 \ --n_critic 5 \ --lambda_gp 10关键参数说明--n_critic 5每轮生成器更新前判别器更新5次——这是WGAN稳定训练的黄金比例低于3易崩溃高于10收敛过慢--lr_g/--lr_c生成器与判别器学习率需相同WGAN理论要求且不宜大于1e-4否则梯度惩罚失效--model_dir自动创建目录并保存每20轮的检查点G_epoch_XX.pth,C_epoch_XX.pth及loss曲线losses.npz。训练过程中实时监控三项指标loss_c_real判别器对真实信号的平均输出应缓慢上升表明判别能力增强loss_c_fake判别器对生成信号的平均输出应缓慢下降表明生成质量提升gp_loss梯度惩罚值应稳定在0.1~1.0之间若持续2.0说明λ过大或网络容量不足。提示首次训练建议先用--epochs 20快速验证流程观察loss是否下降。若loss_c_fake不降反升大概率是数据未归一化或n_critic设置过低。3.4 生成与验证如何判断生成信号“够用”训练完成后用generate.py批量生成信号并可视化验证python generate.py \ --generator_path models/saved/inner_wgan/G_epoch_200.pth \ --output_dir generated/inner/ \ --n_samples 100 \ --latent_dim 100 \ --signal_length 4096生成的.npy文件存于generated/inner/。关键验证步骤分三层验证层级方法合格标准时域层绘制随机10条生成信号叠加图无明显周期性伪影冲击形态多样无平台状饱和区频域层计算FFT幅值谱加汉宁窗主频峰清晰如BPFO157Hz谐波结构合理2×、3×主频可见无宽频噪声隆起诊断层将生成信号喂入已训练好的ResNet1D诊断模型分类准确率提升≥3%对比无增强基线且混淆矩阵中故障类间区分度提高utils/plot_utils.py提供一键可视化函数from utils.plot_utils import plot_comparison plot_comparison( real_pathdata/inner_fault/inner_001.npy, fake_pathgenerated/inner/fake_001.npy, save_pathfigs/inner_compare.png ) # 输出并排子图时域波形 FFT谱 包络谱合格的生成结果应呈现真实信号中常见的“衰减冲击串”结构如图中红色箭头所示而非均匀正弦叠加。4. 常见问题排查那些让我重训三次的玄学翻车现场4.1 现象训练初期loss_c_fake突然飙升至1000以上随后loss_c_real归零原因判别器过强导致生成器梯度消失vanishing gradient。常见于n_critic设置过高如设为10或lr_c过大2e-4。WGAN理论要求判别器接近最优时生成器才有效更新但过优判别器会使生成器loss梯度趋近于零。解决立即将n_critic降至5lr_c设为1e-4并加载上一轮检查点重启。若仍不稳定临时将lambda_gp从10降至5待训练平稳后再调回。4.2 现象生成信号FFT谱出现尖锐单频峰如50Hz工频且所有样本峰位一致原因原始数据未去除工频干扰。采集设备接地不良或电源耦合导致50Hz强干扰被模型当作“共性特征”学习。生成器学会在固定频率注入正弦波以欺骗判别器。解决回到preprocess_vibration.py将带通滤波上限cutoff从1000Hz降至800Hz并增加50Hz陷波器# 在filtering后添加 b_notch, a_notch signal.iirnotch(50, 30, fsfs) # Q30 filtered signal.filtfilt(b_notch, a_notch, filtered)4.3 现象生成信号时域波形呈现规律性“方波振荡”相邻样本高度相似原因模式坍缩mode collapse早期征兆。根本原因是真实数据多样性不足如仅3个内圈故障样本或生成器容量过大ngf128导致过拟合。解决数据侧用utils/augment_by_rotation.py对现有样本做相位旋转np.roll(signal, shift)生成5倍新样本模型侧将models/generator.py中ngf从64改为32降低容量训练侧在train.py中为生成器loss添加轻微L1正则loss_g -torch.mean(critic(fake)) 0.001 * torch.mean(torch.abs(fake))。4.4 现象gradient_penalty值持续5.0且loss_c_real与loss_c_fake差值极小0.1原因插值样本x_hat梯度计算失效。常见于real_data与fake_data动态范围差异过大如real归一化到[-1,1]fake因生成器最后一层无激活而溢出。解决检查Generator.forward()末尾是否遗漏torch.tanh()——WGAN要求生成器输出有界必须显式加tanh# 修改models/generator.py最后一行 # return self.main(x).squeeze(1) → 改为 return torch.tanh(self.main(x).squeeze(1))同时确认utils/dataset.py中归一化逻辑为data data / np.max(np.abs(data))而非/ data.std()。4.5 现象训练到100轮后loss平稳但生成信号包络谱无冲击特征只有宽带噪声原因判别器感受野不足无法捕捉长周期冲击模式。当前5层卷积最大感受野为1 2*(4-1) 4*(4-1) 8*(4-1) 16*(4-1) 127点约6ms而轴承故障冲击周期常达20ms以上。解决修改models/critic.py将前两层卷积核大小从4改为8nn.Conv1d(1, ndf, 8, 2, 3, biasFalse), # kernel8, padding3 → 感受野6 nn.Conv1d(ndf, ndf * 2, 8, 2, 3, biasFalse), # 同理重新训练感受野可扩展至255点12.5ms覆盖典型冲击周期。5. 二次开发实战从信号生成到故障机理嵌入5.1 场景驱动改造为生成器注入物理先验纯数据驱动的GAN易生成“数学正确但物理错误”的信号。例如内圈故障冲击周期应随转速线性变化但原始GAN对此无约束。我们可通过条件生成Conditional GAN注入转速RPM作为辅助输入# 修改models/generator.py class ConditionalGenerator(nn.Module): def __init__(self, latent_dim100, rpm_dim1, signal_length4096, ngf64): super().__init__() self.rpm_proj nn.Linear(rpm_dim, 64) # 将RPM映射为64维向量 self.noise_proj nn.Linear(latent_dim, ngf * 8 * 128 - 64) # 预留空间拼接 # ... 其余结构同原Generator ... def forward(self, z, rpm): rpm_feat self.rpm_proj(rpm) # [B, 64] noise_feat self.noise_proj(z) # [B, ngf*8*128 - 64] fused torch.cat([rpm_feat, noise_feat], dim1) # [B, ngf*8*128] x fused.view(-1, self.ngf * 8, 128) return torch.tanh(self.main(x).squeeze(1))训练时rpm值需与真实工况一致如内圈故障样本对应RPM1500±50。这样生成的信号其冲击间隔会自然适配输入RPM提升下游诊断模型的工况泛化能力。5.2 轻量化部署ONNX导出与边缘推理生成器可导出为ONNX在Jetson Nano等边缘设备上实时生成仿真信号用于在线测试# export_onnx.py import torch from models.generator import Generator # 加载训练好的权重 G Generator(latent_dim100, signal_length4096, ngf64) G.load_state_dict(torch.load(models/saved/inner_wgan/G_epoch_200.pth)) G.eval() # 构造示例输入 dummy_input torch.randn(1, 100) # 单样本噪声 # 导出ONNX torch.onnx.export( G, dummy_input, models/onnx/generator_inner.onnx, input_names[noise], output_names[signal], dynamic_axes{noise: {0: batch}, signal: {0: batch}}, opset_version12 ) print(ONNX exported to models/onnx/generator_inner.onnx)在边缘端用ONNX Runtime推理Pythonimport onnxruntime as ort import numpy as np sess ort.InferenceSession(models/onnx/generator_inner.onnx) z np.random.normal(0, 1, (1, 100)).astype(np.float32) fake_signal sess.run(None, {noise: z})[0] # [1, 4096] # fake_signal 即可送入本地诊断模型注意ONNX导出时opset_version12兼容性最好若目标设备为旧版TensorRT需降为opset_version11并手动替换ConvTranspose1d为UpsampleConv1d组合。5.3 评估体系升级不只是看Loss要建诊断闭环最终价值不在于GAN本身多“酷”而在于它能否提升诊断准确率。我搭建了自动化评估流水线每次生成后自动触发诊断测试# eval_diagnosis.py from sklearn.metrics import classification_report import joblib def evaluate_generation(generator_path, test_data_dir, classifier_path): # 1. 生成1000个假样本 fake_signals generate_batch(generator_path, n1000) # 2. 提取时频特征与真实数据相同pipeline X_fake extract_features(fake_signals) # 返回 [1000, 128] 特征向量 # 3. 加载预训练分类器如LightGBM clf joblib.load(classifier_path) # 4. 预测并统计 y_pred clf.predict(X_fake) # 输出各类别支持度若inner_fault占比80%说明生成偏向性严重 print(Inner fault ratio:, np.mean(y_pred inner_fault)) # 运行 evaluate_generation( generator_pathmodels/saved/inner_wgan/G_epoch_200.pth, test_data_dirdata/test_inner/, classifier_pathmodels/classifiers/lgbm_inner.pkl )这个脚本成为我的“后悔药”每次调整网络结构后不再凭感觉看图而是用诊断准确率变化说话。当发现某次修改使inner_fault识别率从82%升至86.5%我才真正相信改动有效。从那以后我每次改生成器都强制走一遍这个诊断闭环——哪怕多花10分钟也比对着loss曲线自我感动强。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询