AI智能
改变未来

BP神经网络学习


基本介绍

BP神经网络是一种多层前馈网络,可以进行学习和存储输入输出映射关系,不需要去建立数学方程式,是一种常用的神经网络模型

BP神经网络的过程

BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。

BP网络运行的具体流程

第一步:网络初始化
第二步:随机选取
第三部:隐含层计算
第四步:求偏导数
第五步:修正权值
第六步:修正权值
第七部:修正权值
第八步:计算全局误差
第九步:判断模型合理性

函数介绍

net函数

net = newff(minmax§,[隐层的神经元的个数,输出层的神经元的个数],{隐层神经元的传输函数,输出层的传输函数},‘反向传播的训练函数’),其中p为输入数据,t为输出数据。

sim函数

sim执行simulink模型用的命令 相当于windows里的run命令。
sim函数用来运行Simulink模型。需要注意的是,用户无法控制其仿真过程(例如暂停、继续),一旦运行就会直到达到结束条件为止——这一点和通过模型窗口界面运行仿真不同。
调用格式:
[t,x,y] = sim(model,timespan,options,ut);
[t,x,y1, y2, …, yn] = sim(model,timespan,options,ut);
输入参数:
model:模型的名字,用单引号括起来(注意不带扩展名.mdl);
timespan:指定仿真时间范围,可以有几种情况:
标量tFinal,指定仿真结束时间。这种情况下开始时间为0;
两个元素的向量[tStart tFinal],同时指定开始时间和结束时间;
向量[tStart OutputTimes tFinal],除起止时间外,还指定输出时间点(通常输出时间t会包含更多点,这里指定的点相当于附加的点)。
options:指定仿真选项,是一个结构体,该结构体通过simset创建,包括模型求解器、误差控制等都可以通过这个参数指定(不修改模型,但使用和模型对话框里设置的不同选择)。

init函数

功能:
在matlab中init 用于初始化神经网络。
语法:
net = init(net)
性质:
init(net)根据最新的网络初始化函数返回神经网络的权值和误差,其结果由net.initFcn,和参数值,net.initparam影响。
示例:
在这里,我们创建一个双输入(范围在0到1,和-2到2)单神经元感知器。而一旦建立了模型我们就可以得到其权值和阈值。
net = newp([0 1;-2 2],1);
net.iw{1,1}
net.b{1}
对感知器进行训练,改变其权值和阈值。
P = [0 1 0 1; 0 0 1 1];
T = [0 0 0 1];
net = train(net,P,T);
net.iw{1,1}
net.b{1}
重新将权值和阈值初始化。
net = init(net);
net.iw{1,1}
net.b{1}
上面最后的命令已经将权值和阈值重新归零,这就是 init函数在感知器中的应用。

sign函数

sign(x):符号函数 (Signum function)。
当x<0时,sign(x)=-1;
当x=0时,sign(x)=0;
当x>0时,sign(x)=1。

tansig函数

tansig函数是神经网络层传递函数。传递函数将神经网络层的净输入转换为净输出。
tansig()使用格式:
A = tansig(N,FP) %净输出
N——净输入,s-by-q矩阵(列)向量
FP——函数的参数结构(可以忽略)

purelin函数

线性传递函数 y=a*x+b;

newp函数

作用:构造感知器模型。
句法:net=newp[PR,S,TF,LF]
解释:PR:Rx2的输入向量最大值和最小值构成的矩阵,即每一行的最大值最 小值构成一行。
S:构造的神经元的个数
TF:激活函数的设置,可设置为hardlim函数或者hardlins函数,默认为 hardlim函数
LF:学习修正函数的设置,可设置为learnp函数或者learnpn函数,默认 为learnp函数(关于权值误差修正函数learnp函数的使用可看我的上 篇博文learnp)
net:生成的感知器网络

代码及结果

代码

% BP网络% BP神经网络的构建net=newff([-1 2;0 5],[3,1],{\'tansig\',\'purelin\'},\'traingd\')%net = newff(minmax(p),[隐层的神经元的个数,输出层的神经元的个数],{隐层神经元的传输函数,输出层的传输函数},\'反向传播的训练函数\'),其中p为输入数据,t为输出数据net.IW{1}net.b{1}p=[1;2];a=sim(net,p)%sim执行simulink模型用的命令 相当于windows里的run命令net=init(net);net.IW{1}net.b{1}a=sim(net,p)%net.IW{1}*p+net.b{1}p2=net.IW{1}*p+net.b{1}a2=sign(p2)a3=tansig(a2)a4=purelin(a3)net.b{2}net.b{1}net.IW{1}net.IW{2}0.7616+net.b{2}a-net.b{2}(a-net.b{2})/ 0.7616help purelin%purelin函数为输出层的传输函数p1=[0;0];a5=sim(net,p1)net.b{2}% BP网络% BP神经网络的构建net=newff([-1 2;0 5],[3,1],{\'tansig\',\'purelin\'},\'traingd\')net.IW{1}net.b{1}%p=[1;];p=[1;2];a=sim(net,p)net=init(net);net.IW{1}net.b{1}a=sim(net,p)net.IW{1}*p+net.b{1}p2=net.IW{1}*p+net.b{1}a2=sign(p2)a3=tansig(a2)a4=purelin(a3)net.b{2}net.b{1}P=[1.2;3;0.5;1.6]W=[0.3 0.6 0.1 0.8]net1=newp([0 2;0 2;0 2;0 2],1,\'purelin\');net2=newp([0 2;0 2;0 2;0 2],1,\'logsig\');net3=newp([0 2;0 2;0 2;0 2],1,\'tansig\');net4=newp([0 2;0 2;0 2;0 2],1,\'hardlim\');net1.IW{1}net2.IW{1}net3.IW{1}net4.IW{1}net1.b{1}net2.b{1}net3.b{1}net4.b{1}net1.IW{1}=W;net2.IW{1}=W;net3.IW{1}=W;net4.IW{1}=W;a1=sim(net1,P)%网络仿真a2=sim(net2,P)a3=sim(net3,P)a4=sim(net4,P)init(net1);net1.b{1}help tansig% 训练p=[-0.1 0.5]t=[-0.3 0.4]w_range=-2:0.4:2;b_range=-2:0.4:2;ES=errsurf(p,t,w_range,b_range,\'logsig\');%单输入神经元的误差曲面plotes(w_range,b_range,ES)%绘制单输入神经元的误差曲面pause(0.5);hold off;net=newp([-2,2],1,\'logsig\');net.trainparam.epochs=100;net.trainparam.goal=0.001;figure(2);[net,tr]=train(net,p,t);title(\'动态逼近\')wight=net.iw{1}bias=net.bpause;close;% 练p=[-0.2 0.2 0.3 0.4]t=[-0.9 -0.2 1.2 2.0]h1=figure(1);net=newff([-2,2],[5,1],{\'tansig\',\'purelin\'},\'trainlm\');net.trainparam.epochs=100;net.trainparam.goal=0.0001;net=train(net,p,t);a1=sim(net,p)pause;h2=figure(2);plot(p,t,\'*\');title(\'样本\')title(\'样本\');xlabel(\'Input\');ylabel(\'Output\');pause;hold on;ptest1=[0.2 0.1]ptest2=[0.2 0.1 0.9]a1=sim(net,ptest1);a2=sim(net,ptest2);net.iw{1}net.iw{2}net.b{1}net.b{2}

结果

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » BP神经网络学习