如何理解在 PyTorch 中创建叶张量?
How to understand creating leaf tensors in PyTorch?
来自 PyTorch documentation:
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
e = torch.rand(10).cuda().requires_grad_()
e.is_leaf
True
# e requires gradients and has no operations creating it
f = torch.rand(10, requires_grad=True, device="cuda")
f.is_leaf
True
# f requires grad, has no operation creating it
但是,为什么 e
和 f
叶张量也是从 CPU 张量转换为 Cuda 张量(操作)?
是不是因为Tensore
在就地运算requires_grad_()
之前被转入Cuda?
并且因为 f
是通过赋值 device="cuda"
而不是方法 .cuda()
转换的?
当一个张量第一次被创建时,它成为一个叶节点。
基本上,神经网络的所有输入和权重都是计算图的叶节点。
当对张量进行任何操作时,它不再是叶节点
b = torch.rand(10, requires_grad=True) # create a leaf node
b.is_leaf # True
b = b.cuda() # perform a casting operation
b.is_leaf # False
requires_grad_()
与 cuda()
或其他运算方式不同。
它创建了一个新的张量,因为需要梯度(可训练权重)的张量不能依赖于任何其他东西。
e = torch.rand(10) # create a leaf node
e.is_leaf # True
e = e.cuda() # perform a casting operation
e.is_leaf # False
e = e.requires_grad_() # this creates a NEW tensor
e.is_leaf # True
此外,detach()
操作创建了一个不需要梯度的新张量:
b = torch.rand(10, requires_grad=True)
b.is_leaf # True
b = b.detach()
b.is_leaf # True
在最后一个例子中,我们创建了一个已经在 cuda 设备上的新张量。
我们不需要任何操作来投射它。
f = torch.rand(10, requires_grad=True, device="cuda") # create a leaf node on cuda
来自 PyTorch documentation:
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
e = torch.rand(10).cuda().requires_grad_()
e.is_leaf
True
# e requires gradients and has no operations creating it
f = torch.rand(10, requires_grad=True, device="cuda")
f.is_leaf
True
# f requires grad, has no operation creating it
但是,为什么 e
和 f
叶张量也是从 CPU 张量转换为 Cuda 张量(操作)?
是不是因为Tensore
在就地运算requires_grad_()
之前被转入Cuda?
并且因为 f
是通过赋值 device="cuda"
而不是方法 .cuda()
转换的?
当一个张量第一次被创建时,它成为一个叶节点。
基本上,神经网络的所有输入和权重都是计算图的叶节点。
当对张量进行任何操作时,它不再是叶节点
b = torch.rand(10, requires_grad=True) # create a leaf node
b.is_leaf # True
b = b.cuda() # perform a casting operation
b.is_leaf # False
requires_grad_()
与 cuda()
或其他运算方式不同。
它创建了一个新的张量,因为需要梯度(可训练权重)的张量不能依赖于任何其他东西。
e = torch.rand(10) # create a leaf node
e.is_leaf # True
e = e.cuda() # perform a casting operation
e.is_leaf # False
e = e.requires_grad_() # this creates a NEW tensor
e.is_leaf # True
此外,detach()
操作创建了一个不需要梯度的新张量:
b = torch.rand(10, requires_grad=True)
b.is_leaf # True
b = b.detach()
b.is_leaf # True
在最后一个例子中,我们创建了一个已经在 cuda 设备上的新张量。
我们不需要任何操作来投射它。
f = torch.rand(10, requires_grad=True, device="cuda") # create a leaf node on cuda