pytorch中计算图的理解

在这里插入图片描述

pytorch的计算图

pytorch是动态图机制,所以在训练模型的时候,每迭代一次都会构建一个新的计算图。而计算图代表着程序中变量之间的关系。y = ( a + b ) ( b + c ) y=(a+b)(b+c)y=(a+b)(b+c)在这个运算过程就会建立一个如下的计算图。在这个计算图中,叶子节点(leaf_node)就是参与运算的变量。这个图里面只有a,b,c是leaf_node。之所以要关注leaf_node,因为计算网络在反向传播的时候,需要根据链式求导法则求出网络最后输出的梯度,然后再对网络进行优化。在这里插入图片描述

对计算图中的反向传播进一步理解。
Tensor的自动求导对于标量比如l.backward()十分方便,但是当反向传播的对象不是标量时,需要在y.backward()种加入一个与y同形的Tensor。如下面的y是一个1*2的矩阵,所以y.backward(torch.FloatTensor([[0, 1]])) 。
不允许张量对张量求导,只允许标量对张量求导,求导结果是和自变量同形的张量。这是为了避免向量(甚至更高维张量)对张量求导,而转换成标量对张量求导。

x = torch.tensor([[1, 2]],dtype=torch.float32,requires_grad=True)  # 定义一个输入变量
w = torch.tensor([[3, 4], [5, 6]],dtype=torch.float32)
y = torch.mm(x, w)    # 矩阵乘积
y.backward(torch.tensor([[1, 0]],dtype=torch.float32), retain_graph=True) # 求梯度,保留图 。                                  
print(x.grad.data)   # 求出 y1 的梯度
x.grad.data.zero_()  # 最后的梯度会累加到叶节点,所以叶节点清零
y.backward(torch.FloatTensor([[0, 1]]))   # 求出 y2的梯度
print(x.grad.data)        # 求出 y2的梯度

输出结果
tensor([[3., 5.]])
tensor([[4., 6.]])
上面的过程等价于下面的数学表达式:(就是线性方程组y=x*w)
在这里插入图片描述

  • pytorch的计算图中,只有两种元素: 数据(tensor)和运算(函数关系)。 tensor可以分为两类,叶子节点(leaf
    node)和非叶子节点。
    使用backward()函数反向传播计算tensor的梯度时,并不计算所有tensor的梯度,而是只计算满足这几个条件的tensor的梯度:
    1.类型为叶子节点、
    2.requires_grad=True、
    3.依赖该tensor的所有tensor的requires_grad=True。
    自己定义的tensor中,requires_grad属性默认是False。
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值