Numpy实现两层的神经网络

numpy ndarray是一个普通的n维array。它不知道任何关于深度学习或者梯度(gradient)的知识,也不知道计算图(computation graph),只是一种用来计算数学运算的数据结构。

一、神经网络结构图:
Numpy实现两层的神经网络_第1张图片

二、神经网络的构建:
(1)一个输入向量,一个隐藏层,一个全连接ReLU神经网络,没有bias。用来从x预测y,使用L2 Loss。

  • h = W 1 X h = W_1X h=W1X
  • a = m a x ( 0 , h ) a = max(0, h) a=max(0,h)
  • y h a t = W 2 a y_{hat} = W_2a yhat=W2a

(2)使用Numpy实现计算前向神经网络,loss,和反向传播。

  • forward pass
  • loss
  • backward pass

(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

你可能感兴趣的:(项目)