pytorch中Tensor.backward()当Tensor不为标量的情况

运行如下代码:

In [3]: import torch

In [4]: from torch.autograd import Variable

In [6]: x=Variable(torch.Tensor([2,3,4,5]),requires_grad=True)

In [7]: y=Variable(torch.zeros(3))

In [8]: y[0]=x[0]*x[1]

In [9]: y[1]=x[1]*x[2]

In [10]: y[2]=x[2]*x[3]

In [13]: y.backward(torch.ones(y.shape))

In [14]: x.grad
Out[14]: tensor([3., 6., 8., 4.])

把x.grad中元素称为 [ g r a d _ x 0 , g r a d _ x 1 , g r a d _ x 2 , g r a d _ x 3 ] [grad\_x_0,grad\_x_1,grad\_x_2,grad\_x_3] [grad_x0,grad_x1,grad_x2,grad_x3],把传入backward的Tensor称为 [ w 0 , w 1 , w 2 ] [w_0,w_1,w_2] [w0,w1,w2],在此处的例子中, w w w的所有元素均为1。我们可以得到下图:

在这里插入图片描述

也就是得到如下规律:

g r a d _ x i = ∑ k w k ∂ y k ∂ x i grad\_x_i=\sum_kw_k\frac{\partial y_k}{\partial x_i} grad_xi=kwkxiyk

原本的计算图见上图左侧。但是这个backward的过程,根据我对Auto Grad的理解,pytorch帮我们构建了下面的计算图,也就是对每个 y y y乘以对应的 w w w(可以理解为权重),然后将所有输出求和得到一个标量(这一步可以更细致地展开为多步加法),再如往常一样反向传播。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值