博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PyTorch教程之Autograd
阅读量:4969 次
发布时间:2019-06-12

本文共 2481 字,大约阅读时间需要 8 分钟。

在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 torchfrom 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)

输出结果

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

 在y基础上进行运算: 

z = y * y * 3out = 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 * 2while y.data.norm() < 1000:    y = y * 2print(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 outputsNone

传入参数:

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 * xprint(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 * xprint(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]

 

转载于:https://www.cnblogs.com/xueqiuqiu/p/7513721.html

你可能感兴趣的文章
jquery getJSON
查看>>
SLF4+Logback 使用及配置
查看>>
[转] GCC 中的编译器堆栈保护技术
查看>>
ubuntu下如何设置主机名
查看>>
OracleLinux上安装数据库(DBCA)
查看>>
为什么无法发起qq临时会话,必须添加好友?如何设置才能临时会话?
查看>>
如何看英文文档?
查看>>
WebStorm中配置node.js(Windows)
查看>>
Windows Azure Platform 系列文章目录
查看>>
思维(数学)
查看>>
图论3 二分图匹配
查看>>
linux 相关命令
查看>>
SQL字符串传参
查看>>
前端基本功之居中
查看>>
oracle 中导出系统中现有rdbms_jobs中的脚本及schedules job的创建
查看>>
PintJS – 轻量,并发的 GruntJS 运行器
查看>>
jQuery Mapael – 呈现动态的矢量地图
查看>>
Subtle Patterns:网页纹理素材精品免费下载
查看>>
数据、信息与知识、思想之间的关联
查看>>
C++ 格式化输出 及 输入 流
查看>>