实验六 MATLAB神经网络工具箱

更新时间:2023-11-16 06:29:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验七 MATLAB神经网络工具箱

一、实验目的

1、掌握Matlab对感知器网络的构建与训练方法。 2、掌握Matlab对线性神经网络的构建与训练方法。 3、掌握Matlab对BP神经网络的构建与训练方法。

二、实验原理

1、感知器的MATLAB仿真

感知器(Pereceptron)是一种特殊的神经网络模型,是由美国心理学家F.Rosenblatt于1958年提出的,一层为输入层,另一层具有计算单元,感知器特别适合于简单的模式分类问题,也可用于基于模式分类的学习控制和多模态控制中。

(一)感知器神经元模型

感知器神经元通过对权值的训练,可以使感知器神经元的输出能代表对输入模式进行的分类,图1.1为感知器神经元模型。

图1.1 感知器神经元模型

感知器神经元的每一个输入都对应于一个合适的权值,所有的输入与其对应权值的加权和作为阀值函数的输入。由于阀值函数的引入,从而使得感知器可以将输入向量分为两个区域,通常阀函数采用双极阶跃函数,如:

x1 o x2 o ┇ xR o 1 wi1 wi2 wiR θ i o ?1,x?0 (1.1) f(x)???0,x?0而感知器神经元模型的实际输出为

1

?R?o?f??wixi?b? (1.2)

?i??1?其中b为阀值

(二)感知器的网络结构

图1.2所描述的是一个简单的感知器网络结构,输入层有R个输入,Q个输出,通过权值wij与s个感知器神经元连接组成的感知器神经网络。

P o

1 o R×Q N S×R b S×1

图1.2 感知器神经网络结构

根据网络结构,可以写出感知器处理单元对其输入的加权和操作,即:

n S×Q a S×Q ni??wijpj (1.3)

j?1R而其输出ai为

ai=f (ni+bi) (1.4)

由式2.1易知

?1ni?bi?0ai?? (1.5)

0n?b?0ii?则当输入ni+bi大于等于0,即有ni≥-bi时,感知器的输出为1;否则输出为0。

上面所述的单层感知器神经网络是不可能解决线性不可分的输入向量分类问题,也不能推广到一般的前向网络中去。为解决这一问题,我们可以设计多层感知器神经网络以实现任意形状的划分。

图1.3描述了一个双层感知器神经网络。其工作方式与单层感知器网络一样,只不过是增加了一层而已,具体的内容这里不做讨论。

1 o

P o R×Q w1 S×R b S×1 2

a1 o W2 b a2 图1.3 感知器神经网络结构

(三)感知器神经网络的学习规则

感知器的学习规则主要是通过调整网络层的权值和阀值以便能够地网络的输入向量进行正确的分类。

如图1.2所示的输入向量P、输出和量a和目标向量为t的感知器神经网络,感知器的学习规则是根据以下输出矢量a可能出现的几种情况未进行参与调整的:

1)如果第i个神经元的输出是正确的,即有ai=t1,则与第i个神经元联接的权值和阀值保持不变。

2)如果第i个神经元的输出是不正确,应该有两种情况。

i)实际输出为0,而理想输出为1,即有ai=0,而ti=1,则所有的输入j对权值和阀值进行调整,修正值Δw1j=pj,Δbj=1。

ii)实际输出为1,而期望输出为0,即有ai=1,而ti=0,则对所有的输入j进行权值和阀值调整,Δw1j=-pj,Δbi=-1。

基于感知器误差e=t-a,感知器学习规则可望写为:

Δw1j=ei·pj

可以证明当前输入样本来自线性可分的模式时,上述学习算法在有限步同收敛,这时所得的权值能对所有样本正确分类,这一结论被称为感知器收敛定理。

(四)感知器神经网络的训练

要使前向神经网络模型实现某种功能,必须对它进行训练,让它逐步学会要做的事情,并把所学到的知识记忆在网络的权值中。感知器神经网络的训练是采用由一组样本组成的集合来进行。在训练期间,将这些样本重复输入,通过调整权值使感知器的输出达到所要求的理想输出。感知器的训练主要是反复对感知器神经网络进行仿真和学习,最终得到最优的网络阀值和权值。

我们可以用以下方法训练网络:

