为什么设置需要_grad = true在张量创建时特别会导致转移到GPU后的叶子状态丢失?

问题描述 投票:0回答:1
我无法将我的头缠住,而Chatgpt似乎认为情况并非如此。为什么在创建张量时设置

requires_grad=True

会导致将其转移到GPU时失去叶片状态?例如(在Google Colab笔记本中测试):

b = torch.rand(10).cuda() b.is_leaf # True

b = torch.rand(10, requires_grad=True) b.is_leaf # True
But

b = torch.rand(10, requires_grad=True).cuda() b.is_leaf # False
我意识到,

b = torch.rand(10, requires_grad=True, device='cuda')

导致
b
在被转移到GPU后保留其叶子状态,这是一个非常出色的解决方法。但是,我对上述行为感到非常困惑。
    

pytorch
1个回答
0
投票
documentation

consuntion的所有张力张张量tens。

对于具有

requires_grad

的张量,如果用户创建的,它们将是叶子张量。这意味着它们不是操作的结果,因此
False没有。
在您的第一个示例中:

requires_grad

True具有
grad_fn
,因此被认为是叶子张量。 您的第二个示例:
b = torch.rand(10).cuda()
b.is_leaf  # True

b

由用户创建并具有
requires_grad=False
,因此是叶子张量。

您的第三个示例:

b = torch.rand(10, requires_grad=True)
b.is_leaf  # True
它在此返回false,因为创建张量并将张量移至GPU是两个单独的操作。叶子张量是原始张量。调用

b

是一个单独的操作,返回新张量。

从Pytorch文档中:
requires_grad=True

可以通过检查其他张量属性来更明确地看到这一点:
b = torch.rand(10, requires_grad=True).cuda()
b.is_leaf  # False

中以上,由用户创建并具有

torch.rand(10, requires_grad=True)

,因此它是叶子张量。与此一致,
.cuda()

>>> a = torch.rand(10, requires_grad=True) >>> a.is_leaf True >>> 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

我们创建
b = torch.rand(10, requires_grad=True)
b.data_ptr()
> 1934898880
b.grad_fn
> None
b.is_leaf
> True

c = b.cuda()
c.data_ptr()
> 140481214283776 # different data pointer
c.grad_fn
> <ToCopyBackward0 at 0x7fc5f44839a0> # has grad function
c.is_leaf # is no longer a leaf tensor
> False
创建一个新的张量对象。我们可以通过看到它具有不同的

b

来验证这一点。

requires_grad=True
b

,这是Pytorch通过设备开关操作向后向后的方式。

最终,当您使用
grad_fn
时,您是在单个操作中直接在GPU上创建

None

,因此它是叶子张量。
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.