Numpy实现两层的神经网络

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

一、神经网络结构图:
在这里插入图片描述

二、神经网络的构建:
(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
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是代码实现: ```python import numpy as np import matplotlib.pyplot as plt # 定义sigmoid函数 def sigmoid(x): return 1 / (1 + np.exp(-x)) # 定义损失函数 def loss(y, y_pred): return np.mean((y - y_pred) ** 2) # 定义输入和输出 X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0], [0], [0], [1]]) # 定义超参数 num_epochs = 10000 learning_rate = 0.1 # 定义网络参数 input_dim = 2 hidden_dim = 3 output_dim = 1 # 初始化权重和偏置 W1 = np.random.randn(input_dim, hidden_dim) b1 = np.zeros((1, hidden_dim)) W2 = np.random.randn(hidden_dim, output_dim) b2 = np.zeros((1, output_dim)) # 训练网络 losses = [] for epoch in range(num_epochs): # 前向传播 hidden = sigmoid(np.dot(X, W1) + b1) y_pred = sigmoid(np.dot(hidden, W2) + b2) # 计算损失函数 l = loss(y, y_pred) losses.append(l) # 反向传播 grad_y_pred = (y_pred - y) / (y_pred * (1 - y_pred)) grad_hidden = np.dot(grad_y_pred, W2.T) * (hidden * (1 - hidden)) grad_W2 = np.dot(hidden.T, grad_y_pred) grad_b2 = np.sum(grad_y_pred, axis=0, keepdims=True) grad_W1 = np.dot(X.T, grad_hidden) grad_b1 = np.sum(grad_hidden, axis=0, keepdims=True) # 更新权重和偏置 W1 -= learning_rate * grad_W1 b1 -= learning_rate * grad_b1 W2 -= learning_rate * grad_W2 b2 -= learning_rate * grad_b2 # 绘制损失函数图像 plt.figure() plt.plot(losses) plt.xlabel('Epoch') plt.ylabel('Loss') plt.show() ``` 运行以上代码,即可得到两层神经网络与门的输出损失函数图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值