Pytorch-计算图和动态图机制

一、计算图和动态图

1、计算图

计算图是用于描述运算的有向无环图
计算图的两个重要元素:结点(node)和边(edge)
结点表示数据:如向量、矩阵、张量
边表示运算:一些数学操作

2、叶子结点
叶子结点:用户创建的结点称为叶子结点,如x,w
torch.tensor.is_leaf:用来查看是否为叶子结点
叶子结点的用处:在反向传播之后,只有叶子结点的梯度会被保留,其他中间结点的梯度数据会被释放,以节省内存
若要保存某特定结点的梯度,可以在运行反向传播函数前,补上一句tensor.retain_grad(),此次反向传播后,该tensor的梯度会被保留

3、梯度方向
torch.tensor.grad_fn:记录创建该张量时所用的方法(函数)及梯度方向
作用:以便计算机知道求导某张量结点的梯度需用到的特定法则

2、动态图

根据计算图的搭建方式,可以将计算图分为动态图和静态图。

动态图采用搭建和运算同时进行:灵活、易调节(debug)
静态图为先搭建,后运算:高效但不灵活
pytorch采用动态图机制,tensorflow采用静态图机制

静态:tensorflow的搭建机制为先确立好所有的路线流向,再将tensor数据注入跑通整个过程。这也是tensorflow的名字由来

动态:pytorch中随着代码的数据定义与构建,同时也确立部分的计算图模块。

import torch
# 必须标记requires_grad=True才会有梯度
w = torch.tensor([1.],requires_grad=True)
x = torch.tensor([2.],requires_grad=True)
a = torch.add(w,x)
b = torch.add(w,1)
y = torch.mul(a,b)

y.backward()
print(w.grad)
tensor([5.])
# 查看叶子结点
print("is_leaf:\n",w.is_leaf,b.is_leaf,a.is_leaf,x.is_leaf,y.is_leaf)
is_leaf:
 True False False True False
# 查看grad_fn
print("grad_fn:\n",w.grad_fn,x.grad_fn,a.grad_fn,b.grad_fn,y.grad_fn)
grad_fn:
 None None <AddBackward0 object at 0x000001B3F07A9588> <AddBackward0 object at 0x000001B3F07A9898> <MulBackward0 object at 0x000001B3F078B1D0>
# 查看梯度
print("gradient:",w.grad,x.grad,a.grad,b.grad,y.grad)
gradient: tensor([5.]) tensor([2.]) None None None
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaichu2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值