利用MATLAB工具箱学习BP神经网络

BP神经网络:BP网络(Back Propagation)是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一,是1986年由Rumelhart和McCelland为首的科学家小组提出。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。

第1章 神经网络

1.1 生物神经网络的主要结构结构和类比

细胞体:神经元的主体;

树突:细胞体向外延伸的神经纤维,接受来自其他神经元的消息,相当于输入端

轴突:细胞体向外延伸出的最长的一条神经纤维,相当于输出端

突触:神经元通过轴突末梢和其它神经元进行信号连接,相当于输入和输出接口

1.2 人工神经元模型

人工神经元模型(Artificial Neural Networks,ANNs),也叫做神经网络(NNs),是一种模拟生物神经网络进行信息处理的一种数学模型。人工神经元是其基本信息处理单元,类似于生物神经网络和生物神经元关系,简而言之神经网络就是一种仿生。

1.3 人工神经网络的分类

1.3.1 分层网络

一般有输入层、隐含层(中间层)和输出层,各层级顺次连接。

分层网络又分为3类:
(1)单纯的前向型网络:可以用有向无环结构表示,输入层经过中间层模式变换,由输出层输出一个输出模式,这样便完成了一次网络状态的更新,单纯的前向型网络结构见下图(图以三个输入和三个输出为例)。

(2)具有反馈的前向型网络:在单纯前向型网络的基础上,加上反馈机制,即有环结构,具有反馈的单元称为隐单元,反馈前向型网络结构见下图(图以三个输入和三个输出为例)。

(3)层内互联的前向型网络:在单纯前向型网络的基础上,同一层级内的单元相互连接,可以限制同级内的激活单元数目,层内互联的前向型网络见下图(图以三个输入和三个输出为例)。

 

1.3.2 相互连接型网络

互联网络分为两类:局部互联和全互联。局部互联就是网络中每个单元输出并没有全和其它神经元相连;全互联是每个单元的输出都和其它神经元相。对于一般简单的前向神经网络,给定输入,可以快速给出输出;而相互连接的神经网络对于给定的输入。全互联网络结构见下图(图以三个输入和三个输出为例)。

1.4 神经元的数学模型

神经元的数学模型表达式:

 :输入或输出的延时;

 :神经元j的阈值;

 :神经元i到j的权值,与时间无关,具有非时变性,正负取值代表兴奋和抑制;

f() :神经元变换函数;

若上式中延时取单位延时,则可写为:

1.5 神经网络的学习方式

监督学习:事先给定标准样本,如反传网络、感知器等;

非监督学习:事先不给定标准样本,如Hebb学习规则等;