1) 确定我们所解决的问题的输入向量P、目标向量t,并确定各向量的维数,以及网络结构大小、神经元数目。假定我们采用图2.2的网络结构。

2)初始化:权值向量w和阀值向量b分别赋予[-1,+1]之间的随机值,

3

并且给出训练的最大次数。

3)根据输入向量P、最新权值向量w和阀值向量b,计算网络输出向量a。

4)检查感知器输出向量与目标向量是否一致,或者是否达到了最大的训练次数,如果是则结束训练,否则转入(5)。

5)根据感知器学习规则调查权向量,并返回3)。

(五)重要的感知器神经网络函数的使用方法

对于感知器的初始化、训练、仿真,在MATLABP神经网络工具箱中分别提供了init( ), trainp( )和sim( )函数。

1.初始化函数init( )

感知器初始化函数init( )可得到R个输入,S个神经元数的感知器层的权值和阀值,其调用格式为:

[w,b]=init(R,S)

另外,也可以利用输入向量P和目标向量t来初始化。 [w,b]=init(p,t)

在介绍trainp( )函数前,让我们先介绍一下训练的控制参数tp。 tp=[disp_freq max_epoch]

其中disp_freq指定两次显示间训练次数,缺省值为1;map_epoch指定训练的最大次数,缺省值为100。

2. 训练函数trainp( )

调用训练函数trainp( )函数后又得到新的权值矩阵,阀值向量以及误差te。trainp( )函数所需要的输入变量为:输入向量P、目标向量t以及网络的初始权值和阀值,训练的控制参数tp。调用格式为:

[w,b,te]=trainp(w,b,p,t,tp)

由于函数trainp( )并不能保证感知器网络所得到的网络权值和阀值达到要求。因此,在训练完后,要用下列验证语句验证一下。

a=sim(p, w, b);

if all(a= =t),disp( ′It works!′),end

假如网络不能成功运行,就可以继续运用trainp( )函数对网络进行训练。

4

经足够的训练后,网络仍达不到要求,那么就应当认真分析一下,感知器网络是否适合于这个问题。

3.仿真函数sim( )

sim( )函数主要用于计算网络输出。它的调用比较简单。 a=sim(p,w,b)

(六)感知器神经网络应用举例

为了便于消化与理解感知器神经网络的四个问题,下面将给出一个具体的问题进行分析,问题的描述如下:

两种蠓虫Af和Apf已由生物学家W.L.Grogan与w. w. Wirth(1981)根据它们触角长度和翼长中以区分。见表1.1中9Af蠓和6只Apf蠓的数据。根据给出的触角长度和翼长可识别出一只标本是Af还是Apf。

1.给定一只Af或者Apf族的蒙,你如何正确地区分它属于哪一族? 2.将你的方法用于触角长和翼中分别为(1.24,1.80)、(1.28,1.84)、(1.40,2.04)的三个标本

表1.1

Af Apf 触重长 翼 长 触角长 翼 长 1.24 1.72 1.14 1.78 1.36 1.74 1.18 1.96 1.38 1.64 1.20 1.86 1.378 1.82 1.26 2.00 1.38 1.90 1.28 2.00 1.40 1.70 1.30 1.96 1.48 1.70 1.54 1.82 1.56 2.08 输入向量为:

p=[1.24 1.36 1.38 1.378 1.38 1.40 1.48 1.54 1.56 1.14 1.18 1.20 1.26 1.28 1.30;1.72 1.74 1.64 1.82 1.90 1.70 1.70 1.82 2.08 1.78 1.96 1.86 2.00 2.00 1.96 ]

目标向量为:

t=[1 1 1 1 1 1 1 1 1 0 0 0 0 0 0] 图形显示,目标值1对应的用“+”、目标值0对应的用“o”来表示:

plotpv(p,t)

为解决该问题,利用函数newp构造输入量在[0,2.5]之间的

5 P(2)Vectors to be Classified2.32.22.121.91.81.71.61.51.40.911.11.21.31.4P(1)1.51.61.71.8图1.4 样本图形显示

感知器神经网络模型:

net=newp([0 2.5;0 2.5],1) 初始化网络: net=init(net)

利用函数adapt调整网络的权值和阀值,直到误差为0时训练结束: [net, y, e]=adapt(net, p, t)

训练结束后可得如图1.5的分类方式,可见感知器网络将样本正确地分成两类:

