Numpy實現兩層的神經網路

2021-09-27 01:27:42 字數 1580 閱讀 7713

numpy ndarray是乙個普通的n維array。它不知道任何關於深度學習或者梯度(gradient)的知識,也不知道計算圖(computation graph),只是一種用來計算數**算的資料結構。

一、神經網路結構圖:

二、神經網路的構建:

(1)乙個輸入向量,乙個隱藏層,乙個全連線relu神經網路,沒有bias。用來從x**y,使用l2 loss。

(2)使用numpy實現計算前向神經網路,loss,和反向傳播。

(3)複核函式求導:

三、**實現

n, d_in, h, d_out = 64, 1000, 100, 10   #定義常量

# 隨機建立一些訓練資料

x = np.random.randn(n, d_in) #建立輸入矩陣(64,1000)。64個樣本,每個樣本是(1,1000)維

y = np.random.randn(n, d_out)#建立輸出矩陣(64,10)。對於分類任務,d_out是類別的個數。

w1 = np.random.randn(d_in, h) #建立矩陣(1000,100)

w2 = np.random.randn(h, d_out)#建立矩陣(100,10)

learning_rate = 1e-6 #定義學習率,一般1e-4/1e-6較佳。

for it in range(500):

# forward pass 前向運算

h = x.dot(w1) # n * h (64,1000)*(1000,100)------->(64,100)

h_relu = np.maximum(h, 0) # n * h relu不改變維度

y_pred = h_relu.dot(w2) # n * d_out (64,100)*(100,10)------->(64,10)

# compute loss 隨機生成的回歸問題,採用均方差損失

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

print(it, loss)

# backward pass 反向傳,反別對w1、w2進行複核函式求導。

# 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

Pytorch兩層神經網路

這一次我們不用手動更新model的weights,而是使用optim這個包來幫助我們更新引數。optim這個package提供了各種不同的model優化方法,包括sgd momentum,rmsprop,adam import torch n,d in,h,d out 64,1000 100,10 ...

使用python實現兩層神經網路(HW3)

記錄一下手動實現乙個兩層的全連線神經網路,主要針對於李巨集毅老師hw3的7分類問題。本來是想拿nn svg畫一下這個結構,結果維度太高,它宕機了。好吧,是我太菜了,不太會用 所以用乙個小的結構代替一下,就是乙個簡單的fcnn bp演算法就不寫在這裡了,其他的大神都講的很不錯的。網路大概結構 源 im...

用numpy實現簡單的3層神經網路

import numpy as np 啟用函式 def sigmoid x return 1 1 np.exp x 輸出層時使用的 啟用函式 def outputtype x return x softmax函式 def softmax a c np.max a exp a np.exp a c 防...