当残差网络遇上轴承故障:一个让噪声闭嘴的故事
优化深度残差网络及其在强噪声环境下滚动轴承故障诊断中的应用(振动工程学报2023) 针对传统基于深度学习的故障诊断方法存在抗噪性能差、计算复杂度高和泛化性能不足的问题,提出了一种基于深度可分离残差网络DSResNet的滚动轴承故障诊断方法。 利用深度可分离卷积DSC计算复杂度低和逐点卷积PWC能增强网络非线性表达的优点,分别代替传统深度残差网络中的两个标准卷积层,构建出优化后的 DSResNet模型。 将各类故障状态下的时域信号作为 DSResNet 模型的输入进行识别分类。 ● 参考文献:2023年振动工程学报EI《优化深度残差网络及其在强噪声环境下滚动轴承故障诊断中的应用》 ●数据预处理:原方法使用的频域,已修改为时域信号进行诊断 ●网络模型:DSResNet、ResNet、CNN ●数据集:凯斯西储大学CWRU、河内大学滚动轴承数据集HUST(2023年开源)、德国帕德伯恩数据集PN ●网络框架:pytorch ●结果输出:损失曲线图、准确率曲线图、混淆矩阵、tsne图 ●准确率:测试集95%以上 ●使用对象:初学者 ●代码保证:故障诊断代码注释详细、即拿即可跑通。

轴承在工业场景里就像社畜的颈椎——每天高负荷运转还容易被忽视。传统故障诊断方法遇到工厂里的强噪声就像开会时隔壁装修,准确率直接跳水。今天咱们来盘一盘这个让轴承在噪声中也能喊出"我病了"的神奇网络——DSResNet。

先看数据怎么整。传统方法喜欢把振动信号转成频谱图,跟做心电图似的。但这次咱们直接用原始时域信号,毕竟轴承疼起来的时候波形变化比心电图更明显。
# 加载CWRU数据并添加噪声增强
def load_data_with_noise(file_path, snr=10):
raw_signal = np.load(file_path)
noise = np.random.normal(0, 1, len(raw_signal))
noise = noise / np.linalg.norm(noise) * np.linalg.norm(raw_signal) / (10**(snr/20))
return raw_signal + noise
# 数据标准化
def normalize(signal):
return (signal - np.mean(signal)) / np.std(signal)
重点来了!深度可分离残差结构才是真·抗噪神器。普通卷积像带着耳塞听演讲,而深度可分离卷积是主动降噪耳机——先抓空间特征再处理通道关系,计算量还只有原来的1/3。
class DepthwiseSeparableConv(nn.Module):
def __init__(self, in_channels, out_channels, stride=1):
super().__init__()
self.depthwise = nn.Conv1d(in_channels, in_channels, kernel_size=3,
stride=stride, padding=1, groups=in_channels)
self.pointwise = nn.Conv1d(in_channels, out_channels, kernel_size=1)
def forward(self, x):
x = self.depthwise(x) # 空间特征提取
x = self.pointwise(x) # 通道信息融合
return x
整个网络骨架长这样——把ResNet里的标准卷积换成我们的黑科技模块。每层残差结构都像给网络加了弹簧缓冲,防止特征信息在深层网络中"骨折"。
class DSResBlock(nn.Module):
def __init__(self, channels):
super().__init__()
self.conv1 = DepthwiseSeparableConv(channels, channels)
self.conv2 = DepthwiseSeparableConv(channels, channels)
self.relu = nn.ReLU()
def forward(self, x):
residual = x
x = self.relu(self.conv1(x))
x = self.conv2(x)
return self.relu(x + residual) # 残差连接
训练时的数据增强要够"脏"才有效。我们在原始信号上叠加高斯白噪声,模拟工厂里电机轰鸣、设备震动的真实场景。别担心网络学不会,这就像让医学生直接去急诊室练手。
# 动态噪声增强
class DynamicNoise(object):
def __init__(self, min_snr=0, max_snr=20):
self.min_snr = min_snr
self.max_snr = max_snr
def __call__(self, signal):
snr = np.random.randint(self.min_snr, self.max_snr)
return add_noise(signal, snr)
实验结果才是硬道理。在CWRU数据集上,95%的准确率看着平平无奇?但注意这是在信噪比-4dB(比摇滚演唱会还吵)的环境下跑出来的。混淆矩阵里各类故障泾渭分明,t-SNE可视化更显示出特征空间的完美聚类。

优化深度残差网络及其在强噪声环境下滚动轴承故障诊断中的应用(振动工程学报2023) 针对传统基于深度学习的故障诊断方法存在抗噪性能差、计算复杂度高和泛化性能不足的问题,提出了一种基于深度可分离残差网络DSResNet的滚动轴承故障诊断方法。 利用深度可分离卷积DSC计算复杂度低和逐点卷积PWC能增强网络非线性表达的优点,分别代替传统深度残差网络中的两个标准卷积层,构建出优化后的 DSResNet模型。 将各类故障状态下的时域信号作为 DSResNet 模型的输入进行识别分类。 ● 参考文献:2023年振动工程学报EI《优化深度残差网络及其在强噪声环境下滚动轴承故障诊断中的应用》 ●数据预处理:原方法使用的频域,已修改为时域信号进行诊断 ●网络模型:DSResNet、ResNet、CNN ●数据集:凯斯西储大学CWRU、河内大学滚动轴承数据集HUST(2023年开源)、德国帕德伯恩数据集PN ●网络框架:pytorch ●结果输出:损失曲线图、准确率曲线图、混淆矩阵、tsne图 ●准确率:测试集95%以上 ●使用对象:初学者 ●代码保证:故障诊断代码注释详细、即拿即可跑通。


最后给初学者的忠告:跑代码前先检查轴承数据是不是"活的"——用这个脚本快速验证数据质量:
def check_signal_health(signal):
peak = np.max(np.abs(signal))
rms = np.sqrt(np.mean(signal**2))
crest_factor = peak / rms # 峰值因数>5说明可能有冲击故障
print(f"健康指数:{'正常' if crest_factor<5 else '异常'}")
完整代码已打包成"拿来主义"版本,从数据加载到模型训练一键执行。记住:好的故障诊断模型应该像老技师的手——摸一下就知道轴承哪里在呻吟。DSResNet就是把这双手数字化了,还自带降噪耳塞功能。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)