人工神經網路(Artificial Neural Networks)
轉載:http://www.datalab.sinaapp.com/?p=309
人工神經網路的產生一定程度上受生物學的啟發,因為生物的學習系統是由相互連線的神經元相互連線的神經元組成的複雜網路。而人工神經網路跟這個差不多,它是一系列簡單的單元相互密集連線而成的。其中每個單元有一定數量的輸入(可能是其他單元的輸出),併產生單一的實數值輸出(可能成為其他單元的輸入)。
常見的人工神經網路結果如下圖:
- 網路由三部分組成,輸入層、隱藏層和輸出層,往往隱藏層只有1層或2層;
- 每層由若干個單元組成,所有單元分層互連形成一個無環的前饋網路;
- 下一層的某個單元的輸入由上一層的所有單元的輸出組成,每個輸入的權重由相連的邊的權值決定。
不同型別的單元對輸入的處理方式不同,比較常用是sigmoid單元。sigmoid單元首先對所有輸入進行線性組合,然後將線性組合的結果通過sigmoid函式,即F(x) = 1/(1+power(e,-x)),對映為0跟1之間的某個值作為輸出(sigmoid函式有一個比較有用的特徵就是F’(x) = F(x)*( 1-F(x)))。這樣,sigmoid單元的輸出是輸入的非線性函式,並且輸出是輸入的可微函式。
人工神經網路的學習訓練就是為每一條邊選取一個合適的權值,使網路輸出層的輸出和目標值之間的誤差平方和最小化。而像反向傳播(BackPropagation)這樣的演算法,就是使用梯度下降來調節各條表的權重,來最佳擬合輸入-輸出組成的訓練資料。
實驗:人臉朝向識別
實驗資料是具有不同朝向的600多張人臉圖片,每個圖片的畫素是30*32。分為訓練集、驗證集和測試集,大致影象張數比為6:2:2。訓練集用來訓練人工神經網路,驗證集用來選取在驗證集上具有最好效能的網路,而測試集對選中的網路進行最後的評估。
- 輸入:每個畫素對應一個網路輸入,並且把範圍是0-255的亮度值按比例縮放到0-1之間。
- 輸出:使用4個不同的輸出單元,每個單元對應一個臉的朝向,取具有最高值的輸出作為人臉朝向的預測值。另外,使用0.1和0.9,而不是0和1,例如(0.9,0.1,0.1,01.)表示臉朝向正前方。
- 網路結構:使用一個隱藏層,隱藏層的單元個數為3個。
- 其他引數:學習速率設定為0.3,輸入單元的權值被設定為0.0,輸出單元的權值被初始化為一個較小的隨機值。
1.把輸入沿網路前向傳播
1 2 3 4 5 6 7 8 9 10 11 12 |
def feedForward( self ):
for j
in xrange ( 1 , self .hidNum):
sum =
0.0
for i
in xrange ( self .inNum):
sum + = self .inOutput[i] * self .wIn2Hid[i][j]
self .hidOutput[j] = self .sigmoid( sum )
for k
in xrange ( self .outNum):
sum =
0.0
for j
in xrange ( self .hidNum):
sum + = self .hidOutput[j] * self .wHid2Out[j][k]
self .outOutput[k]
|