计算图,动态图与静态图

计算图

  计算图是用来描述运算的有向无环图。计算图有两个主要元素:结点(Node) 和边(Edge)。结点表示数据,如向量,矩阵,张量;边表示运算,如加减乘除卷积等。
用计算图表示 y = ( x + w) * ( w + 1 )
  拆分成 a = x + w ;b = w + 1 ;y = a * b

+1
x
a +
w
b
y *

y对w求导,相当于找到计算图中所有y到w的路径,路径上的导数求积,路径间求和
∂ y ∂ w = ∂ y ∂ a ∂ a ∂ w + ∂ y ∂ b ∂ b ∂ w = b × 1 + a × 1 = b + a = ( w + 1 ) + ( x + w ) = 2 × w + x + 1 \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 \times 1 + a \times 1 = b + a = (w + 1) + (x + w) = 2 \times w + x + 1 wy=aywa+bywb=b×1+a×1=b+a=(w+1)+(x+w)=2×w+x+1
叶子结点: 用户创建的结点,如x与w,梯度反向传播之后,非叶子节点的梯度会被释放掉,若想使用非叶子节点的梯度,可以用 retain_grad()
grad_fn: 记录创建该张量时所用的方法

w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], 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.is_leaf, x.is_leaf, a.is_leaf, b.is_leaf, y.is_leaf)
print(w.grad, x.grad, a.grad, b.grad, y.grad)
print(w.grad_fn, x.grad_fn, a.grad_fn, b.grad_fn, y.grad_fn)
True True False False False
tensor([5.]) tensor([2.]) tensor([2.]) None None
None None <AddBackward0 object at 0x000001F812793A48> <AddBackward0 object at 0x000001F81278F4C8> <MulBackward0 object at 0x000001F821799148>

动态图VS静态图

  根据计算图搭建方式,可将计算图分为动态图和静态图。
  动态图:运算与搭建同时进行,灵活,易调节
  静态图:先搭建图,后运算,高效,不灵活
  PyTorch采用的是动态图机制,每一次训练,都会销毁计算图并重新创建,这样做花销很大,但是更加灵活。
  TensorFlow采用的是静态图机制,一旦定义,训练时就不能修改。一开始就要搭建好计算图,然后才能进行数据的传输和计算,这意味着写代码过程中,错误将更加难以发现,因为搭建图的过程中不会报错,所以不知道错在哪里,只有在传入数据的过程中才能发现哪里出错,灵活性低,而且出现bug也不易调试。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值