Vectors to be Classified2.32.22.12P(2)1.91.81.71.61.51.40.911.11.21.31.4P(1)1.51.61.71.8 图1.5 网络训练结果

感知器网络训练结束后,可以利用函数sim进行仿真,解决实际的分类问题:

p1=[1.24;1.80] a1=sim(net,p1) p2=[1.28;1.84] a2=sim(net,p2) p3=[1.40;2.04] a3=sim(net,p3) 网络仿真结果为: a1=0 a2=0 a3=0

6

2、线性神经网络的MATLAB实现

线性神经网络是最简单的一种神经元网络,由一个或多个线性神经元构成。1959年,美国工程师B.widrow和M.Hoft提出自适应线性元件(Adaptive linear element,简称Adaline)是线性神经网络的最早典型代表。它是感知器的变化形式,尤其在修正权矢量的方法上进行了改进,不仅提高了训练收敛速度,而且提高了训练精度。线性神经网络与感知器神经网络的主要不同之处在于其每个神经元的传递函数为线性函数,它允许输出任意值,而不是象感知器中只能输出0或1。此外,线性神经网络一般采用Widrow-Hoff(简称W-H)学习规则或者最小场方差(Least mean Square,简称LMS)规则来调整网络的权值和阀值。

线性神经网络的主要用途是线性逼近一个函数表达式,具有联想功能。另外,它还适用于信号处理滤波、预测、模式识别和控制等方面。

(一)线性神经元模型

线性神经元可以训练学习一个与之对应的输入/输出函数关系,或线性逼近任意一个非线性函数,但它不能产生任何非线性的计算特性。

图2.1描述了一个具有R个输入的由纯线性函数组成的线性神经元。

图2.1 线性神经元模型

由于线性神经网络中神经元的传递函数为线性函数,其输入与输出之间是简单的比例关系:

a=g(w*p,b) ┇ PR o wR P1 o P2 o w1 w2 b 1

a 7

其中函数g(x)为线性函数。

(二)线性神经网络结构

如图2.2描述了一个由S个神经元相并联形成一层网络,这种网络也称为Madaline网络。

W-H学习规则只能训练单层的线性神经网络,但这并不是什么严重问题。因为对线性神经网络而言,完全可以设计出一个性能完全相当的单层线性神经网络。

1 o P o R×1 N S×R b S×1

图2.2 线性神经元网络

n S×1 a S×1 (三)线性神经学习网络的学习规则

前面我们提到过,线性神经网络采用W-H学习规则。W-H学习规则是Widrow是Hoft提出的用来求得权值和阀值的修正值的学习规则。

首先要定义一个线性网络的输出误差函数:

E(w,b)=

11(t―a)2=(t―w*p)2 2.1 22由式2.1可看出,线性网络具有抛物线型误差函数所形成的误差表面。所以只有一个误差最小值。通过W-H学习规则来计算权值和偏差的变化,并使网络的误差平方和最小化,总能够训练一个网络的误差趋于最小值。这可通过沿着相对于误差平方和最速下降方向连续调整网络的权值和阀值来实现。根据梯度下降法,权矢量的修正值正比于当前位置上E(w,b)的梯度,对于第i输出节点为:

?wij???或表示为:

?E??(ti?ai)pj 2.2 ?wij 8

?wij???ipj 2.3

?bi???i 2.4

这里δi定义为第i个输出节点的误差:

δi=ti―ai 2.5

式2.3称为W-H学习规则。W-H学习规则的权值变化量正比于网络的输出误差及网络的输入向量。它不需求导数,所以算法简单,又具有收敛速度快和精度高的优点。

式2.3中的? 称为学习率,学习率的选取可以适当防止学习过程中产生振荡,提高收敛速度和精度。

(四)线性神经网络训练

首先给线性神经网络提供输入向量P,计算线性网络层的输出向量a,并求得误差e=t―a;

然后比较输出的误差平方和是否小于期望的误差平方和,如果是,则停止训练;否则,采用W-H规则调整权值和阀值,反复进行。

如果经过训练网络不能达到期望目标,可以继续对网络进行训练。经过足够的训练后,网络还是达不到要求。那么就仔细地分析一下, 所要解决的问题,是否适合于线性神经网络。

(五)重要线性神经网络函数的使用方法

