python實現誤差逆傳播演算法

2021-10-14 02:00:21 字數 1766 閱讀 2186

最近學習神經網路,自己參照源**把誤差逆傳播重新寫了一遍,其實挺簡單的,關鍵是要把逆傳播的幾個過程搞清楚以及每一步是為了得到什麼,然後知道numpy的矩陣運算操作,廢話不多說,直接上**:

# 反向傳播演算法

defbackpro

(weights, bs, x, y, nums)

:"""

逆傳播計算引數的梯度

:param weights: 權重矩陣列表,每一層乙個權重矩陣,直到最後一層,整個網路構成乙個矩陣集合

:param bs: 偏置向量列表,每一層乙個偏置列向量

:param x: 輸入

:param y: 期望輸出

:param nums: 網路層數

:return:

"""# 構造兩個空的梯度列表,形狀跟每一層權重矩陣和列向量形狀相同

nabla_weight =

[np.zeros(z.shape)

for z in weights]

# 每一層權重的梯度矩陣跟權重矩陣的形狀相同

nabla_b =

[np.zeros(b.shape)

for b in bs]

# 同理,每一層偏置的梯度列向量跟偏置列向量的形狀相同

# 定義帶權輸入列表,儲存每一層的帶權輸入列向量

zs =

# 定義啟用值列表,儲存啟用值

activation = x

activations =

[x]# 第一步,前向傳播,計算帶權輸入和啟用值

for w, b in

zip(weights, bs)

:# 計算當前層的帶權輸入z

z = np.dot(w, activation)

+ b # 計算當前層的啟用值

activation = f(z)

# 第二步,計算輸出層的誤差

delta = g(activations[-1

])* h(zs[-1

])nabla_b[-1

]= delta # 輸出層的偏置梯度即為其誤差

nabla_weight[-1

]= np.dot(delta, activations[-2

].transpose())

# 第三步,誤差逆傳播,計算倒數第二層到第二層的誤差

for l in

range(2

, nums)

:# 逆傳播公式,-l+1層的誤差得到-l層的誤差

delta = np.dot(weights[

-l+1

].transpose(

), delta)

* h(zs[

-l])

nabla_b[

-l]= delta

nabla_weight[

-l]= np.dot(delta, activations[

-l-1

].transpose())

return nabla_weight, nabla_b

# 定義乙個啟用函式

deff

(z):

return z

# 定義乙個啟用函式的導函式

defh

(z):

return z

# 定義乙個代價函式的導函式

defg

(a):

return a

注意:其中的啟用函式及其導數,以及代價函式都沒有具體的形式,自己可以根據具體情況把這是哪個函式進行修改

機器學習 誤差逆傳播演算法 反向傳播演算法

誤差逆傳播演算法 error backpropagation,bp 是神經網路中常用的傳播演算法。bp演算法不僅可以應用於多層前饋神經網路,還可以應用於其他型別的神經網路,如訓練遞迴神經網路。通常所說的 bp網路 一般是指用bp演算法訓練的多層前饋神經網路。給定訓練集 d left y x y x ...

神經網路 誤差逆傳播演算法推導 BP演算法

誤差逆傳播演算法是迄今最成功的神經網路學習演算法,現實任務中使用神經網路時,大多使用bp演算法進行訓練。給定訓練集 d x i in r d,y i in r l 即輸入示例由 d 個屬性描述,輸出 l 個結果。如圖所示,是乙個典型的單隱層前饋網路,它擁有 d 個輸入神經元 l 個輸出神經元 q 個...

BP誤差反向傳播演算法

bp演算法通過將輸出誤差反向傳播,將誤差分配到每個權值上,利用梯度更新對所有引數進行調整以達到輸出累計誤差最小 來自andrew ng的machine learning課程 為了簡化概念,先不加上偏置單元 符號介紹 zl i 第 l 層第 i節點的誤差zl i 第 l 層第i節點的輸入值al i 第...