【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.pswp.cn/bicheng/79081.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79081.shtml
英文地址,請注明出處:http://en.pswp.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…