ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

可变形卷积与注意力机制在滚动轴承故障诊断中的应用

可变形卷积与注意力机制在滚动轴承故障诊断中的应用 简介滚动轴承是旋转机械的关键部件其故障诊断对保障设备安全运行意义重大。面向这一应用场景资源提供基于可变形卷积和注意力机制的故障诊断算法实现重点解决传统神经网络特征提取能力不足与可解释性较弱的问题算法提出可变形多注意力卷积神经网络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_size3, stride1, padding1): 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_sizekernel_size, stridestride, paddingpadding) self.deform_conv DeformConv2d( in_channels, out_channels, kernel_sizekernel_size, stridestride, paddingpadding) self.bn nn.BatchNorm2d(out_channels) self.act nn.ReLU(inplaceTrue) 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, fs12000, nperseg512, noverlap384): f, t, Zxx stft(signal, fsfs, npersegnperseg, noverlapnoverlap) return np.abs(Zxx) # 返回幅度谱形状为 (freq_bins, time_frames)这里nperseg是窗长noverlap是帧间重叠采样点数。窗长越大频率分辨率越高但时间分辨率越低重叠率越高时间帧越密集。将幅度谱缩放到[0,1]后作为模型输入注意不要使用db单位因为幅度谱的动态范围更小后续BN层更容易稳定。表1给出了可变形卷积与普通卷积在相同输入下的参数与感受野行为对比。卷积类型采样点位置参数来源对时频图形变的适配能力额外计算开销普通卷积固定网格坐标卷积核权重弱无可变形卷积网格坐标偏移量额外卷积预测强低在实际诊断模型中我会把可变形卷积放在网络的前几层而不是最后一层。原因在于浅层特征图中故障瞬态的位置和时频形态还比较具体偏移学习更容易收敛深层特征图经过多次抽象后已失去精确的几何信息偏移量输出容易变成噪声。另一个需要注意的点是偏移量可能过大导致采样区域跨越不同故障特征带因此可以在损失函数中加入偏移量的正则项比如限制其L2范数小于等于核半径的一半。2.4 偏移量可视化的诊断价值可变形卷积的参数是否学到了有意义的采样位置不能只靠准确率判断。我会把每个测试样本的偏移量输出保存为与输入时频图同尺寸的热力图叠加到原始谱图上。对于滚动轴承内圈故障偏移点会沿着冲击出现的时刻和对应频带扩散对于外圈故障因为故障位置相对负载区固定偏移点会集中在某几个固定的角度区间。若偏移量杂乱无章先检查偏移预测卷积的权重初始化。常见做法是将偏移量参数初始化为0相当于开始时就是普通卷积随训练逐步学习偏移。还可以在损失函数中加入偏移量正则项避免偏移量过大。这里给出一个正则项的示例def offset_regularization(offset, base_kernel3, grid_range2.0): return torch.mean(torch.clamp(offset.abs() - grid_range, min0.0) ** 2)这个函数计算偏移量中超过规则网格范围的比例作为额外的损失。超参数grid_range取核半径比如3x3卷积核最大合理偏移量是1.5再大就可能跳到无关特征区。加入该正则项后模型精度通常会略微下降但稳定性提升在变工况测试集中表现更明显。2.5 可变形卷积的训练稳定性与初始化可变形卷积的训练比普通卷积更容易出现梯度波动因为偏移量参与坐标采样梯度要经过采样位置回传。如果偏移量预测网络的学习率与主干网络相同模型可能在早期就产生很大的偏移量导致感受野完全偏离故障区域。常见做法是将偏移预测卷积的权重初始化成接近零的分布并让偏置初始化为0使训练初期等效于普通卷积。另一个技巧是为主干网络和偏移分支设置不同的学习率比如偏移分支使用0.1倍的主干学习率。在混合精度训练时要小心偏移量数值精度下降建议保持float32。若使用AdamWweight decay不要作用到偏移预测卷积上否则会引入额外的收缩惩罚导致偏移量趋于无穷小失去可变形能力。3. 注意力机制从通道、空间到时序的故障特征重标定3.1 SE通道注意力机制与CBAM注意力机制的适用场景注意力机制在故障诊断中的作用是让模型把有限的表达能力用在更关键的特征图上。SE通道注意力机制通过全局平均池化将空间信息压缩成一个通道描述符再用两个全连接层生成每个通道的权重本质上是在通道之间进行非线性重标定。对于轴承振动时频图某个通道可能表示某个频带范围内的能量分布SE权重能突出故障特征频率所在通道。CBAM注意力机制在SE基础上增加了空间注意力分支先做通道注意力再沿通道维度计算空间重要性对不同故障类型的瞬态冲击位置敏感。CA注意力机制则将位置信息嵌入通道注意力中更适合需要精确频率定位的场景。3.2 多头自注意力机制如何处理长距离时序依赖自注意力机制通过查询、键、值的加权组合直接建模任意两个位置之间的依赖关系。多头自注意力机制的原理是把特征分成多个头每个头在不同子空间上计算注意力权重然后拼接起来相当于同时关注时频图中不同尺度的局部模式。在滚动轴承故障诊断中故障冲击信号往往在时间上具有周期性但转速波动会使周期不恒定。多头自注意力能捕捉到这种非严格的周期性依赖比循环神经网络或一维卷积更容易覆盖长时程信号。不过直接对整个时频图用自注意力机制参数量很大常见做法是先将经过卷积层压缩后的特征序列化只对时间步做多头自注意力或者使用窗口形式的自注意力机制。3.3 在诊断模型内集成注意力模块的代码下面是一个轻量级的CBAM模块可以插入到任意卷积块之后。它先执行通道注意力再执行空间注意力输出与输入形状相同class CBAMLayer(nn.Module): def __init__(self, channel, reduction8, spatial_kernel7): super().__init__() self.avg_pool nn.AdaptiveAvgPool2d(1) self.max_pool nn.AdaptiveMaxPool2d(1) self.mlp nn.Sequential( nn.Conv2d(channel, channel // reduction, 1, biasFalse), nn.ReLU(inplaceTrue), nn.Conv2d(channel // reduction, channel, 1, biasFalse)) self.sigmoid_channel nn.Sigmoid() self.spatial_conv nn.Conv2d(2, 1, kernel_sizespatial_kernel, paddingspatial_kernel // 2, biasFalse) 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, dim1, keepdimTrue) max_spatial, _ torch.max(x, dim1, keepdimTrue) spatial_feat torch.cat([avg_spatial, max_spatial], dim1) 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_deformTrue, attention_typecbam): 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_size3, padding1)) blocks.append(nn.BatchNorm2d(64)) blocks.append(nn.ReLU(inplaceTrue)) 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-5batch size取32。4.2 验证模型时看哪些指标更可靠准确率在类别均衡时不敏感建议同时统计宏平均F1、召回率以及每类混淆矩阵。更重要的验证方式是用t-SNE对最后一层特征做降维可视化观察不同故障类型在特征空间是否成簇。若可变形卷积的偏移量可视化后集中在故障频带附近说明学到的几何形变是有效的。绘制t-SNE时将perplexity设为30迭代200次避免高维特征被压缩成杂乱的一团。表3给出了常见的验证工具与关注点。验证内容工具/指标关注点类别区分度准确率、宏F1各类别是否均衡特征聚类t-SNE、UMAP簇间距是否清晰偏移学习效果偏移量热力图是否聚焦于故障瞬态4.3 部署时的模型压缩技巧可变形卷积的自定义算子很多平台不支持导出ONNX后无法直接推理。常见做法是在训练完成后用一个普通卷积层模拟可变形卷积的采样位置然后做知识蒸馏将教师网络输出的特征对齐指导学生网络。若必须保留可变形卷积则使用支持自定义算子的推理引擎或者把可变形卷积固定成静态偏移再导出。为了降低显存占用还可以将注意力机制放置在更靠后的卷积块上并减少多头数量。模型量化时优先量化注意力模块中的全连接层卷积层保留float16精度可以在精度损失小于0.5%的情况下减少约30%的推理时延。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进