【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倍
程,实现了对复杂特征组合的有效建模,在保持较高参数效率的同时提升了模型表达能力。

二、部分代码展示

%% 环境初始化
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') batchNormalizationLayerreluLayerflattenLayer('Name','flatten1')]; % 展平层用于特征融合% 通道2支路(使用3x1卷积核)
branch2 = [imageInputLayer([6 1 1], 'Name','input2')convolution2dLayer([3 1],16,'Padding','same','Name','conv1_2') batchNormalizationLayerreluLayermaxPooling2dLayer([2 1],'Stride',2,'Name','pool2')convolution2dLayer([3 1],32,'Padding','same','Name','conv2_2')batchNormalizationLayerreluLayerflattenLayer('Name','flatten2')];% 分类头部
fullConn = [fullyConnectedLayer(64, 'Name', 'fc')     % 全连接层reluLayerdropoutLayer(0.5)                         % 随机失活防止过拟合fullyConnectedLayer(numel(categories(t_train))) % 输出层(类别数)softmaxLayerclassificationLayer];                    % 分类输出层%% 网络连接
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期”以及相应指令,即可获取对应下载方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025上海车展 | 移远通信推出自研NG-eCall QuecOpen方案,助力汽车安全新标准加速落地

4月29日,在2025上海国际汽车工业展览会期间,全球领先的物联网和车联网整体解决方案供应商移远通信宣布,正式发布自主研发的NG-eCall(下一代紧急呼叫系统)QuecOpen解决方案。 该方案凭借高度集成的软硬件协同设计&…

leetcode76

目录 803ms超时。。。。越改越超时。。。 一些纠缠 代码分析: 代码问题: 改进建议: 示例代码: The error message you’re seeing indicates that there is a reference binding to a null pointer in your code. This typ…

大数据应用开发和项目实战-Seaborn

一、Seaborn概述 Seaborn是基于Python数据可视化库Matplotlib开发的扩展库,专注于统计图形的绘制,旨在通过简洁的代码实现复杂数据的可视化,帮助用户更轻松地呈现和理解数据。其核心设计目标是简化统计可视化流程,提供高级接口和美…

数据科学与计算

Seaborn的介绍 Seaborn 是一个建立在 Matplotlib 基础之上的 Python 数据可视化库,专注于绘制各种统计图形,以便更轻松地呈现和理解数据。 Seaborn 的设计目标是简化统计数据可视化的过程,提供高级接口和美观的默认主题,使得用户…

深入浅出循环神经网络(RNN):原理、应用与实战

1、引言 在深度学习领域,循环神经网络(Recurrent Neural Network, RNN)是一种专门用于处理**序列数据**的神经网络架构。与传统的前馈神经网络不同,RNN 具有**记忆能力**,能够捕捉数据中的时间依赖性,广泛应…

广州创科——湖北房县汪家河水库除险加固信息化工程

汪家河水库 汪家河水库位于湖北省房县,建于1971年,其地利可谓是天公之作,东西二山蜿蜒起伏,山峰相连,峰峰比高,无有尽头,东边陡峭,西边相对平坦,半山腰有一条乡村道路&am…

C++日更八股--day2

### C sort 的底层原理 这里其实原来问的是你如何优化快速排序,但是我最初只以为是随机选择基准,但是很显然面试官对此并不满意 闲暇之际,看到一篇介绍sort的原理的文章,才知道原来如是也 1.快速排序:作为主要算法&…

UniApp 的现状与 WASM 支持的迫切性

UniApp 的现状与 WASM 支持的迫切性 点击进入免费1 UniApp 的现状与 WASM 支持的迫切性 点击进入免费版2 一、UniApp 的跨平台优势与性能瓶颈 UniApp 凭借“一次开发,多端发布”的核心理念,已成为跨平台开发的主流框架之一。然而,随着移动应用场景的复杂化(如 3D 渲染、音…

如何正确使用日程表

日程安排,是时间管理中非常重要的一项,也是不容易管好的一项。 日程安排,通常指放到日程表里的事情,一般来说,放到日程表的事情要符合以下几个特点: 01.明确具体时间段,比如是下午2点到下午三…

【Token系列】14|Prompt不是文本,是token结构工程

文章目录 14|Prompt不是文本,是token结构工程一、很多人写的是“自然语言”,模型读的是“token序列”二、Prompt写法会直接影响token结构密度三、token分布影响Attention矩阵的聚焦方式四、token数 ≠ 有效信息量五、Prompt结构设计建议&…

研发效率破局之道阅读总结(4)个人效率

研发效率破局之道阅读总结(4)个人效率 Author: Once Day Date: 2025年4月30日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…

CNN代码详细注释

import torch from torch import nn#定义张量x,它的尺寸是5x1x28x28 #表示了5个单通道28x28大小的数据 xtorch.zeros([5,1,28,28])#定义一个输入通道是1,输出通道是6,卷积核大小是5x5的卷积层 convnn.Conv2d(in_channels1,out_channels6,ker…

机器指标监控技术方案

文章目录 机器指标监控技术方案架构图组件简介Prometheus 简介核心特性适用场景 Grafana 简介核心特性适用场景 Alertmanager 简介核心特性适用场景 数据采集机器Node ExporterMySQL ExporterRedis ExporterES ExporterRocketMQ ExporterSpringcloud ExporterNacos 数据存储短期…

【Office-Excel】单元格输入数据后自动填充单位

1.自定义设置单元格格式 例如我想输入数字10,回车确认后自动显示10kg。 右击单元格或者快捷键(Ctrl1),选择设置单元格格式,自定义格式输入: 0"kg"格式仍是数字,但是显示是10kg&…

JavaScript的3D库有哪些?

JavaScript的3D库有哪些? 在3D开发领域,JavaScript提供了多种库和框架,使开发者能够在浏览器中创建丰富的3D体验。以下是一些流行的3D方面的JavaScript库: Three.js:这是最著名的用于创建3D图形的JavaScript库之一。它…

中央网信办部署开展“清朗·整治AI技术滥用”专项行动

为规范AI服务和应用,促进行业健康有序发展,保障公民合法权益,近日,中央网信办印发通知,在全国范围内部署开展为期3个月的“清朗整治AI技术滥用”专项行动。 中央网信办有关负责人表示,本次专项行动分两个阶…

论文阅读:2024 arxiv Jailbreaking Black Box Large Language Models in Twenty Queries

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Jailbreaking Black Box Large Language Models in Twenty Queries https://www.doubao.com/chat/4008882391220226 https://arxiv.org/pdf/2310.08419 速览 这篇论文是来…

零基础学指针2

零基础学指针---大端和小端 零基础学指针---什么是指针 零基础学指针---取值运算符*和地址运算符& 零基础学指针---结构体大小 零基础学指针5---数据类型转换 零基础学指针6---指针数组和数组指针 零基础学指针7---指针函数和函数指针 零基础学指针8---函数指针数组…

《Python实战进阶》 No46:CPython的GIL与多线程优化

Python实战进阶 No46:CPython的GIL与多线程优化 摘要 全局解释器锁(GIL)是CPython的核心机制,它保证了线程安全却限制了多核性能。本节通过concurrent.futures、C扩展优化和多进程架构,实战演示如何突破GIL限制&#…

Golang实现函数默认参数

golang原生不支持默认参数 在日常开发中,我们有时候需要使用默认设置,但有时候需要提供自定义设置 结构体/类,在Java我们可以使用无参、有参构造函数来实现,在PHP中我们也可以实现(如 public function xxx($isCName false, $sec…