文档详情

BP神经网络初始化[精].doc

发布:2017-01-16约4.62千字共5页下载文档
文本预览下载声明
Matlab中BP神经网络的构建和初始化 Matlab中BP神经网络的构建和初始化 训练前馈网络的第一步是建立网络对象。函数newff建立一个可训练的前馈网络。这需要4个输入参数。第一个参数是一个Rx2的矩阵以定义R个输入向量的最小值和最大值。第二个参数是一个网络每层神经元个数的数组。第三个参数是包含每层用到的转移函数名称的细胞数组。最后一个参数是用到的训练函数的名称。 举个例子 下面命令将创建一个二层网络。它的输入是两个元素的向量,第一层有三个神经元,第二层有一个神经元。第一层的转移函数是tan-sigmoid,输出层的转移函数是linear。输入向量的第一个元素的范围是-1到2,输入向量的第二个元素的范围是0到5,训练函数是traingd。   net=newff([-1 2; 0 5],[3,1],{tansig,purelin},traingd); ? ?? ???这个命令建立了网络对象并且初始化了网络权重和偏置,因此网络就可以进行训练了。我们可能要多次重新初始化权重或者进行自定义的初始化。下面就是初始化的详细步骤。 ? ?? ???在训练前馈网络之前,权重和偏置必须被初始化。初始化权重和偏置的工作用命令init来实现。这个函数接收网络对象并初始化权重和偏置后返回网络对象。下面就是网络如何初始化的:   net = init(net);   我们可以通过设定网络参数net.initFcn和net.layer{i}.initFcn这一技巧来初始化一个给定的网络。net.initFcn用来决定整个网络的初始化函数。前馈网络的缺省值为initlay,它允许每一层用单独的初始化函数。设定了net.initFcn,那么参数net.layer{i}.initFcn 也要设定用来决定每一层的初始化函数。   对前馈网络来说,有两种不同的初始化方式经常被用到:initwb和initnw。initwb函数根据每一层自己的初始化参数(net.inputWeights{i,j}.initFcn)初始化权重矩阵和偏置。前馈网络的初始化权重通常设为rands,它使权重在-1到1之间随机取值。这种方式经常用在转换函数是线性函数时。initnw通常用于转换函数是曲线函数。它根据Nguyen和Widrow[NgWi90]为层产生初始权重和偏置值,使得每层神经元的活动区域能大致平坦的分布在输入空间。它比起单纯的给权重和偏置随机赋值有以下优点: (1)减少神经元的浪费(因为所有神经元的活动区域都在输入空间内)。 (2)有更快的训练速度(因为输入空间的每个区域都在活动的神经元范围中)。   初始化函数被newff所调用。因此当网络创建时,它根据缺省的参数自动初始化。init不需要单独的调用。可是我们可能要重新初始化权重和偏置或者进行自定义的初始化。例如,我们用newff创建的网络,它缺省用initnw来初始化第一层。如果我们想要用rands重新初始化第一层的权重和偏置,我们用以下命令:   net.layers{1}.initFcn = initwb;   net.inputWeights{1,1}.initFcn = rands;   net.biases{1,1}.initFcn = rands;   net.biases{2,1}.initFcn = rands;   net = init(net);%导入处理数据 load cmgatys; p = p; t = t; [pn,minp,maxp,tn,mint,maxt] = premnmx(p,t); [ptrans,transMat] = prepca(pn,0.001) [R,Q] = size(ptrans) iitst = 2:4:Q; iival = 4:4:Q; iitr = [1:4:Q 3:4:Q]; vv.P = ptrans(:,iival); vv.T = tn(:,iival); vt.P = ptrans(:,iitst); vt.T = tn(:,iitst); ptr = ptrans(:,iitr); ttr = tn(:,iitr); net = newff(minmax(ptr),[20,1],{tansig purelin},trainlm,learngd); net.layers{1}.initFcn = initwb; net.inputWeights{1,1}.initFcn = rands; net.biases{1,1}.initFcn = rands; net.biases{2,1}.initFcn = rands; net = init(net); %训练参数的设定
显示全部
相似文档