什么是pytorch(2Autograd:自动求导)(翻译)
Autograd: 自动求导
pyTorch里神经网络能够训练就是靠autograd包。我们来看下这个包,然后我们使用它来训练我们的第一个神经网络。
autograd 包提供了对张量的所有运算自动求导。它是一种在运行时才被定义的,意味着反向传播只有再代码运行的时候才会计算,每次循环的时候都可以不同,就是说可以有不同的计算图。
用以下几个例子来看autograd:
张量
torch.Tensor 是torch库的核心类。如果你把Tensor类的 .requires_grad 设置为True,它就会计算其上的梯度。 当你计算完所有的值后使用 .backward() 就可以自动的计算所有的导数。 该张量的梯度会累加到 .grad 属性。
To stop a tensor from tracking history, you can call .detach() to detach it from the computation history, and to prevent future computation from being tracked.
To prevent tracking history (and using memory), you can also wrap the code block in with torch.no_grad():. This can be particularly helpful when evaluating a model because the model may have trainable parameters with requires_grad=True, but for which we don’t need the gradients.
有一个对自动求导实现非常关键的类:Function。
Tensor 和Function 互相连接起来,构建了一个无圈图,对所有的历史进行了编码。每个张量都有一个叫  .grad_fn 的属性,是生成该tensor的Function的索引(而那些由我们创建的Tensor的.grad_fn是None)
如果你想计算导数,那么你就可以对一个Tensor调用它的.backward()方法。如果Tensor是一个标量(只有一个元素的数据),你不需要指明backward()的任何参数,如果它有多个元素的话,就需要指定一个gradient的参数,该参数与调用该Tensor的形状相同。
import torch
创建一个tensor并且设置 requires_grad=True 来跟踪计算。
x = torch.ones(2, 2, requires_grad=True)
print(x)
输出:
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
给它来个运算:
y = x + 2
print(y)
输出:
tensor([[3., 3.],
[3., 3.]], grad_fn=<AddBackward0>)
y 是有运算产生的张量,所以它有grad_fn
print(y.grad_fn)
输出:
<AddBackward0 object at 0x7f0ea616bac8>
给 y再来一些运算:
z = y * y * 3
out = z.mean() print(z, out)
输出:
tensor([[27., 27.],
[27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward1>)
.requires_grad_( ... )改变现有张量的 requires_grad 标志。如果没有提供.requires_grad参数的话,输入的标志默认是False。参看例子: #这在fine tune神经网络时候很有用,特别是迁移的时候
a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)
输出:
False
True
<SumBackward0 object at 0x7f0e86396e48>
梯度
Let’s backprop now Because out contains a single scalar, out.backward() is equivalent to out.backward(torch.tensor(1)).
让我们反向传播,由于out是一个标量,out.backward() 等价于 out.backward(torch.tensor(1)).
out.backward()
输出 d(out)/dx的梯度
print(x.grad)
输出:
tensor([[4.5000, 4.5000],
[4.5000, 4.5000]])
可以得到一个4*4的元素是 4.5的举证。让我们称为  out 张量。
至于这个函数的偏导数怎么计算,参见微积分吧!
有了autograd,我们可以做一些疯狂的事情!
x = torch.randn(3, requires_grad=True) y = x * 2
while y.data.norm() < 1000:
y = y * 2 print(y)
输出:
tensor([-1178.9551, 1202.9015, 293.6342], grad_fn=<MulBackward0>) #每次的输出可能不同
gradients = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(gradients) print(x.grad)
输出:
tensor([ 102.4000, 1024.0000, 0.1024])
You can also stop autograd from tracking history on Tensors with .requires_grad=True by wrapping the code block in with torch.no_grad():
你可以使用with torch.no_grad()停止自动的梯度计算,即使tensor的属性.requires_grad=True
print(x.requires_grad)
print((x ** 2).requires_grad) with torch.no_grad():
print((x ** 2).requires_grad)
Out:
True
True
False
更多阅读:
autograd 和 Function 的文档在: http://pytorch.org/docs/autograd
什么是pytorch(2Autograd:自动求导)(翻译)的更多相关文章
- Pytorch Autograd (自动求导机制)
		
Pytorch Autograd (自动求导机制) Introduce Pytorch Autograd库 (自动求导机制) 是训练神经网络时,反向误差传播(BP)算法的核心. 本文通过logisti ...
 - pytorch的自动求导机制 -  计算图的建立
		
一.计算图简介 在pytorch的官网上,可以看到一个简单的计算图示意图, 如下. import torchfrom torch.autograd import Variable x = Variab ...
 - Pytorch学习(一)—— 自动求导机制
		
现在对 CNN 有了一定的了解,同时在 GitHub 上找了几个 examples 来学习,对网络的搭建有了笼统地认识,但是发现有好多基础 pytorch 的知识需要补习,所以慢慢从官网 API进行学 ...
 - 『PyTorch x TensorFlow』第六弹_从最小二乘法看自动求导
		
TensoFlow自动求导机制 『TensorFlow』第二弹_线性拟合&神经网络拟合_恰是故人归 下面做了三个简单尝试, 利用包含gradients.assign等tf函数直接构建图进行自动 ...
 - Pytorch Tensor, Variable, 自动求导
		
2018.4.25,Facebook 推出了 PyTorch 0.4.0 版本,在该版本及之后的版本中,torch.autograd.Variable 和 torch.Tensor 同属一类.更确切地 ...
 - [深度学习] pytorch学习笔记(1)(数据类型、基础使用、自动求导、矩阵操作、维度变换、广播、拼接拆分、基本运算、范数、argmax、矩阵比较、where、gather)
		
一.Pytorch安装 安装cuda和cudnn,例如cuda10,cudnn7.5 官网下载torch:https://pytorch.org/ 选择下载相应版本的torch 和torchvisio ...
 - PyTorch官方中文文档:自动求导机制
		
自动求导机制 本说明将概述Autograd如何工作并记录操作.了解这些并不是绝对必要的,但我们建议您熟悉它,因为它将帮助您编写更高效,更简洁的程序,并可帮助您进行调试. 从后向中排除子图 每个变量都有 ...
 - 『PyTorch』第三弹_自动求导
		
torch.autograd 包提供Tensor所有操作的自动求导方法. 数据结构介绍 autograd.Variable 这是这个包中最核心的类. 它包装了一个Tensor,并且几乎支持所有的定义在 ...
 - Pytorch之Variable求导机制
		
自动求导机制是pytorch中非常重要的性质,免去了手动计算导数,为构建模型节省了时间.下面介绍自动求导机制的基本用法. #自动求导机制 import torch from torch.autogra ...
 
随机推荐
- js打开新页面的方式:
			
1.超链接<a href="http://www.jb51.net" title="脚本之家">Welcome</a>等效于js代码wi ...
 - 微生物组学数据分析工具综述 | 16S+宏基因组+宏病毒组+宏转录组--转载
			
转载:https://mp.weixin.qq.com/s/xsL9GuLs7b3nRF8VeRtinQ 建立在高通量测序基础上的微生物群落研究,当前主要有三大类:基于16S/18S/ITS等扩增子做 ...
 - spring aop 中的JoinPoint
			
AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点 ...
 - SQL Server 2008 分区函数和分区表详解
			
[摘要]本文详细介绍SQL Server 2008 分区函数和分区表,包括查询某个分区.归档数据.添加分区.删除分区等内容. 当我们数据量比较大的时候,我们需要将大型表拆分为多个较小的表,则只访问部门 ...
 - Hadoop 2.7.4 HDFS+YRAN HA部署
			
实验环境 主机名称 IP地址 角色 统一安装目录 统一安装用户 sht-sgmhadoopnn-01 172.16.101.55 namenode,resourcemanager /usr/local ...
 - 再次提供一个纯粹通过pl/sql解析json的方法。
			
在github上面有一个叫pljson的项目,该项目就是用pl/sql 来解析json的. 项目地址:pljson(需翻|强),如果翻不了强的同学,我在国内克隆了一个副本,不定期同步更新 pljson ...
 - 跟随我在oracle学习php(7)
			
盒子模型布局 盒子模型:每个标签都是一个盒子 计算宽高:box-sizing:border-box盒子的宽度就是设置的宽度,里面的内容自适应 从里到外:padding(内边距) Border(边框) ...
 - 十年京东Java程序员的工作总结,写给迷茫中的你!
			
很多年前,刚刚从大学毕业的时候,很多公司来校招.其中最烂俗的一个面试问题是:“你希望你之后三到五年的发展是什么?”.我当时的标准回答是(原话):“成为在某一方面能够独当一面的技术专家“.后来经历了几家 ...
 - Python标准库映射类型与可散列数据类型的关系
			
这里有两个概念似懂非懂,在这里明确一下: 映射类型: Python>3.2中,collections.abc模块有Mapping和MutableMapping两个抽象基类(Python2.6~3 ...
 - unity中实现场景之间加载进度条
			
using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; using UnityEngine.UI ...