BP网络设计文档格式.docx

上传人:b****5 文档编号:8523765 上传时间: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

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

init不需要单独的调用。

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

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

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

  net.layers{1}.initFcn='

initwb'

;

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

rands'

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

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

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],{'

'

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],{'

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

713.703555;

792.983606;

1243.433837;

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

对BP网络进行仿真

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

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

%A=sim(net_1,x);

A=sim(net_1,pn);

%E=y-ty;

E=ty-T;

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

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

%%%%初始化权重阈值

net.layers{1}.initFcn='

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

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

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

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

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

神经网络(BP)系列

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

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

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

1. 

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

经常有人问起的问题:

Errorusing==>

network/train

Targetsareincorrectlysizedfornetwork.

Matrixmusthave1rows.

解决:

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

归一

澄清一个对归一的错误理解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.0174 

0.0176 

0.0148 

0.0210 

0.0000

0.0202 

0.0050 

0.0218 

0.0135 

1.0000 

0.0042 

0.0115 

0.0013 

0.0047 

0.0140 

0.0161 

写法二:

x=x'

4

Columns1through8

0.2260 

0.3609 

0.5576 

0.8644 

0.9395 

0.4876 

0.2367 

0.4553 

0.7245 

0.2656 

0.8112 

0.1897

0.2956 

0.6125 

0.4421 

0.7537 

0.7510 

0.3340 

1.0000

0.0996 

0.1184 

0.3876 

0.2907 

0.2665 

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],{'

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:

t(6:

t(11:

t(16:

length(s)

%7.0版本使用下面代码

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

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

%创建了2层网路,隐层s(i)(任意);

输出层4(由tn决定不可改,但需输入)

%net=newff(minmax(pn),[s(i),4],{'

%

%7.6版本使用下面的代码

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

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

%创建3层网络,输入层8(任意);

隐层s(i)(任意);

输出层4(由tn决定,不可改,不需要输入)

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

net=newff(pn,tn,[4,s(i)],{'

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

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

[ttmp2,ind]=min(res);

no=s(ind);

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

%7.0版本

%net=newff(minmax(pn),[no,4],{'

%7.6版本

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

pureli

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

当前位置:首页 > 党团工作 > 其它

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

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