BP 演算法手動實現

2022-08-24 13:06:11 字數 1645 閱讀 9478

github部落格傳送門

csdn部落格傳送門

numpy

matplotlib

深度學習基礎網路模型(mnist手寫體識別資料集)

import numpy as np

import matplotlib.pyplot as plt

x = np.linspace(1, 100, 100) # 造出一些100個偽資料 範圍在 1,100之間

y = 2 * x + np.random.randn(*x.shape) * 10 # 將x資料乘以2 再加上一些噪點

step = 0.00001 # 學習率 步長

diff = [0, 0] # 梯度

cnt = 0 # 計數

b = 0 # b值初始化

w = 0 # w值初始化

error0 = 0 # 第一次誤差

error1 = 0 # 下一次誤差

epsilon = 0.000001 # 兩次誤差差值

def h(ax):

return w * ax + b # 定義乙個主函式

while true:

# cnt = cnt+1 # 計數 檢視訓練了多少次

diff = [0, 0]

for i in range(len(x)): # 遍歷ax資料個數這麼多次

diff[0] += h(x[i]) - y[i] # **的y值 減去 原本的y的值 求和

diff[1] += (h(x[i]) - y[i]) * x[i] # **的y值 減去 原本的y值 乘以x的值 求和

b = b - step / len(x) * diff[0] # 更新b值 現在的 b 值 減去 學習率/x的個數*diff[0]的梯度

w = w - step / len(x) * diff[1] # 更新w值 現在的 w 值 減去 學習率/x的個數*diff[1]的梯度

error1 = 0 # 重置本次擬合誤差為 0

for i in range(len(x)): # 計算本次 擬合誤差

error1 += (y[i] - (b + w * x[i])) ** 2 / 2 # 均方差

if abs(error1 - error0) < epsilon: # 如果 本次擬合誤差 與 上次擬合誤差 小於設定閾值 則可跳出擬合迴圈

break # 跳出整個 擬合迴圈網路

else:

error0 = error1 # 否則將 本次誤差賦給 error0 以便下次迴圈擬合誤差相比較

plt.ion() # 開啟動態畫圖

plt.clf() # 清除畫板上的圖

plt.plot(x, [h(x) for x in x]) # 畫出原本的x值 和 **的y值 **線

plt.plot(x, y, 'bo') # 再畫出 原本的x, y對應的點(樣本)

print(w, b) # 列印出當前訓練好的 w, b 的值

plt.pause(0.1) # 暫停 0.1 秒

plt.ioff() # 關閉所有畫板

Python簡單實現BP演算法

啟用函式為relu函式 import numpy as np n 64 樣本數 d in 1000 輸入維度 h 100 隱藏層維度 d out 10 輸出維度 隨機建立一些訓練資料 x np.random.randn n,d in y np.random.randn n,d out 隨機初始權重 ...

Kmeans演算法手動實現

背景 平面上有兩堆資料 資料以 x,y 的二維座標形式表示 目標是找出兩堆資料的中心點 隨機生成兩個點作為兩堆資料的中心點 計算所有點分別到兩個中心點的距離 對於平面的每乙個點,比較到哪乙個中心點的距離近,就被歸為哪一類 對於歸類後的資料重新計算中心點的座標 判斷中心點是否有明顯變化,如果有,跳轉到...

BP神經網路演算法實現

bp神經網路演算法實現 include include include include define nh 3 輸入層 define ni 4 隱層 define nj 1 輸出層 define nk 100 樣本容量 define test 70 測試集容量 define nr 0.7 學習效率 ...