使用numpy实现一个简单的2层神经网络

import numpy as np

def main():
    # 2层神经网络,64个输入1000维,1个隐藏层100维,输出10维
    N, D_in, H, D_out = 64, 1000, 100, 10
    # 随机初始化样本
    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)
    # 学习率一般选择1e-6~1e-4
    learning_rate = 1e-6
    # 循环迭代学习500次
    for t 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) # H * D_out

        # compute loss
        loss = np.square(y_pred - y).sum()
        print(t, loss)

        # backward pass
        # 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
        
    # 使用训练好的数据进行预测
    h = x.dot(w1)
    h_relu = np.maximum(h, 0)
    y_pred = h_relu.dot(w2)
    
    # 打印出预测值与实际值的误差
    print(y - y_pred)


if __name__ == '__main__':
    main()

经过500次迭代,损失逐渐减小

490 6.488345724242929e-07
491 6.189309834083105e-07
492 5.904337869152525e-07
493 5.632434702894173e-07
494 5.373005118562679e-07
495 5.125660475282727e-07
496 4.889721590543996e-07
497 4.6647564933752185e-07
498 4.4502716144784435e-07
499 4.245642390520534e-07

进行预测测试,部分结果如下,可见误差已经非常小了

 [-4.05827834e-06 -2.08487774e-05 -1.08563393e-05  2.56239401e-05
   1.21532941e-05  8.19823028e-06 -3.31557266e-05 -5.22064015e-06
  -2.07082664e-05 -9.00997895e-06]
 [ 7.89988666e-06  6.81363721e-06 -1.28522000e-06 -1.39193166e-05
  -1.49279614e-05  1.09177779e-05  2.73508543e-05 -3.20825669e-06
  -6.57302516e-07  4.38394831e-06]]

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值