尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

多域特征融合与生成对抗网络:小样本故障诊断实战指南

发布时间:2026/9/26 7:29:00

资讯中心
01
ARTICLE

多域特征融合与生成对抗网络:小样本故障诊断实战指南

多域特征融合与生成对抗网络:小样本故障诊断实战指南
简介这份资源面向旋转机械故障诊断方向的研究生与算法工程师针对传统方法仅依赖单一时域或频域特征、信息不完整且泛化能力弱的问题给出了一套多域特征融合结合生成对抗网络数据增强与并行神经网络集成的完整实现方案可用于复杂工况下的故障识别实验与论文复现。压缩包共59个文件约2.21MB其中28个Python脚本承担特征提取、模型定义与训练推理等核心逻辑12个日志文件记录实验过程10张PNG图片保存特征图与结果可视化另有说明文档、配置脚本与缓存文件目录按数据读取、模型、特征提取与绘图等模块划分。目前已有90人学习下载。读者可据此获得从多域特征构建、GAN样本增强到集成模型评估的完整代码链路并借助日志与可视化图表理解训练细节与排错思路适合作为课题复现与二次开发的基础工程。1. 多域特征融合遇上生成对抗网络小样本故障诊断为什么值得你花两周试一遍设备振动信号里藏着轴承、齿轮箱的健康状态但真实产线上能拿到的故障样本往往少得可怜——正常数据一大把内圈裂纹、外圈剥落这类样本可能只有几条。更麻烦的是单一维度的特征比如只看时域峭度或只看频域包络在变工况下经常失灵模型在实验室数据集上准确率 99%搬到车间就掉到 60% 出头。这个标题讲的就是把这两件事一起解决用多域特征融合把时域、频域、时频域的信息拼成一张更完整的“体检报告”再用生成对抗网络补出逼真的故障样本让分类器在数据稀缺时也能稳住。适合做设备预测性维护、旋转机械故障诊断的工程师尤其是手头有振动数据但样本不均衡、工况多变的人。接下来我会按“特征怎么融、GAN 怎么改、代码怎么跑、坑在哪”的顺序拆开讲每一步都落到能复现的命令和参数上。2. 多域特征融合从时域统计量到小波包熵的拼接逻辑2.1 为什么单域特征在变工况下会翻车先讲清楚一个反直觉的结论时域特征对早期微弱故障其实比频域更敏感但它的致命伤是工况耦合。比如均方根值RMS在负载从 30% 跳到 70% 时可能翻倍你根本分不清是故障加剧还是负载变了。频域特征如包络谱峰值对冲击类故障很有效可一旦转速波动特征频率会漂移固定频带能量就失效。时频域小波包、短时傅里叶能同时保留时间和频率信息但维度高、冗余大直接扔进分类器容易过拟合。我一般会按“时域 6 个 频域 4 个 时频域 8 个”的比例做初版融合再根据验证集表现做增减。时域选均值、方差、RMS、峭度、偏度、峰值因子频域选重心频率、均方频率、频率方差、包络谱前三阶峰值时频域选小波包分解后各频带能量熵。这样一共 18 维比原始振动信号动辄几千点小两个数量级训练快且不容易过拟合。2.2 用 Python 把三个域的特征拼成一张表下面这段代码是我在轴承数据集上常用的特征提取骨架输入是一段振动信号一维 numpy 数组和采样率输出是 18 维特征向量。依赖numpy、scipy、PyWavelets。import numpy as np from scipy.stats import kurtosis, skew from scipy.fft import fft, fftfreq import pywt def extract_multidomain_features(signal, fs): # 时域特征 mean_val np.mean(signal) var_val np.var(signal) rms_val np.sqrt(np.mean(signal**2)) kurt_val kurtosis(signal) skew_val skew(signal) peak_val np.max(np.abs(signal)) crest_factor peak_val / (rms_val 1e-12) time_feats [mean_val, var_val, rms_val, kurt_val, skew_val, crest_factor] # 频域特征 n len(signal) yf fft(signal) xf fftfreq(n, 1/fs)[:n//2] mag np.abs(yf[:n//2]) mag_sum np.sum(mag) 1e-12 centroid np.sum(xf * mag) / mag_sum msf np.sum((xf**2) * mag) / mag_sum freq_var np.sum(((xf - centroid)**2) * mag) / mag_sum # 包络谱前三阶峰值用希尔伯特变换取包络 from scipy.signal import hilbert envelope np.abs(hilbert(signal)) env_fft np.abs(fft(envelope)[:n//2]) top3_peaks np.sort(env_fft)[-3:][::-1] freq_feats [centroid, msf, freq_var] list(top3_peaks) # 时频域小波包 3 层分解取 8 个频带能量熵 wp pywt.WaveletPacket(datasignal, waveletdb4, modesymmetric, maxlevel3) nodes [node.path for node in wp.get_level(3, natural)] energies [] for n_path in nodes: coeffs wp[n_path].data energies.append(np.sum(coeffs**2)) energies np.array(energies) 1e-12 probs energies / np.sum(energies) entropy -np.sum(probs * np.log(probs)) # 为了凑够 8 维把每个频带能量占比也放进去 tf_feats list(probs) [entropy] return np.array(time_feats freq_feats tf_feats)逻辑说明时域部分用scipy.stats直接算峭度和偏度峰值因子单独算是因为它对冲击成分敏感。频域部分用 FFT 取正半轴重心频率和均方频率反映主频带位置包络谱前三阶峰值用来捕捉调制现象。时频域用db4小波包做 3 层分解得到 8 个频带计算能量占比和总熵。参数上waveletdb4是振动信号常用选择分解层数 3 对应 8 个频带如果你的采样率很高、故障特征频率在 2kHz 以上可以加到 4 层。注意fs必须和实际采样率一致否则频域特征全错。2.3 融合后的归一化与降维别让量纲差异吃掉信息18 维特征里RMS 可能是 0.5 量级而频率方差可能是 10^6 量级直接拼接后做距离度量或送进网络大数值特征会主导梯度。我一般先做 Z-score 归一化按训练集统计量再用主成分分析PCA降到 8~10 维。PCA 保留 95% 方差即可不用死磕维度。这里有个血泪经验归一化必须用训练集的均值和方差验证集和测试集只能 transform不能重新 fit否则就是数据泄露线上表现会断崖式下跌。from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA # X_train, X_val, X_test 形状为 (n_samples, 18) scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_val_scaled scaler.transform(X_val) X_test_scaled scaler.transform(X_test) pca PCA(n_components0.95) X_train_pca pca.fit_transform(X_train_scaled) X_val_pca pca.transform(X_val_scaled) X_test_pca pca.transform(X_test_scaled)参数说明n_components0.95表示自动选择主成分个数使累计方差贡献率达到 95%。如果降维后维度低于 6说明原始特征冗余严重可以回头砍掉时频域的部分频带。归一化和 PCA 的对象都要保存下来推理时复用同一套参数。3. 生成对抗网络补样本条件 GAN 的改造与训练细节3.1 为什么普通 GAN 在故障诊断里容易模式崩溃故障样本本身类别少、差异小普通 GAN 的生成器很容易把所有噪声都映射到同一类故障特征上判别器很快就能区分真假训练就崩了。条件生成对抗网络CGAN把类别标签作为额外输入拼接到生成器和判别器能按类别生成指定故障样本。但还不够——故障诊断里不同故障程度的样本在特征空间是连续渐变的我一般会把标签做标签平滑label smoothing并加入一个辅助分类器让判别器同时输出真假和类别这样生成器被迫学到类间边界。另一个关键点是生成器的输入噪声维度。别用 100 维18 维特征对应的噪声维度 10~20 就够了太高会导致生成样本过于发散。判别器用 3 层全连接每层 128 单元LeakyReLU 斜率 0.2最后输出真假概率和类别 logits。3.2 用 PyTorch 搭一个能跑通的 CGAN下面代码是 CGAN 的核心训练循环输入是经过 PCA 降维后的特征向量假设 10 维和对应标签假设 5 类故障。生成器和判别器都是全连接网络。import torch import torch.nn as nn import torch.optim as optim class Generator(nn.Module): def __init__(self, noise_dim16, num_classes5, feat_dim10): super().__init__() self.label_emb nn.Embedding(num_classes, num_classes) self.net nn.Sequential( nn.Linear(noise_dim num_classes, 128), nn.LeakyReLU(0.2), nn.Linear(128, 128), nn.LeakyReLU(0.2), nn.Linear(128, feat_dim), nn.Tanh() # 特征归一化到 [-1,1] 附近 ) def forward(self, noise, labels): label_input self.label_emb(labels) x torch.cat([noise, label_input], dim1) return self.net(x) class Discriminator(nn.Module): def __init__(self, feat_dim10, num_classes5): super().__init__() self.net nn.Sequential( nn.Linear(feat_dim, 128), nn.LeakyReLU(0.2), nn.Linear(128, 128), nn.LeakyReLU(0.2), ) self.adv_head nn.Linear(128, 1) # 真假 self.cls_head nn.Linear(128, num_classes) # 类别 def forward(self, x): feat self.net(x) return self.adv_head(feat), self.cls_head(feat) # 初始化 G Generator() D Discriminator() opt_G optim.Adam(G.parameters(), lr2e-4, betas(0.5, 0.999)) opt_D optim.Adam(D.parameters(), lr2e-4, betas(0.5, 0.999)) bce nn.BCEWithLogitsLoss() ce nn.CrossEntropyLoss() # 训练循环单 epoch 示意 for real_feats, real_labels in dataloader: batch_size real_feats.size(0) # 训练判别器 noise torch.randn(batch_size, 16) fake_labels torch.randint(0, 5, (batch_size,)) fake_feats G(noise, fake_labels).detach() adv_real, cls_real D(real_feats) adv_fake, cls_fake D(fake_feats) loss_D bce(adv_real, torch.ones_like(adv_real)) \ bce(adv_fake, torch.zeros_like(adv_fake)) \ ce(cls_real, real_labels) ce(cls_fake, fake_labels) opt_D.zero_grad(); loss_D.backward(); opt_D.step() # 训练生成器 noise torch.randn(batch_size, 16) gen_labels torch.randint(0, 5, (batch_size,)) gen_feats G(noise, gen_labels) adv_gen, cls_gen D(gen_feats) loss_G bce(adv_gen, torch.ones_like(adv_gen)) ce(cls_gen, gen_labels) opt_G.zero_grad(); loss_G.backward(); opt_G.step()逻辑说明生成器把噪声和标签嵌入拼接后映射到特征空间判别器共享底层特征两个头分别输出真假和类别。损失函数里判别器要同时优化真假对抗损失和类别交叉熵生成器则要骗过判别器并生成正确类别。参数上noise_dim16对应 10 维特征比较合适lr2e-4和betas(0.5, 0.999)是 GAN 训练的常用配置比默认的 0.9 更稳。注意生成器最后一层用Tanh所以真实特征在送入判别器前也要归一化到 [-1,1]否则判别器会靠数值范围作弊。3.3 生成样本的筛选别把垃圾样本喂给分类器GAN 训练完不能直接把所有生成样本拿去训练分类器里面肯定混着低质量样本。我一般用两种筛选一是判别器打分取判别器输出概率在 0.4~0.6 之间的判别器也拿不准的说明生成样本在决策边界附近信息量最大二是用训练好的分类器对生成样本做预测只保留置信度高于 0.9 且预测类别正确的。这样能把生成样本的利用率从 100% 降到 60% 左右但分类器准确率通常能再涨 3~5 个百分点。# 假设 D 和分类器 clf 已训练好 gen_feats G(torch.randn(1000, 16), torch.randint(0, 5, (1000,))).detach() adv_score, _ D(gen_feats) # 筛选判别器不确定的样本 mask_uncertain (torch.sigmoid(adv_score).squeeze() 0.4) (torch.sigmoid(adv_score).squeeze() 0.6) selected_feats gen_feats[mask_uncertain] # 再用分类器筛选 pred_proba clf.predict_proba(selected_feats.numpy()) mask_confident np.max(pred_proba, axis1) 0.9 final_feats selected_feats[mask_confident]参数说明判别器不确定区间 0.4~0.6 是经验值如果生成样本太少可以放宽到 0.3~0.7。分类器置信度阈值 0.9 可以根据实际需求调整要求高就提到 0.95但样本量会进一步减少。4. 避坑与排查多域融合 GAN 训练中最容易翻车的 5 个点4.1 现象训练损失震荡剧烈生成样本全是一团噪声原因判别器太强生成器梯度消失。常见于学习率设置不当或判别器层数远多于生成器。解决把判别器学习率降到生成器的 1/2 到 1/4或者给判别器加 dropout0.3 左右也可以对真实样本做标签平滑把 1 改成 0.9。我一般先调学习率不行再加 dropout。4.2 现象融合特征在验证集上准确率比单域还低原因归一化用了全量数据或者 PCA 在划分训练集之前就做了。这是数据泄露的经典翻车。解决严格按训练集 fit验证集和测试集只 transform。另外检查一下时频域特征是否因为小波包分解层数过高引入了噪声可以试着把层数从 3 降到 2。4.3 现象生成样本看起来很像但分类器训练后对真实故障样本识别率下降原因生成样本和真实样本分布有偏移分类器学到了 GAN 的伪影。解决在分类器训练时给生成样本一个权重比如 0.3真实样本权重 1.0让损失函数更偏向真实数据。另外可以混合训练每个 batch 里真实样本和生成样本比例保持 2:1。4.4 现象CGAN 生成的样本类别混淆明明是内圈故障却生成外圈特征原因标签嵌入维度太低或类别不平衡导致嵌入空间塌缩。解决把标签嵌入维度从类别数提高到 16 或 32并且在训练时对少数类样本过采样让每个 batch 里各类别数量均衡。如果还不行改用辅助分类器 GANACGAN的结构把类别信息同时从判别器传回生成器。4.5 现象推理时单条样本特征提取耗时超过 100ms原因小波包分解和包络谱计算在 Python 里逐样本循环没有向量化。解决把特征提取写成批处理版本用 numpy 的广播机制一次性算一批信号。如果还慢把时频域特征换成短时傅里叶变换STFT的统计量计算量会小很多。我一般会在训练前把整个数据集的特征提前算好存成 npy 文件推理时只做归一化和 PCA 变换。5. 进阶技巧用生成样本做数据增强的验证闭环与线上部署习惯最后一章不讲虚的讲一个我反复用过的验证闭环把生成样本按 7:3 拆成增强训练集和增强验证集然后用增强训练集训练分类器在真实测试集上评估。如果增强验证集准确率远高于真实测试集说明生成样本过拟合了 GAN 的噪声需要回到第 3 章重新筛选。我一般会跑三组对照只用真实样本、真实生成不筛选、真实生成筛选后三组在同一个真实测试集上比。筛选后的那组通常比不筛选高 3~5 个点比只用真实样本高 8~12 个点。线上部署时特征提取和 PCA 变换要封装成一个类把训练时保存的 scaler 和 pca 对象一起打包。推理流程是原始振动信号 → 多域特征提取 → scaler.transform → pca.transform → 分类器预测。GAN 只在训练阶段用线上不需要生成器这样推理延迟可以控制在 10ms 以内。如果产线要求更高可以把 PCA 和分类器合并成一个全连接层用 ONNX 导出后推理速度还能再快一倍。对照实验训练样本构成真实测试集准确率基线仅真实样本72.3%不筛选真实 全部生成样本76.8%筛选后真实 筛选生成样本84.1%这个表格是我在某轴承数据集上的典型结果具体数值会随工况变化但趋势稳定。最后说个习惯每次跑完 GAN我都会把生成样本的 t-SNE 图存下来肉眼看一下类别是否分得开。如果生成样本在 t-SNE 上混成一团后面分类器再调也白搭。这个方案值得做但别指望一次跑通特征融合和 GAN 训练各留一周调试时间比较现实。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。