如果掌握了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生態智聯”,學知識,享生活!