【MATLAB第118期】基于MATLAB的双通道CNN多输入单输出分类预测方法

【MATLAB第118期】基于MATLAB的双通道CNN多输入单输出分类预测方法

一、双通道CNN简介

在深度学习领域,卷积神经网络(CNN)凭借其强大的特征提取能力,已成为图像识别、自然语言处理等任务的核心技术。传统单通道CNN在处理单一模态数据时表现出色,但在面对多源异构数据时往往力不从心。双通道CNN分类预测方法通过引入并行特征学习机制,开创性地实现了多维度信息融合,为复杂场景下的智能决策提供了新思路。

1、案例数据

本位使用案例数据输入特征变量为12个,四分类。‌将12维特征分为两组(前6维和后6维),对应不同来源或类型的特征,将每个通道使用独立的卷积网络提取局部特征‌,通过拼接(concatenation)整合双通道信息,增强特征表达能力。双通道CNN架构示意图如下,双通道架构包含两个独立特征提取分支与融合模块。

2. 网络结构特点

‌分支结构差异‌:

通道1使用2x1卷积核,适合捕捉短距离特征模式

通道2使用3x1卷积核,适合捕捉较长距离的依赖关系

‌参数共享‌:各通道独立训练,避免特征混淆

‌融合策略‌:拼接(而非相加)保留更多原始特征信息

3. 性能优化措施

‌归一化处理‌:各通道独立归一化,消除量纲差异

‌正则化‌:L2正则化(1e-4) + Dropout(0.5) 防止过拟合

‌动态学习率‌:初始学习率1e-3,每40轮衰减为原来的0.1倍

程,实现了对复杂特征组合的有效建模,在保持较高参数效率的同时提升了模型表达能力。

二、部分代码展示

matlab 复制代码
%% 环境初始化
clc; clear; close all; % 清除命令窗口、工作区变量和关闭所有图形窗口
warning off           % 关闭警告提示

%% 数据加载与预处理(示例数据集)
% 生成演示数据(替换为实际数据)
res = xlsread("分类数据集.xlsx"); % 读取Excel格式的分类数据集
numSamples = size(res,1);         % 获取样本总数

data = res(:,1:end-1); % 提取前12列作为特征数据(12维特征)
labels = res(:,end);   % 最后一列作为分类标签

%% 数据集划分
rng(0); % 固定随机种子保证结果可复现
% 使用dividerand函数按7:3比例划分训练集和测试集
[trainInd,testInd] = dividerand(size(data,1),0.7,0.3);

% 通道分离:将12维特征分为两个6维通道
trainData1 = data(trainInd,1:6)'; % 通道1特征(训练集,转置为行向量)
trainData2 = data(trainInd,7:12)';% 通道2特征
testData1 = data(testInd,1:6)';   % 测试集通道1
testData2 = data(testInd,7:12)';   % 测试集通道2

% 标签处理:转换为分类数据类型
t_train = categorical(labels(trainInd))'; % 训练标签
t_test = categorical(labels(testInd))';     % 测试标签

%% 数据归一化(双通道独立归一化)
% 使用mapminmax进行[0,1]归一化,保持通道独立性
[tr1, ps1] = mapminmax(trainData1, 0, 1);  % 通道1训练集归一化
[tr2, ps2] = mapminmax(trainData2, 0, 1);  % 通道2训练集归一化
ts1 = mapminmax('apply', testData1, ps1);  % 应用通道1的归一化参数到测试集
ts2 = mapminmax('apply', testData2, ps2);  % 应用通道2的归一化参数

%% 数据重塑(适应双通道输入)
% 调整维度顺序为 [特征数, 高度, 通道数, 样本数]
p_train1 = reshape(tr1,6,1,1,[]); % 重塑为4D数组(6个特征,单通道)
p_train2 = reshape(tr2,6,1,1,[]); 
p_test1 = reshape(ts1,6,1,1,[]);
p_test2 = reshape(ts2,6,1,1,[]);


% 创建标签数据存储
labelsTrain = categorical(labels(trainInd));
labelDs = arrayDatastore(labelsTrain);

