我正在关注PyTorch教程here。 它说
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
Out:
tensor([-590.4467, 97.6760, 921.0221])
有人可以解释一下data.norm()在这里做什么吗?
当我将.randn
更改为.ones
时,其输出为tensor([ 1024., 1024., 1024.])
。
答案 0 :(得分:8)
它只是张量的L2范数(a.k.a Euclidean范数)。以下是可重现的插图:
In [15]: x = torch.randn(3, requires_grad=True)
In [16]: y = x * 2
In [17]: y.data
Out[17]: tensor([-1.2510, -0.6302, 1.2898])
In [18]: y.data.norm()
Out[18]: tensor(1.9041)
# computing the norm using elementary operations
In [19]: torch.sqrt(torch.sum(torch.pow(y, 2)))
Out[19]: tensor(1.9041)
首先,它对张量y
中的每个元素进行平方,然后对它们求和,最后取平方根。这些操作会计算所谓的 L2 or Euclidean norm 。
答案 1 :(得分:1)
以@ kmario23的内容为基础,它将向量的元素乘以2,直到向量的欧几里德距离/幅度至少为1000。
以具有(1,1,1)的向量为例:它增加到(512,512,512),其中l2范数约为886。它小于1000,因此再次乘以2。并变成(1024,1024,1024)。它的大小大于1000,因此停止。
答案 2 :(得分:0)
y.data.norm()
等同于
torch.sqrt(torch.sum(torch.pow(y, 2)))
答案 3 :(得分:0)
下面的代码块创建形状为(1,3)的张量 x
x = torch.ones(3, requires_grad=True)
print(x)
>>> tensor([1., 1., 1.], requires_grad=True)
下面的代码块通过将 x 的每个元素乘以2
来创建张量 yy = x * 2
print(y)
print(y.requires_grad)
>>> tensor([2., 2., 2.], grad_fn=<MulBackward0>)
>>> True
TORCH.data返回一个张量,其 requires_grad 设置为false
print(y.data)
print('Type of y: ', type(y.data))
print('requires_grad: ', y.data.requires_grad)
>>> tensor([2., 2., 2.])
>>> Type of y: <class 'torch.Tensor'>
>>> requires_grad: False
TORCH.norm()返回给定张量的矩阵范数或矢量范数。默认情况下,它会返回 Frobenius范本,又称为 L2-范本,该公式是使用公式
计算的。
在我们的示例中,由于 y 中的每个元素都是 2 ,因此y.data.norm()返回 3.4641 ,因为等于 3.4641
print(y.data.norm())
>>> tensor(3.4641)
下面的循环将运行,直到标准值小于1000
while y.data.norm() < 1000:
print('Norm value: ', y.data.norm(), 'y value: ', y.data )
y = y * 2
>>> Norm value: tensor(6.9282) y value: tensor([4., 4., 4.])
>>> Norm value: tensor(3.4641) y value: tensor([2., 2., 2.])
>>> Norm value: tensor(13.8564) y value: tensor([8., 8., 8.])
>>> Norm value: tensor(27.7128) y value: tensor([16., 16., 16.])
>>> Norm value: tensor(55.4256) y value: tensor([32., 32., 32.])
>>> Norm value: tensor(110.8512) y value: tensor([64., 64., 64.])
>>> Norm value: tensor(221.7025) y value: tensor([128., 128., 128.])
>>> Norm value: tensor(443.4050) y value: tensor([256., 256., 256.])
>>> Norm value: tensor(886.8100) y value: tensor([512., 512., 512.])
>>>
>>> Final y value: tensor([1024., 1024., 1024.], grad_fn=<MulBackward0>)