tensor的grad参数

    技术2026-01-14  6

    文章目录

    问题描述测试例子代码


    问题描述

    遇到以下代码

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

    Processed: 0.016, SQL: 9