结合反向传播算法使用python实现神经网络的ReLU、Sigmoid、Affine、Softmax-with-Loss层
結合反向傳播算法使用python實現神經網絡的ReLU、Sigmoid激活函數層
這里寫目錄標題
- 一、ReLU層的實現
- 二、Sigmoid層的實現
- 三、實現神經網絡的Affine層
- 四、Softmax-with-Loss層實現
一、ReLU層的實現
正向傳播時的輸入大于0,則反向傳播會將上游的值原封不動地傳給下游,這是因為y對x偏導是1,而傳出來的數又是輸入乘以偏導,那么輸出就是上游的值。
如果正向傳播時的x小于等于0,則反向傳播中傳給下游的信號將停在此處。因為偏導是0,所以輸入乘偏導就等于0,輸出就是0。
代碼實現:這個里面forward和backward參數是Numpy數組。
mask是由True和False構成的Numpy數組,會把正向傳播輸入x元素中,<=0的地方保存為True,>0的保存為False。反向傳播中會使用正向傳播時保存的mask,將dout的mask中元素為true地方設為0。
out[self.mask] = 0,這句話是說,mask為true的地方設為0。
class Relu:def __init__(self):self.mask = Nonedef forward(self, x):self.mask = (x <= 0)out = x.copy()out[self.mask] = 0return outdef backward(self, dout):dout[self.mask] = 0dx = doutreturn dx二、Sigmoid層的實現
最后一個節點那塊,進行的是y=1/x的操作,求y關于x的偏導,最后用y表示出來,(因為反向傳播是倒著的,所以要用y表示)。
代碼:
out保存正向傳播的輸出,反向傳播時候,用out計算。變量都是Numpy數組。
class Sigmoid:def __init__(self):self.out = Nonedef forward(self, x):out = sigmoid(x)self.out = outreturn outdef backward(self, dout):dx = dout * (1.0 - self.out) * self.outreturn dx三、實現神經網絡的Affine層
神經網絡正向傳播計算加權信號綜合,使用矩陣的乘積運算。
Y=np.dot(X,W)+B
正向進行的矩陣乘積運算,稱為仿射變換,Affine。
輸入X是單個數據時的反向傳播圖如圖所示:
輸入X是N個數據時:
代碼:
以后有時間再來分析。
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四、Softmax-with-Loss層實現
交叉熵誤差作為Softmax函數的損失函數后,反向傳播得到y1-t1之類的結果,這是差分表示的誤差,說明神經網絡的反向傳播會把誤差傳遞給前面的層。
這樣結果不偶然,使用平方和誤差作為恒等函數的損失函數,交叉熵誤差作為Softmax函數的損失函數,反向傳播才能夠得到y1-t1之類的結果。
代碼:
以后有時間再來分析。
class SoftmaxWithLoss:def __init__(self):self.loss = Noneself.y = None # softmax的輸出self.t = None # 監督數據def forward(self, x, t):self.t = tself.y = softmax(x)self.loss = cross_entropy_error(self.y, self.t)return self.lossdef backward(self, dout=1):batch_size = self.t.shape[0]if self.t.size == self.y.size: # 監督數據是one-hot-vector的情況dx = (self.y - self.t) / batch_sizeelse:dx = self.y.copy()dx[np.arange(batch_size), self.t] -= 1dx = dx / batch_sizereturn dx總結
以上是生活随笔為你收集整理的结合反向传播算法使用python实现神经网络的ReLU、Sigmoid、Affine、Softmax-with-Loss层的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bettertouchtool闪退_Be
- 下一篇: websocket python爬虫_p