简介:滚动轴承是旋转机械的关键部件,其故障诊断对保障设备安全运行意义重大。面向这一应用场景,资源提供基于可变形卷积和注意力机制的故障诊断算法实现,重点解决传统神经网络特征提取能力不足与可解释性较弱的问题;算法提出可变形多注意力卷积神经网络(DMACNN),利用可变形卷积自适应调整采样位置以提取不同形态的脉冲故障特征,同时引入注意力机制突出故障相关特征、抑制无关干扰,整体设计贴合轴承振动信号特点。资源为zip压缩包,共19个文件,含17个Python脚本和2个说明文档,大小仅23KB;脚本覆盖数据切片与预处理(如XJTU-SY、CWRU等常用数据集适配)、可变形卷积层、SE等注意力模块、网络模型组织及训练设置,结构清晰,便于复现和在此基础上改进。模型已在XJTU-SY轴承数据集上验证,识别准确率优于当前主流深度模型,已有1319人学习/下载,适合故障诊断、深度学习应用方向的研究者与工程师参考。
1. 为什么滚动轴承故障诊断需要可变形卷积和注意力机制
滚动轴承故障诊断的本质是从振动信号中提取出与故障类型强相关的特征,但现场实测信号往往混入大量背景噪声和周期性干扰,故障冲击成分常被淹没在低频和高频的耦合中。同一型号轴承在不同转速、不同载荷下的故障特征在时频图上会表现出不同的局部形态,比如内外圈故障引起的冲击会随转速变化而拉伸或平移,若使用固定尺寸和固定采样点的卷积核,很难同时覆盖这些不规则形变。可变形卷积通过额外学习的偏移量改变了采样位置,让卷积核主动贴合故障瞬态区域;而注意力机制则是在通道、空间或时序维上对特征进行重标定,抑制与故障无关的成分。将两者组合,可让诊断模型在变工况、强噪声环境下依然保留可区分的特征表达,适用于需要较高鲁棒性的设备状态监测任务。
2. 可变形卷积:用偏移学习适配振动时频图的局部形变
2.1 固定采样点的问题与可变形卷积的偏移机制
普通卷积在滑动窗口采样时,每个采样点相对于中心的位置是固定的。比如3x3卷积核的采样点就是围绕中心的整数坐标,这种规则网格在处理图像边缘、尺度变化时有天然缺陷。在轴承时频图中,故障冲击在低频段往往表现为较宽的水平带,在高频段则是窄而短的竖条,且受转频和调制影响会出现斜向条纹。固定网格要么把背景噪声一起采样进来,要么覆盖不到故障瞬态区域。可变形卷积的做法是在原卷积核的每个采样点坐标上叠加一个由额外卷积层预测的偏移量,偏移量的输入通常是同一层特征图,经过一个轻量卷积后输出与采样点数量相同的二维张量。
2.2 用PyTorch实现一个可变形卷积模块
我一般会用torchvision.ops的DeformConv2d来做偏移计算和采样组合,但需要自己写偏移预测网络。下面是一个可直接插入到诊断网络中的模块,输入是四维张量,输出的是经过可变形卷积后的特征图:
import torch import torch.nn as nn from torchvision.ops import DeformConv2d class DeformConvBlock(nn.Module): def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1): super().__init__() self.kernel_size = kernel_size self.stride = stride self.padding = padding self.offset_conv = nn.Conv2d( in_channels, 2 * kernel_size * kernel_size, kernel_size=kernel_size, stride=stride, padding=padding) self.deform_conv = DeformConv2d( in_channels, out_channels, kernel_size=kernel_size, stride=stride, padding=padding) self.bn = nn.BatchNorm2d(out_channels) self.act = nn.ReLU(inplace=True) def forward(self, x): offset = self.offset_conv(x) out = self.deform_conv(x, offset) return self.act(self.bn(out))这段代码里,offset_conv的作用是从输入特征图直接预测每个采样点的偏移量。偏移通道数为2 * kernel_size * kernel_size,因为每个采样点需要x和y两个方向偏移。DeformConv2d的输入特征图与offset在空间尺寸上要保持一致,stride和padding设置需要与offset_conv保持一致,否则采样坐标对不上。实际应用时注意可变形卷积层会增加少量参数量,但相比整个诊断网络可以忽略。
2.3 输入时频图的预处理与参数选择
可变形卷积一般用在二维输入上,所以常见做法是将一维振动信号转换为时频图。首选短时傅里叶变换,窗长取256或512,重叠率75%,得到256x256或128x128的二维张量;若想增大频率分辨率可以用连续小波变换。此时时频图作为单通道输入,也可以叠加三个不同窗长下的谱图形成类似RGB的三通道。实验时发现,直接用原始波形序列做一维可变形卷积效果不稳定,因为时序上的形变主要在频率轴上,二维可变形卷积更适合捕捉频带位置的变化。下面是一个标准的STFT生成代码:
import numpy as np from scipy.signal import stft def generate_spec(signal, fs=12000, nperseg=512, noverlap=384): f, t, Zxx = stft(signal, fs=fs, nperseg=nperseg, noverlap=noverlap) return np.abs(Zxx) # 返回幅度谱,形状为 (freq_bins, time_frames)这里nperseg是窗长,noverlap是帧间重叠采样点数。窗长越大,频率分辨率越高,但时间分辨率越低;重叠率越高,时间帧越密集。将幅度谱缩放到[0,1]后作为模型输入,注意不要使用db单位,因为幅度谱的动态范围更小,后续BN层更容易稳定。表1给出了可变形卷积与普通卷积在相同输入下的参数与感受野行为对比。
| 卷积类型 | 采样点位置 | 参数来源 | 对时频图形变的适配能力 | 额外计算开销 |
|---|---|---|---|---|
| 普通卷积 | 固定网格坐标 | 卷积核权重 | 弱 | 无 |
| 可变形卷积 | 网格坐标+偏移量 | 额外卷积预测 | 强 | 低 |
在实际诊断模型中,我会把可变形卷积放在网络的前几层而不是最后一层。原因在于浅层特征图中故障瞬态的位置和时频形态还比较具体,偏移学习更容易收敛;深层特征图经过多次抽象后已失去精确的几何信息,偏移量输出容易变成噪声。另一个需要注意的点是偏移量可能过大导致采样区域跨越不同故障特征带,因此可以在损失函数中加入偏移量的正则项,比如限制其L2范数小于等于核半径的一半。
2.4 偏移量可视化的诊断价值
可变形卷积的参数是否学到了有意义的采样位置,不能只靠准确率判断。我会把每个测试样本的偏移量输出保存为与输入时频图同尺寸的热力图,叠加到原始谱图上。对于滚动轴承内圈故障,偏移点会沿着冲击出现的时刻和对应频带扩散;对于外圈故障,因为故障位置相对负载区固定,偏移点会集中在某几个固定的角度区间。若偏移量杂乱无章,先检查偏移预测卷积的权重初始化。常见做法是将偏移量参数初始化为0,相当于开始时就是普通卷积,随训练逐步学习偏移。还可以在损失函数中加入偏移量正则项,避免偏移量过大。这里给出一个正则项的示例:
def offset_regularization(offset, base_kernel=3, grid_range=2.0): return torch.mean(torch.clamp(offset.abs() - grid_range, min=0.0) ** 2)这个函数计算偏移量中超过规则网格范围的比例,作为额外的损失。超参数grid_range取核半径,比如3x3卷积核最大合理偏移量是1.5,再大就可能跳到无关特征区。加入该正则项后,模型精度通常会略微下降,但稳定性提升,在变工况测试集中表现更明显。
2.5 可变形卷积的训练稳定性与初始化
可变形卷积的训练比普通卷积更容易出现梯度波动,因为偏移量参与坐标采样,梯度要经过采样位置回传。如果偏移量预测网络的学习率与主干网络相同,模型可能在早期就产生很大的偏移量,导致感受野完全偏离故障区域。常见做法是将偏移预测卷积的权重初始化成接近零的分布,并让偏置初始化为0,使训练初期等效于普通卷积。另一个技巧是为主干网络和偏移分支设置不同的学习率,比如偏移分支使用0.1倍的主干学习率。在混合精度训练时,要小心偏移量数值精度下降,建议保持float32。若使用AdamW,weight decay不要作用到偏移预测卷积上,否则会引入额外的收缩惩罚,导致偏移量趋于无穷小,失去可变形能力。
3. 注意力机制:从通道、空间到时序的故障特征重标定
3.1 SE通道注意力机制与CBAM注意力机制的适用场景
注意力机制在故障诊断中的作用是让模型把有限的表达能力用在更关键的特征图上。SE通道注意力机制通过全局平均池化将空间信息压缩成一个通道描述符,再用两个全连接层生成每个通道的权重,本质上是在通道之间进行非线性重标定。对于轴承振动时频图,某个通道可能表示某个频带范围内的能量分布,SE权重能突出故障特征频率所在通道。CBAM注意力机制在SE基础上增加了空间注意力分支,先做通道注意力,再沿通道维度计算空间重要性,对不同故障类型的瞬态冲击位置敏感。CA注意力机制则将位置信息嵌入通道注意力中,更适合需要精确频率定位的场景。
3.2 多头自注意力机制如何处理长距离时序依赖
自注意力机制通过查询、键、值的加权组合直接建模任意两个位置之间的依赖关系。多头自注意力机制的原理是把特征分成多个头,每个头在不同子空间上计算注意力权重,然后拼接起来,相当于同时关注时频图中不同尺度的局部模式。在滚动轴承故障诊断中,故障冲击信号往往在时间上具有周期性,但转速波动会使周期不恒定。多头自注意力能捕捉到这种非严格的周期性依赖,比循环神经网络或一维卷积更容易覆盖长时程信号。不过直接对整个时频图用自注意力机制参数量很大,常见做法是先将经过卷积层压缩后的特征序列化,只对时间步做多头自注意力,或者使用窗口形式的自注意力机制。
3.3 在诊断模型内集成注意力模块的代码
下面是一个轻量级的CBAM模块,可以插入到任意卷积块之后。它先执行通道注意力,再执行空间注意力,输出与输入形状相同:
class CBAMLayer(nn.Module): def __init__(self, channel, reduction=8, spatial_kernel=7): super().__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.mlp = nn.Sequential( nn.Conv2d(channel, channel // reduction, 1, bias=False), nn.ReLU(inplace=True), nn.Conv2d(channel // reduction, channel, 1, bias=False)) self.sigmoid_channel = nn.Sigmoid() self.spatial_conv = nn.Conv2d(2, 1, kernel_size=spatial_kernel, padding=spatial_kernel // 2, bias=False) self.sigmoid_spatial = nn.Sigmoid() def forward(self, x): avg_out = self.mlp(self.avg_pool(x)) max_out = self.mlp(self.max_pool(x)) channel_weight = self.sigmoid_channel(avg_out + max_out) x = channel_weight * x avg_spatial = torch.mean(x, dim=1, keepdim=True) max_spatial, _ = torch.max(x, dim=1, keepdim=True) spatial_feat = torch.cat([avg_spatial, max_spatial], dim=1) spatial_weight = self.sigmoid_spatial(self.spatial_conv(spatial_feat)) return x * spatial_weight代码中通道注意力部分使用平均池化和最大池化并行提取全局描述,MLP使用两个1x1卷积代替全连接层,方便处理任意空间尺寸。空间注意力把通道维压缩成平均值和最大值两个平面,再用一个7x7卷积得到单通道空间权重。集成时通常将CBAM放在网络每个阶段最后一次批归一化之后,这样能先稳定分布再重标定。SE通道注意力机制的实现更简单,只保留avg_pool和mlp部分;多头自注意力机制可以直接用PyTorch的nn.TransformerEncoderLayer,但需要先将特征图在时间维展平成序列。
表2总结了三种注意力机制在轴承故障诊断中的典型使用位置、计算量和适用信号类型。
| 注意力类型 | 关注维度 | 典型放置位置 | 相对计算量 | 适用场景 |
|---|---|---|---|---|
| SE通道注意力机制 | 通道 | 每个卷积块后 | 低 | 频带敏感特征 |
| CBAM注意力机制 | 通道+空间 | 每个阶段末尾 | 中 | 时频图局部冲击 |
| 多头自注意力机制 | 时序/空间序列 | 深层特征图展开后 | 较高 | 转速波动、长周期信号 |
实际集成时,我一般不会在每个卷积层后都加注意力模块,而是每隔两个卷积块放一个CBAM,避免过拟合。自注意力机制只在最后一个卷积块之后使用,且头数为4到8,否则训练初期容易陷入局部最优。若故障特征是单一频段主导,SE通道注意力机制已足够;若需要区分内外圈复合故障,CBAM的效果更稳定。
3.4 注意力机制融合顺序与可视化验证
注意力机制不是越多越好,插入顺序对结果影响很大。我在调整网络时发现,先经过两个卷积块再使用CBAM,比每个卷积块都用注意力更稳健。通道注意力应该放在批归一化之后,因为它依赖当前批量的全局统计量;空间注意力放在激活函数之前效果一般,激活之后更容易保留负区间信息。若网络中使用多头自注意力机制,我会把它放在全局平均池化之前,并将时频图的高和宽拼接成一个序列。此时需要设置位置编码,否则模型会丢失频率轴上的先后关系。对于可视化,可以用Grad-CAM生成注意力机制关注区域的梯度热力图,检查热力图是否覆盖故障频率附近,而不是覆盖噪声尖峰。
为了快速验证不同注意力机制的融合顺序,我通常用一个很小的网络做消融实验:
def build_model(use_deform=True, attention_type='cbam'): blocks = [] for i in range(4): if use_deform and i < 2: blocks.append(DeformConvBlock(64 if i > 0 else 1, 64)) else: blocks.append(nn.Conv2d(64 if i > 0 else 1, 64, kernel_size=3, padding=1)) blocks.append(nn.BatchNorm2d(64)) blocks.append(nn.ReLU(inplace=True)) if attention_type == 'cbam' and i in [1, 3]: blocks.append(CBAMLayer(64)) if attention_type == 'se' and i == 3: blocks.append(SELayer(64)) return nn.Sequential(*blocks)这段代码用字符串参数控制注意力类型和可变形卷积位置,方便做消融对比。注意DeformConvBlock内部已经包含批归一化和激活层,所以外层不要叠加重复的BN。这里为了简洁省略了输入形状适配和全连接层。SELayer需要自己定义,结构和CBAMLayer的通道注意力部分类似。
3.5 不同注意力机制的消融实验与通道可视化
为了证明注意力机制确实带来了增益,我会固定可变形卷积部分,分别用SE、CBAM、多头自注意力替换到同一个位置,记录验证集上的宏F1和参数量增量。一个常见的结论是,在简单故障类别上SE通道注意力机制已经足够,而复合故障或变工况下CBAM的增益更明显;多头自注意力只有在原始信号包含明显周期性时才有正向作用。实际生产环境里,如果推理资源有限,可以保留CBAM而舍去自注意力机制。通道可视化可以用主成分分析将通道权重投影到二维平面,检查注意力权重是否存在明显偏向,若所有通道的注意力权重接近均匀,说明注意力模块没有学到有效信息,需要增大reduction因子或改用空间注意力。
4. 融合实践:训练参数、可视化验证与部署建议
4.1 训练策略与超参数设定
在滚动轴承故障诊断任务中,训练集通常来自几种固定工况,测试集来自另一种转速或载荷。直接混合训练容易让模型记住工况信息。我会先用短时傅里叶变换生成时频图,并使用随机噪声注入和频率掩膜做数据增强。优化器选择AdamW,初始学习率1e-3,权重衰减1e-4。模型主干用3到4个卷积块,前两个块使用可变形卷积,最后一个块后接CBAM注意力机制,再通过一个多头自注意力层处理时序依赖,最后用全局平均池化接全连接分类头。损失函数使用带标签平滑的交叉熵,平滑系数0.1,可以缓解因工况变化导致的过置信输出。学习率采用余弦退火,在60个epoch内从1e-3降到1e-5,batch size取32。
4.2 验证模型时看哪些指标更可靠
准确率在类别均衡时不敏感,建议同时统计宏平均F1、召回率以及每类混淆矩阵。更重要的验证方式是用t-SNE对最后一层特征做降维可视化,观察不同故障类型在特征空间是否成簇。若可变形卷积的偏移量可视化后集中在故障频带附近,说明学到的几何形变是有效的。绘制t-SNE时将perplexity设为30,迭代200次,避免高维特征被压缩成杂乱的一团。表3给出了常见的验证工具与关注点。
| 验证内容 | 工具/指标 | 关注点 |
|---|---|---|
| 类别区分度 | 准确率、宏F1 | 各类别是否均衡 |
| 特征聚类 | t-SNE、UMAP | 簇间距是否清晰 |
| 偏移学习效果 | 偏移量热力图 | 是否聚焦于故障瞬态 |
4.3 部署时的模型压缩技巧
可变形卷积的自定义算子很多平台不支持,导出ONNX后无法直接推理。常见做法是在训练完成后,用一个普通卷积层模拟可变形卷积的采样位置,然后做知识蒸馏,将教师网络输出的特征对齐指导学生网络。若必须保留可变形卷积,则使用支持自定义算子的推理引擎,或者把可变形卷积固定成静态偏移再导出。为了降低显存占用,还可以将注意力机制放置在更靠后的卷积块上,并减少多头数量。模型量化时优先量化注意力模块中的全连接层,卷积层保留float16精度,可以在精度损失小于0.5%的情况下减少约30%的推理时延。
本文还有配套的精品资源,点击获取