使用Pytorch手动搭建两层神经网络

使用Pytorch Tensor来构建一个两层神经网络,和numpy方式想像,但是只能在GPU上运行

一、定义数据集和网络权重

import torch
dtype = torch.FloatTensor  # 让dtype表示torch.FloatTensor数据类型

# N表示一个批次输入数据的数量,D_in表示每个输入数据的特征数,H表示经过隐藏层后保留的特征个数,D_out表示每个输出数据的特征个数(分类结果值)
N, D_in, H, D_out = 64, 1000, 100, 10
x = torch.randn(N, D_in).type(dtype)  #64*1000     随机生成数据并且转换为上述类型
y = torch.randn(N, D_out).type(dtype) # 64*10
w1 = torch.randn(D_in, H).type(dtype) # 1000*100
w2 = torch.randn(H, D_out).type(dtype) # 100*10

其中,x为输入,y为输出,w1和w2都为权值大小

二、定义学习次数和学习率

epoch_n = 20          # 学习次数
learning_rate = 1e-6  # 学习率

三、向前和向后传播计算

for t in range(epoch_n):
    # 向前传播计算
    h = x.mm(w1) # 64*100 Tensor类型才可以使用,将x与w1相乘
    h_relu = h.clamp(min=0) # Relu激活函数的作用
    y_pred = h_relu.mm(w2) # 64*10 预测的结果
    loss = (y_pred - y).pow(2).sum() # 均方误差损失函数

    #使用反向传播计算(梯度下降)w1和w2相对于损失的梯度
    grad_y_pred = 2.0 * (y_pred - y)  # 64*10
    grad_w2 = h_relu.t().mm(grad_y_pred)  # 64*100->100*64  *  64*10->100*10   .t()就是将矩阵转置
    grad_h_relu = grad_y_pred.mm(w2.t())  # 64*10  *  100*10的转置-> 64*100
    grad_h = grad_h_relu.clone() # 复制
    grad_h[h < 0] = 0
    grad_w1 = x.t().mm(grad_h) # 1000*64  *  64*100 ->1000*100

    # 权重更新
    w1 -= learning_rate * grad_w1
    w2 -= learning_rate * grad_w2

1、在向前传播中,简单来说,就是使用x*w1,然后使用激活函数,然后在第二层再乘以w2,得到输出y。根据计算的y与真实的y比较,得到损失值

2、在这里插入图片描述
至于乘法里面的先后顺序是无所谓的,但是我们要保证,求出来的梯度的维度,与它之前的维度是一致的。比如w1与grad_w1都是1000*100
3、然后更新权重,不断的循环计算

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值