BP网络设计.docx

上传人:b****5 文档编号:7568962 上传时间:2023-05-11 格式:DOCX 页数:15 大小:23.54KB
下载 相关 举报
BP网络设计.docx_第1页
第1页 / 共15页
BP网络设计.docx_第2页
第2页 / 共15页
BP网络设计.docx_第3页
第3页 / 共15页
BP网络设计.docx_第4页
第4页 / 共15页
BP网络设计.docx_第5页
第5页 / 共15页
BP网络设计.docx_第6页
第6页 / 共15页
BP网络设计.docx_第7页
第7页 / 共15页
BP网络设计.docx_第8页
第8页 / 共15页
BP网络设计.docx_第9页
第9页 / 共15页
BP网络设计.docx_第10页
第10页 / 共15页
BP网络设计.docx_第11页
第11页 / 共15页
BP网络设计.docx_第12页
第12页 / 共15页
BP网络设计.docx_第13页
第13页 / 共15页
BP网络设计.docx_第14页
第14页 / 共15页
BP网络设计.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

BP网络设计.docx

《BP网络设计.docx》由会员分享,可在线阅读,更多相关《BP网络设计.docx(15页珍藏版)》请在冰点文库上搜索。

BP网络设计.docx

BP网络设计

二、BP神经网络

训练前馈网络的第一步是建立网络对象。

函数newff()建立一个可训练的前馈网络。

这需要4个输入参数。

第一个参数是一个Rx2的矩阵以定义R个输入向量的最小值和最大值。

第二个参数是一个设定每层神经元个数的数组。

第三个参数是包含每层用到的传递函数名称的细胞数组。

最后一个参数是用到的训练函数的名称。

举个例子,下面命令将创建一个二层网络。

它的输入是两个元素的向量,第一层有三个神经元(3),第二层有一个神经元

(1)。

第一层的传递函数是tan-sigmoid,输出层的传递函数是linear。

输入向量的第一个元素的范围是-1到2[-12],输入向量的第二个元素的范围是0到5[05],训练函数是traingd。

  net=newff([-12;05],[3,1],{'tansig','purelin'},'traingd');

这个命令建立了网络对象并且初始化了网络权重和偏置,因此网络就可以进行训练了。

我们可能要多次重新初始化权重或者进行自定义的初始化。

下面就是初始化的详细步骤。

  在训练前馈网络之前,权重和偏置必须被初始化。

初始化权重和偏置的工作用命令init来实现。

这个函数接收网络对象并初始化权重和偏置后返回网络对象。

下面就是网络如何初始化的:

  net=init(net);

  我们可以通过设定网络参数net.initFcn和net.layer{i}.initFcn这一技巧来初始化一个给定的网络。

net.initFcn用来决定整个网络的初始化函数。

前馈网络的缺省值为initlay,它允许每一层用单独的初始化函数。

设定了net.initFcn,那么参数net.layer{i}.initFcn也要设定用来决定每一层的初始化函数。

  对前馈网络来说,有两种不同的初始化方式经常被用到:

initwb和initnw。

initwb函数根据每一层自己的初始化参数(net.inputWeights{i,j}.initFcn)初始化权重矩阵和偏置。

前馈网络的初始化权重通常设为rands,它使权重在-1到1之间随机取值。

这种方式经常用在转换函数是线性函数时。

initnw通常用于转换函数是曲线函数。

它根据Nguyen和Widrow[NgWi90]为层产生初始权重和偏置值,使得每层神经元的活动区域能大致平坦的分布在输入空间。

它比起单纯的给权重和偏置随机赋值有以下优点:

(1)减少神经元的浪费(因为所有神经元的活动区域都在输入空间内)。

(2)有更快的训练速度(因为输入空间的每个区域都在活动的神经元范围中)。

  初始化函数被newff所调用。

因此当网络创建时,它根据缺省的参数自动初始化。

init不需要单独的调用。

可是我们可能要重新初始化权重和偏置或者进行自定义的初始化。

例如,我们用newff创建的网络,它缺省用initnw来初始化第一层。

如果我们想要用rands重新初始化第一层的权重和偏置,我们用以下命令:

  net.layers{1}.initFcn='initwb';

  net.inputWeights{1,1}.initFcn='rands';

  net.biases{1,1}.initFcn='rands';

  net.biases{2,1}.initFcn='rands';

  net=init(net);

