PaddlePaddle 自动求导
自动求导
在 PaddlePaddle 中使用自动求导来计算导数。
要求:$ f(x)=\sin{x} $,绘制 \(f(x)\) 和 \(\dfrac{\mathrm{d}f(x)}{\mathrm{d}x}\) 的图像,不能使用 $ f'(x)=\cos{x}$
in[1]
import paddle
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x = paddle.to_tensor(np.arange(-5, 5, 0.01), dtype="float32", stop_gradient=False)
y = paddle.sin(x)
paddle.autograd.backward(y)
dydx = x.grad
x, y, dydx
plt.plot(x, y)
plt.plot(x, dydx)
plt.show()
output[1]

API
backward
paddle.autograd.backward(tensors, grad_tensors=None, retain_graph=False)
计算给定的 Tensors 的反向梯度。
参数
- tensors (list[Tensor]) – 将要计算梯度的 Tensors 列表。Tensors 中不能包含有相同的 Tensor。
- grad_tensors (None|list[Tensor|None],可选) – tensors 的初始梯度值。如果非 None,必须和 tensors 有相同的长度,并且如果其中某一 Tensor 元素为 None,则该初始梯度值为填充 1.0 的默认值;如果是 None,所有的 tensors 的初始梯度值为填充 1.0 的默认值。默认值:None。
- retain_graph (bool,可选) – 如果为 False,反向计算图将被释放。如果在 backward()之后继续添加 OP,需要设置为 True,此时之前的反向计算图会保留。将其设置为 False 会更加节省内存。默认值:False。
返回
None
代码示例
import paddle
x = paddle.to_tensor([[1, 2], [3, 4]], dtype='float32', stop_gradient=False)
y = paddle.to_tensor([[3, 2], [3, 4]], dtype='float32')
grad_tensor1 = paddle.to_tensor([[1,2], [2, 3]], dtype='float32')
grad_tensor2 = paddle.to_tensor([[1,1], [1, 1]], dtype='float32')
z1 = paddle.matmul(x, y)
z2 = paddle.matmul(x, y)
paddle.autograd.backward([z1, z2], [grad_tensor1, grad_tensor2], True)
print(x.grad)
#[[12. 18.]
# [17. 25.]]
x.clear_grad()
paddle.autograd.backward([z1, z2], [grad_tensor1, None], True)
print(x.grad)
#[[12. 18.]
# [17. 25.]]
x.clear_grad()
paddle.autograd.backward([z1, z2])
print(x.grad)
#[[10. 14.]
# [10. 14.]]
grad
paddle.grad(outputs, inputs, grad_outputs=None, retain_graph=None, create_graph=False, only_inputs=True, allow_unused=False, no_grad_vars=None)
对于每个 inputs,计算所有 outputs 相对于其的梯度和。
参数
- outputs (Tensor|list(Tensor)|tuple(Tensor)) – 用于计算梯度的图的输出变量,或多个输出变量构成的 list/tuple。
- inputs (Tensor|list(Tensor)|tuple(Tensor)) - 用于计算梯度的图的输入变量,或多个输入变量构成的 list/tuple。该 API 的每个返回值对应每个 inputs 的梯度。
- grad_outputs (Tensor|list(Tensor|None)|tuple(Tensor|None),可选) - outputs 变量梯度的初始值。若 grad_outputs 为 None,则 outputs 梯度的初始值均为全 1 的 Tensor。若 grad_outputs 不为 None,它必须与 outputs 的长度相等,此时,若 grad_outputs 的第 i 个元素为 None,则第 i 个 outputs 的梯度初始值为全 1 的 Tensor;若 grad_outputs 的第 i 个元素为 Tensor,则第 i 个 outputs 的梯度初始值为 grad_outputs 的第 i 个元素。默认值为 None。
- retain_graph (bool,可选) - 是否保留计算梯度的前向图。若值为 True,则前向图会保留,用户可对同一张图求两次反向。若值为 False,则前向图会释放。默认值为 None,表示值与 create_graph 相等。
- create_graph (bool,可选) - 是否创建计算过程中的反向图。若值为 True,则可支持计算高阶导数。若值为 False,则计算过程中的反向图会释放。默认值为 False。
- only_inputs (bool,可选) - 是否只计算 inputs 的梯度。若值为 False,则图中所有叶节点变量的梯度均会计算,并进行累加。若值为 True,则只会计算 inputs 的梯度。默认值为 True。only_inputs=False 功能正在开发中,目前尚不支持。
- allow_unused (bool,可选) - 决定当某些 inputs 变量不在计算图中时抛出错误还是返回 None。若某些 inputs 变量不在计算图中(即它们的梯度为 None),则当 allowed_unused=False 时会抛出错误,当 allow_unused=True 时会返回 None 作为这些变量的梯度。默认值为 False。
- no_grad_vars (Tensor|list(Tensor)|tuple(Tensor)|set(Tensor),可选) - 指明不需要计算梯度的变量。默认值为 None。
返回
tuple(Tensor),其长度等于 inputs 中的变量个数,且第 i 个返回的变量是所有 outputs 相对于第 i 个 inputs 的梯度之和。
代码示例 1
import paddle
def test_dygraph_grad(create_graph):
x = paddle.ones(shape=[1], dtype='float32')
x.stop_gradient = False
y = x * x
# Since y = x * x, dx = 2 * x
dx = paddle.grad(
outputs=[y],
inputs=[x],
create_graph=create_graph,
retain_graph=True)[0]
z = y + dx
# If create_graph = False, the gradient of dx
# would not be backpropagated. Therefore,
# z = x * x + dx, and x.gradient() = 2 * x = 2.0
# If create_graph = True, the gradient of dx
# would be backpropagated. Therefore,
# z = x * x + dx = x * x + 2 * x, and
# x.gradient() = 2 * x + 2 = 4.0
z.backward()
return x.gradient()
print(test_dygraph_grad(create_graph=False)) # [2.]
print(test_dygraph_grad(create_graph=True)) # [4.]
代码示例 2
import paddle
def test_dygraph_grad(grad_outputs=None):
x = paddle.to_tensor(2.0)
x.stop_gradient = False
y1 = x * x
y2 = x * 3
# If grad_outputs=None, dy1 = [1], dy2 = [1].
# If grad_outputs=[g1, g2], then:
# - dy1 = [1] if g1 is None else g1
# - dy2 = [1] if g2 is None else g2
# Since y1 = x * x, dx = 2 * x * dy1.
# Since y2 = x * 3, dx = 3 * dy2.
# Therefore, the final result would be:
# dx = 2 * x * dy1 + 3 * dy2 = 4 * dy1 + 3 * dy2.
dx = paddle.grad(
outputs=[y1, y2],
inputs=[x],
grad_outputs=grad_outputs)[0]
return dx.numpy()
grad_value = paddle.to_tensor(4.0)
# dy1 = [1], dy2 = [1]
print(test_dygraph_grad(None)) # [7.]
# dy1 = [1], dy2 = [4]
print(test_dygraph_grad([None, grad_value])) # [16.]
# dy1 = [4], dy2 = [1]
print(test_dygraph_grad([grad_value, None])) # [19.]
# dy1 = [3], dy2 = [4]
grad_y1 = paddle.to_tensor(3.0)
print(test_dygraph_grad([grad_y1, grad_value])) # [24.]
PaddlePaddle 自动求导的更多相关文章
- PyTorch官方中文文档:自动求导机制
自动求导机制 本说明将概述Autograd如何工作并记录操作.了解这些并不是绝对必要的,但我们建议您熟悉它,因为它将帮助您编写更高效,更简洁的程序,并可帮助您进行调试. 从后向中排除子图 每个变量都有 ...
- 『PyTorch x TensorFlow』第六弹_从最小二乘法看自动求导
TensoFlow自动求导机制 『TensorFlow』第二弹_线性拟合&神经网络拟合_恰是故人归 下面做了三个简单尝试, 利用包含gradients.assign等tf函数直接构建图进行自动 ...
- 什么是pytorch(2Autograd:自动求导)(翻译)
Autograd: 自动求导 pyTorch里神经网络能够训练就是靠autograd包.我们来看下这个包,然后我们使用它来训练我们的第一个神经网络. autograd 包提供了对张量的所有运算自动求导 ...
- 『PyTorch』第三弹_自动求导
torch.autograd 包提供Tensor所有操作的自动求导方法. 数据结构介绍 autograd.Variable 这是这个包中最核心的类. 它包装了一个Tensor,并且几乎支持所有的定义在 ...
- PytorchZerotoAll学习笔记(三)--自动求导
Pytorch给我们提供了自动求导的函数,不用再自己再推导计算梯度的公式了 虽然有了自动求导的函数,但是这里我想给大家浅析一下:深度学习中的一个很重要的反向传播 references:https:// ...
- 从零开始学习MXnet(四)计算图和粗细粒度以及自动求导
这篇其实跟使用MXnet的关系不大,但对于我们理解深度学习的框架设计还是很有帮助的. 首先还是对promgramming models的一个简单介绍,这个东西实际上是在编译里面经常出现的东西,我们在编 ...
- Pytorch学习(一)—— 自动求导机制
现在对 CNN 有了一定的了解,同时在 GitHub 上找了几个 examples 来学习,对网络的搭建有了笼统地认识,但是发现有好多基础 pytorch 的知识需要补习,所以慢慢从官网 API进行学 ...
- 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的自动求导机制 - 计算图的建立
一.计算图简介 在pytorch的官网上,可以看到一个简单的计算图示意图, 如下. import torchfrom torch.autograd import Variable x = Variab ...
随机推荐
- Sqoop导入MySQL表中数据到Hive出现错误: ERROR hive.HiveConfig: Make sure HIVE_CONF_DIR is set correctly.ERROR tool.ImportTool: Import failed:
1.问题描述: (1)问题示例: [Hadoop@master TestDir]$ sqoop import --connect jdbc:mysql://master:3306/source?use ...
- 从XXE漏洞修复引起Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD说到SPI机制
引子 在使用Fortify扫描时代码报XML External Entity Injection,此漏洞为xml实体注入漏洞,XXE攻击可利用在处理时动态构建文档的 XML 功能.修复方案也包含了增 ...
- 2021.06.18 思科anyconnect安全移动客户端通知
mac系统更新后,开关机后都会弹出思科anyconnect安全移动客户端通知的弹框,很烦,所以要干掉它! 打开终端,执行以下两行命令即可: cd /Library/LaunchAgents/ mv / ...
- java 通过反射以及MethodHandle执行泛型参数的静态方法
开发过程中遇到一个不能直接调用泛型工具类的方法,因此需要通过反射来摆脱直接依赖. 被调用静态方法示例 public class test{ public static <T> T get( ...
- 引用本地的layUI
<script src="/public/vendor/layui-v2.5.6/layui.all.js"></script>
- 看图就会-网络攻击 (xss和csrf)
最近发现好多东西整理过后就没啥印象,但是思维导图很好用,能取其精华去其糟粕
- MAC下使用Wireshark调试chrome浏览器的HTTP/2流量
1.设置环境变量 mkdir ~/tls && touch ~/tls/sslkeylog.log #zsh echo "\nexport SSLKEYLOGFILE=~/t ...
- 记录一次线上gitlab11.x升级gitlab14.x版本操作
前言:gitlab11升级到14还是有挺多需要注意的坑,也算是做一次积累吧,升级前后,gitalb的WEB界面也变化了很多,升级过程需要注意的地方我放到最后说明,挺关键的 一.首先需要下载好要升级的包 ...
- RHCE服务---Web
网站需求:请给openlab搭建web网站 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资 ...
- 网页静态化技术 Freemarker
网页静态化解决方案在实际运用中比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道.对于电商网站的商品详细页(几百万的商品,同样的页面模板格局)来说,每个商品又有大量的信息,这样的情况同样也适 ...