本系列是PyTorch官网Tutorial Deep Learning with PyTorch: A 60 Minute Blitz 的翻译和总结。

  1. PyTorch概览
  2. Autograd - 自动微分
  3. 神经网络
  4. 训练一个分类器

下载本文的Jupyter NoteBook文件:60min_01_PyTorch Overview.ipynb

文章目录

  • Tensor
  • Gradients

在PyTorch中,一切神经网络的核心是 autograd模块。

autograd模块为张量的所有操作提供自动微分。这是一个由运行定义的框架,这意味着你的反向传播是由代码的运行的方式定义的,并且每一次迭代都可能不同。

让我们通过一些示例以更简单的方式看待这一点。

Tensor

torch.Tensor是这个包的核心类。如果将.requires_grad属性设置为True,这将开始追踪它上的所有操作。当计算结束,你可以调用.backward()方法,自动计算所有梯度。该张量的梯度将累加到.grad属性中。

为了停止一个张量上的历史记录跟踪,你可以调用.detach()方法将它从计算历史中分离,并阻止将来计算中的跟踪。

为了防止跟踪历史记录(和使用内存),你还可以将代码块包装在with torch.no_grad():中。这在评估模型时特别有用,因为模型可能存在带requires_grad=True的可训练参数,但事实上我们不需要梯度。

还有一个类对于autograd实现非常重要——Function

TensorFunction相互连接并建立一个无环图,该图对完整的计算历史进行编码。每个张量都有一个.grad_fn属性,该属性引用一个创建这个张量的Function(用户创建的张量除外,他们的.grad_fn属性为None)。

如果你想计算导数,你可以在张量上调用.backward()。如果Tensor为标量(即,它包含一个元素数据),则无需为.backward()指定参数,但是如果它有更多元素,则需要指定gradient 参数为匹配形状的张量。

import torch

创建一个张量,并设置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 0x0000022497B4C630>

我们在y上做更多的操作:

z = y * y * 3
out = z.mean()print(z, out)
tensor([[27., 27.],[27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)

.requires_grad_( ... )方法可以变换一个张量的requires_grad属性。

a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)
False
None
True
<SumBackward0 object at 0x0000022497F12EF0>

Gradients

现在让我们开始反向传播。

out.backward()

打印梯度d(out)/dx

print(x.grad)
tensor([[4.5000, 4.5000],[4.5000, 4.5000]])

接下来是一个vector-Jacobian product的例子

x = torch.randn(3, requires_grad=True)y = x * 2
print(y)
while y.data.norm() < 1000:y = y * 2print(y)
tensor([-0.1796, -0.6436, -1.6582], grad_fn=<MulBackward0>)
tensor([-0.3592, -1.2871, -3.3164], grad_fn=<MulBackward0>)
tensor([-0.7184, -2.5743, -6.6329], grad_fn=<MulBackward0>)
tensor([ -1.4368,  -5.1485, -13.2657], grad_fn=<MulBackward0>)
tensor([ -2.8737, -10.2970, -26.5314], grad_fn=<MulBackward0>)
tensor([ -5.7474, -20.5940, -53.0628], grad_fn=<MulBackward0>)
tensor([ -11.4948,  -41.1880, -106.1257], grad_fn=<MulBackward0>)
tensor([ -22.9896,  -82.3761, -212.2513], grad_fn=<MulBackward0>)
tensor([ -45.9791, -164.7521, -424.5026], grad_fn=<MulBackward0>)
tensor([ -91.9583, -329.5043, -849.0052], grad_fn=<MulBackward0>)
tensor([ -183.9165,  -659.0085, -1698.0105], grad_fn=<MulBackward0>)

现在,y不再是标量。torch.autograd无法直接计算完整雅可比行列,但是如果只想要 vector-Jacobian product,只需通过 backward 将向量作为参数传入:

v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)print(x.grad)
tensor([2.0480e+02, 2.0480e+03, 2.0480e-01])

你也可以使用with torch.no_grad():来包装代码块来使.requires_grad=True的张量通过追踪历史进行自动求导。

print(x.requires_grad)
print((x ** 2).requires_grad)with torch.no_grad():print((x ** 2).requires_grad)
True
True
False

