轴承故障诊断-MCNN·BIGRU-基于小波变换-MATLAB

完整代码请跳转“轴承故障诊断-MCNN·BIGRU-基于小波变换-MATLAB

一、MCNN(多通道卷积神经网络)

MCNN 是卷积神经网络(CNN)的扩展,其核心特点是多输入通道多分支结构,旨在从不同视角提取特征:

  • 多通道输入:可同时处理不同类型的数据(如文本 + 图像 + 音频)或同一数据的不同表示(如原始信号与变换后信号)。
  • 多分支结构:每个分支使用不同的卷积核大小或参数配置,提取不同尺度的特征,然后融合结果。
  • 优势:增强特征多样性,提高模型对复杂模式的捕捉能力。
二、BiGRU(双向门控循环单元)

BiGRU 是循环神经网络(RNN)的改进变体,专门处理序列数据

  • 双向结构:同时考虑序列的过去和未来信息(前向 + 后向传播),捕捉长距离依赖关系。
  • 门控机制:通过更新门(Update Gate)和重置门(Reset Gate)控制信息流动,缓解梯度消失问题。
  • 与 LSTM 对比:参数量更少,计算效率更高,适合处理中等长度序列(如振动信号)。
三、MCNN-BiGRU 混合架构

将 MCNN 的空间特征提取能力与 BiGRU 的时序建模能力相结合:

  1. 分工协作
    • MCNN:通过多分支处理不同类型的特征(如时域信号与频域特征)。
    • BiGRU:将 MCNN 提取的特征视为序列,捕捉信号随时间的变化模式。
  2. 典型应用场景
    • 故障诊断:分析轴承振动信号的时变特征。
    • 语音识别:结合声学特征与时序上下文。
    • 视频分析:处理空间(帧)与时间(动作)信息。
四、注意力机制(Attention)

在 MCNN-BiGRU 中常引入注意力机制,动态分配权重到不同的特征:

  • 全局注意力:计算整个序列的权重分布,聚焦关键时间点。
  • 自注意力:序列内部元素间的关联计算,捕捉复杂依赖关系。
  • 作用:提升对重要故障特征的敏感度,抑制噪声干扰。
五、与其他架构的对比
架构优势适用场景
MCNN多视角特征提取多模态数据或复杂特征建模
BiGRU时序依赖建模时间序列预测、语音处理
MCNN-BiGRU空间 + 时间特征联合建模故障诊断、视频理解
MCNN-SVM特征提取 + 强分类器小样本、高维数据分类
六、轴承故障诊断中的应用逻辑
  1. MCNN 分支设计
    • 一个分支处理原始时域振动信号。
    • 另一个分支处理小波变换后的频域特征。
  2. BiGRU 时序分析
    • 将 MCNN 提取的特征按时间步输入 BiGRU。
    • BiGRU 学习故障发展的时序模式(如裂纹扩展)。
  3. 注意力增强
    • 通过注意力权重突出故障特征明显的时间段(如冲击响应)。
    • 提高对早期微弱故障的检测能力。
七、关键公式与数学表达
  1. 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​ 为隐藏状态。

  2. 注意力权重计算
    αt​=∑i=1T​exp(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) 的优势:

  1. MCNN 架构:保留了双分支结构,分别处理原始时域信号和小波变换特征,充分提取多维度特征

  2. BiGRU 时序建模:利用双向 GRU 捕获信号中的长短期依赖关系,特别适合分析轴承振动信号的时序特性

  3. 注意力机制:引入注意力权重,自动聚焦于故障特征明显的时间段,提高诊断精度

  4. 特征融合策略:MCNN 提取的空间特征被重塑为序列格式,作为 BiGRU 的输入,实现空间 - 时间特征的联合建模

主要改进点:

  • 设计了适合时序信号处理的 MCNN-BiGRU 混合架构
  • 实现了注意力机制,增强对关键故障特征的敏感性
  • 添加了注意力权重可视化功能,便于理解模型决策依据
  • 优化了特征提取与传递流程,提高模型表达能力

该系统在轴承故障诊断任务中具有以下优势:

  • 同时利用信号的空间特征和时序特征
  • 对非平稳振动信号具有更强的适应性
  • 注意力机制有助于发现早期微弱故障特征
  • 双向 GRU 能够捕捉信号中的双向依赖关系,提高故障定位精度

完整代码请跳转“轴承故障诊断-MCNN·BIGRU-基于小波变换-MATLAB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值