實驗部分:
①輸入、輸出矢量及問題的闡述
由題意輸入變量取值範圍為e={-2,-1,0,1,2}和ec={-2,-1,0,1,2},則輸入矢量有25種情況,分别如下所示:
則由T=int((e+ec)/2) ,采用向下取整,可得輸出矢量T為:
該問題可描述為通過訓練BP神經網絡實作模糊控制規則T=int((e+ec)/2),并達到網絡輸出與期望值誤差小于0.001。選取較好的BP神經網絡參數,包括隐含層節點個數、學習速率等。同時對不同的學習訓練算法進行比較,并通過内插方法測試網絡。
②給出網絡結構
由于有兩個輸入量,是以輸入層采用兩個神經元,輸出為單值即僅需采用一個神經元。網絡采用一個隐含層,假設其神經元節點個數為S1,則網絡結構可寫為2- S1-1。其中隐含層采用S型激活函數,輸出層采用線性激活函數。
針對不同的S1,采用固定誤差目标為Err_goal=0.001,固定學習速率0.1,最大疊代次數Max_iteration=10000,采用标準梯度下降訓練算法,并通過對網絡訓練時所需要的循環次數和訓練時間的情況觀察網絡求解效果。
考慮到在不同初始權重和偏差下神經網絡性能也可能不同,是以在确定隐含層神經元個數下,選取三次不同初始值,根據平均訓練時間和循環次數以及所能達到的精度來确定S1。
表一 隐含層節點尋優
S1 | 時間/s | 循環次數 | 結果SEE | ||||||
3 | 10 | 10 | 10 | 10000 | 10000 | 10000 | 0.0470 | 0.0326 | 0.0645 |
10 | 10000 | > | |||||||
8 | 10 | 10 | 10 | 10000 | 10000 | 10000 | 0.0059 | 0.0378 | 0.0013 |
10 | 10000 | > | |||||||
9 | 7 | 11 | 5 | 7070 | 10000 | 5593 | 0.0010 | 0.0237 | 0.0010 |
7.6 | 7553 | > | |||||||
10 | 10 | 8 | 6 | 9232 | 7325 | 6522 | 0.0010 | 0.0010 | 0.0010 |
8 | 7692 | = | |||||||
11 | 4 | 2 | 10 | 3667 | 2921 | 9601 | 0.0010 | 0.0010 | 0.0010 |
5.3 | 5394 | = | |||||||
12 | 5 | 11 | 8 | 5419 | 10000 | 7831 | 0.0010 | 0.0039 | 0.0010 |
8 | 7750 | > | |||||||
13 | 4 | 3 | 6 | 4840 | 4054 | 6762 | 0.0010 | 0.0010 | 0.0010 |
4.3 | 5218.6 | = | |||||||
14 | 1 | 6 | 3 | 994 | 6576 | 3394 | 0.0010 | 0.0010 | 0.0010 |
3.3 | 3654 | = |
通過上表實驗資料,對比可知,當隐含層神經元個數大于10個時結果開始趨于穩定,故選取S1=10,并固定三次訓練中最好結果的的初始值,即誤差平方和SEE=0.0010,疊代時間為6s,疊代次數為6522次的實驗資料。
該網絡權重和偏差初始值分别如下:
其中 W^1和 b^1分别為隐含層的權重和偏差,W^2 和 b^2分别為輸出層的權重和偏差。
确定好S1後,固定随機初始值開始對學習速率進行尋優
表二 學習速率尋優
時間/s | 循環次數 | 結果SEE | |
0.07 | 11 | 9225 | 0.00100 |
0.08 | 9 | 8100 | 0.00100 |
0.09 | 8 | 7223 | 0.00100 |
0.10 | 7 | 6522 | 0.00100 |
0.11 | 6 | 5948 | 0.00100 |
0.12 | 6 | 5470 | 0.00100 |
0.13 | 6 | 5066 | 0.00100 |
0.14 | 5 | 4721 | 0.00100 |
0.15 | 5 | 4423 | 0.00100 |
0.16 | 4 | 4163 | 0.00100 |
0.17 | 4 | 3935 | 0.00100 |
0.20 | 3 | 3254 | 0.00099 |
0.25 | 12 | 10000 | 0.00361 |
由上圖可觀察到在學習速率小于0.16時,誤差SEE能夠平滑快速下降,當 0.17時有毛刺迹象,實驗可得0.25時發散,故選擇 =0.16。
當采用變學習速率的學習算法,即triangda算法時實驗結果如下:
表三 自适應學習速率訓練情況
時間/s | 循環次數 | 結果SEE |
4 | 3192 | 0.0010 |
可見自适應算法的收斂速度要快。
③學習方法(包括所采用的改進方法);
對于不同的權值訓練方法,采用S1=10, =0.16,目标精度為0.001,最大疊代次數為10000次,保持參數不變。實驗結果如下表所示:
表四 不同學習訓練算法對比分析
函數 | 算法描述 | 時間/s | 疊代次數 | 結果 |
traingd | 标準梯度下降 | 4 | 4163 | 0.0010 |
traingdm | 附加動量,mc=0.9 | 11 | 10000 | 0.0204 |
traingda | 變學習速率 | 4 | 3192 | 0.0010 |
traincgf | Fletcher-Powell共轭 | 2 | 108 | 0.00099 |
traincgp | Powell-Ribiere共轭 | <1 | 103 | 0.00093 |
trainscg | Scaled共轭 | <1 | 94 | 0.00095 |
trainbfg | BFGs拟牛頓 | 1 | 65 | 0.00081 |
trainoss | 正割拟牛頓 | <1 | 183 | 0.00099 |
trainrp | 彈性BP算法 | <1 | 184 | 0.00098 |
trainlm | Levenberg-Marquardt | <1 | 29 | 0.00090 |
④初始化及必要的參數選取;
初始化必要參數選擇(對于标準梯度下降算法):網絡結構2-10-1,即S1=10, =0.16,最大疊代次數10000次,初始化權重和偏差如W^1,b^1,W^2 ,b^2分 所示。
⑤最後的結果,循環次數,訓練時間,其中着重讨論:
a)不同隐含層S1時的收斂速度與誤差精度的對比分析,詳細分析見表一。
b)當S1設定為較好的情況下,在訓練過程中取始終不變的學習速率lr值時,對lr值為不同值時的訓練時間,包括穩定性進行觀察比較,詳細分析見表二。
c)當采用自适應值學習速率時,與單一固定的學習速率lr中最好的情況進行對比訓練的觀察,詳細分析見表三。
d)給出結論或體會。
本次實驗首先通過對标準梯度下降學習算法的最佳隐含層節點個數和最佳學習速率的尋優,充分了解掌握了BP神經網絡的訓練方法和結果分析。同時對其他不同的學習算法進行實驗分析,其中效果最佳的為Levenberg-Marquardt法,僅需要29次疊代就可以達到目标精度,次優的為BFGs拟牛頓法,需要65次疊代達到目标精度。通過這次實驗收獲很大。
⑥驗證,采用插值法選取多于訓練時的輸入,對所設計的網絡進行驗證,給出驗證的A與T值。
采用内插值,可知輸入變量取值範圍為 e=[-2,2]和ec=[-2,2],選取 30組内插測試集,并通過計算得到期望輸出矢量T_test。輸入矢量有30種情況,分别如下所示:
通過測試,得到測試結果為:
則E=T_test-Y 為:
可以看到在30組的測試集中有4組是有誤差的,分析原因可知當 的值存在0.5左右的小數時,結果很可能出錯,這可能是在得到 和 時采用round()四舍五入運算,而訓練樣本采用向下取整。
P = [-2 -2 -2 -2 -2 -1 -1 -1 -1 -1 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2;
-2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2];
%T = [-2 -1 -1 -1 0 -1 -1 -1 0 0 -1 -1 0 0 1 -1 0 0 1 1 0 0 1 1 2];
T = [-2 -2 -1 -1 0 -2 -1 -1 0 0 -1 -1 0 0 1 -1 0 0 1 1 0 0 1 1 2];
P_test=[-1.0557 -1.3090 1.2044 1.1025 -0.8188 1.0945 -1.4473 -1.2423 -1.4905 -1.4868 -0.9071 -0.5317 -1.2507 -0.9795 -1.9378 1.8502 -1.9682 -0.5628 0.1633 0.0684 -1.4024 -1.7638 0.8895 0.6688 0.3943 -0.2545 -1.0839 0.0455 -0.6156 0.5526;
-0.8437 -1.2052 -0.8015 0.7111 0.9226 1.6034 1.1763 -1.8841 -1.4651 1.7410 1.7707 -1.0552 0.1826 -0.7767 0.3500 1.3994 0.5361 -1.5438 -0.3343 1.5445 -0.2613 -0.4759 -1.6195 -0.8144 -1.3926 -1.9493 -0.9453 -1.1397 0.9913 1.4901];
T_test=zeros(1,30);
for i=1:30
T_test(1,i)=round((P_test(1,i)+P_test(2,i))/2);
end
%T_test
% for i=1:25
% plot3(P(1,i),P(2,i),T(i),\'ro\')
% hold on
% end
w1=[-1.4806 -1.6455
-1.8388 -1.2325
2.2000 -0.2448
-1.6214 -1.5070
-1.0210 1.9641
-2.0718 -0.7795
-0.6118 -2.1274
-1.6455 -1.4806
1.9736 -1.0025
-1.2304 -1.8401];
b1=[4.4272
3.4434
-2.4595
1.4757
0.4919
-0.4919
-1.4757
-2.4595
3.4434
-4.4272];
w2=[0.0109 0.5229 0.2621 -0.8202 -0.8383 0.5545 0.8103 0.0675 -0.7817 0.6516];
b2=-0.3238;
net=newff([-2 2;-2 2],[10,1],{\'tansig\',\'purelin\'},\'trainlm\'); %建立兩層前向回饋網絡
net.trainParam.epochs=10000; %初始化訓練次數
net.trainParam.goal=0.001;
net.trainParam.lr=0.16;
net.trainParam.show = 25; %顯示循環間隔
%在開始訓練之前我們需要知道權重和偏差的随機初始值
% net.IW{1}
% net.b{1}
% net.LW{2}
% net.b{2}
%初始值負值
net.IW{1}=w1;
net.b{1}=b1;
net.LW{2}=w2;
net.b{2}=b2;
[net,tr]=train(net,P,T); %訓練網絡
round(sim(net,P))
T_test
Y=round(sim(net,P_test)) %計算結果
E=T_test-Y
sumsqr(E)
% net.IW{1}
% net.b{1}
% net.LW{2}
% net.b{2}
View Code