tensor的grad参数


问题描述

遇到以下代码

loss_data[t] = loss.data.item()  # {'S': 0.9529048204421997}
loss.backward()
grads[t] = []
if list_rep:    
    grads[t].append(Variable(rep_variable[0].grad.data.clone(), requires_grad=False))   
    rep_variable[0].grad.data.zero_()
    

debug模式发现

rep_variable[0].shape
torch.Size([4, 2048, 60, 80]) # encoder得到的feature, 作为decoder的输入,这里直接把rep_variable 视为input
out_t, masks[t] = model[t](rep_variable, None)  # 这里的model是decoder,输出shape为b, n_cls, w/8, h/8
loss = loss_fn[t](out_t, labels[t]) 
loss.backward()

rep_variable[0].grad.shape # 这个grad是什么呢?
torch.Size([4, 2048, 60, 80])

这个grad是什么呢?还跟input一个shape ?

可以看到loss tensor没有grad这个参数,但是input有。


测试

例子

a = [ x 1 , x 2 ] , b = x 1 + x 2 2 a=\left[x_{1}, x_{2}\right], b=\frac{x_{1}+x_{2}}{2} a=[x1,x2],b=2x1+x2
则b对a求导,有:
∂ b ∂ x 1 = 1 2 , ∂ b ∂ x 2 = 1 2 \frac{\partial b}{\partial x_{1}}=\frac{1}{2}, \frac{\partial b}{\partial x_{2}}=\frac{1}{2} x1b=21,x2b=21

代码

import torch
a=torch.Tensor([2,3])
a.requires_grad=True

这个时候查看:

a.grad
a.grad.shape

就会报错

Traceback (most recent call last):
  File "/home/lirong/.pycharm_helpers/pydev/_pydevd_bundle/pydevd_exec2.py", line 3, in Exec
    exec(exp, global_vars, local_vars)
  File "<input>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'shape'

继续

b=torch.mean(a) 
b.grad
b
tensor(2.5000, grad_fn=<MeanBackward0>)

b是一个标量,可以视为loss,a可以看成input。

调用 loss.backward()

b.backward()

a.grad
tensor([0.5000, 0.5000])

a出现了grad参数

所以grad就是loss对input求导得到的值!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值