IW:

输入层到隐含层的权重矩阵

LW:

隐含层和输出层间的权重矩阵

b:

阀值向量

如网络为net,输入层和输出均为一个接点情况下,则用

net.IW{1,1}可以看到第一个输入接点到第一隐含层的权重向量;

net.LW{2,1}可以看到隐含层到输出层的权值向量;

net.b{1,1}是隐含层的阀值向量,

net.b{2,1}是输出接点的阀值;

在多输入输出下先用

net.IW

net.LW

net.b

查看各矩阵结构,再相应用net.IW{?

?

}等语句查到相关的向量

______________________________________________________________________________________________

clearall;

%definetheinputandoutput

p=[974874527;

3884661764;

131624392251;

183624101860;

155723011578;

149018772749;

151312782026;

107015612794;

134724153306;

132427461233;

138314631847;

128202347];

t=[197972428234548];

%创建bp网络和定义训练函数

%这里是为了方便而建立一个矩阵,注意是12x2,不是3x2

pr=[527974;

3881764;

13162439;

18362410;

15572301;

14902749;

12782026;

10702794;

13473306;

12332746;

13831847;

02347]

net=newff(pr,[15,1],{'tansig''purelin'},'trainlm');%这里要加入输出层的转移函数,一般是trainlm

net.trainparam.goal=50;

net.trainparam.epochs=5000;

%训练神经网络

[net,tr]=train(net,p,t);

%输出训练后的权值和阈值

iw1=net.IW{1};

b1=net.b{1};

lw2=net.LW{2};

b2=net.b{2};

%存储训练好的神经网络

savenetkohlernet

______________________________________________________________________________________________

怎样知道matlab已经训练好的神经网络的权值、步长以及阙值

用matlab训练神经网络时不需输入权值、步长以及阙值,如果我想知道matlab已经训练好的神经网络的权值、步长以及阙值该怎末操作?

训练好的权值、阈值的输出方法是:

输入到隐层权值:

w1=net.iw{1,1}

隐层阈值:

theta1=net.b{1}

隐层到输出层权值:

w2=net.lw{2,1};

输出层阈值:

theta2=net.b{2}

 

Matlab用神经网络预测如何使每次的预测结果差别不大?

我用神经网络预测城市垃圾产量,程序运行出来,

每一次预测结果差别都比较大,这要怎么修改参数才行?

附代码:

clc;

P=[630.073508;713.703555;792.983606;841.883658;911.863710;993.533525;

    1084.903799;1243.433837;1426.343870;1677.803904;1979.063730;2270.893757]';

T=[45;93.32;115.80;105.54;120.35;248.35;163.5;173.7;

  187.1;202.5;176.5;181.1]';

[pn,minp,maxp,tn,mint,maxt]=premnmx(P,T);%归一化

net_1=newff(minmax(pn),[10,1],{'tansig','purelin'},'traingdm');

inputWeights=net_1.IW{1,1}

inputbias=net_1.b{1}

layerWeights=net_1.LW{2,1}

layerbias=net_1.b{2}

%  设置训练参数

net_1.trainParam.show=50;

net_1.trainParam.lr=0.05;

net_1.trainParam.mc=0.9;

net_1.trainParam.epochs=10000;

net_1.trainParam.goal=1e-3;

%  调用TRAINGDM算法训练BP网络

[net_1,tr]=train(net_1,pn,tn);

%  对BP网络进行仿真

x=tramnmx(pn,minp,maxp);

y=tramnmx(tn,mint,maxt);

A=sim(net_1,x);

ty=postmnmx(A,mint,maxt);

%  计算仿真误差  

E=y-ty;

MSE=mse(E)

%预测

m=[2741.903762]';

mn=tramnmx(m,minp,maxp);

n=sim(net_1,mn);

nn=postmnmx(n,mint,maxt);

P=[630.073508;

  713.703555;

  792.983606;

  841.883658;

  911.863710;

  993.533525;

  1084.903799;

  1243.433837;

  1426.343870;

  1677.803904;

  1979.063730;

  2270.893757]';

T=[45;

  93.32;      

  115.80;      

  105.54;

  120.35;      

  248.35;      

  163.5;

  173.7;

  187.1;

  202.5;

  176.5;

  181.1]';

