BP网络设计.docx
- 文档编号:5296824
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:15
- 大小:23.54KB
BP网络设计.docx
《BP网络设计.docx》由会员分享,可在线阅读,更多相关《BP网络设计.docx(15页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BP 网络 设计