本文章基于学习B站视频的pytorch讲解(附上视频网址:https://www.bilibili.com/video/av62138405?from=search&seid=16456035230894602976),实现了从numpy手写神经网络到pytorch实现神经网络,编写的神经网络的为两层神经网络:
以下每一个代码块都可单独运行
1、利用纯numpy实现神经网络,训练数据利用随机数产生,求梯度及反向传播过程手动计算
'''
使用numpy实现两层神经网络
'''
import numpy as np
N, D_in, H, D_out = 64,1000,100,10 # 输入64个数据,每个数据1000纬,中间层100,输出10
'''
numpy.random.rand()产生从[0,1)之间的随机数,没有负值。
numpy.random.randn()产生服从正态分布的随机数,会出现负值。
'''
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)
learning_rate = 1e-6 # 10的-6次方
for it 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) # N * D_out
# compute loss
loss = np.square(y_pred - y).sum() # 均方误差
print(it, loss)
# Backward pass
# Compute the gradient
grad_y_pred = 2.0 * (y_pred - y) # d loss / d y_pred loss中有平方所以*2
grad_w2 = h_relu.T.dot(grad_y_pred) # .T代表转置
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