[pn,minp,maxp,tn,mint,maxt]=premnmx(P,T);

net_1=newff(minmax(pn),[10,1],{'tansig','purelin'},'traingdm');

inputWeights=net_1.IW{1,1}

inputbias=net_1.b{1}

layerWeights=net_1.LW{2,1}

layerbias=net_1.b{2}

%  设置训练参数

net_1.trainParam.show=50;

net_1.trainParam.lr=0.05;

net_1.trainParam.mc=0.9;

net_1.trainParam.epochs=10000;

net_1.trainParam.goal=1e-3;

%  调用TRAINGDM算法训练BP网络

[net_1,tr]=train(net_1,pn,tn);

%  对BP网络进行仿真

%x=tramnmx(pn,minp,maxp);

%y=tramnmx(tn,mint,maxt);

%A=sim(net_1,x);

A=sim(net_1,pn);

ty=postmnmx(A,mint,maxt);

%  计算仿真误差  

%E=y-ty;

E=ty-T;

MSE=mse(E)

%预测

m=[2741.903762]';

mn=tramnmx(m,minp,maxp);

n=sim(net_1,mn);

nn=postmnmx(n,mint,maxt);

1.训练网络前对数据进行归一化的话,仿真预测的时候是需要进行反归一化的

2.神经网络每次产生的初始权值和阈值都不同,所以结果会有差异,另外,隐层神经元个数也对结果有影响,可以选取一个较好的神经元个数再进行预测

%%%%初始化权重阈值

net.layers{1}.initFcn='initwb';

net.inputWeights{1,1}.initFcn='rands';

net.biases{1,1}.initFcn='rands';

net.biases{2,1}.initFcn='rands';

在训练之前可以使用上面这种初始化权值阈值方法,使得每次初始化的权值阈值都在0~1之内,这样每次训练出来的网络,预测的结果都不会有太大的变化。

并且你可以从中看出来那些样本是需要进行调整的,有助于你网络的优化。

神经网络(BP)系列

(1)关于样本的归一和反归一

这个系列主要针对使用matlab神经网络工具箱,对一些初学者容易理解错误的地方进行解析。

我的解析也可能有理解不对的地方,希望大家批评指正.

这个系列主要针对使用matlab神经网络工具箱,对一些初学者容易理解错误的地方进行解析。

1.  神经网络一列为一个样本,所以对于matlab而言,要求输入和输出的列数必须一样的

经常有人问起的问题:

Errorusing==>network/train

Targetsareincorrectlysizedfornetwork.

Matrixmusthave1rows.

解决:

要求PT的列数一样,如果不一样P=p’t=t’转置一下

2  归一

澄清一个对归一的错误理解1

样本矩阵为9行4列。

9组样本,4个变量。

现在归一化:

x=[68.7  66.6  5610  19.2;

89.9  90.8  4500  11.8;

120.8  120.6  6800  20.6;

169  40.4  6160  40.6;

180.8  69.8  7330  33.4;

190.3  130.2  7320  31.6;

109.8  151.1  5754  86.1;

33.2  61.4  8255  22.6;

111.7  126.6  7040  13.6;]

写法一:

fori=1:

9

x1(i,:

)=(x(i,:

)-min(x(i,:

)))/(max(x(i,:

))-min(x(i,:

)))

end

结果:

0.0089  0.0085  1.0000  0

0.0174  0.0176  1.0000  0

0.0148  0.0148  1.0000  0

0.0210  0    1.0000  0.0000

0.0202  0.0050  1.0000  0

0.0218  0.0135  1.0000  0

0.0042  0.0115  1.0000  0

0.0013  0.0047  1.0000  0

0.0140  0.0161  1.0000  0

写法二:

x=x'

fori=1:

4

x1(i,:

)=(x(i,:

)-min(x(i,:

)))/(max(x(i,:

))-min(x(i,:

)))

end

结果:

Columns1through8

0.2260  0.3609  0.5576  0.8644  0.9395  1.0000  0.4876  0

0.2367  0.4553  0.7245  0    0.2656  0.8112  1.0000  0.1897

0.2956  0    0.6125  0.4421  0.7537  0.7510  0.3340  1.0000

0.0996  0    0.1184  0.3876  0.2907  0.2665  1.0000  0.1454

