回歸預測! 手把手實現(xiàn)MATLAB的CNN 卷積神經(jīng)網(wǎng)絡回歸

基于MATLAB的深度學習工具箱(推薦2018b以上),實現(xiàn)CNN回歸。網(wǎng)上的例子比較少,這里簡單的說一下傳統(tǒng)的多輸入單輸出怎么做。手把手的教(PS:MATLAB自帶一個回歸教程,竟然還是有學生不知道對照著寫)
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代表有多少個輸入特征(如下訓練集集數(shù)據(jù)特征是209個),n是有多少個樣本(如下訓練集數(shù)據(jù)樣本是700個),輸出數(shù)據(jù)是1*n,1代表輸出是單輸出。劃分后如下
2、數(shù)據(jù)歸一化(或者標準化,看哪個效果好)
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ù)的一個轉換,轉換成MATLAB的CNN的輸入數(shù)據(jù)形式,是4-D形式的,最后一維就是樣本數(shù)
trainD=reshape(train_x,[209,1,1,700]);%訓練集輸入 testD=reshape(test_x,[209,1,1,311]);%測試集輸入 targetD = train_y;%訓練集輸出 targetD_test = test_y;%測試集輸出
轉換后訓練集輸入的size是209*1*1*700,輸出的size是1*700
4、CNN模型建立
layers = [ imageInputLayer([209 1 1]) %輸入層參數(shù)設置 convolution2dLayer([3,1],16,'Padding','same')%卷積層的核大小[3 1],因為我們的輸入是[209 1],是一維的數(shù)據(jù),所以卷積核第二個參數(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];%添加回歸層,用于計算損失值
5、模型訓練與測試
% 設置迭代次數(shù) batchsize 學習率啥的 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都取了轉置 % 訓練 net = trainNetwork(trainD,targetD',layers,options); % 預測 YPred = predict(net,testD); % 結果 YPred=double(YPred');%輸出是n*1的single型數(shù)據(jù),要轉換為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里面沒有ValidationData那一句,就看不到驗證集(比較懶,沒有換分驗證集,用的測試集代替)的loss變化,就不方便判斷模型有沒有過擬合。
6、最后是模型評價
figure plot(true_value,'-*','linewidth',3) hold on plot(predict_value,'-s','linewidth',3) legend('實際值','預測值') grid on rmse=sqrt(mean((true_value-predict_value).^2)); disp(['根均方差(RMSE):',num2str(rmse)]) mae=mean(abs(true_value-predict_value)); disp(['平均絕對誤差(MAE):',num2str(mae)]) mape=mean(abs((true_value-predict_value)./true_value)); disp(['平均相對百分誤差(MAPE):',num2str(mape*100),'%'])
根均方差(RMSE):9.3368e-05 平均絕對誤差(MAE):6.9173e-05 平均相對百分誤差(MAPE):0.0069244%
相關文章
matlab怎么安裝? 手把手教你安裝matlab軟件的教程
電腦需要安裝matlab軟件,該怎么安裝呢?今天我們提供下載并分享詳細的安裝圖文教程,詳細如下2025-01-13matlab怎么設置plot繪圖控制線型和顏色? 附多圖對比示例
Matlab 是一種流行的、用于數(shù)學計算和數(shù)據(jù)可視化的編程語言,今天我們就來看看matlab中plot繪圖控制線型和顏色設置,多圖對比示例如下2025-01-13matlab怎么指定繪圖顏色? matlab自定義繪圖顏色的技巧
MATLAB繪圖的時候,不喜歡默認顏色,想要更換顏色,該怎么自定義顏色設置呢?詳細請看下文介紹2025-01-13Matlab常用繪圖顏色搭配有哪些? matlab繪圖顏色代碼整理匯總
在MATLAB中繪圖時,選擇合適的配色方案對于數(shù)據(jù)的可視化至關重要,整理了一些超實用的MATLAB繪圖顏色,它們可以提升圖表的吸引力2025-01-13MATLAB中的條件語句與循環(huán)結構怎么使用? 條件語句與循環(huán)結構詳解
MATLAB提供了多種條件語句和循環(huán)結構,下面是對MATLAB中條件語句和循環(huán)結構的詳細解釋,詳細如下2025-01-11- 在MATLAB中,主要有if、elseif、else和switch語句,我們通過示例代碼幫助讀者更好地理解if、elseif、else的概念2025-01-11
matlab怎么控制坐標軸范圍? Matlab中指定坐標軸范圍的教程
在matlab中,設置坐標軸范圍是通過修改圖形對象屬性來實現(xiàn)的,該怎么指定坐標軸范圍呢?詳細請看下文介紹2025-01-11- 線性方程組是數(shù)學中一類重要的問題,廣泛應用于科學、工程和經(jīng)濟等領域,在Matlab中,我們可以利用內(nèi)置的函數(shù)和工具箱來解決線性方程組,本文將介紹如何使用Matlab求解線性2025-01-11
matlab怎么畫函數(shù)圖像? MATLAB繪制函數(shù)圖像的實例教程
有時候我們在使用matlab的時候,想畫函數(shù)圖像,怎么畫呢,?繪制方法很簡單,下面來分享一下2025-01-11MATLAB如何調(diào)用function? 一文看懂functionfunction函數(shù)的試用技巧
MATLAB的functions函數(shù),用于查詢和調(diào)試函數(shù)句柄信息,該怎么了解并使用這個函數(shù)呢?詳細請看下文介紹2025-01-10