xml地图|网站地图|网站标签 [设为首页] [加入收藏]

智能家电

当前位置:美高梅游戏网站 > 智能家电 > 超简单!pytorch入门教程(二):Autograd

超简单!pytorch入门教程(二):Autograd

来源:http://www.gd-chuangmei.com 作者:美高梅游戏网站 时间:2019-09-06 02:22

假如我们有一个向量x=当成input,经过一系列运算得到了output变量y,如下图所示:

Zen君的配置是macbook pro,升级到Mac Serria安装不了qt,无法显示图片,好在发现了pytorch,正好Zen君以前也玩过python的,所以非常激动。这个教程系列也是趁着心情激动写下来的,不知道会不会持续更新,暂时别抱有期待:)

图片 1如图所示,向量x经过与4和自身相乘之后得到向量z,z再求长度,得到y

安装pytorch之前,需要安装好python,还没安装过python的宝宝请先移步到廖雪峰的python教程,待安装熟悉完之后,再过来这边。

我们想要求y关于x的微分时,pytorch会帮我们自动求解。

我们接着讲。

>>>from torch.autograd import Variable

>>>import torch

>>>x = Variable(torch.ones, requires_grad = True) #vairable是tensor的一个外包装

>>>z=4*x*x

>>>y=z.norm()

>>>y

Variable containing:

5.6569

[torch.FloatTensor of size 1]

我们可以看到y的值与我们上图计算的结果一致。

>>>y.backward() #backward()函数表示backprop

>>>x.grad #返回y关于x的梯度向量

Variable containing:

5.6569

5.6569

[torch.FloatTensor of size 2]

我们可以看到x.grad也与我们上图计算结果一致。

需要注意:autograd是专门为了BP算法设计的,所以这autograd只对输出值为标量的有用,因为损失函数的输出是一个标量。如果y是一个向量,那么backward()函数就会失效。不知道BP算法是什么的同学,估计也不知道什么是深度学习,建议先看Zen君提供的教材。

打开pytorch官网

我们之所以可以实现autograd多亏了Variable和Function这两种数据类型的功劳。要进行autograd必需先将tensor数据包成Variable。Varibale和tensor基本一致,所区别在于多了下面几个属性。

图片 2如图所示,选择好系统,包管理工具,python的版本,是否支持CUDA(Zen君的配置是OSX,包管理工具是pip,版本2.7,不支持CUDA,哭)

图片 3variable是tensor的外包装,variable类型变量的data属性存储着tensor数据,grad属性存储关于该变量的导数,creator是代表该变量的创造者。

选择好相应的配置,然后就可以复制下面“Run this command”的代码,直接打开命令台粘贴运行,即完成pytorch的安装。

variable和function它们是彼此不分开的,先上图:

要介绍Tensor这个数据类型,我觉得有必要扯一下数学。

图片 4数据向前传输和向后传输生成导数的过程示意图

我们都知道:

如图,假设我们有一个输入变量input(数据类型为Variable)input是用户输入的,所以其创造者creator为null值,input经过第一个数据操作operation1得到output1变量(数据类型仍为Variable),这个过程中会自动生成一个function1的变量(数据类型为Function的一个实例),而output1的创造者就是这个function1。随后,output1再经过一个数据操作生成output2,这个过程也会生成另外一个实例function2,output2的创造者creator为function2。

标量是只有大小,没有方向的量,如1,2,3等

在这个向前传播的过程中,function1和function2记录了数据input的所有操作历史,当output2运行其backward函数时,会使得function2和function1自动反向计算input的导数值并存储在grad属性中。

向量是有大小和方向的量,其实就是一串数字,如

creator为null的变量才能被返回导数,比如input,若把整个操作流看成是一张图,那么像input这种creator为null的被称之为图的叶子(graph leaf)。而creator非null的变量比如output1和output2,是不能被返回导数的,它们的grad均为0。所以只有叶子节点才能被autograd。

矩阵是好几个向量拍成一排合并而成的一堆数字,如[1,2;3,4]

图片 5如图,我们可以看出,矩阵是二维的,向量是一维的,标量是零维的。

那么张量是什么呢?呵呵呵呵!大家估计也能猜出来!是按照三维排列的一堆数字?

是的。但是也不完全正确。

其实标量,向量,矩阵它们三个也是张量,标量是零维的张量,向量是一维的张量,矩阵是二维的张量。

图片 6张量就是按照任意维排列的一堆数字的推广。如图所示,矩阵不过是三维张量下的一个二维切面。要找到三维张量下的一个标量,需要三个维度的坐标来定位。

除此之外,张量还可以是四维的、五维的、。。。等等

数学扯完了,我们撸串代码操练操练

>>>import torch #引用torch包

>>>x = torch.Tensor #构造一个2x3的矩阵,没初始化但仍然会有值

>>>x

8.0118e+28 4.5768e-41 8.0118e+28

4.5768e-41 2.9747e-37 1.4013e-45

[torch.FloatTensor of size 2x3] #可以看出数据类型是浮点数的2x3矩阵

看矩阵看不出张量的道道,我们来点刺激的

>>>y=torch.Tensor #构造一个4x2x3的张量,没初始化

>>>y

=

1.00000e-29 *

0.0000 2.5244 0.0000

2.5244 0.0000 0.0000

=

1.00000e-29 *

0.0000 0.0000 0.0000

0.0000 0.0000 0.0000

=

1.00000e-29 *

0.0000 0.0000 0.0000

0.0000 0.0000 0.0000

=

1.00000e-29 *

0.0000 0.0000 0.0000

2.5244 0.0000 2.5244

[torch.FloatTensor of size 4x2x3]

我们从上面的返回值可以看出,4x2x3的张量y由4个2x3的矩阵构成,这符合了我们数学上的定义。

我们先初始化两个张量:

本文由美高梅游戏网站发布于智能家电,转载请注明出处:超简单!pytorch入门教程(二):Autograd

关键词:

上一篇:python初级 1 数据类型和变量

下一篇:没有了