3

如果我在 PyTorch 中创建一个Parameter,那么它会自动分配为一个叶变量:

x = torch.nn.Parameter(torch.Tensor([0.1]))
print(x.is_leaf)

这打印出来True。据我了解,如果x是叶变量,那么它将由优化器更新。

但是,如果我再分配x给 GPU:

x = torch.nn.Parameter(torch.Tensor([0.1]))
x = x.cuda()
print(x.is_leaf)

这打印出来False。所以现在我无法分配x给 GPU 并将其保留为叶节点。

为什么会这样?

4

1 回答 1

2

答案在is_leaf文档中,这是您的确切情况:

>>> b = torch.rand(10, requires_grad=True).cuda()
>>> b.is_leaf
False
# b was created by the operation that cast a cpu Tensor into a cuda Tensor

进一步引用文档:

对于requires_gradtrue 的张量,如果它们是由用户创建的,它们将是叶张量。这意味着它们不是操作的结果,因此 grad_fn 为 None。

在您的情况下,Tensor 不是您创建的,而是由 PyTorch 的cuda()操作创建的(叶子是 pre-cuda b)。

于 2019-07-24T20:25:54.553 回答