Pytorch基础 – 2. torch.linalg.norm() 和 torch.linalg.vector_norm() 和 torch.linalg.matrix_norm()

导读:本篇文章讲解 Pytorch基础 – 2. torch.linalg.norm() 和 torch.linalg.vector_norm() 和 torch.linalg.matrix_norm(),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

1. torch.linalg.norm() 

2. torch.linalg.vector_norm()

3. torch.linalg.matrix_norm()


最近在写程序的时候,用到了L2范数,也因此了解到了这几个函数torch.norm()【已弃用】,torch.linalg.norm(),torch.linalg.matrix_norm(),torch.linalg.vector_norm()。

1. torch.linalg.norm() 

 该函数能够计算向量/矩阵/范数,首先献上官方文档:torch.linalg.norm — PyTorch 1.13

torch.linalg.norm(Aord=Nonedim=Nonekeepdim=False*out=Nonedtype=None)

(1) ord是指定的范数,默认None,为F-范数(2-范数)。当p=’nuc’时为核范数,剩下的可看文档。

(2) dim为指定求范数的维度

  • 如果dim是一个int,将计算向量范数。
  • 如果dim是一个二元组,将计算矩阵范数。
  • 如果dim= None和ord= None,则A将被展为1D,并计算结果向量的2范数。
  • 如果dim= None和ord != None,则A必须是1D或2D。

(3)  keepdim指是否保留dim指定的维度

示例1:dim和ord均为None,即默认A展平,计算向量的2-范数,下面是向量范数公式(当p=2时)

Pytorch基础 - 2. torch.linalg.norm() 和 torch.linalg.vector_norm() 和 torch.linalg.matrix_norm()

import torch
from torch import linalg as LA

if __name__ == '__main__':
    a = torch.arange(20).reshape(4, -1).float()
    f2 = LA.norm(a)
    print(f2)  # tensor(49.6991)
    
    # 验证
    f2_my = torch.sqrt(a.pow(2).sum())
    print(f2_my) # tensor(49.6991)

示例2:当指定维度为int时,计算的是该维度的向量范数。以下为示例和验证

import torch
from torch import linalg as LA

if __name__ == '__main__':
    a = torch.arange(20).reshape(4, -1).float()
    f2 = LA.norm(a, dim=0)
    print(f2)  # tensor([18.7083, 20.3470, 22.0454, 23.7908, 25.5734])

    # 验证
    f2_my = torch.sqrt(a.pow(2).sum(dim=0))
    print(f2_my) # tensor([18.7083, 20.3470, 22.0454, 23.7908, 25.5734])

 示例3:当指定维度为二元组时,计算的是该维度的矩阵范数。

import torch
from torch import linalg as LA

if __name__ == '__main__':
    a = torch.arange(8).reshape(2, 2, 2).float()
    f2 = LA.norm(a, dim=(1, 2))
    print(f2, f2.shape)  # tensor([ 3.7417, 11.2250]), torch.Size([2])
    
    f2_keepdim = LA.norm(a, dim=(1, 2), keepdim=True)
    print(f2_keepdim, f2_keepdim.shape)   # tensor([[[ 3.7417]], [[11.2250]]]), torch.Size([2, 1, 1])

例子中给出了dim=(1, 2)是指计算dim=1和dim=2的矩阵范数,所以结果f2_keepdim是维度1和2的shape是1,维度为0的shape不变。同时例子中也验证了keepdim这个参数的用法,即默认是False,会把结果展平到一维,若为True的话,会保留原始的shape。

torch.linalg.norm()包含矩阵和向量范数,更具体的可以使用 torch.linalg.vector_norm()来计算向量范数,使用torch.linalg.matrix_norm()来计算矩阵范数。

2. torch.linalg.vector_norm()

torch.linalg.vector_norm(xord=2dim=Nonekeepdim=False*dtype=Noneout=None)

 基本用法和norm一样,具体可参考torch.linalg.vector_norm — PyTorch 1.13 documentation

(1) ord是指定的范数:默认是2

(2) dim为指定求范数的维度:

  • 如果dim= None,则将x拉平再计算范数。
  • 如果dim是int或tuple,则将在这些维度上计算范数。

示例4: 直接将示例1中的LA.norm更改成LA.vector_norm即可

from torch import linalg as LA

if __name__ == '__main__':
    a = torch.arange(20, dtype=torch.float).reshape((4, -1)
    f2 = LA.vector_norm(a, ord=2)
    print(f2)

3. torch.linalg.matrix_norm()

torch.linalg.matrix_norm(Aord=’fro’dim(- 2, – 1)keepdim=False*dtype=Noneout=None)

基本用法和norm也是一致的,具体参考torch.linalg.matrix_norm — PyTorch 1.13 documentation

(1) ord指指定范数,下图为官网截图

Pytorch基础 - 2. torch.linalg.norm() 和 torch.linalg.vector_norm() 和 torch.linalg.matrix_norm()

 示例5:直接将示例3中的LA.norm更改为LA.matrix_norm即可

import torch
from torch import linalg as LA

if __name__ == '__main__':
    a = torch.arange(8).reshape(2, 2, 2).float()
    f2 = LA.matrix_norm(a, dim=(1, 2))

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/87438.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!