您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 神经网络初学答疑汇总
写得很不错的博文,取自:晴天小猪的博文,汇总出来与大家一起分享。神经网络(BP)系列(1)关于样本的归一和反归一这个系列主要针对使用matlab神经网络工具箱,对一些初学者容易理解错误的地方进行解析。我的解析也可能有理解不对的地方,希望大家批评指正.这个系列主要针对使用matlab神经网络工具箱,对一些初学者容易理解错误的地方进行解析。1.神经网络一列为一个样本,所以对于matlab而言,要求输入和输出的列数必须一样的经常有人问起的问题:Errorusing==network/trainTargetsareincorrectlysizedfornetwork.Matrixmusthave1rows.解决:要求PT的列数一样,如果不一样P=p’t=t’转置一下2.归一澄清一个对归一的错误理解1样本矩阵为9行4列。9组样本,4个变量。现在归一化:x=[68.766.6561019.2;89.990.8450011.8;120.8120.6680020.6;16940.4616040.6;180.869.8733033.4;190.3130.2732031.6;109.8151.1575486.1;33.261.4825522.6;111.7126.6704013.6;]写法一:fori=1:9x1(i,:)=(x(i,:)-min(x(i,:)))/(max(x(i,:))-min(x(i,:)))end结果:0.00890.00851.000000.01740.01761.000000.01480.01481.000000.021001.00000.00000.02020.00501.000000.02180.01351.000000.00420.01151.000000.00130.00471.000000.01400.01611.00000写法二:x=x'fori=1:4x1(i,:)=(x(i,:)-min(x(i,:)))/(max(x(i,:))-min(x(i,:)))end结果:Columns1through80.22600.36090.55760.86440.93951.00000.487600.23670.45530.724500.26560.81121.00000.18970.295600.61250.44210.75370.75100.33401.00000.099600.11840.38760.29070.26651.00000.1454Column90.49970.77870.67640.0242注意:写法2为正确的归一化对归一的错误理解2将数据集分为训练集和测试集,对训练集和测试集分别做归一处理所以就会有人问如果我的测试集只有一个数据如何归一呀最大最小值从那里找呀正确的理解是:训练集和测试集的归一标准是一样的建议:如果训练集和测试集是一起归一的可以自己编程实现归一如果是训练集和测试集是分开的,最好是使用matlab自带的premnmx、postmnmx、tramnmx函数如果是自己编程的话,请注意训练集和测试集的归一标准需要一样premnmx、postmnmx、tramnmx函数的使用例子如下:ExampleHereisthecodetonormalizeagivendatasetsothattheinputsandtargetswillfallintherange[-1,1],usingPREMNMX,andthecodetotrainanetworkwiththenormalizeddata.p=[-10-7.5-5-2.502.557.510];t=[07.07-10-7.0707.07107.070];[pn,minp,maxp,tn,mint,maxt]=premnmx(p,t);net=newff(minmax(pn),[51],{'tansig''purelin'},'trainlm');net=train(net,pn,tn);Ifwethenreceivenewinputstoapplytothetrainednetwork,wewilluseTRAMNMXtotransformthemfirst.Thenthetransformedinputscanbeusedtosimulatethepreviouslytrainednetwork.ThenetworkoutputmustalsobeunnormalizedusingPOSTMNMX.p2=[4-7];[p2n]=tramnmx(p2,minp,maxp);an=sim(net,pn);[a]=postmnmx(an,mint,maxt);这个是归一到-1和1之间那我要归一到01之间怎么办有人说可以使用加绝对值就归一到01之间了我觉得加绝对值可能会有些问题比较好的方式是变换P在-11之间Pp=(p+1)/2就可以归一到01之间至于要归一到0.10.9之间选取合适的变换就可以做到了神经网络(BP)系列(2)(初学者系列)每次结果不一样解析这个系列主要针对使用matlab神经网络工具箱,对一些初学者容易理解错误的地方进行解析。神经网络每次结果不同解析神经网络每次结果不同是因为初始化的权值和阈值是随机的因为每次的结果不一样,才有可能找到比较理想的结果啊找到比较好的结果后,用命令savefilenamenet;保存网络,可使预测的结果不会变化,调用时用命令loadfilenamenet;取p_test=[];t_test=[];t=sim(net,p_test);err=t_test-t;plot(p_test,err);选择误差小的保存网络savefilenamenet以后调用时loadfilenamenetp_test=[];t_test=[];t=sim(net,p_test);err=t_test-t;plot(p_test,err):因为每次初始化网络时都是随机的,而且训练终止时的误差也不完全相同,结果训练后的权植和阀也不完全相同(大致是一样的),所以每次训练后的结果也略有不同举个例子,这样初始化就能使网络的输出结果是一样的,另外也可以给网络特定的权值,一种方法是把预测结果后的效果比较好的权值做为初值p=[0.87260.94410;000.7093;0.73780.70930.3795;0.64160.37950.7031;10.70310.4241;0.77740.42410.9559;0.95590.50120.7052;...0.82090.70520.4983;0.60110.49831;]';t=[00.73780.641610.77740.50120.82090.60110.9350];rand('state',0);net=newff(minmax(p),[6,1],{'tansig','logsig'},'trainlm');net.trainParam.epochs=2000;net.trainParam.goal=0.001;net=train(net,p,t);y=sim(net,p);error=y-t;res=norm(error);p_test=[0.935010.6236;]';t_test=[0.8027]a=sim(net,p_test)rand('state',0);这个的作用是每次初始化一样0是种子数,如果换成其他数,就可以产生不同的随机值注:rand('state',0);的使用有点为结果相同而相同,至于这样的结果网络性能是否达到好的要求则没有考虑,建议还是不要用这种方法使每次结果相同用保存网络的方法吧消除初值影响可以考虑的另一个方法是简单集成神经网络原理由于选择不同的权值所得结果不同,使最终神经网络泛化能力体现出一定的随机性。利用这个特性也可以改善神经网络的泛化能力,神经网络集成便是利用这种思路的体现,即先训练一组只有初始权值不同的子网,然后通过各子网“表决(Voting)”的形式(如加权和)得到学习系统的输出。当神经网络集成用于分类器时,集成的输出通常由个体网络的输出投票产生。通常利用绝对多数投票法(某分类成为最终结果当且仅当输出结果为该分类的神经网络的数目最多)。理论分析和大量实验表明,后者优于前者。因此,在对分类器进行集成时,目前大多采用相对多数投票法。当神经网络集成用于回归估计时,集成的输出通常由各网络的输出通过简单平均或加权平均产生。Perrone等人认为,采用加权平均可以得到比简单平均更好的泛化能力。神经网络(BP)系列(3)(初学者请看)分类实例分类实例输入输出设计:对某一问题分析,影响网络性能的输入主要有5个指标,输出则分为8类。8类的话可以用三位二进制表示。000001010011100101110111神经网络的输入为5维的向量,输出为三维的向量。输入的数据具有不同的单位和量级,所以在输入在输入神经网络之前应该首先进行归一化处理,将样本数据归一到01之间。样本总共有328组数据将样本集分为训练集和测试集随机抽取70取做为测试测试集其余的作为训练集网络设计采用tansig(x)和logsig(x)函数作为传输函数,tansig(x)如下式:tansig=2/(1+exp(-2x))-1logsig(x)如下式:logsig(x)=1/(1+exp(-n))对于有限个输入到输出的映射,并不需要无限个隐层节点,这就涉及到如何选择隐层节点数的问题,而这一问题的复杂性,使得至今为止尚未找到一个很好的解析式,隐层节点数往往根据前人设计所得的经验和自己进行试验来确定。设计网络时我采用的方法是通过神经网络训练来确定隐含层的个数,首先确定隐含层中节点数目的范围,设计一个隐含层神经元数目可变的BP网络,通过误差对比,确定最佳的隐含层神经元的个数。最后确定的隐含层的个数为12。所以网络结构为5-12-3的三层结构。load('CSHuju1.mat');p=CC1(:,[1,3:6])';T=[000;111;110;101;100;011;010;001];t=repmat(T,41,1)';pp=p;%%%%%%归一到01之间fori=1:5p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));endAllSamNum=328;%总样本数TrainSamNum=258;%训练样本数TestSamNum=AllSamNum-TrainSamNum;%测试样本数PerPos=randperm(AllSamNum);TrainDataIn=p(:,1:TrainSamNum)TrainDataOut=t(:,1:TrainSamNum)TestDataIn=p(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))TestDataOut=t(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))MaxMin=[01;01;01;01;01];net=newff(MaxMin,[12,3],{'tansig','logsig'},'trainlm');%训练参数设置net.trainParam.epochs=1000;%训练次数net.trainParam.goal=0.0001;%训练结束的目标LP.lr=0.1;%学习率net.trainParam.show=20;net=train(net,TrainDataIn,TrainDataOut);out=sim(net,TestDataIn)训练结果:TRAINLM,Epoch0/1000,MSE0.296308/0.0001,Gradient83.9307/1e-010TRAINLM,Epoch20/1000,MSE0.0224641/0.0001,Gradient6.7605/1e-010TRAINLM,Epoch40/1000,MSE0.00563627/0.0001,Gr
本文标题:神经网络初学答疑汇总
链接地址:https://www.777doc.com/doc-4258144 .html