回歸預(yù)測(cè)! 手把手實(shí)現(xiàn)MATLAB的CNN 卷積神經(jīng)網(wǎng)絡(luò)回歸

基于MATLAB的深度學(xué)習(xí)工具箱(推薦2018b以上),實(shí)現(xiàn)CNN回歸。網(wǎng)上的例子比較少,這里簡(jiǎn)單的說(shuō)一下傳統(tǒng)的多輸入單輸出怎么做。手把手的教(PS:MATLAB自帶一個(gè)回歸教程,竟然還是有學(xué)生不知道對(duì)照著寫(xiě))
1、首先加載數(shù)據(jù)與數(shù)據(jù)集劃分
clc;clear;close all load data n=700; train_x=input(:,1:n); train_y=output(:,1:n); test_x=input(:,n+1:end); test_y=output(:,n+1:end);
我的輸入數(shù)據(jù)是m*n形式的,m代表有多少個(gè)輸入特征(如下訓(xùn)練集集數(shù)據(jù)特征是209個(gè)),n是有多少個(gè)樣本(如下訓(xùn)練集數(shù)據(jù)樣本是700個(gè)),輸出數(shù)據(jù)是1*n,1代表輸出是單輸出。劃分后如下
2、數(shù)據(jù)歸一化(或者標(biāo)準(zhǔn)化,看哪個(gè)效果好)
method=@mapminmax; % method=@mapstd; [train_x,train_ps]=method(train_x); test_x=method('apply',test_x,train_ps); [train_y,output_ps]=method(train_y); test_y=method('apply',test_y,output_ps);
程序里用的是mapminmax,就是極大極小值歸一化,
3、數(shù)據(jù)的一個(gè)轉(zhuǎn)換,轉(zhuǎn)換成MATLAB的CNN的輸入數(shù)據(jù)形式,是4-D形式的,最后一維就是樣本數(shù)
trainD=reshape(train_x,[209,1,1,700]);%訓(xùn)練集輸入 testD=reshape(test_x,[209,1,1,311]);%測(cè)試集輸入 targetD = train_y;%訓(xùn)練集輸出 targetD_test = test_y;%測(cè)試集輸出
轉(zhuǎn)換后訓(xùn)練集輸入的size是209*1*1*700,輸出的size是1*700
4、CNN模型建立
layers = [ imageInputLayer([209 1 1]) %輸入層參數(shù)設(shè)置 convolution2dLayer([3,1],16,'Padding','same')%卷積層的核大小[3 1],因?yàn)槲覀兊妮斎胧荹209 1],是一維的數(shù)據(jù),所以卷積核第二個(gè)參數(shù)為1就行了,這樣就是1d卷積 %、數(shù)量,填充方式 reluLayer%relu激活函數(shù) maxPooling2dLayer([2 1],'Stride',2)% 2x1 kernel stride=2 fullyConnectedLayer(384) % 384 全連接層神經(jīng)元 reluLayer%relu激活函數(shù) fullyConnectedLayer(384) % 384 全連接層神經(jīng)元 fullyConnectedLayer(1) % 輸出層神經(jīng)元 regressionLayer];%添加回歸層,用于計(jì)算損失值
5、模型訓(xùn)練與測(cè)試
% 設(shè)置迭代次數(shù) batchsize 學(xué)習(xí)率啥的 options = trainingOptions('adam', ... 'MaxEpochs',20, ... 'MiniBatchSize',16, ... 'InitialLearnRate',0.005, ... 'GradientThreshold',1, ... 'Verbose',false,... 'Plots','training-progress',... 'ValidationData',{testD,targetD_test'}); %這里要吐槽一下,輸入數(shù)據(jù)都是最后一維為樣本數(shù),偏偏輸出要第一維為樣本數(shù),所以targetD和targetD_test都取了轉(zhuǎn)置 % 訓(xùn)練 net = trainNetwork(trainD,targetD',layers,options); % 預(yù)測(cè) YPred = predict(net,testD); % 結(jié)果 YPred=double(YPred');%輸出是n*1的single型數(shù)據(jù),要轉(zhuǎn)換為1*n的double是數(shù)據(jù)形式 % 反歸一化 predict_value=method('reverse',YPred,output_ps);predict_value=double(predict_value); true_value=method('reverse',targetD_test,output_ps);true_value=double(true_value);
如果options里面沒(méi)有ValidationData那一句,就看不到驗(yàn)證集(比較懶,沒(méi)有換分驗(yàn)證集,用的測(cè)試集代替)的loss變化,就不方便判斷模型有沒(méi)有過(guò)擬合。
6、最后是模型評(píng)價(jià)
figure plot(true_value,'-*','linewidth',3) hold on plot(predict_value,'-s','linewidth',3) legend('實(shí)際值','預(yù)測(cè)值') grid on rmse=sqrt(mean((true_value-predict_value).^2)); disp(['根均方差(RMSE):',num2str(rmse)]) mae=mean(abs(true_value-predict_value)); disp(['平均絕對(duì)誤差(MAE):',num2str(mae)]) mape=mean(abs((true_value-predict_value)./true_value)); disp(['平均相對(duì)百分誤差(MAPE):',num2str(mape*100),'%'])
根均方差(RMSE):9.3368e-05 平均絕對(duì)誤差(MAE):6.9173e-05 平均相對(duì)百分誤差(MAPE):0.0069244%
相關(guān)文章
matlab怎么安裝? 手把手教你安裝matlab軟件的教程
電腦需要安裝matlab軟件,該怎么安裝呢?今天我們提供下載并分享詳細(xì)的安裝圖文教程,詳細(xì)如下2025-01-13matlab怎么設(shè)置plot繪圖控制線型和顏色? 附多圖對(duì)比示例
Matlab 是一種流行的、用于數(shù)學(xué)計(jì)算和數(shù)據(jù)可視化的編程語(yǔ)言,今天我們就來(lái)看看matlab中plot繪圖控制線型和顏色設(shè)置,多圖對(duì)比示例如下2025-01-13matlab怎么指定繪圖顏色? matlab自定義繪圖顏色的技巧
MATLAB繪圖的時(shí)候,不喜歡默認(rèn)顏色,想要更換顏色,該怎么自定義顏色設(shè)置呢?詳細(xì)請(qǐng)看下文介紹2025-01-13Matlab常用繪圖顏色搭配有哪些? matlab繪圖顏色代碼整理匯總
在MATLAB中繪圖時(shí),選擇合適的配色方案對(duì)于數(shù)據(jù)的可視化至關(guān)重要,整理了一些超實(shí)用的MATLAB繪圖顏色,它們可以提升圖表的吸引力2025-01-13MATLAB中的條件語(yǔ)句與循環(huán)結(jié)構(gòu)怎么使用? 條件語(yǔ)句與循環(huán)結(jié)構(gòu)詳解
MATLAB提供了多種條件語(yǔ)句和循環(huán)結(jié)構(gòu),下面是對(duì)MATLAB中條件語(yǔ)句和循環(huán)結(jié)構(gòu)的詳細(xì)解釋,詳細(xì)如下2025-01-11MATLAB中構(gòu)if elseif else語(yǔ)句的實(shí)例教程
在MATLAB中,主要有if、elseif、else和switch語(yǔ)句,我們通過(guò)示例代碼幫助讀者更好地理解if、elseif、else的概念2025-01-11matlab怎么控制坐標(biāo)軸范圍? Matlab中指定坐標(biāo)軸范圍的教程
在matlab中,設(shè)置坐標(biāo)軸范圍是通過(guò)修改圖形對(duì)象屬性來(lái)實(shí)現(xiàn)的,該怎么指定坐標(biāo)軸范圍呢?詳細(xì)請(qǐng)看下文介紹2025-01-11- 線性方程組是數(shù)學(xué)中一類重要的問(wèn)題,廣泛應(yīng)用于科學(xué)、工程和經(jīng)濟(jì)等領(lǐng)域,在Matlab中,我們可以利用內(nèi)置的函數(shù)和工具箱來(lái)解決線性方程組,本文將介紹如何使用Matlab求解線性2025-01-11
matlab怎么畫(huà)函數(shù)圖像? MATLAB繪制函數(shù)圖像的實(shí)例教程
有時(shí)候我們?cè)谑褂胢atlab的時(shí)候,想畫(huà)函數(shù)圖像,怎么畫(huà)呢,?繪制方法很簡(jiǎn)單,下面來(lái)分享一下2025-01-11MATLAB如何調(diào)用function? 一文看懂functionfunction函數(shù)的試用技巧
MATLAB的functions函數(shù),用于查詢和調(diào)試函數(shù)句柄信息,該怎么了解并使用這個(gè)函數(shù)呢?詳細(xì)請(qǐng)看下文介紹2025-01-10