人工智能3—BP神经网络

目录

 

一、神经网络

二、BP神经网络

1.什么是BP神经网络

2.BP神经网络的原理

3.BP神经网络的算法流程

4.优缺点

5.代码运行结果图

6.代码解析


一、神经网络

神经网络也被称为人工神经网络(Artificial Neural Network,ANN),是可科学家们在对神经元、神经系统有了进一步认识的基础上,通过借助数学和物理的方法从信息处理的角度对人脑神经网络进行抽象后建立的简化模型。

生物学中,神经系统的基本单元是神经元,神经元由一个细胞体和突组成,突又分为两类,树突和轴突,人工神经网络就是模拟神经元的组成,可把ANN看成是以处理单元为节点,用加权有向弧相互连成的有向图,如下图示。输入层就是树突,接受输入的信号;加权和就是细胞体,加工和处理信号;阈值函数(激活函数)就是轴突,控制输出;输出层就是突触,输出结果。

二、BP神经网络

1.什么是BP神经网络

人工神经网络可以分为很多种类型,BP(Back Propagation)神经网络就是其中应用比较广泛的一种,全称为“后向传播学习的前馈型神经网络”。BP神经网络是一种多层的前馈神经网络,信号是前向传播的,而误差是反向传播的。在BP神经网络中,后向传播是一种学习算法,体现为训练过程,该过程是需要监督学习的;前馈型网络是一种结构,体现为网络框架。

2.BP神经网络的原理

BP神经网络分为训练和使用两个阶段。

训练:根据给定样本,使用适当的学习算法(如后向传播学习算法)调整某种结构的网络(如前馈型神经网络结构)的网络参数(层数、偏置值、神经元个数等),使得被训练的网络能够对样本有很好的拟合作用。

也就是:(1)在处理样本的时候,从输入层输入,向前把结果输出到第一隐含层

(2)第一隐含层将接收到的数据处理后作为输出,该输出为第二隐含层的输入,以此类推

(3)直到输出层输出

再看反向传播:(1)比较隐含层的实际输出和预期结果,得到误差

(2)通过相关的误差方程式调整最后一个隐含层到输出层之间的网络权重

(3)从最后一个隐含层向倒数第二隐含层进行误差反馈,调整各层之间的网络权重,以此类推

(4)直到输入层和第一隐含层之间的网络权重调整好为止

使用:采用已经训练好的神经网络,对一些未知结果的输入进行运算,得到输出,一般情况下都是先训练后使用,一旦训练结束就可以长期使用。

3.BP神经网络的算法流程

输入:网络结构参数(层数、结点数等);训练数据集
输出:网络权值与阈值

(1)初始化网络权值
(2)向前传播输入:当某个具体样本作用在输入端后 ,计算每个神经元的输出,即一个信号从输入到隐层再到输出
(3)反向误差传播:在输出层得到实际输出,比较预期输出得到误差,反向向前传播,依次得到最后一个隐含层到第一个隐含层每个神经元的误差

(4)网络权重与神经元偏置调整:一边后向传播误差,一边调整网络权重和神经元阈值。

(5)判断结束:如果最终的输出误差小于可接受的范围或迭代次数达到一定的阈值,则选取下一个样本,重复步骤2;否则迭代次数加1,然后转向步骤2继续使用当前样本进行训练。

4.优缺点

(1)优点:非线性映射能力,自学习和自适应能力,将学习成果应用于新知识的泛化能力,一定的容错能力

(2)缺点:BP 算法的本质是梯度下降法 ,它所要的最小化目标函数非常复杂 ,算法可能陷入目标函数的局部最小点 ,不能保证收敛到全局最优点 ,所以BP 算法是低效的。

5.代码运行结果图

6.代码解析

ps:代码(不是自己写的)无误,理解有误的请指出。

(1)net = newff(PR,[s1,s2...sn],{tf1,tf2...tfn},BTF,BLF,PF) 生成bp神经网络
 PR:为网络输入取向量取值范围的矩阵
[s1,s2..sn]:各层的神经元个数
[tf1,tf2...tfn]:隐含层和输出层神经元传递函数
BTF:训练函数
BLF:网络权值学习函数,默认为learngdm
PF:性能数,默认为mse

(2)tansig双曲正切S型传递函数,将净输入转换为净输出。
A = tansig(N,FP) 净输出
N:净输入,矩阵列向量
FP:函数的参数结构

(3)  newp生成感知机神经网络 net = newp(PR,S,TF,LF) 
PR为一个R2的矩阵,由R组输入向量中的最大值和最小值组成
S表示神经元的个数
TF表示感知器的激活函数,缺省值为硬限幅激活函数hardlim
LF表示网络的学习函数,缺省值为learnp 

% net = newff(PR,[s1,s2...sn],{tf1,tf2...tfn},BTF,BLF,PF) 生成bp神经网络
% PR:为网络输入取向量取值范围的矩阵
% [s1,s2..sn]:各层的神经元个数
% [tf1,tf2...tfn]:隐含层和输出层神经元传递函数
% BTF:训练函数
% BLF:网络权值学习函数,默认为learngdm
% PF:性能数,默认为mse

% tansig双曲正切S型传递函数,将净输入转换为净输出。
% A = tansig(N,FP) 净输出
% N:净输入,矩阵列向量
% FP:函数的参数结构

% purelin 线性传递函数,输入输出可取任意值

%训练中隐含层传递函数用tansig(比logsig误差小),输出层选用purelin

net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd')

%中间层到输出层的权值
net.IW{1}

%输出层各神经元阈值
net.b{1}

%matlab中定义输入p
p=[1;2];

%sim动态系统仿真 使用参数名称-值对组对指定模型仿真 得到仿真预测值
a=sim(net,p)

%init初始化神经网络  返回神经网络的权值和误差
net=init(net);

net.IW{1}
net.b{1}
a=sim(net,p)

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.7616
help purelin

p1=[0;0];

a5=sim(net,p1)
net.b{2}

net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd')
net.IW{1}
net.b{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]

%newp生成感知机神经网络 net = newp(PR,S,TF,LF) 
%PR为一个R2的矩阵,由R组输入向量中的最大值和最小值组成
%S表示神经元的个数
%TF表示感知器的激活函数,缺省值为硬限幅激活函数hardlim
%LF表示网络的学习函数,缺省值为learnp 
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输入 T输出
p=[-0.1 0.5]
t=[-0.3 0.4]

%range创建一个包含指定范围的元素的数组 返回从low到high之间的元素数组
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使调用进程(或线程)进入休眠状态,直到传递的信号终止进程或导致调用信号捕获函数
pause(0.5);

%hold off 使当前轴及图形不在具备被刷新的性质
hold off;
net=newp([-2,2],1,'logsig');

%设置网络的训练参数
%net.trainParam.epochs―最大收敛次数
%net.trainParam.goal―收敛误差
net.trainparam.epochs=100;
net.trainparam.goal=0.001;

%figure是建立图形,figure(2)就是第一第二副图
figure(2);
[net,tr]=train(net,p,t);
%添加标题
title('动态逼近')

wight=net.iw{1}
bias=net.b

%暂时停止执行
pause;
%删除当前图窗
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}
发布了13 篇原创文章 · 获赞 5 · 访问量 1213

猜你喜欢

转载自blog.csdn.net/qq_43653930/article/details/102313452