torch.autograd 包提供Tensor所有操作的自动求导方法。

数据结构介绍

autograd.Variable 这是这个包中最核心的类。 它包装了一个Tensor,并且几乎支持所有的定义在其上的操作。一旦完成了你的运算,你可以调用 .backward()来自动计算出所有的梯度,Variable有三个属性:

访问原始的tensor使用属性.data;

关于这一Variable的梯度则集中于 .grad;

.creator反映了创建者,标识了是否由用户使用.Variable直接创建(None)。

 import torch
from torch.autograd import Variable '''求导数''' x = Variable(torch.ones(2,2),requires_grad=True)
y = x + 2
print(x.creator) # None,用户直接创建没有creater属性
print(y.creator) # <torch.autograd._functions.basic_ops.AddConstant object at 0x7fb9b4d4b208>

返回:

None
<torch.autograd._functions.basic_ops.AddConstant object at 0x7fb9b4d4b208>

求导运算

如果你想要进行求导计算,你可以在Variable上调用.backward()。

  • 如果Variable是一个标量(例如它包含一个单元素数据),你无需对backward()指定任何参数

     z = y*y*3
    out = z.mean() out.backward() print(x,y,z)
    print(x.grad) # 输出对out对x求倒结果
    print(y.grad) # y不是自动求导变量
    Variable containing:
    1 1
    1 1
    [torch.FloatTensor of size 2x2]
    Variable containing:
    3 3
    3 3
    [torch.FloatTensor of size 2x2]
    Variable containing:
    27 27
    27 27
    [torch.FloatTensor of size 2x2] Variable containing:
    4.5000 4.5000
    4.5000 4.5000
    [torch.FloatTensor of size 2x2] None

    最终得出的结果应该是一个全是4.5的矩阵。设置输出的变量为o。我们通过这一公式来计算:

    ,因此,,最后有

  • 如果它有更多的元素(矢量),你需要指定一个和tensor的形状匹配的grad_output参数(y在指定方向投影对x的导数)

     x = torch.randn(3)
    x = Variable(x, requires_grad = True)
    y = x * 2
    while y.data.norm() < 1000:
    y = y * 2
    gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
    y.backward(gradients)
    x.grad
    Variable containing:
    -0.8143
    -1.5852
    -0.8598
    [torch.FloatTensor of size 3] Variable containing:
    -1.6286
    -3.1704
    -1.7195
    [torch.FloatTensor of size 3] 3.9573325720437613
    Variable containing:
    51.2000
    512.0000
    0.0512
    [torch.FloatTensor of size 3]

    测试传入向量的意义:

 x = torch.randn(3)
x = Variable(x,requires_grad=True)
y = x*2 gradients = torch.FloatTensor([0.5,0.5,1])
y.backward(gradients) # 沿着某方向的梯度
print(x.grad) # Variable containing:
#
#
#
# [torch.FloatTensor of size 3]
 x = torch.randn(3)
x = Variable(x,requires_grad=True)
y = x*2 gradients = torch.FloatTensor([1,1,1])
y.backward(gradients) # 沿着某方向的梯度
print(x.grad) # Variable containing:
#
#
#
# [torch.FloatTensor of size 3]

『PyTorch』第三弹_自动求导的更多相关文章

  1. 『PyTorch』第三弹重置_Variable对象

    『PyTorch』第三弹_自动求导 torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现 Varibale包含三个属性: data ...

  2. 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下

    『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 # Author : Hellcat # Time : 2018/2/11 import torch as t import t ...

  3. 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上

    总结一下相关概念: torch.Tensor - 一个近似多维数组的数据结构 autograd.Variable - 改变Tensor并且记录下来操作的历史记录.和Tensor拥有相同的API,以及b ...

  4. 『PyTorch』第十弹_循环神经网络

    RNN基础: 『cs231n』作业3问题1选讲_通过代码理解RNN&图像标注训练 TensorFlow RNN: 『TensotFlow』基础RNN网络分类问题 『TensotFlow』基础R ...

  5. 『PyTorch』第五弹_深入理解autograd_下:函数扩展&高阶导数

    一.封装新的PyTorch函数 继承Function类 forward:输入Variable->中间计算Tensor->输出Variable backward:均使用Variable 线性 ...

  6. 『PyTorch』第五弹_深入理解autograd_上:Variable属性方法

    在PyTorch中计算图的特点可总结如下: autograd根据用户对variable的操作构建其计算图.对变量的操作抽象为Function. 对于那些不是任何函数(Function)的输出,由用户创 ...

  7. 『PyTorch』第五弹_深入理解Tensor对象_下:从内存看Tensor

    Tensor存储结构如下, 如图所示,实际上很可能多个信息区对应于同一个存储区,也就是上一节我们说到的,初始化或者普通索引时经常会有这种情况. 一.几种共享内存的情况 view a = t.arang ...

  8. 『PyTorch』第五弹_深入理解autograd_中:Variable梯度探究

    查看非叶节点梯度的两种方法 在反向传播过程中非叶子节点的导数计算完之后即被清空.若想查看这些变量的梯度,有两种方法: 使用autograd.grad函数 使用hook autograd.grad和ho ...

  9. 『PyTorch』第五弹_深入理解Tensor对象_中下:数学计算以及numpy比较_&_广播原理简介

    一.简单数学操作 1.逐元素操作 t.clamp(a,min=2,max=4)近似于tf.clip_by_value(A, min, max),修剪值域. a = t.arange(0,6).view ...

随机推荐

  1. IE10 解决input file 同一文件不触发onchange事件

    if (window.ActiveXObject) { var reg = /10\.0/; var str = navigator.userAgent; if (reg.test(str)) { v ...

  2. POJ 3278 Catch That Cow(赶牛行动)

    POJ 3278 Catch That Cow(赶牛行动) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 Farmer J ...

  3. UVA12558 埃及分数

    #include<iostream> #include<cstdio> #include<set> #include<memory.h> using n ...

  4. python3.6配置libsvm2.2

    参考自:https://blog.csdn.net/weixin_35884839/article/details/79398085 由于需要使用到libsvm,所以开始配这个,所幸一次性就成功了. ...

  5. React Native组件之BackAndroid !安卓手机的物理返回键的使用

    ok!在安卓手机上,当我们用物理返回键的时候,会以一次性的将程序退出来,这样是很不好的体验,所以就需要使用RN的物理返回键组件:BackAndroid,其原理也就是 分析路由,然后pop()这样! o ...

  6. 搭建Nuget服务器

    1.新建一个web网站应用程序 (最好是ASP.NET空Web应用程序) 2.通过NuGet扩展 引用 NuGet.Server包 引用之后的项目结构为 将此网站部署到IIS上,即可访问,既搭建好了 ...

  7. [原][osgEarth][JSBSim]重新整理使用JSBSim飞机动力模拟的使用

    JSBSim是一个模拟飞机飞行空气动力学的,这些都不用深入理解,只要知道自己程序怎么和JSBSim交互就行了 我使用的是JSBSim-Win32-0.9.13 原理:改写jsbsim的FGInput ...

  8. Lua和C++交互 学习记录之四:全局table交互

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...

  9. CPU、OpenGL/DirectorX、显卡驱动和GPU之间的关系

  10. mybatis-generator-core 自动生成实体和Mapper

    所谓mybatis-generator-core就是利用mybatis-generator-core.jar自动生成数据库对应的实体和映射文件.首先要下载mybatis-generator-core- ...