『PyTorch』第三弹_自动求导

torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现

Varibale包含三个属性:

  • data:存储了Tensor,是本体的数据
  • grad:保存了data的梯度,本事是个Variable而非Tensor,与data形状一致
  • grad_fn:指向Function对象,用于反向传播的梯度计算之用

data

import torch as t
from torch.autograd import Variable x = Variable(t.ones(2, 2), requires_grad = True)
x # 实际查询的是.data,是个Tensor

实际上查询x和查询x.data返回结果一致,

Variable containing:

1 1

1 1

[torch.FloatTensor of size 2x2]

梯度求解

构建一个简单的方程:y = x[0,0] + x[0,1] + x[1,0] + x[1,1],Variable的运算结果也是Variable,但是,中间结果反向传播中不会被求导()

这和TensorFlow不太一致,TensorFlow中中间运算果数据结构均是Tensor,

y = x.sum()

y
"""
  Variable containing:
   4
  [torch.FloatTensor of size 1]
"""

可以查看目标函数的.grad_fn方法,它用来求梯度,

y.grad_fn
"""
    <SumBackward0 at 0x18bcbfcdd30>
""" y.backward() # 反向传播
x.grad # Variable的梯度保存在Variable.grad中
"""
  Variable containing:
   1 1
   1 1
  [torch.FloatTensor of size 2x2]
"""

grad属性保存在Variable中,新的梯度下来会进行累加,可以看到再次求导后结果变成了2,

y.backward()
x.grad # 可以看到变量梯度是累加的
"""
Variable containing:
2 2
2 2
[torch.FloatTensor of size 2x2]
"""

所以要归零,

x.grad.data.zero_()  # 归零梯度,注意,在torch中所有的inplace操作都是要带下划线的,虽然就没有.data.zero()方法

"""
0 0
0 0
[torch.FloatTensor of size 2x2]
"""

对比Variable和Tensor的接口,相差无两,

Variable和Tensor的接口近乎一致,可以无缝切换

x = Variable(t.ones(4, 5))

y = t.cos(x)                         # 传入Variable
x_tensor_cos = t.cos(x.data) # 传入Tensor print(y)
print(x_tensor_cos) """
Variable containing:
0.5403 0.5403 0.5403 0.5403 0.5403
0.5403 0.5403 0.5403 0.5403 0.5403
0.5403 0.5403 0.5403 0.5403 0.5403
0.5403 0.5403 0.5403 0.5403 0.5403
[torch.FloatTensor of size 4x5] 0.5403 0.5403 0.5403 0.5403 0.5403
0.5403 0.5403 0.5403 0.5403 0.5403
0.5403 0.5403 0.5403 0.5403 0.5403
0.5403 0.5403 0.5403 0.5403 0.5403
[torch.FloatTensor of size 4x5]
"""

『PyTorch』第三弹重置_Variable对象的更多相关文章

  1. 『PyTorch』第三弹_自动求导

    torch.autograd 包提供Tensor所有操作的自动求导方法. 数据结构介绍 autograd.Variable 这是这个包中最核心的类. 它包装了一个Tensor,并且几乎支持所有的定义在 ...

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

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

  3. 关于『HTML』:第三弹

    关于『HTML』:第三弹 建议缩放90%食用 盼望着, 盼望着, 第三弹来了, HTML基础系列完结了!! 一切都像刚睡醒的样子(包括我), 欣欣然张开了眼(我没有) 敬请期待Markdown语法系列 ...

  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』第五弹_深入理解Tensor对象_下:从内存看Tensor

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

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

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

  8. 『MXNet』第三弹_Gluon模型参数

    MXNet中含有init包,它包含了多种模型初始化方法. from mxnet import init, nd from mxnet.gluon import nn net = nn.Sequenti ...

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

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

随机推荐

  1. 容器技术与DevOps

    容器技术的使用支撑了目前 DevOps 三大主要实践:工作流.及时反馈.持续学习. 有人说容器技术与 DevOps 二者在发展的过程中是互相促进的关系.得益于 DevOps 设计理念的流行,容器生态系 ...

  2. web前端----JavaScript的DOM(一)

    一.什么是HTML  DOM HTML  Document Object Model(文档对象模型) HTML DOM 定义了访问和操作HTML文档的标准方法 HTML DOM 把 HTML 文档呈现 ...

  3. SNMP学习笔记之iReasoning MIB Browser

    0x00 MIB Browser iReasoning MIB浏览器是一个强大和易于使用的工具由iReasoning SNMP API提供支持. MIB浏览器是工程师管理启用SNMP的网络设备和应用程 ...

  4. Jsp中如何通过Jsp调用Java类中的方法

    Jsp中如何通过Jsp调用Java类中的方法 1.新建一个项目,在src文件夹下添加一个包:如:cn.tianaoweb.com; 2.再在包中添加一个类:如 package com; public ...

  5. 07: linux中正则表达式与grep使用

    1.1 linux中正则表达式 1.^linux        以linux开头的行 2.$php         以php结尾的行 3..                匹配任意单字符 4..+  ...

  6. python脚本监控获取当前Linux操作系统[内存]/[cpu]/[硬盘]/[登录用户]

    此脚本应用在linux, 前提是需要有python和python的psutil模块 脚本 #!/usr/bin/env python # coding=utf-8 import sys import ...

  7. Rubin-Miller与Pollard Rho

    两个没什么卵用的算法. 只放一下模板: BZOJ3667 //BZOJ 3667 //by Cydiater //2017.2.20 #include <iostream> #includ ...

  8. 《网络对抗》——逆向及Bof基础实践

    <网络对抗>--逆向及Bof基础实践 原理 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数. 手工修改可执行文件,改变程序执行流程,直接跳转到g ...

  9. map set iterator not incrementable 解决办法

    例子: #include <iostream> #include <map> using namespace std; int main() { map<int, int ...

  10. 分页器的js实现代码 bootstrap Paginator.js

    参考: http://www.jb51.net/article/76093.htm 如前所述, 不要什么都想到 jquery的 脚本js, 应该首先推荐的是 css 和 元素本身的事件 函数 如: o ...