zoukankan      html  css  js  c++  java
  • pytorch学习3-Autograd 自动微分

    1.深度学习算法本质上是通过反向传播求导数,pytorch的Autograd模块实现了自动提供微分的功能,能够避免手动计算导致的复杂过程。autograd.Variable是Autograd的核心类,简单封装了Tensor,并支持几乎所有的Tensor的操作。通过调用其中的.backward(反向传播)实现反向传播,自动计算梯度。

    2.Variable主要包括三个属性(也是Variable的数据结构)

    (1)data:保存Variable的Tensor(数组)

    (2)grad:保存data对应的梯度,grad数据类型是Variable,不是Tensor,和data的形状一样

    (3)grad_fn:指向Function对象,Function用来反向传播计算输入的梯度

    Variable的数据结构有三部分:data、grad、grad_fn

    3.使用前需要导入Variable类

    from torch.autograd import Variable

    4.使用Tensor新建Variable

    x=Variable(t.ones(2,2),requires_grad=True) #新建两行两列的Variable,每个位置的值为1
    Out[4]:
    tensor([[ 1.,  1.],
            [ 1.,  1.]])

     5.求和

    y=x.sum()
    y
    #求内容的和
    Out[8]:
    tensor(4.)

    6.反向传播求梯度

    y.grad_fn #指向function对象,用来反向传播计算输入的梯度
    y.backward() #反向传播 x.grad #计算梯度

    grad反向传播过程中是累加的,在每次运行反向传播,梯度都会累加之前的梯度,因此每次反向传播时都需要清零。

    7.清零之后反向传播

    x.grad.data.zero_()  #梯度清零
    #反向传播,计算梯度
    y.backward()
    x.grad

    8.Variable和Tensor具有几乎一致的接口,实际使用中可以无缝切换

    以求cos为例

    #Variable和Tensor可以无缝切换
    x=Variable(t.ones(4,5)) #将x设置成4行5列的每个元素都为1的数组
    y=t.cos(x)  
    x_tensor_cos=t.cos(x.data) #对每个元素都求cos
    print(y)
    x_tensor_cos     #输出cos值
  • 相关阅读:
    .NET MVC AjaxHelper
    .NET MVC HtmlHepler
    堆栈存储的区别
    两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
    == 和 equals 的区别是什么
    JDK 和 JRE 有什么区别?
    javaInt占几个字节
    java代码如何在没有安装JDK的Windows下运行
    java跨平台的原因
    MyBatis JdbcType 与Oracle、MySql数据类型对应关系详解
  • 原文地址:https://www.cnblogs.com/qianwangxingfu/p/12325389.html
Copyright © 2011-2022 走看看