PyTorch中的data.norm() < 1000是什么意思?

25

我正在遵循PyTorch教程这里。 它说:

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.])


我不熟悉PyTorch,但经过一些搜索,我认为norm()方法可能与数学范数有关。我不知道这是否是同一个方法,但我在PyTorch文档中也找到了一个norm()方法链接 - 0xCursor
4个回答

32

这仅仅是张量的L2范数(也叫欧几里得范数)。以下是一个可复现的说明:

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)

说明: 首先,它对输入张量x中的每个元素进行平方,然后将它们相加,最后取这个和的平方根。总之,这些操作计算所谓的L2或欧几里德范数


2
基本上,它试图获取一个大小小于1000的向量(L2范数可以计算向量的欧几里得距离)。 - information_interchange

6

在@kmario23所说的基础上,代码将向量的元素乘以2,直到向量的欧几里得大小(距原点的距离)/向量的L2范数至少为1000。

以向量(1,1,1)为例:它增加到(512,512,512),其中l2范数约为886。这小于1000,因此它再次乘以2变成(1024,1024,1024)。它的大小大于1000,因此停止。


1
y.data.norm() 

等同于

torch.sqrt(torch.sum(torch.pow(y, 2)))

3
请问需要翻译的原始文本是什么? - 0xInfection

1

让我们逐步分解以更好地理解代码。


以下代码块创建了一个形状为(1,3)的张量x
x = torch.ones(3, requires_grad=True)
print(x)

>>> tensor([1., 1., 1.], requires_grad=True)

以下代码块通过将x的每个元素乘以2来创建张量y
y = 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>)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接