BP神经网络的Matlab语法

更新时间:2024-05-24 07:50:01 阅读量: 综合文库 文档下载

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

1. 数据预处理

在训练神经网络前一般需要对数据进行预处理,一种重要的预处理手段是归一化处理。下面简要介绍归一化处理的原理与方法。 (1) 什么是归一化?

数据归一化,就是将数据映射到[0,1]或[-1,1]区间或更小的区间,比如(0.1,0.9) 。

(2) 为什么要归一化处理?

<1>输入数据的单位不一样,有些数据的范围可能特别大,导致的结果是神经网络收敛慢、训练时间长。

<2>数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小。

<3>由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。例如神经网络的输出层若采用S形激活函数,由于S形函数的值域限制在(0,1),也就是说神经网络的输出只能限制在(0,1),所以训练数据的输出就要归一化到[0,1]区间。

<4>S形激活函数在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(X)在参数a=1时,f(100)与f(5)只相差0.0067。 (3) 归一化算法

一种简单而快速的归一化算法是线性转换算法。线性转换算法常见有两种形式: <1>

y = ( x - min )/( max - min )

其中min为x的最小值,max为x的最大值,输入向量为x,归一化后的输出向量为y 。上式将数据归一化到 [ 0 , 1 ]区间,当激活函数采用S形函数时(值域为(0,1))时这条式子适用。 <2>

y = 2 * ( x - min ) / ( max - min ) - 1

这条公式将数据归一化到 [ -1 , 1 ] 区间。当激活函数采用双极S形函数(值域为(-1,1))时这条式子适用。 (4) Matlab数据归一化处理函数

Matlab中归一化处理数据可以采用premnmx , postmnmx , tramnmx 这3个函数。 <1> premnmx

语法:[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t) 参数:

pn: p矩阵按行归一化后的矩阵

minp,maxp:p矩阵每一行的最小值,最大值

tn:t矩阵按行归一化后的矩阵

mint,maxt:t矩阵每一行的最小值,最大值

作用:将矩阵p,t归一化到[-1,1] ,主要用于归一化处理训练数据集。 <2> tramnmx

语法:[pn] = tramnmx(p,minp,maxp) 参数:

minp,maxp:premnmx函数计算的矩阵的最小,最大值 pn:归一化后的矩阵

作用:主要用于归一化处理待分类的输入数据。 <3> postmnmx

语法: [p,t] = postmnmx(pn,minp,maxp,tn,mint,maxt) 参数:

minp,maxp:premnmx函数计算的p矩阵每行的最小值,最大值 mint,maxt:premnmx函数计算的t矩阵每行的最小值,最大值

作用:将矩阵pn,tn映射回归一化处理前的范围。postmnmx函数主要用于将神经网络的输出结果映射回归一化前的数据范围。 2. 使用Matlab实现神经网络

使用Matlab建立前馈神经网络主要会使用到下面3个函数: newff :前馈网络创建函数 train:训练一个神经网络 sim :使用网络进行仿真

下面简要介绍这3个函数的用法。 (1) newff函数 <1>newff函数语法

newff函数参数列表有很多的可选参数,具体可以参考Matlab的帮助文档,这里介绍newff函数的一种简单的形式。 语法:net = newff ( A, B, {C} ,‘trainFun’) 参数:

A:一个n×2的矩阵,第i行元素为输入信号xi的最小值和最大值; B:一个k维行向量,其元素为网络中各层节点数;

C:一个k维字符串行向量,每一分量为对应层神经元的激活函数; trainFun :为学习规则采用的训练算法。

表3.1 BP网络的常用函数表 函数类型 前向网络创建函数 函数名称 newcf Newff logsig 函数用途 创建级联前向网络 创建前向BP网络 S型的对数函数 传递函数 学习函数 性能函数 显示函数 tansig purelin learngd learngdm mse msereg plotperf plotes plotep errsurf S型的正切函数 纯线性函数 基于梯度下降法的学习函数 梯度下降动量学习函数 均方误差函数 均方误差规范化函数 绘制网络的性能 绘制一个单独神经元的误差曲面 绘制权值和阈值在误差曲面上的位置 计算单个神经元的误差曲面

