完整代码请跳转“轴承故障诊断-MCNN·BIGRU-基于小波变换-MATLAB”
一、MCNN(多通道卷积神经网络)
MCNN 是卷积神经网络(CNN)的扩展,其核心特点是多输入通道或多分支结构,旨在从不同视角提取特征:
- 多通道输入:可同时处理不同类型的数据(如文本 + 图像 + 音频)或同一数据的不同表示(如原始信号与变换后信号)。
- 多分支结构:每个分支使用不同的卷积核大小或参数配置,提取不同尺度的特征,然后融合结果。
- 优势:增强特征多样性,提高模型对复杂模式的捕捉能力。
二、BiGRU(双向门控循环单元)
BiGRU 是循环神经网络(RNN)的改进变体,专门处理序列数据:
- 双向结构:同时考虑序列的过去和未来信息(前向 + 后向传播),捕捉长距离依赖关系。
- 门控机制:通过更新门(Update Gate)和重置门(Reset Gate)控制信息流动,缓解梯度消失问题。
- 与 LSTM 对比:参数量更少,计算效率更高,适合处理中等长度序列(如振动信号)。
三、MCNN-BiGRU 混合架构
将 MCNN 的空间特征提取能力与 BiGRU 的时序建模能力相结合:
- 分工协作:
- MCNN:通过多分支处理不同类型的特征(如时域信号与频域特征)。
- BiGRU:将 MCNN 提取的特征视为序列,捕捉信号随时间的变化模式。
- 典型应用场景:
- 故障诊断:分析轴承振动信号的时变特征。
- 语音识别:结合声学特征与时序上下文。
- 视频分析:处理空间(帧)与时间(动作)信息。
四、注意力机制(Attention)
在 MCNN-BiGRU 中常引入注意力机制,动态分配权重到不同的特征:
- 全局注意力:计算整个序列的权重分布,聚焦关键时间点。
- 自注意力:序列内部元素间的关联计算,捕捉复杂依赖关系。
- 作用:提升对重要故障特征的敏感度,抑制噪声干扰。
五、与其他架构的对比
架构 | 优势 | 适用场景 |
---|---|---|
MCNN | 多视角特征提取 | 多模态数据或复杂特征建模 |
BiGRU | 时序依赖建模 | 时间序列预测、语音处理 |
MCNN-BiGRU | 空间 + 时间特征联合建模 | 故障诊断、视频理解 |
MCNN-SVM | 特征提取 + 强分类器 | 小样本、高维数据分类 |
六、轴承故障诊断中的应用逻辑
- MCNN 分支设计:
- 一个分支处理原始时域振动信号。
- 另一个分支处理小波变换后的频域特征。
- BiGRU 时序分析:
- 将 MCNN 提取的特征按时间步输入 BiGRU。
- BiGRU 学习故障发展的时序模式(如裂纹扩展)。
- 注意力增强:
- 通过注意力权重突出故障特征明显的时间段(如冲击响应)。
- 提高对早期微弱故障的检测能力。
七、关键公式与数学表达
-
GRU 单元更新:
zt=σ(Wz⋅[ht−1,xt])
rt=σ(Wr⋅[ht−1,xt])
h~t=tanh(W⋅[rt⊙ht−1,xt])
ht=(1−zt)⊙ht−1+zt⊙h~t
其中,zt 为更新门,rt 为重置门,ht 为隐藏状态。 -
注意力权重计算:
αt=∑i=1Texp(score(hi,st−1))exp(score(ht,st−1))
其中,score 函数常用点积或多层感知机实现。
八、总结
MCNN-BiGRU 结合了空间特征提取与时序建模能力,特别适合处理轴承振动等非平稳信号。通过注意力机制的增强,模型能够自动关注故障特征显著的区域,提高诊断准确率和鲁棒性。在实际应用中,该架构对早期故障检测、多故障类型识别等场景具有明显优势。
%% 轴承故障诊断 - 基于MCNN-BiGRU
clear all; close all; clc;
%% 参数设置
waveletName = 'db4'; % 小波基函数
decompLevel = 5; % 分解层数
samplingFreq = 12000; % 采样频率(Hz)
dataLength = 1024; % 每个样本长度
trainRatio = 0.7; % 训练集比例
batchSize = 64; % 批大小
maxEpochs = 50; % 最大训练轮次
hiddenSize = 128; % BiGRU隐藏层大小
%% 1. 数据加载与预处理
fprintf('加载数据并进行预处理...\n');
data = loadBearingData(); % 自定义函数加载轴承数据
classes = unique(data.labels);
numClasses = length(classes);
% 划分训练集和测试集
[trainData, testData] = splitData(data, trainRatio);
%% 2. 多尺度小波变换特征提取
fprintf('执行多尺度小波变换特征提取...\n');
[trainFeaturesTime, trainFeaturesWavelet] = multiScaleFeatureExtraction(trainData.signals, waveletName, decompLevel);
[testFeaturesTime, testFeaturesWavelet] = multiScaleFeatureExtraction(testData.signals, waveletName, decompLevel);
%% 3. 数据格式转换为MCNN-BiGRU输入
fprintf('准备MCNN-BiGRU训练数据...\n');
[XTrainTime, XTrainWavelet, YTrain] = prepareDataForMCNN(trainFeaturesTime, trainFeaturesWavelet, trainData.labels, dataLength);
[XTestTime, XTestWavelet, YTest] = prepareDataForMCNN(testFeaturesTime, testFeaturesWavelet, testData.labels, dataLength);
%% 4. 构建MCNN-BiGRU模型
fprintf('构建MCNN-BiGRU模型...\n');
mcnn_bigru = buildMCNNBIGRUModel(dataLength, hiddenSize, numClasses);
%% 5. 设置训练选项
options = trainingOptions('adam', ...
'InitialLearnRate', 0.001, ...
'MaxEpochs', maxEpochs, ...
'MiniBatchSize', batchSize, ...
'Shuffle', 'every-epoch', ...
'ValidationData', {XTestTime, XTestWavelet, YTest}, ...
'ValidationFrequency', 30, ...
'Verbose', false, ...
'Plots', 'training-progress');
%% 6. 训练MCNN-BiGRU模型
fprintf('开始训练MCNN-BiGRU模型...\n');
net = trainNetwork({XTrainTime, XTrainWavelet}, YTrain, mcnn_bigru, options);
%% 7. 模型评估
fprintf('评估模型性能...\n');
YPred = classify(net, {XTestTime, XTestWavelet});
accuracy = mean(YPred == YTest);
fprintf('测试集准确率: %.2f%%\n', accuracy*100);
% 混淆矩阵
cm = confusionmat(YTest, YPred);
plotconfusion(YTest, YPred);
title(['混淆矩阵 (准确率: ' num2str(accuracy*100) '% )']);
%% 8. 故障特征可视化与分析
visualizeNetwork(net);
visualizeClassificationResults(YPred, YTest, classes);
plotAttentionWeights(net, {XTestTime, XTestWavelet}, YTest);
%% 自定义函数: 构建MCNN-BiGRU模型
function mcnn_bigru = buildMCNNBIGRUModel(inputSize, hiddenSize, numClasses)
% 时域信号分支
timeBranch = [
imageInputLayer([inputSize 1 1], 'Name', 'timeInput')
convolution2dLayer([16 1], 16, 'Padding', 'same', 'Name', 'timeConv1')
batchNormalizationLayer('Name', 'timeBN1')
reluLayer('Name', 'timeReLU1')
maxPooling2dLayer([2 1], 'Stride', [2 1], 'Name', 'timePool1')
convolution2dLayer([8 1], 32, 'Padding', 'same', 'Name', 'timeConv2')
batchNormalizationLayer('Name', 'timeBN2')
reluLayer('Name', 'timeReLU2')
maxPooling2dLayer([2 1], 'Stride', [2 1], 'Name', 'timePool2')
];
% 小波变换分支
waveletBranch = [
imageInputLayer([inputSize 1 1], 'Name', 'waveletInput')
convolution2dLayer([16 1], 16, 'Padding', 'same', 'Name', 'waveConv1')
batchNormalizationLayer('Name', 'waveBN1')
reluLayer('Name', 'waveReLU1')
maxPooling2dLayer([2 1], 'Stride', [2 1], 'Name', 'wavePool1')
convolution2dLayer([8 1], 32, 'Padding', 'same', 'Name', 'waveConv2')
batchNormalizationLayer('Name', 'waveBN2')
reluLayer('Name', 'waveReLU2')
maxPooling2dLayer([2 1], 'Stride', [2 1], 'Name', 'wavePool2')
];
% 特征融合层
fusionLayers = [
convolution2dLayer([4 1], 64, 'Padding', 'same', 'Name', 'fusionConv')
batchNormalizationLayer('Name', 'fusionBN')
reluLayer('Name', 'fusionReLU')
% 重塑为序列格式供BiGRU处理
reshapeLayer([inputSize/4 1 64 1], 'Name', 'reshape')
permuteLayer([1 3 2 4], 'Name', 'permute')
sequenceInputLayer([64 1], 'Name', 'sequenceInput')
];
% BiGRU层
bigruLayers = [
bidirectionalLayer(gruLayer(hiddenSize, 'OutputMode', 'sequence'), 'Name', 'bigru')
% 注意力机制
sequenceFoldingLayer('Name', 'fold')
fullyConnectedLayer(1, 'Name', 'attentionFC')
softmaxLayer('Name', 'attentionSoftmax')
sequenceUnfoldingLayer('Name', 'unfold')
elementWiseProductLayer(2, 'Name', 'weightedFeatures')
globalAveragePooling1dLayer('Name', 'globalPool')
fullyConnectedLayer(numClasses, 'Name', 'fc')
softmaxLayer('Name', 'softmax')
classificationLayer('Name', 'classoutput')
];
% 连接多分支
mcnn_bigru = layerGraph([timeBranch; waveletBranch; fusionLayers; bigruLayers]);
% 合并两个分支的输出
mcnn_bigru = connectLayers(mcnn_bigru, 'timePool2', 'fusionConv');
mcnn_bigru = connectLayers(mcnn_bigru, 'wavePool2', 'fusionConv');
mcnn_bigru = connectLayers(mcnn_bigru, 'fusionReLU', 'reshape');
mcnn_bigru = connectLayers(mcnn_bigru, 'permute', 'sequenceInput');
mcnn_bigru = connectLayers(mcnn_bigru, 'sequenceInput', 'bigru');
mcnn_bigru = connectLayers(mcnn_bigru, 'bigru', 'fold');
mcnn_bigru = connectLayers(mcnn_bigru, 'fold', 'attentionFC');
mcnn_bigru = connectLayers(mcnn_bigru, 'attentionSoftmax', 'unfold');
mcnn_bigru = connectLayers(mcnn_bigru, 'unfold', 'weightedFeatures');
mcnn_bigru = connectLayers(mcnn_bigru, 'bigru', 'weightedFeatures/in2');
end
%% 自定义函数: 绘制注意力权重
function plotAttentionWeights(net, X, Y)
% 提取注意力权重
layerName = 'attentionSoftmax';
attentionWeights = activations(net, X, layerName, 'OutputAs', 'rows');
% 选择一个样本进行可视化
idx = randperm(size(attentionWeights, 1), 1);
sampleWeights = reshape(attentionWeights(idx,:), [], 1);
% 绘制注意力权重分布
figure('Name', '注意力权重可视化');
plot(1:length(sampleWeights), sampleWeights, 'LineWidth', 2);
title(['样本 ', num2str(idx), ' 的注意力权重分布 (类别: ', char(Y(idx)), ')']);
xlabel('时间步');
ylabel('注意力权重');
grid on;
end
该代码实现了一个基于 MCNN-BiGRU 的轴承故障诊断系统,结合了多通道卷积神经网络 (MCNN) 和双向门控循环单元 (BiGRU) 的优势:
-
MCNN 架构:保留了双分支结构,分别处理原始时域信号和小波变换特征,充分提取多维度特征
-
BiGRU 时序建模:利用双向 GRU 捕获信号中的长短期依赖关系,特别适合分析轴承振动信号的时序特性
-
注意力机制:引入注意力权重,自动聚焦于故障特征明显的时间段,提高诊断精度
-
特征融合策略:MCNN 提取的空间特征被重塑为序列格式,作为 BiGRU 的输入,实现空间 - 时间特征的联合建模
主要改进点:
- 设计了适合时序信号处理的 MCNN-BiGRU 混合架构
- 实现了注意力机制,增强对关键故障特征的敏感性
- 添加了注意力权重可视化功能,便于理解模型决策依据
- 优化了特征提取与传递流程,提高模型表达能力
该系统在轴承故障诊断任务中具有以下优势:
- 同时利用信号的空间特征和时序特征
- 对非平稳振动信号具有更强的适应性
- 注意力机制有助于发现早期微弱故障特征
- 双向 GRU 能够捕捉信号中的双向依赖关系,提高故障定位精度
完整代码请跳转“轴承故障诊断-MCNN·BIGRU-基于小波变换-MATLAB”