BP神經網絡:feedforwardnet版迴歸預測

程序相關說明:

input:預處理後的訓練集數據 (60 by 14731)

output:預處理後的訓練集標籤(1 by 14731)

input_test:預處理後的測試集數據(60 by 100)

output_test:測試集數據經模型擬合後的結果(1 by 100)

BPoutput:反歸一化,得到數據本身數量級的值(1 by 100

net:訓練後的網絡

注:與newff相比,多出一個output_test量!

feedforwarnet將樣本自動分爲training、validation、test。

output_net:將input做輸入,經過訓練後的網絡,得到輸出結果。(1 by 14731

它與output作比較,可以對訓練得到的模型進行初步評估。

%% 模型訓練
% Author:Huberry
% Date:2017.11.23
tic
clear;
clc;
format compact;
%% 加載數據集 輸入輸出均歸一化處理
load('train_FD001_trainData.mat','trainData','trainLabel')
load('train_FD001_regressPara.mat','HI_regress');    %線性迴歸參數
[input,setting1] = mapminmax(trainData');
[output,setting2] = mapminmax(trainLabel');
% 測試單元樣本集
load('train_FD001_testData','testData','RUL_FD001');
input_test = mapminmax('apply',testData',setting1);
% newff版本
% %創建BP網絡
% net = newff(input,output,15,{'tansig','purelin'},'traingdm');
% net.divideFcn = '';
% net.trainparam.show = 50;
% net.trainparam.epochs = 20000 ;
% net.trainparam.goal = 0.01 ;
% net.trainParam.lr = 0.01 ;
% %訓練網絡模型
% [net,tr] = train(net,input,output);
% %記錄模型權值和閾值
% weigh1=net.iw{1,1};
% bias1=net.b{1,1};
% weigh2=net.lw{2,1};
% bias2=net.b{2,1};
% save('BpPara','net','weigh1','bias1','weigh2','bias2');
% feedforwardnet版本
net = feedforwardnet(12,'traingdm');
% Setup Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 0.9;
net.divideParam.valRatio = 0.1;
net.divideParam.testRatio = 0;
net.trainParam.max_fail=100;
net.performFcn = 'mse';
net.plotFcns = {'plotperform','plottrainstate','ploterrhist', ...
  'plotregression', 'plotfit'};
[net,tr] = train(net,input,output);
output_net = net(input);
performance = perform(net,output,output_net);  % 根據設定的net.performFcn 
% Recalculate Training, Validation and Test Performance獲得訓練驗證和測試的結果
trainTargets = output.* tr.trainMask{1};
valTargets = output.* tr.valMask{1};
testTargets = output.* tr.testMask{1};
trainPerformance = perform(net,trainTargets,output_net)
valPerformance = perform(net,valTargets,output_net)
testPerformance = perform(net,testTargets,output_net)
%% 測試
output_test = sim(net,input_test);
BPoutput = mapminmax('reverse',output_test,setting2); 
disp('網絡模型與實際RUL之間的MSE:')
mse(RUL_FD001'-BPoutput)
% 繪圖
view(net)
figure(1)
plot(BPoutput,':or')
hold on
plot(RUL_FD001,'-*')
legend('預測RUL值','實際RUL值');
title('模型輸出','fontsize',12);
toc

註釋:

1、關於training、validation、test

參考:http://www.ilovematlab.cn/thread-68797-1-1.html

training set是訓練樣本數據;validation set是驗證樣本數據;test set是測試樣本數據。在訓練時,用training訓練,每訓練一次,系統自動會將validation set中的樣本數據輸入神經網絡進行驗證,在validation set輸入後會得出一個誤差(不是網絡的訓練誤差,而是驗證樣本數據輸入後得到的輸出誤差,可能是均方誤差),而此前對validation set會設置一個步數,比如默認是6echo,則系統判斷這個誤差是否在連續6次檢驗後不下降,如果不下降或者甚至上升,說明training set訓練的誤差已經不再減小,沒有更好的效果了,這時再訓練就沒必要了,就停止訓練,不然可能陷入過學習。所以validation set有個設置步數,作用就在這裏。

實際使用中,經常出現Validation checks很快達到6此變停止的情況!

解決方法:

(1)net.divideFcn=' ';  樣本只做爲訓練集使用

(2)net.trainParam.max_fail=100;  改變默認值6

本程序因爲有單獨的測試集,故將net.divideParam.testRatio設置爲0。


2、關於mse

mse大小的判斷是相對於輸出數據的數量級來共同決定的。

比如數據所在範圍是0-1之間,而mse值爲0.2,此時mse值可能並不理想。

但是,如果數據均爲大於100的數據,mse爲0.2時,效果應該是不錯的。


3、幾個小說明

net.plotFcns 表示程序運行結束後,顯示的nntraintool工具箱中Plots部分顯示哪些內容;

view(net) 顯示你的網絡結構;










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章