3.1.1 BP网络创建函数

1) newff

该函数用于创建一个BP网络。调用格式为: net=newff

net=newff(PR,[S1 S2..SN1],{TF1 TF2..TFN1},BTF,BLF,PF) 其中,

net=newff;用于在对话框中创建一个BP网络。 net为创建的新BP神经网络; PR为网络输入向量取值范围的矩阵;

[S1 S2…SNl]表示网络隐含层和输出层神经元的个数;

{TFl TF2…TFN1}表示网络隐含层和输出层的传输函数,默认为‘tansig’; BTF表示网络的训练函数,默认为‘trainlm’; BLF表示网络的权值学习函数,默认为‘learngdm’; PF表示性能数,默认为‘mse’。

<2>常用的激活函数 常用的激活函数有:

a) 线性函数 (Linear transfer function)

f(x) = x

该函数的字符串为’purelin’。

b) 对数S形转移函数( Logarithmic sigmoid transfer function )

该函数的字符串为’logsig’。

c) 双曲正切S形函数 (Hyperbolic tangent sigmoid transfer function )

也就是上面所提到的双极S形函数。

该函数的字符串为’ tansig’。

Matlab的安装目录下的toolbox\\nnet\\nnet\\nntransfer子目录中有所有激活函数的定义说明。 <3>常见的训练函数 常见的训练函数有:

traingd :梯度下降BP训练函数(Gradient descent backpropagation) traingdx :梯度下降自适应学习率训练函数

如果考虑增加动量项,可以使用两个训练函数:traingdm和traingdx traingdm——有动量的梯度下降法,设置动量因子的命令如下: net.trainParam.mc=0.9(缺省值为0.9)

traingdx——有自适应lr的动量梯度下降法,设置动量因子的命令同traingdm

<4>网络配置参数

一些重要的网络配置参数如下:

net.trainparam.goal :神经网络训练的目标误差 net.trainparam.show : 显示中间结果的周期

net.trainparam.epochs :最大迭代次数 net.trainParam.lr : 学习率

net.trainParam.max_fail :验证次数 net.trainParam.mc = 0.9; 动量因子

validation

(2) train函数 网络训练学习函数。

语法:[ net, tr, Y1, E ] = train( net, X, Y ) 参数:

X:网络实际输入 Y:网络应有输出 tr:训练跟踪信息

Y1:网络实际输出 E:误差矩阵 (3) sim函数 语法:Y=sim(net,X) 参数: net:网络

X:输入给网络的K×N矩阵,其中K为网络输入个数,N为数据样本数 Y:输出矩阵Q×N,其中Q为网络输出个数 保存网络

validation checks是用来防止网络训练过适的,即是训练时网络的验证误差大于训练误差的次数,默认值为6就是大于次数达到6次训练就会停止。网络训练过适时,即使

performance还在减小网络性能也不会提高,反而会降低,因此要设定过适次数来提前训练以保证网络性能。 % 当前输入层权值和阈值 inputWeights=net.IW{1,1}

inputbias=net.b{1} % 当前网络层权值和阈值 layerWeights=net.LW{2,1} layerbias=net.b{2}

inputWeights=net.IW{1,1}

inputbias=net.b{1} %当前输入层权值和阀值 layerWeights=net.LW{2,1} layerbias=net.b{2}

net.IW{1,1}; 输入层到第一层隐层的权值 net.b{1,1}; 输入层到第一层隐层的阈值 net.LW{2,1}; 第一层隐层到第二层隐层的权值 net.b{2,1}; 第一层隐层到第二层隐层的阈值 net.LW{3,2}; 第二层隐层到输出层的权值

net.b{3,2}; 第二层隐层到输出层的阈值

1.网络总体结构

网络总体结构包括以下属性:

(1) numInputs:该属性定义了神经网络的输入个数,属性值可以是 0 或正整数。需要注意的是,该属性定义了网络输入矢量的总个数,而不是单个输入矢量的维数。

(2) numLayers:该属性定义了神经网络的层数,其属性值可以是 0 或正整数。

(3) biasConnect:该属性定义了神经网络的每层是否具有阈值,其属性值为 N×1 维的布尔量矩阵,其中 N 为网络的层数(net.numLayers)。net.biasConnect(i)为 1,表示第 i 层上的神经元具有阈值,为 0 则表示该层没有阈值.

