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 "", 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求导得到的值!

你可能感兴趣的:(pytorch)