在MATLAB神经网络工具箱中提供了基于线性神经网络的初始化函数initlin( )、设计函数solvelin( )、仿真函数simulin( )以及训练函数trainwh和adaptwh。下面我们将分别介绍多种函数的使用方法。

1.初始化函数initlin( )

函数initlin( )对线性神经网络初始化时,将权值和阀值取为绝对值很小的数。其使用格式

[w,b]=initlin(R,S)

R为输入数,S为神经元数。

另外,R和S也可用输入向量P和目标向量t来代替,即 [w,b]=initlin(p,t) 2.设计函数solvelin( )

9

与大多数其它神经网络不同,只要已知其输入向量P和目标向量t,就可以直接设计出线性神经网络使得线性神经网络的权值矩阵误差最小。其调用命令如下:

[w,b]=solve lin(p,t); 3.仿真函数simulin( )

函数simulin( )可得到线性网络层的输出 a=simulin(p,w,b)

其中a为输出向量,b为阀值向量 4.训练函数trainwh 和adaptwh( )

线性神经网络的训练函数有两种:trainwh( )和adaptwh( )。其中函数trainwh可以对线性神经网络进行离线训练;而函数adaptwh( ) 可以对线性神经网络进行在线自适应训练。

利用trainwh( )函数可以得到网络的权矩阵w,阀值向量b,实际训练次数te 以及训练过程中网络的误差平方和lr。

[w,b,te,lr]=trainwh(w,b,p,t,tp) 输入变量中训练参数tp为:

·tp(1)指定两次更新显示间的训练次数,其缺省值为25; ·tp(2)指定训练的最大次数,其缺省值为100; ·tp(3)指定误差平方和指标,其缺省值为0.02;

·tp(4)指定学习速率,其缺省值可由maxlinlr( )函数(此函数主要用于计算采用W-H规则训练线性网络的最大的稳定的分辨率)得到。

而利用函数adaptwh( )可以得到网络的输出a、误差e、权值矩阵w和阀值向量b。

[a,e,w,b]=adaptwh(w,b,p,t,lr)

输入变量lr为学习速率,学习速率lr 为可选参数,其缺省值为1.0。 另外,函数maxlinlr( )的调用格式为: lr=maxlinlr(p);

(六)线性神经网络的应用举例

为了理解线性神经网络的理论及其应用问题,下面给出一个实际问题进

10

行分析,设计一个线性神经网络,用于信号仿真及信号预测。

首先输入信号样本为: time=1:0.0025:5; p=sin(sin(time)*time*10); 目标信号为: t=p*2+2;

图形显示样本信号的规律为: plot(time, p, time, t, ’---’) title(‘Input and Target Signals’) xlabel(‘Time’)

ylabel(‘Input__ Target__’)

Tnput and Target Signals43.532.5Input__ Target__21.510.50-0.5-111.522.53Time3.544.55 图2.3 样本信号

利用输入样本信号和理想输出进行线性神经网络初始化: [w,b]=initlin(p,t)

然后利用函数adaptwh对构造的网络进行训练, lr=0.01; [a, e, w, b]=adaptwh(w, b, p, t, lr) 其中lr为学习率,a为网络的输出,e为误差。 仿真结果与目标信号对比分析: plot(time, a, time, t, ‘--’) title(‘Output and Target Signals’)

11

xlabel(‘Time’); ylabel(‘Output__ Target__’)

Output and Target Signals43.53Output__ Target__2.521.510.5011.522.53Time3.544.55 图2.4 仿真结果与目标信号对比分析

误差分析: plot(time,e)

hold on; plot([min(time) max(time)],[0 0],':r') xlabel('Time'); ylabel('Error')

Error Signal43.532.521.510.50-0.5Error11.522.53Time3.544.55 图2.5 误差分析

12

3、BP神经网络的MATLAB实现

感知器神经网络模型和线性神经网络模型虽然对人工神经网络的发展起了很大的作用,它们的出现也曾掀起了人们研究神经网络的热潮。但它们有许多不足之处。人们也曾因此失去了对神经网络研究的信心,但rumelhart、mcclellard和他们的同事洞悉到网络信息处理的重要性,并致力于研究并行分布信息处理方法,探索人类认知的微结构,于1985年发展了BP网络的学习算法。从而给人工神经网络增添了活力,使其得以全面迅速地恢复发展起来。

