以下代码旨在说明PyTorch梯度计算的工作原理,IMO应该返回权重矩阵,但不会:
# the code calculates T x W + B ---> K1
# compute the mean of K1 --> km
# compute the gradient of km relative to T
#
import torch
torch.manual_seed(0)
t = torch.rand(2,3)
w = torch.rand(3,4)
b = torch.rand(1,4)
#
k1 = torch.mm(t, w) + b
#
#torch.set_grad_enabled(True)
print('k1_grad_fn ',k1.grad_fn)
#
print('t grad ',t.grad)
#
#
km = k1.mean()
km.requires_grad_(True)
print('k1 mean=',km)
km.backward()
print('t grad ',t.grad)
print('k1 grad ',k1.grad_fn)
结果是:
t grad None
k1 mean= tensor(1.0396, requires_grad=True)
t grad None
k1 grad None```
这并不奇怪,预期为indicated by Autograd Mechanics in PyTorch documentation:
在子图中永远不会执行向后计算,张量不需要渐变。
设置km.required_grad_(True)
会创建一个子图(只有一个操作是k1
张量的平均值),因此得到k1_mean.grad
。请注意,在这种情况下,k1 grad
也将是None
,因为它不需要渐变。
[默认情况下,tensor
将required_grad
设置为False
,所以图形不必执行不必要的操作。要获得所需的行为,请将t
更改为:
t = torch.rand((2, 3), requires_grad=True)
(每个张量函数具有requires_grad
参数)。如您所料,这给了您:]
k1_grad_fn <AddBackward0 object at 0x7fe3454d6100>
t grad None
k1 mean= tensor(1.0396, grad_fn=<MeanBackward0>)
t grad tensor([[0.3093, 0.1177, 0.2888],
[0.3093, 0.1177, 0.2888]])
k1 grad <AddBackward0 object at 0x7fe3454d6100>