完整代码请跳转“轴承故障诊断-MCNN-基于小波变换-MATLAB”
一、基本概念对比
-
CNN(卷积神经网络)
是一种典型的深度学习模型,核心在于通过卷积层提取数据的空间特征,结合池化层降维,最终通过全连接层完成分类或回归任务。其结构简单高效,广泛应用于图像识别、语音处理等领域。 -
MCNN(多通道卷积神经网络)
并非单一固定架构,通常指多通道输入或多分支网络结构的卷积神经网络,旨在处理多源异构数据或提取更复杂的特征组合。
二、核心区别解析
| 对比维度 | CNN | MCNN(以多通道为例) |
|---|---|---|
| 输入数据形式 | 单通道数据(如灰度图像)或固定维度的多通道数据(如 RGB 三通道) | 支持多源、异构数据输入(如文本 + 图像 + 音频的融合输入),或同一数据的不同特征表示(如同一图像的不同尺度、不同预处理结果) |
| 网络结构设计 | 单一路径的卷积 - 池化 - 全连接层串联 | 包含多个并行分支(通道),每个分支可独立处理特定类型的数据,分支间可能存在信息交互或特征融合 |
| 特征提取方式 | 单一视角提取特征,适合处理结构统一的数据 | 多视角、多尺度提取特征,例如: - 不同分支处理不同分辨率的图像 - 不同通道处理时域和频域的信号特征 |
| 计算复杂度 | 参数量和计算量相对较低 | 因多分支结构,计算复杂度和参数量显著增加,需更多算力支持 |
| 应用场景 | 单模态数据任务(如图像分类、目标检测) | 多模态融合任务(如视频理解、跨模态检索)、复杂特征建模(如医学图像的多序列分析) |
三、MCNN 的典型类型与应用
-
多输入通道 MCNN
- 示例:输入同时包含图像的 RGB 通道和深度通道(如 RGBD 图像),每个通道对应独立的卷积层,最终融合特征。
- 应用:机器人视觉(结合颜色与深度信息进行环境感知)。
-
多分支结构 MCNN
- 示例:Siamese 网络(孪生网络),通过两个对称的 CNN 分支处理输入对(如图像对),计算相似度。
- 应用:目标跟踪、人脸识别中的特征匹配。
-
多尺度特征融合 MCNN
- 示例:使用不同大小的卷积核分支(如 Inception 模块),同时提取局部和全局特征。
- 应用:图像语义分割(兼顾细节与整体结构)。
四、优势与挑战
-
MCNN 的优势
- 适应多源数据融合,提升模型对复杂场景的理解能力。
- 多分支结构可针对性提取不同类型特征,增强模型泛化性。
- 在需要多维度信息的任务中(如医疗诊断),比单通道 CNN 更具优势。
-
MCNN 的挑战
- 结构复杂导致训练难度增加,需更多标注数据和计算资源。
- 多通道特征融合的权重设计需领域知识支撑,否则可能引入噪声。
- 模型部署时对硬件性能要求更高(如边缘计算设备)。
五、总结
CNN 是深度学习的基础架构,适合单模态、结构化数据的特征提取;而 MCNN 通过多通道或多分支设计,突破了单一数据形式的限制,更适用于多模态融合、复杂特征建模的场景。实际应用中,可根据任务需求选择 CNN 的轻量化优势,或利用 MCNN 的多维度特征处理能力提升模型性能。
%% 轴承故障诊断 - 基于小波变换和MCNN
clear all; close all; clc;
%% 参数设置
waveletName = 'db4'; % 小波基函数
decompLevel = 5; % 分解层数
samplingFreq = 12000; % 采样频率(Hz)
dataLength = 1024; % 每个样本长度
trainRatio = 0.7; % 训练集比例
batchSize = 64; % 批大小
maxEpochs = 50; % 最大训练轮次
%% 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);
% 特征可视化(可选)
visualizeMultiFeatures(trainFeaturesTime(1:5,:), trainFeaturesWavelet(1:5,:), trainData.labels(1:5));
%% 3. 数据格式转换为MCNN输入
fprintf('准备MCNN训练数据...\n');
[XTrainTime, XTrainWavelet, YTrain] = prepareDataForMCNN(trainFeaturesTime, trainFeaturesWavelet, trainData.labels, dataLength);
[XTestTime, XTestWavelet, YTest] = prepareDataForMCNN(testFeaturesTime, testFeaturesWavelet, testData.labels, dataLength);
%% 4. 构建MCNN模型
fprintf('构建MCNN模型...\n');
mcnn = buildMCNNModel(dataLength, 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模型
fprintf('开始训练MCNN模型...\n');
net = trainNetwork({XTrainTime, XTrainWavelet}, YTrain, mcnn, 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);
%% 自定义函数: 构建MCNN模型
function mcnn = buildMCNNModel(inputSize, 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')
globalAveragePooling2dLayer('Name', 'globalPool')
fullyConnectedLayer(numClasses, 'Name', 'fc')
softmaxLayer('Name', 'softmax')
classificationLayer('Name', 'classoutput')
];
% 连接多分支
mcnn = layerGraph([timeBranch; waveletBranch; fusionLayers]);
% 合并两个分支的输出
mcnn = connectLayers(mcnn, 'timePool2', 'fusionConv');
mcnn = connectLayers(mcnn, 'wavePool2', 'fusionConv');
end
%% 自定义函数: 多尺度特征提取
function [timeFeatures, waveletFeatures] = multiScaleFeatureExtraction(signals, waveletName, level)
[numSamples, signalLength] = size(signals);
% 1. 时域特征提取
timeFeatures = zeros(numSamples, signalLength);
for i = 1:numSamples
% 归一化处理
timeFeatures(i,:) = normalize(signals(i,:), 'range');
end
% 2. 小波变换特征提取
waveletFeatures = zeros(numSamples, signalLength);
for i = 1:numSamples
% 执行小波分解
[C, L] = wavedec(signals(i,:), level, waveletName);
% 重构信号
waveletReconstruct = waverec(C, L, waveletName);
% 提取小波特征
waveletFeatures(i,:) = normalize(waveletReconstruct, 'range');
end
end
%% 自定义函数: 准备MCNN输入数据
function [XTime, XWavelet, Y] = prepareDataForMCNN(timeFeatures, waveletFeatures, labels, dataLength)
numSamples = size(timeFeatures, 1);
% 重塑时域特征为图像格式
XTime = zeros(dataLength, 1, 1, numSamples);
for i = 1:numSamples
if length(timeFeatures(i,:)') < dataLength
XTime(:,1,1,i) = [timeFeatures(i,:)'; zeros(dataLength-length(timeFeatures(i,:)'), 1)];
else
XTime(:,1,1,i) = timeFeatures(i,:)'(1:dataLength);
end
end
% 重塑小波特征为图像格式
XWavelet = zeros(dataLength, 1, 1, numSamples);
for i = 1:numSamples
if length(waveletFeatures(i,:)') < dataLength
XWavelet(:,1,1,i) = [waveletFeatures(i,:)'; zeros(dataLength-length(waveletFeatures(i,:)'), 1)];
else
XWavelet(:,1,1,i) = waveletFeatures(i,:)'(1:dataLength);
end
end
% 转换标签为分类器格式
Y = categorical(labels);
end
%% 自定义函数: 可视化多特征
function visualizeMultiFeatures(timeFeatures, waveletFeatures, labels)
figure('Name', '多特征可视化');
numSamples = min(size(timeFeatures, 1), 5);
classes = {'正常', '内圈故障', '外圈故障', '滚动体故障'};
for i = 1:numSamples
% 时域特征
subplot(numSamples, 2, 2*i-1);
plot(1:length(timeFeatures(i,:)), timeFeatures(i,:), 'LineWidth', 1.5);
title(['样本 ', num2str(i), ' - 时域特征 - ', classes{labels(i)}]);
xlabel('时间点');
ylabel('幅值');
grid on;
% 小波特征
subplot(numSamples, 2, 2*i);
plot(1:length(waveletFeatures(i,:)), waveletFeatures(i,:), 'LineWidth', 1.5);
title(['样本 ', num2str(i), ' - 小波特征 - ', classes{labels(i)}]);
xlabel('时间点');
ylabel('幅值');
grid on;
end
sgtitle('时域与小波变换特征对比', 'FontSize', 14);
tight_layout;
end





该代码实现了一个基于多通道卷积神经网络 (MCNN) 的轴承故障诊断系统,主要改进在于:
- 多特征融合架构:同时处理原始时域信号和小波变换后的频域特征,通过双分支网络分别提取特征
- MCNN 网络设计:构建了两个独立的 CNN 分支,分别处理时域和频域数据,然后融合特征进行分类
- 增强特征表示:结合了时域波形特征和小波变换提取的时频特征,更全面地描述轴承故障特性
与单通道 CNN 相比,MCNN 能够从多个维度捕获故障特征,提高诊断准确率,特别是对早期微弱故障的检测能力。
主要改进点包括:
- 新增多尺度特征提取函数,同时保留时域和小波特征
- 设计了双分支 MCNN 模型,分别处理不同类型的特征
- 实现了多输入数据准备函数,支持多通道网络输入
- 增强了特征可视化功能,便于分析不同特征的诊断效果
该系统同样支持识别四种轴承状态:正常、内圈故障、外圈故障和滚动体故障,且具有更好的鲁棒性和泛化能力。
完整代码请跳转“轴承故障诊断-MCNN-基于小波变换-MATLAB”

9865

被折叠的 条评论
为什么被折叠?