PyTorch深度学习60分钟闪电战:02 Autograd - 自动微分相关推荐

  1. PyTorch深度学习60分钟闪电战:03 神经网络

    本系列是PyTorch官网Tutorial Deep Learning with PyTorch: A 60 Minute Blitz 的翻译和总结. PyTorch概览 Autograd - 自动微 ...

  2. PyTorch深度学习60分钟闪电战:04 训练一个分类器

    本系列是PyTorch官网Tutorial Deep Learning with PyTorch: A 60 Minute Blitz 的翻译和总结. PyTorch概览 Autograd - 自动微 ...

  3. PyTorch深度学习60分钟闪电战:01 PyTorch概览

    本系列是PyTorch官网Tutorial Deep Learning with PyTorch: A 60 Minute Blitz 的翻译和总结. PyTorch概览 Autograd - 自动微 ...

  4. PyTorch 深度学习: 60 分钟极速入门

    PyTorch 深度学习: 60 分钟极速入门 2019年年初,ApacheCN组织志愿者翻译了PyTorch1.2版本中文文档(github地址),同时也获得了PyTorch官方授权,我相信已经有许 ...

  5. PyTorch深度学习基础之Reduction归约和自动微分操作讲解及实战(附源码 超详细必看)

    创作不易 觉得有帮助请点赞关注收藏~~~ 一.PyTorch的Reduction操作 Reduction运算的特点是它往往对一个Tensor内的元素做归约操作,比如torch.max找极大值,torc ...

  6. PyTorch深度学习60分钟入门与实战(四)训练分类器

    原文:github link,最新版会首先更新在github上 有误的地方拜托大家指出~ 训练分类器 目前为止,我们以及看到了如何定义网络,计算损失,并更新网络的权重. 现在可能会想, 数据呢? 通常 ...

  7. pytorch入门:60分钟闪电战

    什么是pytorch? 参考教程:https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner ...

  8. PyTorch 深度学习:34分钟快速入门——自动编码器

    自动编码器最开始是作为一种数据压缩方法,同时还可以在卷积网络中进行逐层预训练,但是随后更多结构复杂的网络,比如 resnet 的出现使得我们能够训练任意深度的网络,自动编码器就不再使用在这个方面,下面 ...

  9. PyTorch 深度学习:36分钟快速入门——GAN

    自动编码器和变分自动编码器,不管是哪一个,都是通过计算生成图像和输入图像在每个像素点的误差来生成 loss,这一点是特别不好的,因为不同的像素点可能造成不同的视觉结果,但是可能他们的 loss 是相同 ...

最新文章

  1. 经验 | 机器学习要避开十大雷区
  2. mysql 上一页下一页_实现“上一页”和“下一页按钮
  3. 小学生python-小学生学python(三)
  4. 神经网络的输出层有哪些_神经网络算法—总结篇
  5. mysql 拼音查询_mysql实现用拼音搜索中文的数据库实现
  6. CodeForces - 1440E Greedy Shopping(线段树)
  7. 数据预处理(part1)--单个预测变量数据变换R语言
  8. 大新闻!Magic Leap造假,HoloLens即将入华商用
  9. 一种快速构造和获取URL查询参数的方法:URLSearchParams
  10. AI又成中国名片!杭州8分钟展示阿里无人车,马云压轴广发英雄帖
  11. 访问iis元数据库失败怎么解决
  12. 12.present perfect(2)
  13. es3,es5语法记要
  14. Pandas进阶伍 变形
  15. java 微信自动回复功能开发
  16. ps打造人物光滑的肤色
  17. xy苹果助手未受信任_重要通知:苹果APP紧急修复!
  18. TIA博途中通过关键字AT实现变量覆盖的具体方法及示例程序
  19. 比Switch...Case更加优雅的多条件判断写法
  20. 【C语言】按要求输出矩阵。

热门文章

  1. 把ipad作为电脑的第二显示器
  2. 甜美列车长的春运故事 微笑应对一切
  3. mint-ui的学习入门实例
  4. Python-批量修改图片全部颜色,批量修改图片的指定颜色,马甲包一键换主题UI
  5. mysql简单应用题答案_MySQL数据库设计与应用题库免费期末考试2020答案
  6. POI 临时文件夹“poifiles”问题处理
  7. 感情沟通出了问题要怎么解决_当感情出现问题怎么沟通 相处更融洽
  8. wifi模块:ESP8266-ESP-01的使用
  9. gets,getline,getchar,getch在C++中的使用
  10. 解决报错 Error in processing command line: Don‘t understand command line argument “-cl-no-subgroup-ifp“