BP网络设计文档格式.docx
《BP网络设计文档格式.docx》由会员分享,可在线阅读,更多相关《BP网络设计文档格式.docx(15页珍藏版)》请在冰点文库上搜索。
因此当网络创建时,它根据缺省的参数自动初始化。
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’转置一下
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.0174
0.0176
0.0148
0.0210
0
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