1. 程式人生 > >前饋神經網路(matlab例項)

前饋神經網路(matlab例項)

定義回顧

前饋網路也稱前向網路。這種網路只在訓練過程會有反饋訊號,而在分類過程中資料只能向前傳送,直到到達輸出層,層間沒有向後的反饋訊號,因此被稱為前饋網路。感知機( perceptron)與BP神經網路就屬於前饋網路。

對於一個3層的前饋神經網路N,若用X表示網路的輸入向量,W1~W3表示網路各層的連線權向量,F1~F3表示神經網路3層的啟用函式。
  那麼神經網路的第一層神經元的輸出為:
O1 = F1( XW1 )
  第二層的輸出為:
O2 = F2 ( F1( XW1 ) W2 )
  輸出層的輸出為:
O3 = F3( F2 ( F1( XW1 ) W2 ) W3 )
若啟用函式F1~F3都選用線性函式,那麼神經網路的輸出O3將是輸入X的線性函式。因此,若要做高次函式的逼近就應該選用適當的非線性函式作為啟用函式。

例項

描述

有一批Iris花,已知這批Iris花可分為3個品種,現需要對其進行分類。不同品種的Iris花的花萼長度、花萼寬度、花瓣長度、花瓣寬度會有差異。我們現有一批已知品種的Iris花的花萼長度、花萼寬度、花瓣長度、花瓣寬度的資料。
一種解決方法是用已有的資料訓練一個神經網路用作分類器。

BP網路例項

實驗步驟

將Iris資料集分為2組,每組各75個樣本,每組中每種花各有25個樣本。其中一組作為以上程式的訓練樣本,另外一組作為檢驗樣本。為了方便訓練,將3類花分別編號為1,2,3 。
使用這些資料訓練一個4輸入(分別對應4個特徵),3輸出(分別對應該樣本屬於某一品種的可能性大小)的前向網路。

程式碼

%讀取訓練資料
[f1,f2,f3,f4,class] = textread('trainData.txt' , '%f%f%f%f%f',150);

%特徵值歸一化
[input,minI,maxI] = premnmx( [f1 , f2 , f3 , f4 ]')  ;

%構造輸出矩陣
s = length( class) ;
output = zeros( s , 3  ) ;
for i = 1 : s 
   output( i , class( i )  ) = 1 ;
end

%建立神經網路
net = newff( minmax(input) , [10 3
]
, { 'logsig' 'purelin' } , 'traingdx' ) ; %設定訓練引數 net.trainparam.show = 50 ; net.trainparam.epochs = 500 ; net.trainparam.goal = 0.01 ; net.trainParam.lr = 0.01 ; %開始訓練 net = train( net, input , output' ) ; %讀取測試資料 [t1 t2 t3 t4 c] = textread('testData.txt' , '%f%f%f%f%f',150); %測試資料歸一化 testInput = tramnmx ( [t1,t2,t3,t4]' , minI, maxI ) ; %模擬 Y = sim( net , testInput ) %統計識別正確率 [s1 , s2] = size( Y ) ; hitNum = 0 ; for i = 1 : s2 [m , Index] = max( Y( : , i ) ) ; if( Index == c(i) ) hitNum = hitNum + 1 ; end end sprintf('識別率是 %3.3f%%',100 * hitNum / s2 )

訓練曲線如下:

這裡寫圖片描述

訓練140次左右收斂。最後程式輸出的識別率在95%左右。

引數設定對神經網路效能的影響

<1>隱含層節點個數
  隱含層節點的個數對於識別率的影響並不大,但是節點個數過多會增加運算量,使得訓練較慢。

<2>啟用函式的選擇
啟用函式無論對於識別率或收斂速度都有顯著的影響。在逼近高次曲線時,S形函式精度比線性函式要高得多,但計算量也要大得多。

<3>學習率的選擇
學習率影響著網路收斂的速度,以及網路能否收斂。學習率設定偏小可以保證網路收斂,但是收斂較慢。相反,學習率設定偏大則有可能使網路訓練不收斂,影響識別效果。