使用numpy實現乙個簡單的2層神經網路

2021-10-03 02:30:26 字數 2029 閱讀 6121

import numpy as np

def main():

# 2層神經網路,64個輸入1000維,1個隱藏層100維,輸出10維

n, d_in, h, d_out = 64, 1000, 100, 10

# 隨機初始化樣本

x = np.random.randn(n, d_in)

y = np.random.randn(n, d_out)

# 隨機初始化權重

w1 = np.random.randn(d_in, h)

w2 = np.random.randn(h, d_out)

# 學習率一般選擇1e-6~1e-4

learning_rate = 1e-6

# 迴圈迭代學習500次

for t in range(500):

# forward pass

h = x.dot(w1) # n * h

h_relu = np.maximum(h,0) # n * h

y_pred = h_relu.dot(w2) # h * d_out

# compute loss

loss = np.square(y_pred - y).sum()

print(t, loss)

# backward pass

# compute the gradient

grad_y_pred = 2.0 * (y_pred - y)

grad_w2 = h_relu.t.dot(grad_y_pred)

grad_h_relu = grad_y_pred.dot(w2.t)

grad_h = grad_h_relu.copy()

grad_h[h<0] = 0

grad_w1 = x.t.dot(grad_h)

# update weights of w1 and w2

w1 -= learning_rate * grad_w1

w2 -= learning_rate * grad_w2

# 使用訓練好的資料進行**

h = x.dot(w1)

h_relu = np.maximum(h, 0)

y_pred = h_relu.dot(w2)

# 列印出**值與實際值的誤差

print(y - y_pred)

if __name__ == '__main__':

main()

經過500次迭代,損失逐漸減小

490 6.488345724242929e-07

491 6.189309834083105e-07

492 5.904337869152525e-07

493 5.632434702894173e-07

494 5.373005118562679e-07

495 5.125660475282727e-07

496 4.889721590543996e-07

497 4.6647564933752185e-07

498 4.4502716144784435e-07

499 4.245642390520534e-07

進行**測試,部分結果如下,可見誤差已經非常小了

[-4.05827834e-06 -2.08487774e-05 -1.08563393e-05  2.56239401e-05

1.21532941e-05 8.19823028e-06 -3.31557266e-05 -5.22064015e-06

-2.07082664e-05 -9.00997895e-06]

[ 7.89988666e-06 6.81363721e-06 -1.28522000e-06 -1.39193166e-05

-1.49279614e-05 1.09177779e-05 2.73508543e-05 -3.20825669e-06

-6.57302516e-07 4.38394831e-06]]

實現乙個簡單的shell(2)

tomorrow 星辰 部落格。這是本部落格的第乙個文章 主要介紹如何用 c 語言基於linux 系統來實現乙個簡單shell diy 乙個shell 通過自己程式設計實現乙個linux 下的shell,可以使得個人對程序的概念 程序的通訊和作業系統的執行的理解更加的深刻。還會大大增加個人學習的成就...

用numpy構造的乙個簡單BP

coding utf 8 created on thu oct 4 08 28 15 2018 author 37989 import numpy as np import pandas as pd from matplotlib import pyplot 標準化 def standard x x...

學習乙個簡單的純numpy實現的神經網路象限分類

import numpy as np 神經網路的分類任務 理論上兩層神經網路就足夠擬合任意函式 為了使得神經網路不僅僅只能擬合線性函式,引入了啟用層 常見的啟用函式有三種 階躍,sigmoid,relu函式 def affine forward x,w,b out none n x.shape 0 ...