PyTorch梯度计算得出意外结果

问题描述 投票:1回答:1

以下代码旨在说明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```

python pytorch gradient matrix-multiplication autograd
1个回答
0
投票

这并不奇怪,预期为indicated by Autograd Mechanics in PyTorch documentation

在子图中永远不会执行向后计算,张量不需要渐变。

设置km.required_grad_(True)会创建一个子图(只有一个操作是k1张量的平均值),因此得到k1_mean.grad。请注意,在这种情况下,k1 grad也将是None,因为它不需要渐变。

[默认情况下,tensorrequired_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>
© www.soinside.com 2019 - 2024. All rights reserved.