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 防...