利用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);
利用MATLAB工具箱學習BP神經網絡