例程5-1:如何建立、训练并且仿真一个BP神经网络
方法1:通过MATLAB自带的GUI工具建立神经网络
这个例子中,使用MATLAB自带的神经网络GUI工具建立一个单隐含层的BP神经网络,其中隐含层包含20个神经元,输入变量7个,输出变量3个。
首先,启动GUI工具,在MATLAB工作区中输入:
该命令将打开一个Network/Data管理窗口,界面如图5-21所示。
从图中可见,Network/Data管理窗口分为7个区域,下方有7个按钮。各个区域的作用如下。
(1)Input Data:用户指定输入样本。
(2)Target Data:用户指定期望目标响应。
(3)Input Delay States:设定输入延迟。
(4)Networks:神经网络。
(5)Output Data:仿真输出。
(6)Error Data:学习误差。
(7)Layer Delay States:网络各层的延迟状态。
图5-21 Network/Data管理窗口
各个按钮作用如下。
(1)Import:从工作区或指定地址导入数据。
(2)New:新建网络或数据。
(3)Open:打开网络或数据,进而能够进行查看、编辑、训练、仿真等操作。
(4)Export:将数据导出到工作区或指定地址。
(5)Delete:删除所选项。
(6)Help:获取帮助。
(7)Close:关闭窗口。
由于训练数据是现成的,inputmodel将作为训练的输入,outputmodel则是期望响应,可直接从工作区中导入这两个数据。单击Import按钮后,在中间一栏选中inputmodel,在右边选中Input Data选项,如图5-22,将inputmodel作为输入样本。
图5-22 导入输入样本
同样,如图5-23,将outputmodel导入,作为期望输出。
图5-23 导入期望输出
之后,单击Network/Data管理窗口中的New按钮,创建一个神经网络。如图5-24所示,出现一个对话框,上面有两个选项卡,可以选择要创建网络还是数据,可根据自己的需求选择创建一个名叫net的BP神经网络,设定网络的层数、每层的神经元个数、每层的传递函数、训练算法、训练输入和期望输出等。单击下方的Create按钮,一个网络就创建好了。
图5-24 创建一个BP网络
这时,Network/Data管理窗口中就出现了三个新对象,如图5-25所示,分别是inputmodel输入样本、outputmode期望输出和net神经网络。
图5-25 创建完成的网络net
选中net,单击Open按钮,打开网络。图5-26所示即为网络结构,一个单隐含层的BP神经网络,隐含层含有20个神经元、7个输入量、3个输出量。
图5-26 所建立的BP网络结构(www.xing528.com)
选中Train选项卡可以设置训练的输入输出,以及训练过程的各项参数。如图5-27和图5-28所示,当各项参数设置好后,单击下方的Train Network按钮即可训练。
图5-27 设置训练输入和期望输出
图5-28 设置训练的各项参数
训练结束后得到一个新的网络。新网络仍然存放在net中,选择Simulate选项卡,可以选择我们的测试数据。如图5-29所示,将inputmodeltest作为测试数据,单击Simulate Network按钮则开始仿真。网络训练的好坏就可通过仿真结果来判断。
图5-29 设置仿真所用测试数据
方法2:使用函数建立、训练并仿真神经网络
使用函数来建立神经网络,这里使用newff函数来建立一个前馈网络,并存放到net这个结构中。在使用newff时,需要提供4个参数:
1)第一个参数是输入数据的范围,即训练输入中输入样本的最大值和最小值。通过minmax函数获得一个7×2的矩阵,“7”对应神经网络有7个输入,“2”存放该类输入的最大值和最小值。
2)第二个参数是神经网络的层数和每层的神经元的个数。由于神经网络输入层的神经元个数与输入一致,MATLAB中输入层就不算做一层,而从左到右依次写隐含层神经元个数和输出层神经元个数即可。这里建立的是一个单隐含层的网络,“20”表示隐含层含有20个神经元,“3”表示输出层有3个神经元。如果要建立包含N个隐含层的网络,则数组中元素个数为N+1个,每个元素的数值对应该层网络的神经元个数。
3)第三个参数用于设定每层所要用到的传递函数的类型,tansig为双曲正切S形函数,purelin为线性函数。
4)第四个函数为所要使用的训练函数,不同的函数训练速度不同,这里使用目前最快的收敛函数之一——Levenberg-Marquardt函数。
当输入上面的这条语句后,BP网络就建立好了。建立好的网络并不能直接使用,需要先进行训练。但在训练之前,还应该给出训练的一些条件,具体的训练条件根据自己的使用需求来定,可以包括训练周期、训练步长、训练误差限等。
使用下面的三条语句设定训练的参数。
➢epochs用于设定最大训练周期,此处由于要训练多个网络,设定为300,即如果训练误差限在不到300周期是就已达到指定值0.00004,则停止训练;而若到达300周期后还未达到指定误差,则在训练次数达到300次的时候,也停止网络的训练。
➢lr用于设定训练步长,也即每个训练周期中权重调整的大小,这里为0.1。
➢goal为训练的误差限,也就是训练结果和期望结果之间的误差,选择0.00004,当误差小于0.00004时就停止训练。
设置完成训练的参数以后,就可以对网络进行训练了。使用train函数对网络进行训练,该函数需要提供三个参数。第一个参数是刚才建立的网络,第二个参数是训练输入,第三个参数是期望输出。下面的语句中,我们对刚刚建立的net网络进行训练,所用的训练输入是inputmodel,期望输出是outputmodel,训练好的网络仍将会存放在net中。
训练完成后,采用sim函数进行网络识别。将随机拍摄的测试输入inputmodeltest输入网络net中,得到的结果存放在an里面,an就是一个包含测试结果的矩阵。
上面的例子介绍了如何建立、训练并且仿真一个神经网络,所获得的网络即可以用来识别目标。下面介绍如何进一步提升网络性能。
首先,设置一个分布权值D,D是一个掌管测试数据权重的因子,掌管数据的分布的权值,根据预测序列的权重at(i)来调整下一轮训练样本的权重。
然后,建立10个弱分类器,这里的一个弱分类器即为一个神经网络,具体程序如下所示。
接下来将得到的弱分类器组合成为一个强分类器,程序如下。
得到强分类器和弱分类器之后,将它们的识别结果进行统计,程序如下。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。