BP网络是一种多层前馈神经网络,其神经元的激励函数为S型函数,因此输出量为0到1之间的连续量,它可以实现从输入到输出的任意的非线性映射。由于其权值的调整是利用实际输出与期望输出之差,对网络的各层连接权由后向前逐层进行校正的计算方法,故而称为反向传播(Back-Propogation)学习算法,简称为BP算法。BP算法主要是利用输入、输出样本集进行相应训练,使网络达到给定的输入输出映射函数关系。算法常分为两个阶段:第一阶段(正向计算过程)由样本选取信息从输入层经隐含层逐层计算各单元的输出值;第二阶段(误差反向传播过程)由输出层计算误差并逐层向前算出隐含层各单元的误差,并以此修正前一层权值。BP网络主要用于函数逼近、模式识别、分类以及数据压缩等方面。

(一)BP网络的网络结构

BP网络通常至少有一个隐含层,如图3.1所示的是一个具有R个输入和一个隐含层的神经网络模型。

1 o 隐含层 输出层 P o R×Q W1 S1×R a1 f1 1 o S1×q w2 S2×S1 a2 B1 S1×1 f2 S2×q b2 图3.1 具有一个隐含层的BP网络结构

感知器与线性神经元的主要差别在于激励函数上:前者是二值型的,而

后者是线性的。BP网络除了在多层网络上与已介绍过的模型有不同外,其

13

主要差别也表现在激励函数上。

图3.2所示的两种S型激励函数的图形,可以看到f(· )是连续可微的单调递增函数,这种激励函数的输出特性比较软,其输出状态的取值范围为[0,1]或者[-1,+1],其硬度可以由参数λ来调节。函数的输入输出关系表达式如下所示:

双极型的S型激励函数:f(net)?2, f(net)∈(-1,1)

1?exp(??net)1, f(net)∈(0,1)

1?exp(??net)单极型的S型激励函数:f(net)?

图3.2 sigmoid型函数图形

对于多层网络,这种激励函数所划分的区域不再是线性划分,而是由一个非线性的超平面组成的区域。

因为S型函数具有非线性的大系数功能。它可以把输入从负无穷到正无穷大的信号变换成-1到+1之间输出,所以采用S型函数可以实现从输入到输出的非线性映射。

(二)BP网络学习规则

BP网络最为核心的部分便是网络的学习规则。用BP算法训练网络时有两种方式:一种是每输入一样本修改一次权值;另一种是批处理方式,即使组成一个训练周期的全部样本都依次输入后计算总的平均误差。这里我们主要探讨的是后一种方式。

14

下面我们给出两层网络结构示意简图4.3,并以此探讨BP算法。 BP网络的学习过程主要由以下四部分组成: 1)输入样本顺传播

输入样本传播也就是样本由输入层经中间层向输出层传播计算。这一过程主要是

输入样本求出它所对应的实际输出。

① 隐含层中第i个神经元的输出为

?R??a1i?f1??w1ijpj?b1i???j?1?② 输出层中第k个神经元的输出为:

i?1,2,?,s1 (3.1)

a2k?S1???f2?wa?b2k?,??2ki1i?i?1?i?1,2,?s2 (3.2)

其中f1(·), f2 (·)分别为隐含层的激励函数。 2)输出误差逆传播

在第一步的样本顺传播计算中我们得到了网络的实际输出值,当这些实际的输出值与期望输出值不一样时,或者说其误差大于所限定的数值时,就要对网络进行校正。

首先,定义误差函数

1s22E(w,b)=?(tk?a2k) (3.3)

2k?1其次,给出权值的变化 ① 输出层的权值变化

从第i个输入到第k个输出的权值为:

?w2ki????E????ki?a1i (3.4) ?w2ki其中:

?ki?ekf2' (3.5)

ek?lk?a2k (3.6)

② 隐含层的权值变化

15

从第j个输入到第i个输出的权值为:

?wij????E????ij?pj?w1ij0???1 (η为学习系数)

(3.7)

其中:

?ij?ei?f1' (3.8)

ei???ki?w2ki (3.9)

