在PyTorch中,autograd是所有神经网络的核心内容,为Tensor所有操作提供自动求导方法。

它是一个按运行方式定义的框架,这意味着backprop是由代码的运行方式定义的。

一、Variable

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

Variable有三个属性:data,grad以及creator。

访问原始的tensor使用属性.data;  关于这一Variable的梯度则集中于 .grad;  .creator反映了创建者,标识了是否由用户使用.Variable直接创建(None)。

还有一个对autograd的实现非常重要的类——Function。Variable 和Function数是相互关联的,并建立一个非循环图,从而编码完整的计算过程。每个变量都有一个.grad_fn属性引用创建变量的函数(除了用户创建的变量,它们的grad_fn是None)。

import torch
from torch.autograd import Variable

创建变量x:

x = Variable(torch.ones(2, 2), requires_grad=True)
print(x)

输出结果:

Variable containing:
1 1
1 1
[torch.FloatTensor of size 2x2]

在x基础上进行运算:

y = x + 2 
print(y)

输出结果:

Variable containing:
3 3
3 3
[torch.FloatTensor of size 2x2]

查看x的grad_fn:

print(x.grad_fn)

输出结果:

None

查看y的grad_fn:

print(y.grad_fn)

输出结果:

<torch.autograd.function.AddConstantBackward object at 0x7f603f6ab318>

可以看到y是作为运算的结果产生的,所以y有grad_fn,而x是直接创建的,所以x没有grad_fn。

在y基础上进行运算:

z = y * y * 3
out = z.mean()
print(z, out)

输出结果:

Variable containing:
27 27
27 27
[torch.FloatTensor of size 2x2]
Variable containing:
27
[torch.FloatTensor of size 1]

二、Gradients

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

out.backward()等价于out.backward(torch.Tensor([1.0])).

out.backward()
print(x.grad)

输出结果:

Variable containing:
4.5000 4.5000
4.5000 4.5000
[torch.FloatTensor of size 2x2]

如果它有更多的元素(矢量),你需要指定一个和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 print(y)

输出结果:

Variable containing:
-1296.5227
499.0783
778.8971
[torch.FloatTensor of size 3]

不传入参数:

y.backward()
print(x.grad)

输出结果:

RuntimeError: grad can be implicitly created only for scalar outputs
None

传入参数:

gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)
print(x.grad)

输出结果:

Variable containing:
102.4000
1024.0000
0.1024
[torch.FloatTensor of size 3]

简单测试一下不同参数的效果:

参数1:[1,1,1]

x=torch.FloatTensor([1,2,3])
x = Variable(x, requires_grad=True)
y = x * x
print(y) gradients = torch.FloatTensor([1,1,1])
y.backward(gradients)
print(x.grad)

输出结果:

Variable containing:
1
4
9
[torch.FloatTensor of size 3]
Variable containing:
2
4
6
[torch.FloatTensor of size 3]

参数2:[3,2,1]

x=torch.FloatTensor([1,2,3])
x = Variable(x, requires_grad=True)
y = x * x
print(y) gradients = torch.FloatTensor([3,2,1])
y.backward(gradients)
print(x.grad)

输出结果:

Variable containing:
1
4
9
[torch.FloatTensor of size 3]
Variable containing:
6
8
6
[torch.FloatTensor of size 3]