第2部分 BP神经网络

  1 %% BP神经网络 
  2 
  3 %% 第1部分 BP提供了两个函数实现创建,  
  4 %% 1.1 newcf函数  调用格式: net = newcf(PR,[S1,S2...SN],{TF1,TF2...TFN},BTF,BLF,PF)
  5 %%      PR:每组输入(共有R组输入)元素的最大值和最小值组成的R*2维的矩阵;
  6 %%      Si:第i层的长度;
  7 %%      TFi:各层的传递函数;
  8 %%      BTF:BP网络的训练函数,默认值为"trainlm"
  9 %%      BLF:权值和阈值的学习算法,默认值"learngdm";
 10 %%      PF:网络的性能函数,默认值"mse";
 11 %% 1.2 newff函数   调用格式: net = newff(PR,[S1,S2...SN],{TF1,TF2...TFN},BTF,BLF,PF)
 12 %%              参数含义同newcf函数;
 13 %% 案例:创建一个BP网络;
 14 clear all;
 15 X = [1 2; 2 3];             %输入训练集
 16 T = [1 2;2 1];              %目标集
 17 net = newff(X,T,5);         %建立BP网络
 18 net = train(net,X,T);       %网络训练
 19 X1 = X;
 20 disp('输出网络仿真数据');
 21 y = sim(net,X1);
 22 
 23 %% 第2部分 传递函数
 24 %% 2.1 logsig函数:对数S型函数传递曲线,  调用格式: A = logsig(N,FP)
 25 %%      N:S*Q维的网络输入向量矩阵;
 26 %%      FP:性能参数,可忽略;
 27 %%  dA_dN = logsig('dn',N,A,FP);
 28 %%      返回A关于N的导数dA_dN,如果A或FP没有给出或空矩阵,则FP返回默认参数;
 29 %%  info = logsig('code');
 30 %%     若   code = name,返回传递函数的全称; 
 31 %%          code=output,返回输出值域;
 32 %%          code=active,返回有效的输入区间;
 33 %%          code=fullderiv,返回导数的次数;
 34 %%          code=fpnames,返回函数参数的名称;
 35 %%          code=fpdefaults,返回默认的函数参数;
 36 %% 案例:绘制一个对数S型函数传递曲线;
 37 clear all;
 38 n = -5:0.1:5;
 39 a = logsig(n);
 40 plot(n,a);
 41 grid on;
 42 xlabel('输入数据');
 43 ylabel('对数S型传递曲线');
 44 
 45 
 46 %% 2.2 tansig函数:双曲正切S型传递函数, 调用格式: A = tansig(N,PF)
 47 %%      N:S*Q维的网络输入向量矩阵;
 48 %%      PF:性能参数,可忽略;
 49 %% 案例: 绘制一个双曲正切S型传递函数
 50 clear all;
 51 n =-5:0.1:5;
 52 a =tansig(n);
 53 plot(n,a);
 54 grid on ;                   %画网格
 55 xlabel('输入数据');                 
 56 ylabel('双曲正切S型传递函数');
 57 
 58 
 59 %% 第3部分 BP学习函数
 60 %%  3.1 learngd函数:梯度下降权值/阈值学习函数,它通过神经网络的输入和误差,以及权值和阈值的学习速率来计算权值或阈值的变化率;
 61 %%  调用格式:[dW,LS] = learngd(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
 62 %% info = learngd('code')
 63 %%      若  code=pnames,返回设置的学习参数;
 64 %%          code=pdefaults,返回默认的学习参数;
 65 %%          code=needg,如果函数使用了解gW或gA,则返回1;
 66 %%      W;S*R维的权值矩阵;
 67 %%      P:Q组R维的输入向量;
 68 %%      Z:Q组S维的加权输入向量;
 69 %%      N:Q组S维的输入向量;
 70 %%      A:Q组S维的输出向量;
 71 %%      T:Q组S维的层目标向量;
 72 %%      E:Q组S维的层误差向量;
 73 %%      gW;与性能相关的S*R维梯度;
 74 %%      gA:与性能相关的S*R维输出梯度;
 75 %%      D:S*S维的神经元距离矩阵;
 76 %%      LP:学习状态,初始状态下为空;
 77 %%      输出参数LS:新的学习速率;
 78 %%      输出参数dW:S*R维的权值或阈值变化率矩阵;
 79 %% 案例:根据给出的随机梯度及速率计算权值与阈值的变化率
 80 clear all;
 81 gW = rand(3,2);
 82 lp.lr = 0.5;
 83 dW = learngd([],[],[],[],[],[],[],gW,[],[],lp,[]);
 84 
 85 %%  3.2 learngdm函数:梯度下降动量学习函数,它通过神经网络的输入和误差、权值和阈值的学习速率和动量常数来计算权值或阈值的变化率;
 86 %%  调用格式:[dW,LS] = learngdm(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
 87 %%  info = learngdm('code')
 88 %%  参数同learngd函数
 89 %% 案例:根据给定的梯度、学习速率以及动量计算其权值及阈值变化率
 90 clear all;
 91 gW = rand(3,2);
 92 lp.lr = 0.5;
 93 lp.mc = 0.8;
 94 ls = [];
 95 [dW,ls] = learngdm([],[],[],[],[],[],[],gW,[],[],lp,ls);
 96 
 97 %% 第4部分 性能函数
 98 %%  4.1 mse函数:用于计算BP神经网络的均方误差;
 99 %%  调用格式:   perf = mse(E,Y,X,FP);
100 %%              dPerf_dy = mse('dy',E,Y,X,perf,FP);
101 %%              dPerf_dx = mse('dx',E,Y,X,perf,FP);
102 %%              info = mse('code');
103 %%                  当 code=pnames,返回设置的学习参数;
104 %%                      code=pdefaults,返回默认的学习参数;
105 %%                      code=pdefaults,返回默认的训练参数;
106 %%              E:误差矩阵或向量(E = T-Y,T表示网络的目标向量)
107 %%              Y:网络的输出向量(可忽略);         
108 %%              X:所有权值和阈值向量(可忽略);
109 %%              FP:性能参数(可忽略);
110 %%              perf:平均绝对误差;
111 %%              dPerf_dy:perf对Y的导数;
112 %%              dPerf_dx:perf对X的导数;
113 %%  案例:创建一个BP网络,并计算其均方误差性能
114 clear all;
115 net = newff([-10 10],[4,1],{'tansig','purelin'});   %创建一个BP网络
116 p = [-10 -5 0 5 10];
117 t = [0 0 1 1 1];
118 disp('网络仿真值');
119 y = sim(net,p);
120 disp('绝对误差值');
121 e = t-y;
122 disp('均方误差性能');
123 perf = mse(e);
124 
125 %% 4.2 msereg函数:用于通过两个因子的加权和来评估网络性能,这两个因子分别为均方误差、均方权值和阈值。
126 %%      调用格式:   perf = msereg(E,Y,X,FP);
127 %%                 dPerf_dy = msereg('dy',E,Y,X,perf,FP);
128 %%                 dPerf_dx = msereg('dx',E,Y,X,perf,FP);
129 %%        参数与mse同
130 %% 案例: 创建一个BP网络并评估其性能
131 clear all;
132 net = newff([-10 10],[4,1],{'tansig','purelin'});   %创建一个BP网络
133 p = [-10 -5 0 5 10];
134 t = [0 0 1 1 1];
135 y = sim(net,p);
136 e = t-y;
137 net.performParam.ratio = 20/(20+1);
138 perf = msereg(e,net);
139 
140 
141 %% 第5部分 训练函数
142 %%  5.1 trainbfg函数:该函数是BFGS准牛顿BP算法函数。除了BP网络外,还可以训练任意形式的神经网络,只要它的传递函数对于权值和输入存在导数
143 %%  即可;
144 %%  调用格式:[net,TR] = trainbfg(net,TR,trainV,valV,testV);
145 %%      net:神经网络对象;
146 %%      TR:初始化的训练记录;
147 %%      trainV:训练向量;
148 %%      valV:验证向量;
149 %%      testV:测试向量;
150 %%      输出参数net:训练网格;
151 %%      输出参数TR:训练记录;
152 %%      info = trainbfg('code'); 返回有关函数的有用信息;
153 %%
154 %%                  BP网格训练参数(MATLAB R2011a默认值)
155 %%  参数名称                        默认值                 属性
156 %%  net.trainParam.epochs           100        训练次数,100为人工设定训练次数最大值
157 %%  net.trainParam.showWindow       25          两次显示之间的训练步数(无显示时设为NaNa)
158 %%  net.trainParam.showCommandLine  0           生成命令行输出
159 %%  net.trainParam.showGUI          1           显示GUI训练
160 %%  net.trainParam.goal             0           训练目标
161 %%  net.trainParam.time             inf         训练时间,inf表示训练时间不限
162 %%  net.trainParam.min_grad         le-6        最小性能梯度
163 %%  net.trainParam.min_fail         5           最大确认失败次数
164 %%  net.trainParam.searchFcn      'srchcha'     所用的线性搜索路径  
165 %%
166 %%
167 %% 案例:对创建的BP网络进行BFGS准牛顿学习
168 clear all;
169 P = [0 1 2 3 4 5];
170 T = [0 0 0 1 1 1];
171 net = newff(P,T,2,{},'trainbfg');
172 a1 = sim(net,P);
173 net = train(net,P,T);
174 a2 = sim(net,P);
175 
176 %% 5.2 traingd函数
177 %% 案例:对创建的BP网络进行梯度下降学习;
178 clear all;
179 p = [-1 -1 2 2 ;0 5 0 5];
180 t = [-1 -1 1 1];
181 net = newff(p,t,3,{},'traingd');
182 % 对BP网络训练参数进行设置
183 net.divideFcn = '';
184 net.trainParam.show = 50;
185 net.trainParam.lr = 0.05;
186 net.trainParam.epochs = 300;
187 met.trainParam.goal = 1e-5;
188 a = sim(net,p);
189 
190 %% 5.3 traingdm函数:梯度下降动量BP算法函数;
191 %% 案例:对创建的BP网络进行动量梯度下降学习;
192 clear all;
193 p = [-1 -1 2 2;0 5 0 5];
194 t = [-1 -1 1 1];
195 net = newff(p,t,3,{},'traingdm');           %创建BP网络; 
196     % 对BP网络训练参数进行设置;
197 net.trainParam.lr = 0.05;
198 net.trainParam.mc = 0.9;
199 y = sim(net,p);                             %对网络进行仿真;
200 
201 %% 第6部分 显示函数(MATLAB神经网络工具箱提供了三个函数)
202 %%  6.1 errsurf函数:用于计算单个神经网络的误差曲面;
203 %%      调用格式:errsurf(P,T,WV,BV,F)
204 %%              P:输入行向量;
205 %%              T:目标行向量;
206 %%              WV:权值列向量;
207 %%              BV:阈值向量;
208 %%              F:函数名称;
209 
210 %%  6.2 plotes函数:用于绘制误差曲面图;由权值和阈值确定的、由函数errsurf计算得出的;
211 %%      plotes(WV,BV,ES,V);
212 %%          WV:权值的N维行向量;
213 %%          BV:M维的阈值行向量;
214 %%          ES:误差向量组成的额M*N维矩阵;
215 %%          V:视角,默认[-37.5,30];
216 %% 案例:根据样本和木笔噢数据,绘制误差曲面图;
217 clear all;
218 p = [-6.0 -6.1 -4.1 -4.0 +4.0 +4.1 +6.0 +6.1];
219 t = [+0.0 +0.0 +.97 +.99 +.01 +.03 +1.0 +1.0];
220 wv = -1:0.1:1;
221 bv = -2.5:0.25:2.5;
222 es = errsurf(p,t,wv,bv,'logsig');
223 plotes(wv,bv,es,[60 30]);
224 set(gcf,'color','w');
225 
226 
227 %%  6.3 plotep函数
228 %%     调用格式:F = plotep(W,B,E);
229 %%              F = plotep(W,B,E,H); 
230 %%              W:当前权值矩阵;
231 %%              B:当前阈值向量;
232 %%              E:当前神经元误差;
233 %%              H:权值和阈值在上一时刻的位置向量
234 %%              F:当前的权值和阈值位置信息向量;
235 %% 案例:根据输入样本和目标数据,计算权值和阈值在误差曲面上的位置;
236 clear all;
237 X =[2.0 2.0];
238 T = [0.5 0.52];
239 W = -4:0.4:4;
240 b = W;
241 ES = errsurf(X,T,W,b,'logsig');
242 plotes(W,b,ES,[60 60]);
243 W = -2;
244 b = 0;
245 net = newlind(X,T);
246 a = sim(net,X);
247 E = T-a;
248 e = sumsqr(E);
249 plotep(W,b,e);

猜你喜欢

转载自www.cnblogs.com/kwinwei/p/10695499.html