k?1s2由此可以看出:①调整是与误差成正比,即误差越大调整的幅度就越大。②调整量与输入值大小成比例,在这次学习过程中就显得越活跃,所以与其相连的权值的调整幅度就应该越大,③调整是与学习系数成正比。通常学习系数在0.1~0.8之间,为使整个学习过程加快,又不会引起振荡,可采用变学习率的方法,即在学习初期取较大的学习系数随着学习过程的进行逐渐减小其值。

最后,将输出误差由输出层经中间层传向输入层,逐层进行校正。 3)循环记忆训练

为使网络的输出误差尽可能的小,对于BP网络输入的每一组训练样本,一般要经过数百次甚至上万次的反复循环记忆训练,才能使网络记住这一样本模式。

这种循环记忆训练实际上就是反复重复上面介绍的输入模式正向传播和输出误差逆传播过程。

4)学习结束的检验

当每次循环记忆结束后,都要进行学习是否结束的检验。检验的目的主要是检查输出误差是否已经符合要求。如果小到了允许的程度,就可以结束整个学习过程,否则还要进行循环训练。

(三)BP网络的训练

对BP网络进行训练时,首先要提供一组训练样本,其中每个样本由输入样本和输出对组成。当网络的所有实际输出与其理想输出一致时,表明训练结束。否则,通过修正权值,使网络的实际输出与理想输出一致。

16

实际上针对不同具体情况,BP网络的训练有相应的学习规则,即不同的最优化算法,沿减少理想输出与实际输出之间误差的原则,实现BP网络的函数逼近、向量分类和模式识别。以图3.3为例来说明BP网络训练的主要过程。

图3.3 含一个隐含层的BP网络结构

首先:网络初始化,构造合理的网络结构(这里我们采用图4.3的网络结构),取可调参数(权和阀值)为[-1,1]上服从均匀分布随机数,并取定期望误差、最大循环次数和修正权值的学习率的初始值。

其次,利用相应的BP网络学习规则对网络进行训练,求得权值修正后的误差平方和。

最后,检查网络误差平方和是否降低到期望误差之下,若是,训练结束,否则继续。

(四)重要BP神经网络函数的使用方法

函数initff( )和simuff可以用来初始化和仿真不超过三层的前馈型网络。函数trainbp( )、trainbpx( )、trainlm( )可用来训练BP网络。其中trainlm( )的训练速度最快,但它需要更大的存储空间,也就是说它是以空间换取了时间;trainbpx( )的训练速度次之;trainlm( )最慢。

1.初始化函数initff( )

函数initff( )的主要功能就是对至多三层的BP网络初始化。其使用格式有多种,现列如下:

[w,b]=initff(p, s, f)

[w1, b1, w2, b2]=initff(p, s1, f1, s2, f2)

[w1, b1, w2, b2, w3, b3]=initff(p, s1, f1, f2, s3, f3)

17

[w, b]=initff(p, s, t)

[w1,b1,w2,b2]=initff(p, s1, f1, s2, t)

[w1, b1, w2, b2, w3, b3]=initff(p, s1, f1, s2, f2, s3, t)

[w, b]=initff(p, s, f)可得到s个神经元的单层神经网络的权值和阀值,其中p为输入向量,f为神经元的激励函数。

BP网络有一个特点很重要,即p中的每一行中必须包含网络期望输入的最大值和最小值,这样才能合理地初始化权值和阀值。

2.仿真函数simuff( )

BP网络是由一系列网络层组成,每一层都从前一层得到输入数据,函数simuff( )可仿真至多三层前馈型网络。对于不同的网络层数,其使用格式为:

a=simuff(p, w1, b1, f1)

a=simuff(p, w1, b1, f1, w2, b2, f2)

a=simuff(p, w1, b1, f1, w2, b2, f2, w3, b3, f3)

以上三式分别为单层、双层和三层网络结构的仿真输出。 3.训练函数

关于前面所提到的几种BP网络训练函数,在这里只介绍其中之一:trainbp( )。

函数trainbp( )利用BP算法训练前馈型网络。trainbp( )函数可以训练单层、双层和三层的前馈型网络,其调用格式分别为:

[w, b, te, tr]=trainbp(w, b, f′,p, t, tp)

[w1, b1, w2, b2, te, tr]=trainbp(w1,b1, f1′,w2, b2, f2′,p, t, tp)

[w1,b1,w2,b2,w3,b3,te,tr]=trainbp(w1, b1, f1′,w2, b2, f2′,w3, b3, f3′,p, t, tp)

