张量的一系列操作,增多,导致可能出现多个操作之间的串行并行,协同不同的底层之间的协作,避免操作的冗余。计算图就是为了解决这些问题产生的。

计算图与动态图机制

1. 计算图

计算图用来描述运算的有向无环图,计算图有两个主要元素:结点Node和边Edge。

结点表示数据,如向量、矩阵、张量。

边表示运算,如加减乘除卷积、激活函数等

用计算图表示:y = (x + w)*(w+1)

a = x + w

b = w+ 1

y = a * b

从下往上进行。使用计算图的好处就是对于梯度求导比较方便

2. 计算图与梯度求导

y = (x+ w) * (w+1)

a = x+ w

b = w+1

y = a*b

\[\frac{\partial y}{\partial w}=\frac{\partial y}{\partial a}\frac{\partial a}{\partial w}+\frac{\partial y}{\partial b}\frac{\partial b}{\partial w}
\]

=b*1+a*1

=b+a

= (w+1)+(x+w)

=2*w+x+1

=2*1+2+1=5

3.叶子结点

用户创建的结点称为叶子结点,如x与 w

is_leaf:指示张量是否为叶子结点。他是整个计算图的根基

为什么要设立叶子结点,是为了节省内存,因为当程序结束后整个计算图的非叶子结点都是释放掉的

如果想使用非叶子结点的梯度,使用retain_grad(),执行这个方法就可以保留非叶子结点的梯度。

grad_fn:记录创建该张量时所用的方法(函数)在梯度传播的时候用到

比如y,y.grad_fn = <MulBackward0>y是用乘法得到的,所以在求解a和b的梯度时就会用乘法的求导法则去求解。叶子结点的grad_fn都是none

import torch
import numpy as np x = torch.tensor([2.], requires_grad=True)
w = torch.tensor([1.], requires_grad=True) a = torch.add(x,w)
a.retain_grad()
b = torch.add(w,1)
y = torch.mul(a,b)
y.backward()
# print(w.grad)
print("is_leaf:", x.is_leaf, w.is_leaf, a.is_leaf, b.is_leaf, y.is_leaf)
print("gradient",x.grad,w.grad,a.grad,b.grad,y.grad)
print("gradient_fun",x.grad_fn,w.grad_fn,a.grad_fn,b.grad_fn,y.grad_fn)
is_leaf: True True False False False
gradient tensor([2.]) tensor([5.]) tensor([2.]) None None
gradient_fun None None <AddBackward0 object at 0x00000214F45B6610> <AddBackward0 object at 0x00000214F65CC580> <MulBackward0 object at 0x00000214F65CC730>

pytorch(05)计算图的更多相关文章

  1. 深度学习框架PyTorch一书的学习-第三章-Tensor和autograd-2-autograd

    参考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的网址去查看代码,下面是本人的笔记 torch.autograd就是为了方 ...

  2. 『PyTorch』第五弹_深入理解autograd_上:Variable属性方法

    在PyTorch中计算图的特点可总结如下: autograd根据用户对variable的操作构建其计算图.对变量的操作抽象为Function. 对于那些不是任何函数(Function)的输出,由用户创 ...

  3. 理解PyTorch的自动微分机制

    参考Getting Started with PyTorch Part 1: Understanding how Automatic Differentiation works 非常好的文章,讲解的非 ...

  4. pytorch 入门指南

    两类深度学习框架的优缺点 动态图(PyTorch) 计算图的进行与代码的运行时同时进行的. 静态图(Tensorflow <2.0) 自建命名体系 自建时序控制 难以介入 使用深度学习框架的优点 ...

  5. 莫烦pytorch学习笔记(二)——variable

    .简介 torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现 Variable和tensor的区别和联系 Variable是篮子, ...

  6. [PyTorch入门]之从示例中学习PyTorch

    Learning PyTorch with examples 来自这里. 本教程通过自包含的示例来介绍PyTorch的基本概念. PyTorch的核心是两个主要功能: 可在GPU上运行的,类似于num ...

  7. PyTorch全连接ReLU网络

    PyTorch全连接ReLU网络 1.PyTorch的核心是两个主要特征: 一个n维张量,类似于numpy,但可以在GPU上运行 搭建和训练神经网络时的自动微分/求导机制 本文将使用全连接的ReLU网 ...

  8. [源码解析]PyTorch如何实现前向传播(1) --- 基础类(上)

    [源码解析]PyTorch如何实现前向传播(1) --- 基础类(上) 目录 [源码解析]PyTorch如何实现前向传播(1) --- 基础类(上) 0x00 摘要 0x01 总体逻辑 0x02 废弃 ...

  9. [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下)

    [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下) 目录 [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下) 0x00 摘要 0x01 前文回顾 0x02 Te ...

  10. [源码解析] PyTorch如何实现前向传播(3) --- 具体实现

    [源码解析] PyTorch如何实现前向传播(3) --- 具体实现 目录 [源码解析] PyTorch如何实现前向传播(3) --- 具体实现 0x00 摘要 0x01 计算图 1.1 图的相关类 ...

随机推荐

  1. A - 敌兵布阵 ——B - I Hate It——C - A Simple Problem with Integers(线段树)

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  2. CS144学习(1)Lab 0: networking warmup

    CS144的实验就是要实现一个用户态TCP协议,对于提升C++的水平以及更加深入学习计算机网络还是有很大帮助的. 第一个Lab是环境配置和热身,环境按照文档里的配置就行了,前面两个小实验就是按照步骤来 ...

  3. Ubuntu下跑通py-faster-rcnn、详解demo运作流程

    在不同的服务器不同的机器上做过很多次实验,分别遇到各种不一样的错误并且跑通Py-Faster-RCNN,因此,在这里做一个流程的汇总: 一.下载文件: 首先,文件的下载可以有两种途径: 1.需要在官网 ...

  4. java8按照lamda表达式去重一个list,根据list中的一个元素

    /** * 按照指定字段给list去重 * @param list * @return */ public static List<DataModel> niqueList(List< ...

  5. 记一次 Raven2 渗透(phpmailer漏洞+UDF提权)

    目录: 1. 寻找IP 2.dirb目录爆破 2.PHPMailer漏洞反弹得到shell 3.python版本的exp修改 4.查看wordpress的wp-config.php配置文件得到数据库账 ...

  6. code screenshot beautify plugin & 代码截图美化插件

    code screenshot beautify plugin & 代码截图美化插件 代码截图美化 codesnap 微信分享代码截图 https://github.com/kufii/Cod ...

  7. CSS pseudo element All In One

    CSS pseudo element All In One CSS 伪元素 https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elemen ...

  8. Immutable.js 实现原理

    Immutable.js 实现原理 Immutable collections for JavaScript v4.0.0-rc.12 released on Oct 31, 2018 https:/ ...

  9. JS Object Deep Copy & 深拷贝

    JS Object Deep Copy & 深拷贝 针对深度拷贝,需要使用其他方法 JSON.parse(JSON.stringify(obj));,因为 Object.assign() 拷贝 ...

  10. js coverage testing

    js coverage testing 测试覆盖率 istanbul 伊斯坦堡/伊斯坦布尔 https://istanbul.js.org/ jest coverage https://jestjs. ...