深度學習入門--NumPy多維陣列的運算
想要高效地實現神經網路,離不開numpy多維陣列的運算。
一維陣列
先介紹numpy一維陣列:
In [1]: import numpy as np In [2]: A=np.array([1, 2, 3, 4]) In [3]: print(A) [1 2 3 4] In [4]: np.ndim(A)# 陣列A的維數 Out[4]: 1 In [6]: A.shape# 陣列A的形狀 Out[6]: (4,) In [7]: A.shape[0] Out[7]: 4
如上所示,陣列的維數可以通過np.ndim()函式
獲得;陣列的形狀可以通過<陣列名>.shape
獲得。
二維陣列
In [8]: B=np.array([[1,2],[3,4],[5,6]]) In [9]: print(B) [[1 2] [3 4] [5 6]] In [10]: np.ndim(B) Out[10]: 2 In [11]: B.shape Out[11]: (3, 2)
二維陣列也稱之為矩陣。
矩陣乘法
根據大學本科學的【線性代數】的知識可知:矩陣的乘積是通過左邊矩陣的行和右邊矩陣的列以對應元素相乘後再求和而得到的。
並且矩陣A和矩陣B相乘積的前提是:矩陣A的列數等於矩陣B的行數。
矩陣的乘積用程式碼實現如下:
In [13]:A=np.array([[1,2],[3,4]]) In [14]: A.shape Out[14]: (2, 2) In [15]: B=np.array([[5,6],[7,8]]) In [16]: B.shape Out[16]: (2, 2) In [17]: np.dot(A,B)# A*B Out[17]: array([[19, 22], [43, 50]])
矩陣的乘積可以通過numpy的np.dot()函式
計算。np.dot()函式
接收兩個numpy陣列作為引數,並返回陣列的乘積。這裡要注意,矩陣乘法沒有交換律,即np.dot(A,B)
一般不等於np.dot(B,A)
。
利用numpy陣列實現三層神經網路
這裡將輸入訊號、權重、偏置設定成任意值:
import numpy as np # 中間層的啟用函式sigmoid def sigmoid(x): return 1/(1+np.exp(-x)) # 輸出層的啟用函式identity_function def identity_function(x): return x # 初始化神經網路 def init_network(): network={} network['w1']=np.array([[0.1,0.3,0.5], [0.2,0.4,0.6]]) # 第一層的權重 network['b1']=np.array([0.1,0.2,0.3])# 第一層的偏置 network['w2']=np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])# 第二層的權重 network['b2']=np.array([0.1,0.2])# 第二層的偏置 network['w3']=np.array([[0.1,0.3], [0.2,0.4]])# 第三層的權重 network['b3']=np.array([0.1,0.2])# 第三層的偏置 return network # 神經網路的前向處理 def forward(network, x): w1, w2, w3=network['w1'], network['w2'], network['w3'] b1, b2, b3=network['b1'], network['b2'], 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=identity_function(a3)# 輸出層的啟用函式(恆等函式) return y network=init_network() x=np.array([1.0, 0.5])# 兩個輸入訊號 y=forward(network, x)# 輸出訊號 print(y)
輸出為:
[0.31682708 0.69627909]
這裡主要有sigmoid()函式
、identity_function()函式
、init_network()函式
和forward()函式
這四個函式:
-
sigmoid()函式
:中間層的啟用函式 -
identity_function()函式
: 輸出層的啟用函式 -
identity_function()函式
:進行權重和偏置的初始化,並將它們儲存在字典變數network中。 -
forward()函式
: 封裝了將輸入訊號轉換成輸出訊號的處理過程,這個過程稱之為前向處理 。
藉助numpy多維陣列,我們可以方便地實現神經網路。
每天學習一點點,每天進步一點點。