不完备数据深度学习列车轮对轴承故障识别实现【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,查看文章底部二维码
(1)条件变分自编码器生成对抗网络的小样本数据增强:
针对轮对轴承故障样本难以获取导致的小样本问题,设计了一种条件变分自编码器与生成对抗网络融合的样本生成模型。传统GAN在生成离散类别样本时容易模式崩塌,本方案采用条件控制的方式,将故障类别标签作为输入条件同时送入生成器和判别器。生成器不仅接收随机噪声,还接收来自条件VAE编码的潜在变量和标签信息,从而迫使生成器产生特定类别的逼真故障样本。在训练中,采用了Wasserstein距离作为损失函数,避免了原始GAN的梯度消失问题,同时增加了梯度惩罚项确保Lipschitz约束。在诊断模型部分,引入卷积注意力模块增强对生成样本特征的有效性评估,避免过拟合虚假特征。通过在原始真实样本基础上增加生成样本,将训练集从每类20个样本扩充到200个,诊断准确率从78%提升到94%。实验还发现,生成样本与真实样本在t-SNE可视化中存在高度重叠,证明了生成样本具有较高的质量和多样性。
(2)联合最大均值差异对抗域适应网络变工况诊断:
为了解决测试工况与训练工况不同且测试集完全无标签的场景,提出了一种联合最大均值差异的对抗域适应模型。模型包含多尺度卷积通道注意力机制的特征提取器:利用不同尺寸的卷积核捕获轴承故障在不同转速下的频率偏移特性,同时通过通道注意力动态加权,强调对工况变化鲁棒的特征通道。在域适应层面,同时考虑边缘概率和条件概率分布的对齐:对抗域判别器负责使得特征提取器无法区分数据来自源域或目标域,从而实现边缘分布对齐;联合最大均值差异损失通过最小化源域与目标域在每一类伪标签下的条件分布差异,实现细粒度对齐。为了防止伪标签噪声,在训练初期使用高置信度阈值筛选可靠的目标域样本,并采用课程学习策略逐渐降低阈值。在变工况轴承数据集上,该方法相比仅使用对抗适应的模型准确率提高了11%。
(3)频段多尺度自适应稀疏注意力机制域泛化诊断:
进一步解决目标域数据完全缺失(即新工况从未出现)的极端情况,提出了基于域泛化的故障诊断方法。首先,采用经验模态分解将原始振动信号自适应分解为多个本征模态分量,每个分量对应不同的频段,使得模型能够学习与转速无关的纯频段特征。然后,构建了一个多尺度自适应稀疏注意力模块,该模块能够自动识别各频段分量中对故障敏感的频率成分,并分配稀疏权重,忽略不相关频段的干扰。通过将多个工况的数据作为源域进行训练,模型学习到一种与工况无关的故障嵌入表示。在未知工况测试中,该嵌入空间依然能够保持源域中的聚类结构。实验表明,该方法在完全未知转速下的诊断准确率达到89.7%,显著高于普通卷积网络的67.2%,展示了优越的泛化性能。"
import torch import torch.nn as nn import numpy as np # 1. 条件VAE-GAN生成器 (简化) class ConditionalGenerator(nn.Module): def __init__(self, latent_dim=100, num_classes=4): super().__init__() self.label_embedding = nn.Embedding(num_classes, 10) self.fc = nn.Linear(latent_dim + 10, 256) def forward(self, z, labels): label_emb = self.label_embedding(labels) x = torch.cat([z, label_emb], dim=1) x = torch.relu(self.fc(x)) # 输出伪造的振动信号片段 return x # 训练WGAN-GP (梯度惩罚) def wgan_gp_loss(real, fake, critic): # 批评者损失: 希望real输出大,fake输出小 gp = gradient_penalty(critic, real, fake) return torch.mean(fake) - torch.mean(real) + 10 * gp # 2. 对抗域适应 + JMMD def jmmd_loss(src_feat, tgt_feat, src_labels, tgt_pseudo): # 联合最大均值差异 total_loss = 0 for c in np.unique(src_labels): src_c = src_feat[src_labels == c] tgt_c = tgt_feat[tgt_pseudo == c] if len(src_c) > 0 and len(tgt_c) > 0: total_loss += mmd_loss(src_c, tgt_c) return total_loss # 多尺度卷积注意力模块 class MultiScaleAttention(nn.Module): def __init__(self, in_channels): super().__init__() self.conv3 = nn.Conv1d(in_channels, 32, kernel_size=3, padding=1) self.conv5 = nn.Conv1d(in_channels, 32, kernel_size=5, padding=2) self.conv9 = nn.Conv1d(in_channels, 32, kernel_size=9, padding=4) self.attention = nn.Sequential(nn.AdaptiveAvgPool1d(1), nn.Conv1d(96, 1, 1), nn.Sigmoid()) def forward(self, x): c3 = torch.relu(self.conv3(x)) c5 = torch.relu(self.conv5(x)) c9 = torch.relu(self.conv9(x)) out = torch.cat([c3, c5, c9], dim=1) weight = self.attention(out) return out * weight # 3. EMD分解 (调包) from PyEMD import EMD def emd_decompose(signal): emd = EMD() imfs = emd(signal) return imfs "如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
