【问题标题】:What is the correct way to calculate the norm, 1-norm, and 2-norm of vectors in PyTorch?在 PyTorch 中计算向量的范数、1-范数和 2-范数的正确方法是什么?
【发布时间】:2021-07-22 18:17:02
【问题描述】:

我有一个矩阵:

t = torch.rand(2,3)
print(t)
>>>tensor([[0.5164, 0.3651, 0.0882],
        [0.4488, 0.9824, 0.4067]])

我正在关注this 规范的介绍,并想在 PyTorch 中尝试一下。

好像是这样的:

  • 向量的norm 是“向量的大小或长度是描述向量在空间中的范围的非负数,有时也称为向量的大小或范数”
  • 1-Norm 是“绝对向量值的总和,其中标量的绝对值使用符号 |a1|。实际上,范数是计算距向量空间原点的曼哈顿距离。”李>
  • 2-Norm是“向量坐标到向量空间原点的距离。L2范数计算为向量平方和的平方根。”

我目前只知道这个:

print(torch.linalg.norm(t, dim=1))
>>>tensor([0.6385, 1.1541])

但我不知道它正在计算来自here 的三个(范数、1-范数、2-范数)中的哪一个,以及如何计算其余的

【问题讨论】:

  • 我认为是函数中的ord参数。尝试 print(torch.linalg.norm(t, dim=1 , ord = 1)) 用于 1-norm 和 print(torch.linalg.norm(t, dim=1 , ord = 2)) 用于 2-norm 看看它是否有效。
  • 我认为这行得通! norm 呢?
  • 不要传递任何参数,这应该给你规范。这个print(torch.linalg.norm(t, dim=1 , ord = None)) 或这个print(torch.linalg.norm(t, dim=1)) 应该可以工作。

标签: python vector pytorch


【解决方案1】:

要计算 0-、1- 和 2-范数,您可以使用 torch.linalg.norm,提供 ord 参数(分别为 012)。或者直接在张量上:Tensor.norm,带有p 参数。以下是三种变体:手动计算、torch.linalg.normTensor.norm

  • 0-范数

    >>> x.norm(dim=1, p=0)
    >>> torch.linalg.norm(x, dim=1, ord=0)
    >>> x.ne(0).sum(dim=1)
    
  • 1-范数

    >>> x.norm(dim=1, p=1)
    >>> torch.linalg.norm(x, dim=1, ord=1)
    >>> x.abs().sum(dim=1)
    
  • 2-范数

    >>> x.norm(dim=1, p=2)
    >>> torch.linalg.norm(x, dim=1, ord=2)
    >>> x.pow(2).sum(dim=1).sqrt()
    

【讨论】:

  • 谢谢! norm 呢?
  • 您所指的似乎是 0 范数,我已将其添加到我的答案中。
【解决方案2】:

要计算不同顺序的范数,你只需要传入一个ord 参数和你想要的顺序。例如:

  • torch.linalg.norm(t, dim=1, ord = 0) 应该适用于规范
  • torch.linalg.norm(t, dim=1, ord = 1) 应该适用于 1-Norm
  • torch.linalg.norm(t, dim=1, ord = 2) 应该适用于 2-Norm
    等等。

【讨论】:

  • 实际上调用torch.linalg.norm而不指定ord(或传递ord=None)默认为2-norm,而不是0-norm.
  • 哼,所以他要么是inf norm,要么是0-norm。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 2020-01-19
  • 2019-06-01
  • 1970-01-01
相关资源
最近更新 更多