问题描述
遇到以下代码
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}
∂x1∂b=21,∂x2∂b=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求导得到的值!