(4) inputConnect:该属性定义了神经网络的输入层,其属性值为 N×Ni 维的布尔量矩阵,其中 N 为网络的层数,Ni 为网络的输入个数(net.numInputs)。net.inputConnect(i,j)为1,表示第 i 层上的每个神经元都要接收网络的第 j 个输入矢量,为 0 则表示不接收该 输入。

(5) layerConnect:该属性定义了网络各层的连接情况,其属性值为 N×N 维的布尔量矩阵,其中 N 为网络的层数。net.layerConnect(i,j)为 1,表示第 i 层与第 j 层上的神经元相连,为 0 则表示它们不相连。 (6) outputConnect:该属性定义了神经网络的输出层,其属性值为 1×N 维的布尔量矩阵,其中 N 为网络的层数。net.outputConnect(i)为 1,表示第 i 层神经元将产生网络的输出,为 0 则表示该层不产生输出。

(7) targetConnect:该属性定义了神经网络的目标层,即网络哪些层的输出具有目标矢量。其属性值为 1×N 维的布尔量矩阵,其中 N 为网络的层数。net.targetConnect(i)为 1,表示第 i 层神经元产生的输出具有目标矢量,为 0 则表示该层输出不具有目标矢量。

(8) numOutputs:该属性定义了神经网络输出矢量的个数,属性值为只读变量,其数值为网络中输出层的总数(sum(net.outputConnect))。

(9) numTargets:该属性定义了网络目标矢量的个数,属性值为只读变量,其数值为网络中目标层的总数(sum(net.targetConnect))。

(10) numInputDelays:该属性定义了神经网络的输入延迟,属性值为只读变量,其数值为网络各输入层输入延迟拍数(net.inputWeights{i,j}.delays)中的最大值。

(11) numLayerDelays:该属性定义了神经网络的层输出延迟,属性值为只读变量,其数值为各层的神经元之间连接延迟拍数(net.layerWeights{i,j}.delays)中的最大值。 2.子对象结构 子对象结构包括以下属性:

(1) inputs:该属性定义了神经网络每个输入的属性,其属性值为 Ni×1 维的单元数组,其中 Ni 为网络输入的个数。

(2) layers:该属性定义了神经网络每层神经元的属性,其属性值为 N×1 维的单元数组,其中 N 为网络的层数。

(3) outputs:该属性定义了神经网络每个输出的属性,其属性值为 N×1 维的单元数组,其中 N 为网络的层数。

(4) targets:该属性定义了每层神经网络目标矢量的属性,其属性值为 N×1 维的单元数组,其中 N 为网络的层数。

(5) biases:该属性定义了每层神经网络阈值的属性,其属性值为 N×1 维的单元数组,其中 N 为网络

的层数。

(6) inputWeights:该属性定义了神经网络每组输入权值的属性,其属性值为 N×Ni 维的单元数组,其中 N 为网络的层数,Ni 为网络的输入个数。

(7) layerWeights:该属性包括了神经网络各层神经元之间网络权值的属性,其属性值为 N×N 维的单元数组,其中 N 为网络的层数。

3.函数 神经网络对象的函数包括以下属性:

(1) adaptFcn:该属性定义了网络的自适应调整函数,其属性值为表示自适应函数名称的字符串。 (2) initFcn:该属性定义了网络的初始化函数,其属性值为表示网络初始化函数名称的字符串。 (3) performFcn:该属性定义了衡量网络输出误差的性能函数,其属性值为表示性能函数名称的字符串。 (4) trainFcn:该属性定义了网络的训练函数,其属性值为表示训练函数名称的字符串。 4.函数参数 神经网络对象的函数参数包括以下属性:

(1) adaptParam:该属性定义了网络当前自适应函数的各参数,其属性值为各参数构成的结构体。 (2) initParam:该属性定义了网络当前初始化函数的各参数,其属性值为各参数构成的结构体。 (3) performParam:该属性定义了网络当前性能函数的各参数,其属性值为各参数构成的结构体。 (4) trainParam:该属性定义了网络当前训练函数的各参数,其属性值为各参数构成的结构体。 5.权值和阈值

