BP神经网络之MATLAB@GUI篇

来源:互联网 发布:excel数据列表创建列表 编辑:程序博客网 时间:2024/06/05 18:27

设计BP神经网络方法

使用BP神经网络解决问题时,需要一个训练数据集,此外还需要确定以下参数:

(1)网络层数

BP网络可以包含1到多个隐层,单隐层前馈网络已具有很大的学习。因此对于大部分场合,单个隐层即可满足需求。面对大数据,从增加模型复杂度角度来说,增加隐层数目比增加隐层神经节点数更有效,因为增加隐层数目不仅增加了拥有激活函数的神经元数目,还增加了记过函数嵌套的层数。但随着隐层数目增加,网络收敛难度加大,传统BP算法很难实现。

(2)输入层节点数、输出层节点个数

输入层节点数取决于输入向量的维数、输出层节点数取决于目标结果。实际应用时,首先应将问题提炼出向量模型用于表述输入、输出。

(3)隐含层节点数

隐含层节点数的选择对网络影响很大,数目较多会带来更好的性能,但训练难度也会变大,一般采用经验公式估计节点数,例如:

a.M = 根号下(n+m)+a,n、m分别为输入层、输出层神经元个数,a是0到10之间常数

b.M = log2(n),n为输入层神经元个数 

(4)传递函数选择

一般隐含层使用Sigmoid函数,而输出层使用线性函数。如果输出层也采用Sigmoid函数,则输出结果为[0,1]或[-1,1]。

(5)训练函数选择

针对不同类型问题,选择不同训练函数。例如对于包含数百个权值的回归问题,LM收敛速度快,误差小。但LM占用内存大,模式识别问题处理能力弱,RPROP是更好的选择。(MATLAB中所有训练函数在后文列出)

(7)初始权值赋值

参数的初始值对训练过程有着重大的影响。对参数初始化的原则是:参数应该随机初始化在能让sigmoid函数在线性区域激活的值。如果参数全部都很大,那sigmoid一开始就饱和了,这样就会得到一个非常小的梯度值,那参数更新就会很慢,训练也会很慢。如果参数太小了,那梯度也会很小,同样也会导致训练很慢。


下面进入正题:MATLABBP神经网络的使用提供强大的仿真工具,除了一些函数外,更直观、简单的就是GUI的使用,简化了众多参数的设定,使得设计、仿真过程更加简单。


在命令界面输入nnstart命令

有四个选项,分别解决不同问题:

1)回归问题

2)归类问题(监督学习)

3)聚类问题(非监督学习)

4)非线性时间序列问题

此外,GUI界面的BP网络隐含层只有1层,不能修改。


选择Fitting app

接下来是输入数据,可以选择自己已经导入工作空间的数据,或者使用load example data set导入matlab的一些默认实验数据,我这里选择bodyfat,根据人体的年龄、身高、体重等个13个输入信息预测肥胖系数。输入数据大小13*253,输出数据大小1*253

接下来是训练数据、修正数据、测试数据的比重。修正数据的作用是对训练结果作一定调整,提升泛化能力,防止过拟合,GUI内训练数据比重是不能调整的,其他两个可以。

选择隐含层神经元结点数(默认为10)


选择训练方法,提供了3种方式,默认为LM算法。

此外,MATLAB提供了多种数据训练方式,在CODE模式下均可使用。LM算法训练数据通常是最快的,同样BFGS quasi-Newton算法速度也很快;但当数据规模较大时,这两种算法由于占用内存较大效率较低,此时SCG(分类问题)和RP算法是更好的选择;当数据规模较小且包含噪声时,可以选择BR算法。

有关这些学习算法的详细对比可以在matlab中搜索Choose a Multilayer Neural Network Training Function


训练完毕后,可以绘制回归曲线还有误差直方图。

回归曲线描述了网络对训练数据、修正数据、测试数据的拟合能力,理想情况下45°直线代表输出和目标完全相同。

误差直方图描述了不同误差对应点数的分布情况。可以根据直方图对数据做一些评价,例如:

(1)如果部分训练数据(占比很少)偏离中心较多,则可认为这部分数据可能是有错误的

(2)如果修正数据大部分集中在边缘,则说明原数据的过于重复,不具备泛化能力,可能需要添加更多数据,重新训练

如果对以上评价结果不满意的话,可以重新训练,调整学习方法,增加隐层节点数,增加数据量等。


最后可以将GUI做所的事情转换为代码,方便阅读:

Codegeneration将给出所训练神经网络的权重系数,可以查看网络的结构。

Generate Scripts是将GUI执行命令转换为代码,方便学习相应的函数。


Generate Scripts产生的代码如下:

% This script assumes these variables are defined:%%   bodyfatInputs - input data.%   bodyfatTargets - target data.x = bodyfatInputs;t = bodyfatTargets;% Choose a Training Function% For a list of all training functions type: help nntrain% 'trainlm' is usually fastest.% 'trainbr' takes longer but may be better for challenging problems.% 'trainscg' uses less memory. NFTOOL falls back to this in low memory situations.trainFcn = 'trainlm';  % Levenberg-Marquardt% Create a Fitting NetworkhiddenLayerSize = 10;net = fitnet(hiddenLayerSize,trainFcn);% Setup Division of Data for Training, Validation, Testingnet.divideParam.trainRatio = 70/100;net.divideParam.valRatio = 15/100;net.divideParam.testRatio = 15/100;% Train the Network[net,tr] = train(net,x,t);% Test the Networky = net(x);e = gsubtract(t,y);performance = perform(net,t,y)% View the Networkview(net)

执行一下Generate Scripts代码,得到:

Algorithms中描述了数据分组方式、训练方法以及评级函数。Process中描述了迭代次数、耗费时间、修正次数、初始误差/结束误差、初始梯度/结束梯度等。其中可以设置最大迭代次数、最小误差、最小梯度都可以作为训练神经网络的结束条件,在CODE模式都可以执行。

 

CODE执行的好处在于可以查看迭代过程中误差、梯度等变化情况,例如误差图:


如有问题,敬请指正~





0 0