PyTorch教程之Autograd的更多相关文章

  1. PyTorch教程之Training a classifier

    我们已经了解了如何定义神经网络,计算损失并对网络的权重进行更新. 接下来的问题就是: 一.What about data? 通常处理图像.文本.音频或视频数据时,可以使用标准的python包将数据加载 ...

  2. PyTorch教程之Neural Networks

    我们可以通过torch.nn package构建神经网络. 现在我们已经了解了autograd,nn基于autograd来定义模型并对他们有所区分. 一个 nn.Module模块由如下部分构成:若干层 ...

  3. PyTorch教程之Tensors

    Tensors类似于numpy的ndarrays,但是可以在GPU上使用来加速计算. 一.Tensors的构建 from __future__ import print_function import ...

  4. [转]搬瓦工教程之九:通过Net-Speeder为搬瓦工提升网速

    搬瓦工教程之九:通过Net-Speeder为搬瓦工提升网速 有的同学反映自己的搬瓦工速度慢,丢包率高.这其实和你的网络服务提供商有关.据我所知一部分上海电信的同学就有这种问题.那么碰到了坑爹的网络服务 ...

  5. jQuery EasyUI教程之datagrid应用(三)

    今天继续之前的整理,上篇整理了datagrid的数据显示及其分页功能 获取数据库数据显示在datagrid中:jQuery EasyUI教程之datagrid应用(一) datagrid实现分页功能: ...

  6. jQuery EasyUI教程之datagrid应用(二)

    上次写到了让数据库数据在网页datagrid显示,我们只是单纯的实现了显示,仔细看的话显示的信息并没有达到我们理想的效果,这里我们丰富一下: 上次显示的结果是这样的 点击查看上篇:jQuery Eas ...

  7. jQuery EasyUI教程之datagrid应用(一)

    最近一段时间都在做人事系统的项目,主要用到了EasyUI,数据库操作,然后抽点时间整理一下EasyUI的内容. 这里我们就以一个简洁的电话簿软件为基础,具体地说一下datagrid应用吧 datagr ...

  8. kali linux 系列教程之metasploit 连接postgresql可能遇见的问题

    kali linux 系列教程之metasploit 连接postgresql可能遇见的问题 文/玄魂   目录 kali linux 下metasploit 连接postgresql可能遇见的问题. ...

  9. kali Linux系列教程之BeFF安装与集成Metasploit

    kali Linux系列教程之BeFF安装与集成Metasploit 文/玄魂 kali Linux系列教程之BeFF安装与集成Metasploit 1.1 apt-get安装方式 1.2 启动 1. ...

随机推荐

  1. 浅谈服务器对SEO的影响,该如何选择服务器?

    对于SEO,很多人想的都是怎么做好网站的内部优化,做好外部推广.其实SEO没什么技术含量,到网上搜别人的心得看,千篇一律,都是翻来覆去的说一样的东西,就像吃不同人做的馒头,吃来吃去就是一个味道.笔者经 ...

  2. 《阿里巴巴Java开发手册v1.2》解析(编程规约篇)

    之前在乐视天天研究各种底层高大上的东西,因为我就一个人,想怎么弄怎么弄.如今来了新美大,好好研读一下<阿里巴巴Java开发手册v1.2>.还要对这么看似简单的东西解析一番.毕竟现在带团队, ...

  3. postman 第4节 切换环境和设置读取变量(转)

    postman提供了environment管理功能,想要在多个环境中测试,比如在测试环境.灰度环境.生产环境等,只需要用同样的接口,切换下环境即可,非常方便.具体步骤: 切换环境 1.点击界面右上角的 ...

  4. Redis 常用数据结构及其控制命令整合

    Redis 键值支持5种基本结构,分别是字符串,列表,哈希,集合,有序集合.每一种数据结构都有对应的取值和设值命令,辅助命令,除此之外,还有一些全局命令,用来管理Redis存储的所有 键. 全局命令 ...

  5. Jquery的入门学习

    jQuery API中文文档地址 http://www.jquery123.com/ Jquery w3school教程 http://www.w3school.com.cn/jquery/index ...

  6. NWERC2016-Problem A(Arranging Hat)

    Arranging Hat is a cushy job indeed; high impact work, absolute authority, and 364 days of holiday e ...

  7. 软工+C(2017第6期) 最近发展区/脚手架

    // 上一篇:工具和结构化 // 下一篇:野生程序员 教育心理学里面有提到"最近发展区"这个概念,这个概念是前苏联发展心理学家维果茨基(Vygotsky)提出的,英文名词是Zone ...

  8. 团队作业10——Beta版本事后诸葛亮

    事后诸葛亮分析 1.总结的提纲内容: a. 项目管理之事后诸葛亮会议. 一.设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件要解决的是教师需要 ...

  9. 【Alpha】Daily Scrum Meeting——Day1

    站立式会议照片 每个人的工作分配 成 员 今日计划完成的任务 胡丹丹 学习手机app开发的总体流程以及搭建APP开发所需要的安卓环境,加强Java语言的学习掌握 曾丽君 学习手机app开发的总体流程以 ...

  10. 学号:201521123116 《java程序设计》第一周学习总结

    #1. 本章学习总结了解了班级的纪律和期末成绩组成.本周重点学习了java语言的特点具有简单性和结构中立.明白了jdk是java开发人员使用的一种工具,以及编写一个java程序的所需步骤,懂得了jdk ...