文/羅莉
BP神經網絡是一種按照誤差逆向傳播算法訓練的多層前饋神經網絡,已廣泛應用于模式識別、函數(shù)逼近、信號處理和自動控制等領域,是目前應用最廣泛的神經網絡。
在目前數(shù)學和工程計算領域較為通用的軟件Matlab中,針對神經網絡系統(tǒng)的分析與設計,提供了大量可供直接調用的工具箱函數(shù)、圖形用戶界面和Simulink仿真工具,是進行神經網絡系統(tǒng)分析與設計的一個很好的工具。
在使用Matlab建模BP神經網絡過程中,需要調用函數(shù)newff建立一個可訓練的前饋網絡,此函數(shù)存在新舊兩個版本,而現(xiàn)在文獻介紹的都是舊版本的使用,對于新版本如何使用卻鮮有介紹。導致現(xiàn)在很多用戶使用新版本訓練函數(shù)newff時,遇到訓練結果不理想的問題,苦于找不到原因。本文即以數(shù)字識別為例,一方面指出新老版本newff使用上的區(qū)別,另一方面對常見的訓練函數(shù)進行對比實驗,找到了適用于本文案例的最佳訓練函數(shù)。
現(xiàn)需要設計一個三層BP神經網絡對數(shù)字0至9進行分類識別,訓練數(shù)據(jù)如圖1所示,測試數(shù)據(jù)如圖2所示,文獻[5]中有描述。
該分類問題有10類,由此可設計出BP網絡的輸出層有10個結點,可采用如圖3所示的輸出目標矩陣。
圖3中的第1列向量代表數(shù)字0的目標輸出,第2列向量代表數(shù)字1的目標輸出,第3列向量代表數(shù)字2的目標輸出,以此類推……
由圖1可知訓練數(shù)據(jù)的每個數(shù)字可用9×7的網格表示,用白色像素代表0,灰色像素代表1,可將網格表示為0或者1的長位串。位映射由左上角開始向下直到網格的整個一列,然后重復其他列。如數(shù)字“1”的網格的數(shù)字串表示為{0,0,0,0,0,0,0,0,0;0,0,0,0,0,0,0,1,0;0,0,1,0,0,0,0,1,0;0,1,1,1,1,1,1,1,0;0,0,0,0,0,0,0,1,0;0,0,0,0,0,0,0,1,0;0,0,0,0,0,0,0,0,0}。由此可確定輸入層有9×7=63個結點,對應上述網格的映射。
輸入與輸出層的結點個數(shù)已確定,分別是63和10,對于此類比較簡單的分類問題,選用一個隱層即可。隱層結點數(shù)如何確定?對于BP網絡結構中隱層結點數(shù)的選取沒有完善的理論可以利用,目前均是進行摸索試驗。一般地,確定三層BP網絡的隱層結點數(shù)的經驗公式有如下幾個:(m為隱層結點數(shù);n為輸入層節(jié)點數(shù);l為輸出層結點數(shù);α為1~10之間的常數(shù))?;谏厦?個經驗公式,我們又經過多次摸索試驗,最終決定隱層結點數(shù)設置為20比較優(yōu),于是構造出網絡結構為63-20-10的BP神經網絡,如圖4所示。
圖1:數(shù)字分類訓練數(shù)據(jù)
圖2:數(shù)字分類測試數(shù)據(jù)
使用Matlab創(chuàng)建神經網絡時,需要用到newff函數(shù)建立網絡對象,但若使用舊版本的newff函數(shù),會出現(xiàn)警告信息,這是由于使用了舊版本的newff參數(shù)列表。解決方法很簡單,就是改為新版本形式的參數(shù)列表。舊版本中第一個參數(shù)需要結合minmax()函數(shù)使用,新版本不需要了;另外新版本中不需要指定輸出層的神經元個數(shù),改為由輸入?yún)?shù)output決定,其他參數(shù)不變。這是新舊版本創(chuàng)建神經網絡方法的不同,但存在另外一個問題,即使相同的數(shù)據(jù)和參數(shù)下,新舊版本的計算結果總是不一樣,而且二者偏差很大,通常新版本的newff方法的識別率總是偏低。造成此問題的原因是新版本的神經網絡函數(shù)把訓練集分成了3份,即訓練集train set,驗證集validation set和測試集test set,默認比例為7:1.5:1.5。
而在類似本文案例的BP網絡構建中,由于訓練數(shù)據(jù)少,訓練集必須要完全保留進行訓練,否則訓練的效果會出現(xiàn)很大的偏差。通過仔細比較新舊兩個子函數(shù),發(fā)現(xiàn)新版設置了net.divideFcn屬性,其值為'dividerand',解決辦法是在新版net中再添加一條語句:net.divideFcn=''。示例語句如下(其中X是輸入向量集,Y是目標輸出向量集,數(shù)字20是隱層結點數(shù)):
圖3:BP網絡輸出目標值
圖4:BP神經網絡(63-20-10)結構
上述代碼中,X是訓練數(shù)據(jù)(如圖1所示),Y是目標輸出值(如圖3所示),T是測試數(shù)據(jù)(如圖2所示),Sim_T是測試數(shù)據(jù)識別輸出結果。
確定了BP神經網絡的結構以及在Matlab中的實現(xiàn)方法,還需要確定的是訓練函數(shù)。本文選取了幾種常用的訓練算法進行實驗,有traingd(基本梯度下降法)、traingdm(帶有動量項的梯度下降法)、traingdx(帶有動量項的自適應學習算法)、trainlm(L-M優(yōu)化算法)、trainbr(貝葉斯正則法)。
表1:不同訓練函數(shù)實驗結果比較
圖5:trainbr測試輸出結果
設定訓練目標(goal)的值為1e-05,最小性能梯度(min_grad)的值為1e-025,學習步長(lr)的值為1,隱層和輸出層的傳遞函數(shù)都設置為“tansig”,其它為默認值,可參考文獻[8][9][10]。針對本文的要求進行多次實驗,下面給出實驗結果對照表1。
本文實驗所采用的Matlab版本為R2016b,實驗電腦CPU配置為Intel Pentium G2030 3.0GHz。
表1中的實驗數(shù)據(jù)是對各種訓練函數(shù)連續(xù)運行20次后取的平均值。
從表1中“測試數(shù)據(jù)識別成功率”一項可看出,只有trainbr的識別成功率非常高,幾乎100%準確,其它幾種訓練函數(shù)的識別成功率都在50%左右,效果不理想。圖5 給出了trainbr某一次訓練后測試數(shù)據(jù)識別輸出結果,圖6為trainbr訓練數(shù)據(jù)均方誤差曲線。
由圖5可見,trainbr的測試輸出結果符合分類識別要求。圖2所示測試數(shù)據(jù)都有一個或者多個位丟失。測試結果表明,除了8以外,所有被測數(shù)字都能夠被正確地識別。圖5數(shù)據(jù)所示,對于測試數(shù)字8,對應數(shù)字6的結點上的輸出值為0.4513,而對應數(shù)字8的結點上的輸出值為0.3971,表明第8個測試數(shù)據(jù)是模糊的,可能是數(shù)字6,也可能是數(shù)字8。實際上,人識別這個數(shù)字時也會發(fā)生這種錯誤;對于測試數(shù)字9,丟失的像素點較多,但人眼識別出來還是數(shù)字9的可能性最大,測試輸出的結果也是符合的,在對應數(shù)字9的結點上的輸出值為0.9441,而對應數(shù)字8的結點上的輸出值為0.3646,說明數(shù)字8的可能性,但是沒有數(shù)字9的可能性大。
經過多次試驗比對,trainbr最符合本文所述識別訓練算法,識別結果高度符合且準確,和其它幾種算法相比,雖然多占一些運行內存,但訓練收斂時間卻是相對比較短的。
在Matlab中使用newff函數(shù)創(chuàng)建神經網絡對象時,對于如本文類似的識別問題(訓練數(shù)據(jù)少),要注意將divideFcn置于空,不對訓練集進行劃分。通過對多種常見的訓練函數(shù)進行實驗和比較,最后確定了trainbr(貝葉斯規(guī)則法)作為本文的數(shù)字分類的訓練方法效果最優(yōu),識別準確率高,另外通過本文實驗也驗證了trainbr算法的泛化能力強的特點。
圖6:trainbr訓練數(shù)據(jù)均方誤差曲線