机器学习入门(13)— Affine 仿射层、Softmax 归一化指数函数层实现
1. 一維 Affine 仿射層
我們回顧下之前為了計算加權信號的總和,使用了矩陣的乘積運算 NumPy 中是 np.dot() , 參照代碼如下:
In [7]: X = np.random.rand(2)In [8]: W = np.random.rand(2,3)In [9]: B = np.random.rand(3)In [10]: X
Out[10]: array([0.4789532 , 0.09922952])In [11]: W
Out[11]: 
array([[0.57158149, 0.58963237, 0.99674485],[0.80968617, 0.57239467, 0.07508432]])In [12]: X.shape
Out[12]: (2,)In [13]: W.shape
Out[13]: (2, 3)In [14]: B.shape
Out[14]: (3,)In [15]: Y = np.dot(X, W) + BIn [16]: 
這里,X 、W 、B 分別是形狀為 (2,)、(2, 3)、(3,) 的多維數組。這樣一來,神經元的加權和可以用 Y = np.dot(X, W) + B 計算出來。然后,Y 經過激活函數轉換后,傳遞給下一層。這就是神經網絡正向傳播的流程。
矩陣的乘積運算的要點是使對應維度的元素個數一致。比如,如下面的圖5-23 所示,X 和 W 的乘積必須使對應維度的元素個數一致。
神經網絡的正向傳播中進行的矩陣的乘積運算在幾何學領域被稱為“仿射變換”。因此,這里將進行仿射變換的處理實現為 “Affine層”。
計算圖如下,并且在各個變量的上方標記了它們的形狀(比如,計算圖上顯示了 X 的形狀為(2,),X·W 的形狀為(3,) 等。)
 
 圖5-24 的計算圖的反向傳播。以矩陣為對象的反向傳播,按矩陣的各個元素進行計算時,步驟和以標量為對象的計算圖相同。如下式所示:
 我們根據式(5.13),嘗試寫出計算圖的反向傳播,如圖5-25 所示。
 
 
 
2. 多維 Affine 仿射層
多維 Affine 層的計算圖,如圖 5-27 所示。
 
 加上偏置時,需要特別注意。正向傳播時,偏置被加到 X·W 的各個數據上。比如,N = 2(數據為2 個)時,偏置會被分別加到這 2 個數據(各自的計算結果)上,具體的例子如下所示。
In [17]: X_dot_W = np.array([[0, 0, 0], [10, 10, 10]])In [18]: B = np.array([1,2,3])In [19]: X_dot_W
Out[19]: 
array([[ 0,  0,  0],[10, 10, 10]])In [20]: X_dot_W + B
Out[20]: 
array([[ 1,  2,  3],[11, 12, 13]])In [21]:
正向傳播時,偏置會被加到每一個數據(第1 個、第2 個……)上。因此,反向傳播時,各個數據的反向傳播的值需要匯總為偏置的元素。用代碼表示的話,如下所示。
In [21]: dY = np.array([[1,2,3], [4,5,6]])In [22]: dY
Out[22]: 
array([[1, 2, 3],[4, 5, 6]])In [23]: dB = np.sum(dY, axis=0)In [24]: dB
Out[24]: array([5, 7, 9])In [25]: 
這個例子中,假定數據有2 個(N = 2)。偏置的反向傳播會對這 2 個數據的導數按元素進行求和。因此,這里使用了 np.sum() 對第0 軸(以數據為單位的軸,axis=0)方向上的元素進行求和。
下面代碼考慮了輸入數據為張量(四維數據)的情況。
class Affine:def __init__(self, W, b):self.W =Wself.b = bself.x = Noneself.original_x_shape = None# 權重和偏置參數的導數self.dW = Noneself.db = Nonedef forward(self, x):# 對應張量self.original_x_shape = x.shapex = x.reshape(x.shape[0], -1)self.x = xout = np.dot(self.x, self.W) + self.breturn outdef backward(self, dout):dx = np.dot(dout, self.W.T)self.dW = np.dot(self.x.T, dout)self.db = np.sum(dout, axis=0)dx = dx.reshape(*self.original_x_shape)  # 還原輸入數據的形狀(對應張量)return dx
3. Softmax 歸一化指數函數層
待補充
總結
以上是生活随笔為你收集整理的机器学习入门(13)— Affine 仿射层、Softmax 归一化指数函数层实现的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 《琴》第四句是什么
- 下一篇: golang 同一个包中函数互相调用报错