Column9

0.4997

0.7787

0.6764

0.0242

注意:

写法 2为正确的归一化

对归一的错误理解2

将数据集分为训练集和测试集,对训练集和测试集分别做归一处理

所以就会有人问如果我的测试集只有一个数据如何归一呀

最大最小值从那里找呀

正确的理解是:

训练集和测试集的归一标准是一样的

建议:

如果训练集和测试集是一起归一的可以自己编程实现归一

如果是训练集和测试集是分开的,最好是使用matlab自带的premnmx、postmnmx、tramnmx函数

如果是自己编程的话,请注意训练集和测试集的归一标准需要一样

premnmx、postmnmx、tramnmx函数

的使用例子如下:

Example

Hereisthecodetonormalizeagivendatasetso

thattheinputsandtargetswillfallinthe

range[-1,1],usingPREMNMX,andthecodetotrainanetwork

withthenormalizeddata.

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);

Ifwethenreceivenewinputstoapplytothetrained

network,wewilluseTRAMNMXtotransformthem

first.Thenthetransformedinputscanbeused

tosimulatethepreviouslytrainednetwork.The

networkoutputmustalsobeunnormalizedusing

POSTMNMX.

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之间选取合适的变换就可以做到了

Matlab神经网络反归一化的问题

程序如下:

clear

clc

closeall

warningoff

%数据输入

huanghe_p=[370503434575490420560640558343326405446423422697598377435472451667601689541485425389382707422];

huanghe_t=[5157135867537205677179878104894535896395685959828495196156525999418939997587016305615201040535];

%归一化处理

p=(huanghe_p-min(huanghe_p))/(max(huanghe_p)-min(huanghe_p));

t=(huanghe_t-min(huanghe_t))/(max(huanghe_t)-min(huanghe_t));

%网络有关参数

EPOCHS=10000;

GOAL=0.000005;

LR=0.01;

MAX_FAIL=100;

%建立bp神经网络,并训练,仿真。

其中输入为p,输出为t

%-------------------------隐层神经元确定-----------------------------

s=3:

15;%s为常向量,表示神经元的个数

res=zeros(size(s));%res将要存储误差向量,这里先置零

pn=[p(1:

5);p(6:

10);p(11:

15);p(16:

20)];

tn=[t(1:

5);t(6:

10);t(11:

15);t(16:

20)];

fori=1:

length(s)

%7.0版本使用下面代码

%输出层的神经元个数必须等于tn的行数

%每层的传递函数可以自己指定

%创建了2层网路,隐层s(i)(任意);输出层4(由tn决定不可改,但需输入)

%net=newff(minmax(pn),[s(i),4],{'tansig','purelin'},'trainlm');

%

%7.6版本使用下面的代码

%输出层神经元由tn决定,不需要输入,我们只需要确定输入层和隐层的神经元个数

%所有层的传递函数都可以自己定义

%创建3层网络,输入层8(任意);隐层s(i)(任意);输出层4(由tn决定,不可改,不需要输入)

%

%其实两个版本的区别在于7.6的bp网络创建函数直接给出了t,故最后一层不需要指定了,故相同的参数时,7.6的会多一层

%

net=newff(pn,tn,[4,s(i)],{'tansig','tansig','purelin'},'trainlm');

net.iw{1,1}=zeros(size(net.iw{1,1}))+0.5;

net.lw{2,1}=zeros(size(net.lw{2,1}))+0.75;

net.b{1,1}=zeros(size(net.b{1,1}))+0.5;

net.b{2,1}=zeros(size(net.b{2,1}));

net.trainParam.epochs=EPOCHS;

net.trainParam.goal=GOAL;

net.trainParam.lr=LR;

net.trainParam.max_fail=MAX_FAIL;

net=train(net,pn,tn);

y=sim(net,pn);

e=tn-y;

error=mse(e,net);

res(i)=norm(error);

end

%选取最优神经元数,number为使得误差最小的隐层神经元个数

[ttmp2,ind]=min(res);

no=s(ind);

%选定隐层神经元数目后,建立网络,训练仿真。

%7.0版本

%net=newff(minmax(pn),[no,4],{'tansig','purelin'},'trainlm');

%7.6版本

net=newff(pn,tn,[4,no],{'tansig','tansig','pureli

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 环境科学食品科学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2