【pytorch实战2】自动求导机制

参考资料:

《深度学习之pytorch实战计算机视觉》

Pytorch官方教程

Pytorch中文文档

 

先看一个只有一层的简单的神经网络训练代码。

#--coding:utf-8--
'''
一个简单的神经网络模型
'''
import torch
batch_n = 100#batchsize值
hidden_layer = 100#100个神经元
input_data = 1000#1000个特征值
output_data = 10#十分类

x = torch.randn(batch_n,input_data)#输入数据
y = torch.randn(batch_n,output_data)#标签
w1 = torch.randn(input_data,hidden_layer)
w2 = torch.randn(hidden_layer,output_data)

#训练优化权重参数
epoch_n = 20
learning_rate = 1e-6
for epoch in range(epoch_n):
    h1 = x.mm(w1)#矩阵乘法
    h1 = h1.clamp(min=0)#等同于加上一个reLU的激活函数
    y_pred = h1.mm(w2)

    loss = (y_pred-y).pow(2).sum()
    print("Epoch:{},Loss:{:.4f}".format(epoch,loss))

    #反向传播计算梯度
    grad_y_pred = 2*(y_pred-y)
    grad_w2 = h1.t().mm(grad_y_pred)

    grad_h = grad_y_pred.mm(w2.t())
    grad_h.clamp_(min=0)
    grad_w1 = x.t().mm(grad_h)

    #梯度下降法进行优化
    w1 -= learning_rate*grad_w1
    w2 -= learning_rate*grad_w2

其中反向传播计算梯度的代码相对繁琐。事实上,pytorch提供了非常方便的方法,用于自动计算反向传播过程中的梯度。该方法封装在torch.autograd包中。

下面看用torch.autograd包中的方法对该代码的重写。

import torch
from torch.autograd import  Variable
batch_n = 100#batchsize值
hidden_layer = 100#100个神经元
input_data = 1000#1000个特征值
output_data = 10#十分类


x = Variable(torch.randn(batch_n,input_data),requires_grad = False)#输入数据
y = Variable(torch.randn(batch_n,output_data),requires_grad = False) #标签
w1 = Variable(torch.randn(input_data,hidden_layer),requires_grad = True)
w2 = Variable(torch.randn(hidden_layer,output_data),requires_grad = True)

#训练优化权重参数
epoch_n = 2000
learning_rate = 1e-6
for epoch in range(epoch_n):
    h1 = x.mm(w1)#矩阵乘法
    h1 = h1.clamp(min=0)#等同于加上一个reLU的激活函数
    y_pred = h1.mm(w2)

    loss = (y_pred-y).pow(2).sum()
    print("Epoch:{},Loss:{:.4f}".format(epoch,loss))

    #反向传播计算梯度
    loss.backward()

    #梯度下降法进行优化
    w1.data -= learning_rate*w1.grad.data
    w2.data -= learning_rate*w2.grad.data

    w1.grad.data.zero_()
    w2.grad.data.zero_()

backward函数会自动计算requires_grad值为True的变量的梯度并保存。此外每迭代一次需要将计算得到的梯度置零,否则计算的梯度值会一直叠加。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值