日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

结合反向传播算法使用python实现神经网络的ReLU、Sigmoid、Affine、Softmax-with-Loss层

發布時間:2025/3/12 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 结合反向传播算法使用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层的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。