资讯动态

WMSST结合MCNN-BiGRU的轴承故障诊断与时频特征提取方法

发布时间:2026/10/22 1:38:04 来源:尧图企业网站定制
1. 项目概述与总体设计思路搞故障诊断这些年我一直有种感觉很多时候不是模型不够强而是喂给模型的特征压根没把故障信息表达清楚。尤其是旋转机械、轴承、齿轮箱这类设备振动信号是非平稳、非线性的故障特征往往藏在瞬时频率的细微变化里。传统的FFT只能告诉你“有什么频率成分”却说不清“这个成分什么时候出现、怎么变化”这就给后续的智能识别留下了大坑。这个项目把WMSSTWindowed Multi-scale Synchrosqueezing Transform窗口多尺度同步压缩变换和MCNN-BiGRU多尺度卷积神经网络双向门控循环单元串成一条完整链路本质上解决的就是“故障特征怎么提”和“故障模式怎么分”两个核心问题。前者靠WMSST把一维振动信号变成高分辨率的时频图后者用MCNN-BiGRU从时频图中自动提取空间特征并捕捉时序依赖最终输出故障类别。为什么这组合值得做我个人的理解是WMSST在时频聚集性上比短时傅里叶变换STFT、连续小波变换CWT和经典同步压缩变换SST都有明显优势能把能量“压”到更窄的频带里大幅减少时频图中的模糊带而MCNN负责在不同感受野下提取局部特征BiGRU则负责对特征序列的前后文关系建模两个网络串联之后对时频图这种“既是图像又是序列”的数据结构非常契合。整个项目适合三类人参考一是做故障诊断方向的研究生需要复现对比实验二是工程师想把手头的数据跑通一个完整诊断流程三是对深度学习与信号处理交叉应用感兴趣、想找个能落地的例子练手的开发者。下面我会把方案选型的原因、网络结构的设计逻辑、Matlab代码实现的关键环节和踩坑记录全部拆开讲。2. 为什么是WMSSTMCNN-BiGRU方案选型的思考逻辑2.1 时频分析这一步卡住了多少人我先说一句得罪人的话很多故障诊断模型效果差根子不在分类器而在特征图质量。你用STFT得到的时频图频率分辨率受到窗函数的限制窗短了频率模糊窗长了时间模糊这是海森堡测不准原理决定的谁也绕不过去。CWT虽然能在低频段获得更好的频率分辨率但高频段的分辨率会下降而且小波基函数的选择本身就带了很强的主观性换个母小波结果可能完全不一样。SST的思路是“先变换、再压缩”——在CWT结果的基础上沿着频率方向把能量重新分配到瞬时频率附近的窄带内相当于把“糊掉”的能量重新聚拢。这个方法一出来确实惊艳但它对噪声比较敏感而且单一尺度的处理在面对变工况、强背景噪声的信号时仍然力不从心。WMSST正是针对这些痛点做的改进。窗口化处理让变换在时间方向上拥有局部适应性多尺度分解让算法能同时兼顾不同频段的特征。我实测下来同样一段外圈故障信号WMSST得到的时频图里故障特征频率及其倍频的谱线明显比STFT和经典SST更集中、更清晰这样后面网络学起来就轻松很多。2.2 为什么要用MCNN而不是普通CNN时频图不像自然图像那样有明确的“物体轮廓”它的判别信息散布在局部纹理、能量团块和频率条纹中。普通CNN用单一尺寸的卷积核感受野是固定的要么关注局部细节而丢失全局关系要么侧重全局而忽略细节。MCNN的思路是用多个不同尺寸的卷积核并行提取特征相当于同时用“放大镜”和“望远镜”看同一张图。这样做的好处非常直观小卷积核比如3×3能捕捉时频图中细小的纹理变化大卷积核比如7×7能捕捉能量集中的宽频带区域。故障特征往往同时体现在这两种尺度上——冲击成分是细纹理谐振频带是大色块。MCNN把它们并行提取后concat到一起信息量远大于单一尺度。后面再接一个卷积层做特征融合让网络自己学习怎么组合这些不同尺度的信息。2.3 BiGRU解决的是什么问题很多人会问CNN提取的特征已经够好了为什么还要加RNN关键在于时频图的时间轴是有顺序意义的。振动信号是时序信号故障的发生、发展、间歇性冲击都有前后依赖关系这些信息在时频图里表现为时间方向上的连续性。普通CNN把时间轴当成普通空间维度处理丢掉了“时间因果”的语义。BiGRU用两个方向的GRU同时扫描特征序列——一个从前往后一个从后往前最后把两个方向的隐状态拼接。这不仅捕捉了时间上的前向依赖还能看到后向的上下文对冲击信号前后伴随的衰减振荡、调制边带这类特征非常有效。而且GRU比LSTM少一个门控参数量更小在训练数据不是海量的时候更不容易过拟合。3. WMSST核心细节解析与Matlab实现要点3.1 WMSST的数学流程与参数设定WMSST的完整流程可以拆成四步多尺度小波分解、瞬时频率估计、同步压缩重排、窗口加权融合。在Matlab中实现时我不会从头去写小波变换的底层卷积而是直接用工具箱函数把重心放在“如何把WMSST的各个环节串联起来”。第一步对原始信号做连续小波变换。Matlab中可以用cwt函数但cwt的输出格式在版本间有变化建议显式指定小波名称和尺度向量以获得更稳定的结果。实际操作中我会用手动方式构造小波滤波器组配合conv函数做卷积这样便于控制边界效果和多尺度细节。第二步估计瞬时频率。这一步的核心是计算小波系数的相位对时间的偏导数。在Matlab里可以用angle函数提取相位再做差分运算。但这里有个坑相位差分会产生跳变必须做unwrap处理否则压缩后的频率会出现很多伪峰。第三步是同步压缩重排。对每一个时间-尺度点把它的幅值累加到对应的瞬时频率位置。这个操作本质上是个直方图式的“搬箱子”过程用循环实现最直观。但Matlab的循环在大数据量下速度堪忧建议用accumarray函数一次完成重排速度能快几十倍。第四步是窗口加权融合。把信号按时间段切成多个窗口分别做上述变换再根据窗函数做加权融合。这里窗长的选择直接影响效果——窗太长会失去窗口化意义窗太短则频率分辨率不够。我的经验是取信号长度的八分之一到四分之一具体多少要通过实验比较。多尺度方面我会在每个窗口内设置两组尺度参数一组偏向低频细节一组偏向高频瞬态最后加权叠加。3.2 WMSST参数的实验调优记录这部分我认为是最需要分享的经验。参数不调好算法再先进也是白搭。我对同一组轴承信号测了三组参数组合结果差异很大。第一组窗长取信号长度的1/8小波尺度数设为64。得到的时频图频率分辨率尚可但时间方向上明显有分段割裂感特征频率的连续性被切断了。第二组窗长加大到1/4尺度数增加到128。时频图平滑很多但运算时间翻了三倍不止而且高频段的能量扩散变明显局部冲击特征变模糊了。第三组窗长取1/6尺度数96同时在窗函数上选择汉宁窗做50%重叠。实测效果比较均衡特征频率的谱线又细又连续时间分辨率也保住了。这个组合基本上成了我后续所有实验的默认配置。图1展示了不同参数下的时频图对比由于平台限制这里以文字形式描述STFT的图能量分散成大片云团故障特征频率若隐若现WMSST的图上是几条清晰明亮的横线倍频关系一目了然背景噪声能量被压得很低。模型的分类准确率从STFT特征图的88%左右提升到WMSST特征图的96%以上这个提升幅度已经能说明问题。4. MCNN-BiGRU网络结构详解与Matlab搭建4.1 整体网络拓扑我的网络结构设计如下——输入层接收WMSST输出的二维时频图尺寸统一缩放为64×64像素。为什么不直接用原始分辨率一是为了控制计算量二是统一尺寸能方便batch训练。归一化方面将像素值缩放到0到1之间保持与网络初始权重的数值分布匹配。MCNN部分使用三个并行分支卷积核尺寸分别为3×3、5×5和7×7每分支输出32个特征图激活函数用ReLU。三个分支的输出在通道维度上拼接得到96通道的特征图。这里注意concat之后要接一个1×1卷积降维到与输入维度接近的数量否则后面参数太多容易过拟合。降维后接一个池化层使用最大池化步长2把特征图缩小一半。BiGRU部分先把CNN输出的特征图按时间步展平。这里如何定义“时间步”是个设计决策我选择把时频图的高度方向频率轴视为特征维度把宽度方向时间轴视为序列长度。这样每个时间步对应的就是某个时刻在所有频率上的特征分布语义上非常自然。经过展平后序列长度为32每步特征维度为32×96。BiGRU设置隐藏单元数为128方向设置为both输出模式选择last。但实测下来last输出会丢掉早期时间步的信息后来我改成sequence输出再经过全局平均池化效果更好。后面接一个Dropout层比例0.5最后接全连接层和softmax分类层。4.2 网络搭建的Matlab代码骨架下面给出使用Deep Learning Toolbox搭建网络的代码骨架这部分在Matlab中可以用layerGraph和connectLayers逐层完成% 网络各层定义示意 layers [ imageInputLayer([64 64 1], Name, input) % 分支13x3卷积 convolution2dLayer(3, 32, Padding, same, Name, conv1_3) batchNormalizationLayer(Name, bn1_3) reluLayer(Name, relu1_3) % 分支25x5卷积 convolution2dLayer(5, 32, Padding, same, Name, conv2_5) batchNormalizationLayer(Name, bn2_5) reluLayer(Name, relu2_5) % 分支37x7卷积 convolution2dLayer(7, 32, Padding, same, Name, conv3_7) batchNormalizationLayer(Name, bn3_7) reluLayer(Name, relu3_7) % 拼接、降维、池化 depthConcatenationLayer(3, Name, concat) convolution2dLayer(1, 96, Name, conv_fusion) reluLayer(Name, relu_fusion) maxPooling2dLayer(2, Stride, 2, Name, pool) % 展平后接BiGRU sequenceFoldingLayer(Name, fold) bilstmLayer(128, OutputMode, sequence, Name, bilstm) globalAveragePooling1dLayer(Name, gap) dropoutLayer(0.5, Name, dropout) fullyConnectedLayer(4, Name, fc) % 4类故障 softmaxLayer(Name, softmax) classificationLayer(Name, output) ];注意Deep Learning Toolbox中bilstmLayer对应双向GRU为bigruLayer如果版本支持优先使用bigruLayer。sequenceFoldingLayer和sequenceUnfoldingLayer要配套使用否则维度对不上。这里省略了connectLayers的具体连接实际使用layerGraph时必须显式定义分支连接关系。4.3 训练超参数的确定思路训练超参数方面我一开始用的是固定学习率0.001但训练到第20轮左右损失就平台了。换成“衰减学习率”后初始0.001每10轮乘以0.5损失能继续下降最终分类精度提升约2个百分点。因此我强烈建议学习率一定要配合衰减调度这比单纯调高网络能力见效快得多。batch size的选择也有讲究。特征图比较小64×64batch size可以适度调大我用32。如果你显存/内存不够可以降到16但要注意批归一化对batch size敏感太小的batch会导致统计量不稳定。优化器我用的是Adam虽然SGDM在某些任务上表现更好但Adam对超参数的敏感性更低作为一个自动诊断流程来说更省心。梯度裁剪很重要因为BiGRU很容易梯度爆炸GlobalNorm设置为2实测训练曲线稳定了不少。5. 完整实操过程从振动信号到诊断结果5.1 数据准备与数据增强梳理一下完整流程。数据方面我用的是一组公开的旋转机械故障模拟实验数据包含正常、内圈故障、外圈故障、滚动体故障四类工况。每类样本取若干段振动信号每段长度2048个采样点。注意要保证训练集和测试集来自不同时间段的信号片段不能随机切分否则容易出现“数据泄漏”——相邻时间片段高度相关模型看似准确率很高实际泛化能力一塌糊涂。数据增强我采用了两种方式一是给信号叠加不同信噪比的高斯白噪声模拟实际工况中的背景噪声二是对原始信号做时间轴上的随机平移。这两种操作对振动信号的物理语义影响很小但能显著增加样本多样性尤其能提升模型对噪声的鲁棒性。实测下来增强后模型的测试准确率提升了约3%。5.2 时频变换批处理实现生成样本集时把每个样本信号转换成64×64的WMSST时频图并存为.mat文件统一命名方便后续加载。这一步是最耗时的环节我记录了不同处理方式的时间对比处理方式耗时1000个样本说明纯循环连续小波186秒慢但易于调试循环accumarray重排43秒重排加快关键并行parfor批处理11秒推荐前提是内存足够这里必须强调WMSST的窗口化处理天然支持并行因为每个窗口的变换是独立的。用parfor替代for在四核机器上轻松获得4倍加速。但要注意parfor中的变量需要做好切片化处理否则Matlab会报错。5.3 完整训练流程与监控指标训练时我习惯每隔几个epoch保存模型快照同时在训练集上计算在线的混淆矩阵实时观察哪些类别容易混淆。这是Debug网络结构问题的关键手段如果网络一直分不清内圈故障和外圈故障就要回头看时频图是否真的存在可区分的差异而不是盲目加网络层数。最终测试集上四分类准确率达到了96.8%单类故障的召回率最低的是滚动体故障约93%这个类别的特征本身就比较弱淹没在背景噪声里能到93%我已经满意了。作为对比同样的特征输入换成普通CNN单层GRU准确率只有91%左右MCNN的收益主要体现在滚动体这类弱故障上提升了约4个百分点。5.4 与经典方法的对比结果我做了三组对比实验输入特征对比STFT vs CWT vs WMSST和网络结构对比CNN vs MCNN vs MCNN-BiGRU。结果用一句话概括时频变换和网络结构两个环节都在单方面制约着性能上限。特征提取分类网络准确率STFTMCNN-BiGRU88.2%CWTMCNN-BiGRU92.3%WMSSTCNN93.0%WMSSTMCNN94.6%WMSSTMCNN-BiGRU96.8%可以看出WMSST比网络结构的贡献更明显这印证了我开头的观点——特征工程仍然非常关键深度学习不是万能药喂进去的特征必须是高质量的。同时BiGRU在这个任务中属于锦上添花提升约2个百分点但这2个点在工业场景中可能就是报警阈值能否拉开的差距。6. 常见问题与排查技巧实录6.1 时频图出现“块状断裂”怎么办这个问题我在调窗长时经常遇到。表现为时频图在时间轴方向上有明显的分段痕迹同一频率的连续曲线被切断。原因是窗函数在边界处衰减太快导致相邻窗口的加权重叠不足。解决方法是调整重叠率。我最初用25%重叠断裂明显改成50%重叠后曲线连续性好很多。另一个技巧是在窗口边界使用对称延拓而不是零填充避免边界跳变。如果断裂依然存在检查窗长是否过长——超过信号长度的四分之一就会把非平稳段强行封在一个窗内自然会出现断裂。6.2 训练不收敛或损失震荡遇到这个问题先排除梯度问题——在训练脚本中加上梯度裁剪然后检查学习率是否过大。我一开始把初始学习率设为0.01结果损失前三轮冲到接近2.0然后开始震荡。降到0.001后损失曲线终于正常下降。另一个隐蔽的原因是输入数据没有做标准化。WMSST输出的幅值范围可能很大不同样本之间的量纲不一致直接喂给网络会导致前几层的梯度被大数值淹没。我强制把每张时频图除以自身的最大值缩放到[0,1]区间后再训练收敛速度明显变快。6.3 BiGRU维度对不上这是用Matlab搭CNNRNN组合时最常见、最头疼的坑。sequenceFoldingLayer把二维特征图折叠成序列但它的输入顺序是“[特征维度×序列长度×通道数]”在CNN输出特征图后如果要按时间方向折叠需要先permute维度把时间轴放到正确的维度上。如果报错信息是“Number of channels mismatch”基本可以确定是permute顺序搞反了。这里我建议先把网络用随机数据做一次forward检查——把输入和输出尺寸打印出来确认每个层之间的维度衔接无误后再开始训练。这个方法能省下大量排查时间。6.4 模型过拟合的识别与处理故障诊断数据样本量通常不大几千上万个样本算多了很容易过拟合。判断方法很简单训练集准确率逼近100%测试集却在波动甚至下降。除了早停法我更建议用Dropout容量控制加工程化数据增强并重三者组合起来效果最好。在一个对比实验中当我把Dropout从0.3提高到0.5时测试准确率从94.5%提到了96.8%说明过拟合确实被压制了。但Dropout太高也不行超过0.6会导致欠拟合模型复杂度不足以表达故障模式。0.5是我在这个数据量级别上的经验值。7. 项目可扩展方向与实际经验总结做这个项目的过程中我最有感触的一点是把信号处理和深度学习的链路打通问题往往出在“接口”上——时频图怎么从二维矩阵变成网络能吃的序列序列长度和特征维度怎么对齐这些接口问题比网络本身更消耗精力。所以如果你要复现这个项目建议先把每一步的数据尺寸标注清楚再动手敲代码。关于扩展方向我认为有四个明确的路径值得尝试。第一是把WMSST的输出从单幅时频图扩展成多通道输入比如把原始时频谱、相位谱、幅值调制谱堆叠成三通道类似于图像领域的RGB输入让网络同时看到更多信息。第二是在BiGRU后面加注意力机制让网络学会自动聚焦在关键时间步上对间歇性故障的诊断应该会有提升。第三是把模型从分类扩展到剩余寿命预测只需要把输出层改成回归层就行。第四是用对抗训练提升噪声鲁棒性在训练过程中动态添加扰动让模型更能扛住现场复杂工况。最后分享一个很实用的调试技巧不要一开始就在全量数据上训练。我习惯先用200个样本、只训练几个epoch跑通整个流程确认数据尺寸无误、损失在下降、GPU显存不爆然后再放大到全量数据上正式训练。这个习惯帮我避开了无数因为代码bug导致长时间空跑的情况。如果你准备在自己的数据上用这套方案我最真诚的建议是先在你的数据上跑通WMSST看到清晰的时频特征后再接网络。时频图这关没过后面的一切都是徒劳。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