神经网络对象的权值和阈值包括以下属性:

(1) IW:该属性定义了网络输入和各输入层神经元之间的网络权值,属性值为 N×Ni维的单元数组,其中,N 为网络的层数,Ni 为网络的输入个数。如果 net.inputConnect(i,j)为 1,即第 i 层上的各神经元接收网络的第 j 个输入,那么在单元 net.IW{i,j}中将存储它们之间的网络权值矩阵,该矩阵的行数为第 i 层神经元的个数(net.layers{i}.size),列数为第 j个输入的维数(net.inputs{j}.size)与输入延迟拍数(net.inputWeights{i,j}.delays)的乘积。

(2) LW:该属性定义了各层神经元之间的网络权值,其属性值为 N×N 维的单元数组,其中 N 为网络的层数。如果 net.layerConnect(i,j)为 1,即第 i 层与第 j 层上的神经元相连,那么在单元 net.LW{i,j}中将存储它们之间的网络权值矩阵,该矩阵的行数为第 i 层上神经元的个数(net.layers{i}.size),列数为第 j 层神经元的个数(net.layers{j}.size)与层输入延迟拍数(net.layerWeights{i,j}.delays)的乘积。

(3) b:该属性定义了各层神经元的阈值,其属性值为 1×N 维的单元数组,其中 N 为网络的层数。如果 net.biasConnect(i)为 1,即第 i 层的神经元具有阈值,那么单元 net.b{i}中将存储该层的阈值矢量,矢量维数和第 i 层的神经元个数(net.layers{j}.size)相等。 6.其他数据

userdata 属性用于存储用户信息。 2 神经网络的细节结构(子对象属性)

将详细介绍网络输入、网络层、输出、目标、权值和阈值等子对象的属性。 1.输入(inputs)

网络输入 net.inputs 为 Ni×1 维的单元数组,其中 net.inputs{i}中存储了网络第 i 个输入的信息。网络的每个输入具有以下属性:

(1) size:该属性定义了输入矢量的维数,其属性值可以为 0 或正整数。

(2) range:该属性定义了输入矢量的取值范围,其属性值为 Ri×2 维的矩阵,Ri 为输入矢量的维数(net.inputs{i}.size),该矩阵中的每一行表示输入矢量中各维元素可取的最小值和最大值。 (3) userdata:该属性用于存储用户信息。

2.层(layers) 网络各层 net.layers 为 N×1 维的单元数组,其中 net.layers{i}中存储了网络第 i 层的信息。网络的每一层具有以下属性:

(1) size:该属性定义了每层神经元的个数,其属性值可以为 0 或正整数。

(2) dimensions:该属性定义了每层神经元在多维空间中排列时各维的维数,其属性值为一个行矢量,该矢量中各元素的乘积等于该层神经元的个数(net.layers{i}.size)。该属性对于自组织映射网络十分重要。 (3) topologyFcn:该属性定义了每层神经元在多维空间中分布的拓扑函数,其属性值为表示拓扑函数名称的字符串。

(4) positions:该属性定义了每层网络中各神经元的位置坐标,属性值为只读变量,其值由拓扑函数(net.layers{i}.topologyFcn)和神经元在各维分布的维数(net.layers{i}.dimensions)来确定。

(5) distanceFcn:该属性定义了每层神经元间距的计算函数,其属性值为表示距离函数名称的字符串。 (6) distances:该属性定义了每层网络中各神经元之间的距离,属性值为只读变量,其数值由神经元的位置坐标(net.layers{i}.positions)和距离函数(net.layers{i}.distanceFcn)来 确定。

(7) initFcn:该属性定义了每层神经元的初始化函数,其属性值为表示初始化函数名称的字符串。 (8) netInputFcn:该属性定义了每层神经元的输入函数,其属性值为表示输入函数名称的字符串。该函数确定了网络每层的加权输入以何种方式和阈值组合在一起以形成神经元传递函数的输入。

(9) transferFcn:该属性定义了每层神经元的传递函数,其属性值为表示传递函数名称的字符串。 (10) userdata:该属性用于存储用户信息。 3.输出(outputs)

