在 PyTorch 中,某些生成张量的操作本身不会创建与计算图相关联的梯度信息。这些操作通常用于初始化张量,并且默认情况下不需要进行梯度计算。以下是一些常见的不会自动传播梯度的张量生成操作:
-
数值初始化操作:
torch.linspace()
: 用于生成等差数列的张量。torch.arange()
: 类似于 Python 的range()
,用于生成指定范围内的序列。torch.zeros()
,torch.zeros_like()
: 用于生成全 0 张量。torch.ones()
,torch.ones_like()
: 用于生成全 1 张量。torch.full()
: 用于创建每个元素都是指定值的张量。torch.empty()
,torch.empty_like()
: 用于创建未初始化的张量。
-
随机初始化操作:
torch.rand()
,torch.rand_like()
: 用于生成 0 到 1 范围内服从均匀分布的随机数张量。torch.randn()
,torch.randn_like()
: 用于生成均值为 0、标准差为 1 的正态分布的随机数张量。torch.randint()
,torch.randint_like()
: 生成整数随机数张量。
-
创建单位矩阵:
torch.eye()
: 用于生成单位矩阵。
这些操作生成的张量默认情况下 requires_grad
属性是 False
,因此即使在计算过程中这些张量的值被用作操作数,也不会在反向传播时计算其梯度。
如果需要将这些生成的张量用于需要梯度计算的操作时,需要手动设置 requires_grad=True
,例如:
python">x = torch.linspace(0, 1, steps=10, requires_grad=True)
这样,x
在后续的操作中就会被包含在计算图中,从而能够计算梯度。
但是类似下面:
python">x = torch.linspace(-2, 2, 100, requires_grad=True) * torch.pi
是及其容易忽略的错误。