变工况强噪声滚动轴承故障诊断算法【附代码】

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)基于自适应噪声完备集合经验模态分解的信号降噪预处理
工业现场的滚动轴承长期工作在变载荷、变转速以及强电磁干扰共存的恶劣环境之中,所采集到的振动信号往往被各类噪声严重污染,使得故障特征频率以及对应的边带成分难以从频谱中清晰呈现。本研究在算法的前端预处理阶段引入了自适应噪声完备集合经验模态分解技术,通过自适应迭代的方式将原始振动信号分解为一系列具有不同时频特征的本征模态函数分量。与传统经验模态分解相比,自适应噪声完备集合方法在每一次迭代过程中向待分解信号中加入特定方差的高斯白噪声,然后通过多次集合平均消除噪声分量带来的模态混叠现象,从而获得更加纯净的本征模态函数。在分解结果的基础上,算法计算每一个本征模态函数与原始信号的相关系数以及包络谱峭度指标,通过综合判据筛选出与故障特征最为相关的若干分量并将其重构为降噪后的故障特征信号。这一预处理环节有效抑制了背景噪声的干扰,为后续的深度学习模型提供了高质量的输入数据,显著降低了模型在强噪声环境下的特征学习难度。
(2)基于一维残差注意力网络的端到端故障特征学习
针对变工况场景下振动信号呈现出非平稳、非线性的复杂特性,本研究设计了一种一维残差注意力深度网络作为核心特征学习模型。网络主干由多个一维残差块堆叠而成,每个残差块内部包含两层卷积加上一条跳跃连接,跳跃连接的引入使得深层梯度能够顺畅回传,有效缓解了深度网络训练过程中的梯度消失问题。在残差主干之上,我们进一步嵌入了空间-通道双重注意力机制,空间注意力子模块沿着时间维度对每一帧特征计算重要性权重,引导网络聚焦于故障冲击发生的关键时间段;通道注意力子模块则对各特征通道的全局重要性进行评估,使得最具判别力的特征通道在最终决策中发挥主导作用。两类注意力以串联方式集成到主干网络的关键位置之上,与卷积特征提取过程协同工作。整个网络以端到端方式训练,可直接接收一维降噪振动信号并输出故障类别预测,无需依赖人工设计的特征提取过程,在多种工况切换场景下均展现出了优秀的泛化能力。
(3)小样本场景下的元学习快速适配机制
工业现场不同设备所对应的故障数据规模差异极大,部分关键设备甚至只能获取到少量已知故障样本,此时传统深度学习模型由于训练数据不足容易出现严重的过拟合,无法满足实际的诊断需求。为提升模型在小样本场景下的泛化能力,本研究在所设计的一维残差注意力网络之上引入了基于模型不可知元学习思想的快速适配机制。具体来说,我们将整个训练过程划分为大量的元任务,每个元任务包含一个支持集和一个查询集,支持集用于模拟在新工况下进行少量样本微调的过程,查询集则用于评估微调后的模型在该工况下的泛化性能。通过在大量元任务上反复进行内层快速适配与外层元参数更新的双循环优化,模型最终学习到一组对新任务具有良好初始适应能力的元参数。在面对一个全新工况或者新设备的小样本诊断需求时,只需将所学到的元参数作为初始值,在该任务的少量带标签样本上进行若干步梯度下降即可获得性能良好的诊断模型,大幅度降低了对目标域数据规模的依赖。所提算法在凯斯西储大学公开数据集以及自建变工况实验台上的对比实验均验证了其在变载荷、变转速、强噪声叠加场景下的有效性。
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
# CEEMDAN 简化实现:自适应噪声辅助分解
def ceemdan_decompose(signal, n_imf=8, n_trial=50, noise_std=0.2):
imfs = []
residual = signal.copy()
for k in range(n_imf):
ensemble = []
for _ in range(n_trial):
noise = np.random.randn(len(residual)) * noise_std
# EMD筛分过程的简化代理:高频分量提取
x = residual + noise
for _ in range(3):
upper = np.maximum.accumulate(x)
lower = np.minimum.accumulate(x[::-1])[::-1]
x = x - (upper + lower) / 2
ensemble.append(x)
imf = np.mean(ensemble, axis=0) # 集合平均消除噪声
imfs.append(imf)
residual = residual - imf
return np.array(imfs)
# 通过相关系数+包络峭度筛选有效IMF
def select_useful_imfs(imfs, signal):
selected = []
for imf in imfs:
corr = np.corrcoef(imf, signal)[0, 1]
env = np.abs(np.fft.rfft(np.abs(imf)))
kurt = ((env - env.mean())**4).mean() / (env.var()**2 + 1e-9)
if abs(corr) > 0.1 and kurt > 3: # 双重判据
selected.append(imf)
return np.sum(selected, axis=0) if selected else signal
# 一维残差块
class Res1DBlock(nn.Module):
def __init__(self, c):
super().__init__()
self.conv1 = nn.Conv1d(c, c, 3, padding=1)
self.conv2 = nn.Conv1d(c, c, 3, padding=1)
self.bn1 = nn.BatchNorm1d(c)
self.bn2 = nn.BatchNorm1d(c)
def forward(self, x):
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
return F.relu(out + x) # 跳跃连接缓解梯度消失
# 双重注意力残差网络
class ResAttentionNet(nn.Module):
def __init__(self, n_class=10):
super().__init__()
self.stem = nn.Conv1d(1, 32, 7, stride=2, padding=3)
self.blocks = nn.Sequential(Res1DBlock(32), Res1DBlock(32))
self.ch_att = nn.Sequential(
nn.AdaptiveAvgPool1d(1), nn.Flatten(),
nn.Linear(32, 8), nn.ReLU(), nn.Linear(8, 32), nn.Sigmoid())
self.sp_att = nn.Conv1d(32, 1, 1)
self.fc = nn.Linear(32, n_class)
def forward(self, x):
x = self.blocks(F.relu(self.stem(x)))
ch_w = self.ch_att(x).unsqueeze(-1)
x = x * ch_w # 通道注意力
sp_w = torch.softmax(self.sp_att(x), dim=2)
x = (x * sp_w).sum(dim=2) # 空间注意力 + 池化
return self.fc(x)
# MAML 元学习内层快速适配
def maml_inner_step(model, support_x, support_y, lr=0.01):
pred = model(support_x)
loss = F.cross_entropy(pred, support_y)
grads = torch.autograd.grad(loss, model.parameters(), create_graph=True)
fast_weights = [p - lr * g for p, g in zip(model.parameters(), grads)]
return fast_weights



如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)