网络输出 net.outputs 为 N×1 维的单元数组,如果第 i 层产生网络的一个输出,那么在net.outputs{i}中将存储该输出量的信息。网络的每一个输出都具有以下属性:

(1) size:该属性定义了每一个网络输出的维数,属性值为只读变量,其数值等于该输出层中神经元的个数(net.layers{i}.size) 。

(2) userdata:该属性用于存储用户信息 4.目标(targets)

目标 net.targets 为 N×1 维的单元数组,如果第 i 层具有网络的一个目标矢量,那么在net.targets{i}中将存储该目标矢量的信息。网络的每一个目标矢量都具有以下属性:

(1) size:该属性定义了每一个神经网络目标矢量的维数,属性值为只读变量,其数值等于第 i 层中神经元的个数(net.layers{i}.size)。

(2) userdata:该属性用于存储用户信息。 5.阈值(biases)

阈值 net.biases 为 N×1 维的单元数组,第 i 个单元 net.biases{i}中存储了第 i 层神经元的阈值信息。网络中每一层神经元的阈值都具有以下属性:

(1) initFcn:该属性定义了阈值的初始化函数,其属性值为表示阈值初始化函数名称的字符串。 (2) learn:该属性定义了阈值在训练过程中是否进行调整,其属性值为 0 或 1。

(3) learnFcn:该属性定义了阈值的学习函数,其属性值为表示阈值学习函数名称的字符串。 (4) learnParam:该属性定义了阈值学习函数的参数,其属性值为各参数构成的结 构体。

(5) size:该属性定义了每层神经网络的阈值个数,属性值为只读变量,其数值等于该层神经元的个数(net.layers{i}.size)。

(6) userdata:该属性用于存储用户信息。 6.输入权值(inputWeights)

网络输入权值 net.inputWeights 为 N×Ni 维的单元数组,其中 net.inputWeights{i,j}为网络第 j 个输入到

网络第 i 层的网络权值的属性。每一组网络输入权值都具有以下属性:

(1) delays:该属性定义了网络输入的各延迟拍数,其属性值是由 0 或正整数构成的行矢量,各输入层实际接收的是由网络输入的各个延迟构成的混合输入。

(2) initFcn:该属性定义了输入权值的初始化函数,其属性值为表示权值初始化函数名称的字符串。 (3) learn:该属性定义了输入权值在训练过程中是否进行调整,其属性值为 0 或 1。

(4) learnFcn:该属性定义了输入权值的学习函数,其属性值为表示权值学习函数名称的字符串。 (5) learnParam:该属性定义了权值学习函数的参数,其属性值为各参数构成的结 构体。

(6) size:该属性定义了每个输入权值矩阵(net.IW{i,j})的大小,其属性值是一个具有两元 素 的 行 矢 量 , 并 且 是 只 读 变 量 , 其 中 第 一 个 元 素 等 于 该 层 神 经 元 的 个 数(net.layers{i}.size),第二个元素等于输入延迟矢量的长度(length(net.inputWeights{i,j}.delays))和输入矢量维数(net.inputs{j}.size)的乘积。

(7) userdata:该属性用于存储用户信息。

(8) weightFcn:该属性定义了输入权值的加权函数,其属性值为表示加权函数名称的字符串,该函数确定了输入和权值以何种方式组合在一起构成神经元的加权输入量。 7.各层网络权值(layerWeights)

网 络 各 层 间 的 网 络 权 值 net.layerWeights 为 N × N 维 的 单 元 数 组 , 其 中net.layerWeights{i,j}为从网络第 j 层到第 i 层的网络权值的属性。网络权值具有以下属性:

(1) delays:该属性定义了网络第 j 层的输出送入到网络第 i 层之前要经过的各延迟拍数,其属性值是由 0 或正整数构成的行矢量。

(2) initFcn:该属性定义了权值的初始化函数,其属性值为表示权值初始化函数名称的字符串。 (3) learn:该属性定义了权值在训练过程中是否进行调整,其属性值为 0 或 1。

(4) learnFcn:该属性定义了权值的学习函数,其属性值为表示权值学习函数名称的字符串。 (5) learnParam:该属性定义了权值学习函数的参数,其属性值为各参数构成的结 构体。