可选训练参数tp内的四个参数依次为:

·tp(1)指定两次显示间的训练次数,其缺省值25; ·tp(2)指定训练的最大次数,其缺省值100; ·tp(3)指定误差平方和指标,其缺省值0.02; ·tp(4)指定学习速率,其缺省值0.01;

18

只有网络误差平方和降低到期望误差之下,或者达到了最大训练次数,网络才停止学习。学习速率指定了权值与阀值的更新比例,较小学习速率会导致学习时间较长,但可提高网络权值收敛效果。

(五)BP网络的应用举例

BP网络的函数逼近举例:设计一个BP网络,其隐含层神经元的激励函数为双曲正切函数,输出层神经元的激励函数为线性函数,学习样本为21组单输入矢量,理想输出为相应的单输出矢量。

输入矢量为: p=-1:0.1:1; 理想输出矢量为:

t=[-0.96 -0.577 -0.0729 0.377 0.641 0.66 0.461 0.1336 -0.201 -0.434 -0.5 -0.393 -0.1647 0.0988 0.3072 0.396 0.3449 0.1816 -0.0312 -0.2183 -0.3201];

输入输出的函数关系曲线: plot(p,t) xlabel('Input') ylabel('Output')

0.80.60.40.2Output0-0.2-0.4-0.6-0.8-1-1-0.8-0.6-0.4-0.20Input0.20.40.60.81 图3.4 输入输出关系

利用输入和理想输出进行BP神经网络初始化:

[w1,b1,w2,b2]=initff(p,5,'tansig',t,'purelin')

19

利用函数trainbp对构造的BP网络进行训练: df=10 me=8000 eg=0.02 lr=0.01 tp=[df me eg lr]

[w1,b1,w2,b2,ep,tr]=trainbp(w1,b1,'tansig',w2,b2,'purelin',p,t,tp)

其中df指定两次显示间的训练次数,其缺省值25;me指定训练的最大次数,其缺省值100;eg指定误差平方和指标,其缺省值0.02;lr指定学习速率,其缺省值0.01;

训练结果与理想输出对比分析:

Function Approximation0.80.60.4Output: -, Target: +0.20-0.2-0.4-0.6-0.8-1-1-0.8-0.6-0.4-0.20Input0.20.40.60.81 图3.5 训练结果与理想输出对比分析

网络的训练过程中,网络收敛效果一定程度上要受网络初始化的初始值的影响,实际输出和理想输出的误差的变化情况可以反映网络学习的效果,这一点可以通过如图3.6反映:

ploterr(tr, eg)

其中tr为网络学习的循环次数。

20

图4训练过程图

第四步网络测试

用sim()观察训练后的网络输出如图5 所示。

26

y2 = sim (net1,p) figure;

plot (p,t,'r* ',p,y1,'b- ',p,y2,'ko') title ('训练后网络的输出结果') xlabel ('时间') ; ylabel ('仿真输出')

legend ('要逼近的非线性函数','未训练网络的输出结果','训练后网络的输出结果')

图5训练后网路的输出结果

从图5 可以看出经过很短时间的训练后BP 网络很好的逼近了非线性函数。

讨论:

1、改变非线性函数的频率,即改变N 的值时发现,网络的训练时间会长些,逼近效果要差些。

2、改变隐层的神经元数目对网络的逼近效果也有影响,一般来说,隐层的神经元数目越多,则BP 网络逼近非线性函数能力越强,但也并非隐层的神经元数目越多,网络性能就越好,而同时训练时

27

间有所增长。

3、采用不同的训练函数,对本例采用三种训练方法,即Levenberg-Marquadt (trainlm)、剃度下降动量法(traingdx)、普通剃度下降法(traingd ),通过比较发现Levenberg - Marquadt ( trainlm) 训练速度最快,误差也较小,剃度下降动量法(traingdx)次之,普通剃度下降法(traingd )最差。

28

2Sum-Squared Network Error for 535 Epochs1010Sum-Squared Error110010-110-2050100150200250300Epoch350400450500 图3.6 误差曲线

三、实验步骤

1、利用感知器进行分类

一个经过训练的2输入神经元对5个输入向量进行分类(2类)。结合一个例子给出步骤。

步骤一:

