赞
踩
程序相关说明:
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) 显示你的网络结构;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。