(6) size:该属性定义了权值矩阵(net.LW{i,j})的大小,其属性值是一个具有两元素的行矢量,并且为只读变量,其中第一个元素等于第 i 层神经元的个数(net.layers{i}.size),第二个元素等于两层网络之间延迟矢量的长度(length(net.layerWeights{i,j}.delays))和第 j 层神经元个数(net.layers{j}.size)的乘积。 (7) userdata:该属性用于存储用户信息。

(8) weightFcn:该属性定义了加权函数,其属性值为表示加权函数名称的字符串。

培训职能。

trainb - 批具有重量与偏见学习规则的培训。 trainbfg - 的BFGS拟牛顿倒传递。 trainbr - 贝叶斯规则的BP算法。

trainbu - 与重量与偏见一批无监督学习规则的培训。 trainbuwb - 与体重无监督学习规则与偏见一批培训。 trainc - 循环顺序重量/偏见的培训。

traincgb - 共轭鲍威尔比尔重新启动梯度反向传播。 traincgf - 共轭弗莱彻-里夫斯更新梯度反向传播。 traincgp - 共轭波拉克- Ribiere更新梯度反向传播。 traingd - 梯度下降反向传播。

traingda - 具有自适应LR的反向传播梯度下降。 traingdm - 与动量梯度下降。

traingdx - 梯度下降瓦特/惯性与自适应LR的反向传播。 trainlm - 采用Levenberg -马奎德倒传递。 trainoss - 一步割线倒传递。 trainr - 随机重量/偏见的培训。 trainrp - RPROP反向传播。

trainru - 无监督随机重量/偏见的培训。 火车 - 顺序重量/偏见的培训。

trainscg - 规模化共轭梯度BP算法。

绘图功能。

plotconfusion - 图分类混淆矩阵。 ploterrcorr - 误差自相关时间序列图。 ploterrhist - 绘制误差直方图。 plotfit - 绘图功能适合。

plotinerrcorr - 图输入错误的时间序列的互相关。 plotperform - 小区网络性能。 plotregression - 线性回归情节。

plotresponse - 动态网络图的时间序列响应。 plotroc - 绘制受试者工作特征。 plotsomhits - 小区自组织图来样打。

plotsomnc - 小区自组织映射邻居的连接。 plotsomnd - 小区自组织映射邻居的距离。 plotsomplanes - 小区自组织映射重量的飞机。 plotsompos - 小区自组织映射重量立场。 plotsomtop - 小区自组织映射的拓扑结构。 plottrainstate - 情节训练状态值。 plotwb - 图寒春重量和偏差值图。

列出其他神经网络实现的功能。

nnadapt - 适应职能。 nnderivative - 衍生功能。 nndistance - 距离函数。 nndivision - 除功能。

nninitlayer - 初始化层功能。

nninitnetwork - 初始化网络功能。 nninitweight - 初始化权函数。 nnlearn - 学习功能。

nnnetinput - 净输入功能。 nnperformance - 性能的功能。 nnprocess - 处理功能。 nnsearch - 线搜索功能。

nntopology - 拓扑结构的功能。 nntransfer - 传递函数。 nnweight - 重量的功能。

示例,数据集和其他资源

nndemos - 神经网络工具箱的示威。 nndatasets - 神经网络工具箱的数据集。 nntextdemos - 神经网络设计教科书的示威。 nntextbook - 神经网络设计教科书的资讯。

nnadapt - 适应职能。 nnderivative - 衍生功能。 nndistance - 距离函数。 nndivision - 除功能。

nninitlayer - 初始化层功能。

nninitnetwork - 初始化网络功能。 nninitweight - 初始化权函数。 nnlearn - 学习功能。

nnnetinput - 净输入功能。 nnperformance - 性能的功能。 nnprocess - 处理功能。 nnsearch - 线搜索功能。

nntopology - 拓扑结构的功能。 nntransfer - 传递函数。 nnweight - 重量的功能。

示例,数据集和其他资源

nndemos - 神经网络工具箱的示威。 nndatasets - 神经网络工具箱的数据集。 nntextdemos - 神经网络设计教科书的示威。 nntextbook - 神经网络设计教科书的资讯。

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

Top