两个长度为5的向量构成输入样本矩阵P,行向量T为指导向量。利用PLOTPV画出这个向量的图像。例如:

P = [-0.5 -0.5 +0.3 -0.1 -4; -0.5 +0.5 -0.5 +1.0 5]; T = [1 1 0 0 1];

plotpv(P,T);//plotpv函数利用感知器的输入向量和目标向量来画输入向量的图像

步骤二 建立神经网络

MATLAB提供函数newp来创建一个指定的感知器。第一个参数指定了期望的两个输入向量的取值范围,第二个参数指定了只有一个神经元。

21

net = newp([-40 1;-1 50],1);

注意:这个神经元的传递函数是hardlim函数,也就是阶跃函数。取0,1两个值。Hardlims函数,取-1,1两个值。

步骤三 添加神经元的初始化值到分类图

初始化的权值被设为0,因此任何输入都会给出同样的输出,并且分类线不会出现在这个图中,不用害怕,我们会继续训练这个神经网。

hold on

linehandle = plotpc(net.IW{1},net.b{1});//plotpc函数用来画神经网络的分类线

步骤四 训练感知器

Matlab提供了adapt函数来训练感知器,adapt函数返回一个新的能更好的执行分类、网络的输出、和误差的神经网络,这个划线函数允许网络从3个角度去调整,画分类线一直到误差为0为止。

E = 1;//E为误差 net.adaptParam.passes = 3;

while (sse(E))//sse函数是用来判定误差E的函数 [net,Y,E] = adapt(net,P,T);//利用输入样本调节神经网net linehandle = plotpc(net.IW{1},net.b{1},linehandle);//画出调整以后的分类线

drawnow;//延迟一段时间 end

步骤五 模拟sim

SIM函数能被用来划分任何别的输入向量,例如划分一个输入向量[0.7; 1.2].这个新点的图像为红色,他将用来显示这个感知器如何把这个新点从最初的训练集取分开来。

p = [0.7; 1.2];

22

a = sim(net,p);//利用模拟函数sim计算出新输入p的神经网络的输出

plotpv(p,a);

circle = findobj(gca,'type','line'); set(circle,'Color','red');

打开Hold,以便于以前的图像不被删除。增加训练装置和分类线在图中。

hold on; plotpv(P,T);

plotpc(net.IW{1},net.b{1}); hold off; axis([-2 2 -2 2]);

最后放大感兴趣的区域。这个感知器正确的区分了我们的新点(用红色表示)作为”zero”类(用圆圈表示),而不是”one”类(用+号表示),尽管需要比较长的训练时间,这个感知器仍然适当的进行了学习。

2、BP 神经网络进行函数逼近。

第一步 问题的提出

设计一个简单的BP 网络,实现对非线性函数的逼近,通过改变BP 网络的隐层神经元的数目,采用不同的训练方法来观察训练时间和训练误差的变化情况。假设将要将要逼近的函数为正弦函数,其频率参数N=1,绘制此函数见图2 所示。

N=1;

p= [- 1:0.05:1] ; t=sin (N*pi*p) ; %假设N=1,绘制此函数曲线 plot (p,t,'r*')

title ('要逼近的非线性函数')

23

xlabel ('时间') ;

第二步 网络建立

应用newff () 建立两层的BP 网络,隐层神经元数目可以改变,此时S=8 ,输出层一个神经元,隐层和输出层的传递函数分别为tansig 和purelin ,学习算法采用Levenberg - Marquadt ( trainlm) 。用sim() 观察初始化网络输出如图3 所示。

S=8;

net=newff (minmax (p) , [S,1] , {'tansig','purelin'} ,'trainlm') ; y1=sim (net,p) ; figure;

plot (p,t, 'r* ',p,y1,'b- ') title ('未训练网络的输出结果') xlabel ('时间') ;

ylabel ('仿真输出- 原函数*') ;

legend ('要逼近的非线性函数','未训练网络的输出结果')

24

图2要逼近的非线性函数

图3未训练时网络的输出结果

第三步网络训练

将训练时间设为10,精度为0.001,用train ()进行训练,误差曲线见图4 所示。

net.trainParam.epochs=10; net.trainParam.goal=0.001; net1 = train (net,p,t)

25

本文来源:https://www.bwwdw.com/article/k2hv.html

Top