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. 题解——Codeforces Round #508 (Div. 2) T2 (构造)

    按照题意构造集合即可 注意无解情况的判断 #include <cstdio> #include <algorithm> #include <cstring> #in ...

  2. 使用vue做表单验证

    <template> <Form ref="formInline" :model="formInline" :rules="rule ...

  3. unity3d 加载优化建议 总结 from 侑虎科技

    第一部分 我们对于纹理资源的加载建议如下: 1.严格控制RGBA32和ARGB32纹理的使用,在保证视觉效果的前提下,尽可能采用“够用就好”的原则,降低纹理资源的分辨率,以及使用硬件支持的纹理格式. ...

  4. 【BZOJ】1832: [AHOI2008]聚会

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1832 省选出出了CF的感觉..... 显然一发贪心,如果两个点显然就是他们的$LCA$(不 ...

  5. 3.1 vue组件的使用

    1. 组件 组件: 组件是一个局部功能界面,它包含了所有要实现这个功能界面的相关资源,如css.html等. 组件化编程: vue文件包含3个部分 <template> <div&g ...

  6. VC.遍历文件夹中的文件

    1.VC下遍历文件夹中的所有文件的几种方法 - 年少要轻狂 - CSDN博客.html(https://blog.csdn.net/wllmsdn/article/details/27220999) ...

  7. Qt532.线程(_beginthread)

    1.(20180928)环境:Win7x64.Qt5.3.2 MSVC2010 OpenGL.ms2010 2.测试代码: ZC:我记得 之前在 VC6.vs08 上,还要选择 使用的是哪种 运行时线 ...

  8. git 命令详解

    初始化仓库 git init命令将目录初始化为一个仓库 git init 目录名 git 撤销commit git reset --hard <commit_id> git push or ...

  9. 关于datatables自适应以及自定义列宽度的总结

    table-layout:fixed;可以自定义列的宽度 <div id="bizhi" style="width:100%;height: 85%;overflo ...

  10. MySQL学习(十二)

    视图 view 在查询中,我们经常把查询结果当成临时表来看, view是什么?view可以看成一张虚拟表,是表通过某种运算得到的一个投影. 表的变化会影响到视图 既然视图只是表的某种查询的投影,所以主 ...