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_が1つ増えました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にはデフォルト6 echoなどのステップ数が設定されていた.この誤差が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)はあなたのネットワーク構造を表示します.