% 验证集构建同理
labelsTest = categorical(labels(testInd));
valLabelDs = arrayDatastore(labelsTest;

%% 双通道网络架构
% 通道1支路(使用2x1卷积核)
branch1 = [
    imageInputLayer([6 1 1], 'Name','input1') % 输入层:6个特征,单通道
    convolution2dLayer([2 1],16,'Padding','same','Name','conv1_1') % 2x1卷积核
    batchNormalizationLayer                    % 批量归一化
    reluLayer                                  % 激活函数
    maxPooling2dLayer([2 1],'Stride',2,'Name','pool1') % 最大池化
    convolution2dLayer([2 1],32,'Padding','same','Name','conv2_1') 
    batchNormalizationLayer
    reluLayer
    flattenLayer('Name','flatten1')]; % 展平层用于特征融合

% 通道2支路(使用3x1卷积核)
branch2 = [
    imageInputLayer([6 1 1], 'Name','input2')
    convolution2dLayer([3 1],16,'Padding','same','Name','conv1_2') 
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer([2 1],'Stride',2,'Name','pool2')
    convolution2dLayer([3 1],32,'Padding','same','Name','conv2_2')
    batchNormalizationLayer
    reluLayer
    flattenLayer('Name','flatten2')];

% 分类头部
fullConn = [
    fullyConnectedLayer(64, 'Name', 'fc')     % 全连接层
    reluLayer
    dropoutLayer(0.5)                         % 随机失活防止过拟合
    fullyConnectedLayer(numel(categories(t_train))) % 输出层(类别数)
    softmaxLayer
    classificationLayer];                    % 分类输出层

%% 网络连接
lgraph = layerGraph();
lgraph = addLayers(lgraph, branch1);
lgraph = addLayers(lgraph, branch2);

%% 训练参数设置
options = trainingOptions('adam',...
    'MaxEpochs',500,...             % 最大训练轮次
    'InitialLearnRate',1e-3,...     % 初始学习率
    'LearnRateSchedule','piecewise',... % 分段学习率策略
    'LearnRateDropFactor',0.1,...      % 学习率衰减因子
    'LearnRateDropPeriod',40,...       % 每40轮衰减一次
    'ValidationData',valDs,...         % 验证数据集
    'ValidationFrequency',30,...       % 每30次迭代验证一次
    'L2Regularization',1e-4,...        % L2正则化系数
    'Shuffle','every-epoch',...        % 每轮打乱数据
    'OutputNetwork','best-validation-loss',... % 保存最佳模型
    'Verbose',true);                   % 显示训练过程

%% 网络训练
[net,traininfo] = trainNetwork(trainDs, lgraph, options);

%% 测试集预测
preds = classify(net, testCombined);       % 执行预测
accuracy = mean(preds == labelsTest);      % 计算准确率
fprintf('测试集准确率: %.2f%%\n', accuracy*100);

%% 结果可视化
figure();
yyaxis left;
plot(traininfo.TrainingLoss);              % 绘制训练损失曲线
title('Double_CNN');
xlabel('训练次数');
ylabel('损失值');
yyaxis right;
plot(traininfo.TrainingAccuracy);          % 绘制训练准确率曲线
ylabel('正确率');

% 预测结果对比
YTest = double(labelsTest);
YPred = double(preds);
figure()
subplot(2,1,1)
plot(YTest)
hold on
plot(YPred,'--ok')                         % 绘制预测值与真实值对比
legend(["监测值" "预测值"])
xlabel("测试样本")
ylabel("预测结果")

subplot(2,1,2)
stem(YPred - YTest)                        % 绘制预测误差
xlabel("测试样本")
ylabel("误差")
title("准确率acc = " + accuracy)


三、代码获取

1.阅读首页置顶文章

2.关注CSDN

3.根据自动回复消息,回复"118期"以及相应指令,即可获取对应下载方式。

相关推荐
北漂老男孩2 小时前
在 Linux 上安装 MATLAB:完整指南与疑难解决方案
linux·运维·matlab
tyatyatya4 小时前
神经网络在MATLAB中是如何实现的?
人工智能·神经网络·matlab
缘友一世5 小时前
PyTorch深度神经网络(前馈、卷积神经网络)
pytorch·cnn·dnn
思茂信息5 小时前
CST软件对OPERA&CST软件联合仿真汽车无线充电站对人体的影响
c语言·开发语言·人工智能·matlab·汽车·软件构建
软件算法开发6 小时前
基于自适应交叉概率和变异概率遗传算法的地铁车辆使用寿命和璇修次数优化matlab仿真
matlab·遗传算法·自适应交叉概率·自适应变异概率·璇修次数·使用寿命
tyatyatya7 小时前
MATLAB 神经网络的系统案例介绍
开发语言·神经网络·matlab
tyatyatya8 小时前
MATLAB 自然语言处理入门教程
开发语言·matlab·自然语言处理
tyatyatya9 小时前
MATLAB的神经网络工具箱
开发语言·神经网络·matlab
t198751289 小时前
基于MATLAB-GUI图形界面的数字图像处理
人工智能·计算机视觉·matlab
卡尔曼的BD SLAMer10 小时前
计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM-Attention时间序列预测(完整源码和数据)
python·深度学习·算法·cnn·lstm