【PyTorch深度学习60分钟快速入门 】Part2:Autograd自动化微分

在PyTorch中,集中于所有神经网络的是autograd包。首先,我们简要地看一下此工具包,然后我们将训练第一个神经网络。

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

下面,让我们使用一些更简单的术语和例子来解释这个问题。

0x01 变量(Variable)

autograd.Variableautograd包的核心类,它封装了一个张量,并支持几乎所有在该张量上定义的操作。一旦完成了你的计算,你可以调用.backward(),它会自动计算所有梯度。

你可以通过.data属性访问原始的张量,而梯度w.r.t.这个变量被累积到.grad

还有一个类对于autograd的实现非常重要——一个函数。

变量和函数是相互联系的,并建立一个非循环图,它编码了计算的一个完整历史。每个变量都有一个.grad_fn属性,该属性引用了一个创建了该变量的函数(除了由用户创建的变量之外,它们的grad_fnNone)。

如果你想计算导数,你可以在一个变量上调用.backward()。如果变量是一个标量(也就是说它包含一个元素数据),那么你不需要为backward()指定任何参数,但是如果它有更多元素,那么你需要指定一个grad_output参数,该参数是一个匹配形状的张量。

import torch
from torch.autograd import Variable

创建一个变量:

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

输出结果:

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

做一个变量操作:

y = x + 2
print(y)

输出结果:

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

y是由于操作而创建的,所以它有一个grad_fn

print(y.grad_fn)

输出结果:

<AddBackward0 object at 0x7ff91b4f0908>

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]

0x02 梯度(Gradients)

现在我们介绍后向传播,out.backward()等效于做out.backward(torch.Tensor([1.0]))

out.backward()

打印梯度d(out)/dx:

print(x.grad)

输出结果:

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

你应该得到一个元素为4.5的矩阵。我们将这个变量叫做"o"。此时,我们有:

你可以利用梯度做很多疯狂的事情!

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:
  164.9539
 -511.5981
-1356.4794
[torch.FloatTensor of size 3]
gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)

print(x.grad)

输出结果:

Variable containing:
  204.8000
 2048.0000
    0.2048
[torch.FloatTensor of size 3]

扩展阅读: 变量和函数的文档在这里http://pytorch.org/docs/autograd

以上脚本的总运行时间为:0分0.009秒。

本文中所使用的Python代码:autograd_tutorial.py

原文地址:https://www.cnblogs.com/leejack/p/8373211.html

时间: 2024-11-07 20:56:54

【PyTorch深度学习60分钟快速入门 】Part2:Autograd自动化微分的相关文章

【PyTorch深度学习60分钟快速入门 】Part1:PyTorch是什么?

0x00 PyTorch是什么? PyTorch是一个基于Python的科学计算工具包,它主要面向两种场景: 用于替代NumPy,可以使用GPU的计算力 一种深度学习研究平台,可以提供最大的灵活性和速度 0x01 开始学习 1.Tensors Tensors(张量)类似于numpy的ndarrays,不过Tensors还可以运行于GPU上以提升计算速度. from __future__ import print_function import torch 创建一个5x3且未初始化的矩阵: x =

【PyTorch深度学习60分钟快速入门 】Part3:神经网络

神经网络可以通过使用torch.nn包来构建. 既然你已经了解了autograd,而nn依赖于autograd来定义模型并对其求微分.一个nn.Module包含多个网络层,以及一个返回输出的方法forward(input) . 例如,查看下图中的对数字图片分类的网络: 这是一个简单的前馈网络.它接受输入,并将输入依次通过多个层,然后给出输出结果. 对于神经网络来说,一个经典的训练过程包括以下步骤: 定义一个包含一些可学习的参数(或权重)的神经网络 对输入数据集进行迭代 通过网络处理输入 计算损失

pytorch深度学习60分钟闪电战

https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html 官方推荐的一篇教程 Tensors #Construct a 5x3 matrix, uninitialized: x = torch.empty(5, 3) #Construct a randomly initialized matrix: x = torch.rand(5, 3) # Construct a matrix filled zeros and

Vue.js 60 分钟快速入门

Vue.js 60 分钟快速入门 转载 作者:keepfool 链接:http://www.cnblogs.com/keepfool/p/5619070.html Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为V

Vue.js——60分钟快速入门

Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 本文摘自:http://www.cnblogs.com/keepfool/p/5619070.html 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM.它通过一些特殊的HTML语法,将

Vue.js&mdash;&mdash;60分钟快速入门

Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM.它通过一些特殊的HTML语法,将DOM和数据绑定起来.一旦你创建了绑定,DOM将和数据保持同步,每当变更了数据,DOM

Vue.js&mdash;&mdash;vue-router 60分钟快速入门

概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的页面应用,是用一些超链接来实现页面切换和跳转的.在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换. 本文将以示例的形式来介绍vue-router的各个特性,一共包含6个示例,每个示例都有乞丐版,前5个示例有皇帝版.乞丐版是将所有代码混杂在一起的HTML页面,皇帝版是基于vue

Vue.js——60分钟快速入门(转)

var vm = new Vue({ el: '#app', data: { people: [{ name: 'Jack', age: 30, sex: 'Male' }, { name: 'Bill', age: 26, sex: 'Male' }, { name: 'Tracy', age: 22, sex: 'Female' }, { name: 'Chris', age: 36, sex: 'Male' }] } }) </script> </html> 我们在选项对象的

Vue.js——vue-router 60分钟快速入门

概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的页面应用,是用一些超链接来实现页面切换和跳转的.在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换. 本文将以示例的形式来介绍vue-router的各个特性,一共包含6个示例,每个示例都有乞丐版,前5个示例有皇帝版.乞丐版是将所有代码混杂在一起的HTML页面,皇帝版是基于vue