神經網絡第二篇:numpy輕鬆實現神經網絡的計算

如果掌握了NumPy多維數組的運算,那麼神經網絡的實現就變得簡單了。

多維數組

        多維數組就是數字的集合,數字排成一列的集合、排成行列的集合、排成三維或N維形狀的集合。Numpy是專爲Python提供的多維數組計算庫,這裏我們簡單地給出一些相關的運算。

import numpy as np
"一維數組"
data=np.array([1,2,3,4])  #構造一維數組
print(np.ndim(data)) #獲取數組的維數,輸出:1
print(data.shape)  #數組形狀(4,)
"多維數組"
data=np.array([[1,2],[3,4],[5,6],[7,8]]) #構造4行2列數組                    
print(np.ndim(data)) #2維
print(data.shape)    #(4,2)

    二維數組也稱爲矩陣,橫排列稱爲行,縱排列稱爲列                

 

                                                  

矩陣乘法

    矩陣乘法,即二維數組的乘積,要求對應維度的元素個數要保持一致,如下圖所示:

                                          

矩陣乘積的計算方法如下圖所示:

                                         

Python代碼實現:

A=np.array([[1,2],[3,4]])#(2,2)
B=np.array([[5,6],[7,8]]) #(2,2)
np.dot(A,B)  #矩陣乘積,輸出[[19,22],[43,50]]

神經網絡的內積

    以一個簡單的神經網絡爲例,這裏省略了偏置b和激活函數:

                                      

Python代碼如下:

X=np.array([1,2])
W=np.array([[1,3,5],[2,4,6]])
Y=np.dot(X,W)  #輸出[[5,11,17]

三層神經網絡的實現

        這裏我們以一個簡單的三層神經網絡的實現爲例:輸入層(即第0層)有兩個神經元,第一層有三個神經元,第二層有2個神經元,輸出層有2個神經元。

從輸入層到第一層的信號傳遞

        從這裏開始,我們把偏置b也考慮進來,首先輸入層的神經元與權重乘積並求和,得到節點a(上一個專題講過),將節點a傳遞至激活函數h()後得到第一層的輸出z。如下圖所示。

                                     

                                    

    第一層加權和表示爲:

                                    

     從第一層到第二層的信號傳遞過程同上面的一樣。這裏我們着重講一下從第二層到輸出層(第三層)的信號傳遞,爲了區分輸出層的激活函數,我們採用了σ()來表示。

                                     

   一般而言,輸出層的激活函數要根據具體情況決定,比如迴歸問題使用恆等函數,二元分類問題使用sigmoid函數,多元分類問題可以使用softmax函數(我們會在下一專題詳細介紹),這裏我們選擇恆等函數,主要方便大家對程序的理解。下面是我們介紹的三層神經網絡的實現代碼:

                                            

# coding: utf-8
import numpy as np
def sigmoid(x):
    return 1/(1+np.exp(-x)
def equal_function(x):
    return x
def init_network():
    network={}
    network['W1']=np.array([[0.1,0.2,0.3],[0.4,0.5,0.6]])
    network['b1']=np.array([0.1,0.2,0.3])
    network['W2']=np.array([[0.7,0.8],[0.9,1.0],[1.1,1.2]])
    network['b2']=np.array([0.4,0.5])
    network['W3']=np.array([[1.3,1.4],[1.5,1.6]])
    network['b3']=np.array([0.6,0.7])
    return network
def forward(network,x):
    W1=network['W1']
    b1=network['b1']
    W2=network['W2']
    b2=network['b2']
    W3=network['W3']
    b3=network['b3']   
    a1=np.dot(x,W1)+b1
    z1=sigmoid(a1)
    a2=np.dot(z1,W2)+b2
    z2=sigmoid(a2)
    a3=np.dot(z2,W3)+b3
    y=equal_function(a3)    
    return y
              
network=init_network()
x=np.array([1.1,1.2])
y=forward(network,x)
y#輸出[3.19934969, 3.48486525]
                            


    init_network()函數對權重和偏置進行初始化,並保存至字典變量network中。forward()函數封裝了將輸入信號轉換爲輸出信號的處理過程,採用forward單詞表示從輸入到輸出方向的傳遞處理。到這裏神經網絡的向前處理的實現就完成了,接下來的專題將介紹輸出層(softmax激活函數)的設計。

      歡迎關注“Python生態智聯”,學知識,享生活!

                                             

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章