pytorch求范數函數——torch.norm


 

torch.norm(input, p='fro', dim=None, keepdim=False, out=None, dtype=None)

返回所給tensor的矩陣范數或向量范數

參數:

  • input:輸入tensor
  • p (int, float, inf, -inf, 'fro', 'nuc', optional):范數計算中的冪指數值。默認為'fro'

  • dim (int,2-tuple,2-list, optional): 指定計算的維度。如果是一個整數值,向量范數將被計算;如果是一個大小為2的元組,矩陣范數將被計算;如果為None,當輸入tensor只有兩維時矩陣計算矩陣范數;當輸入只有一維時則計算向量范數。如果輸入tensor超過2維,向量范數將被應用在最后一維
  • keepdim(bool,optional):指明輸出tensor的維度dim是否保留。如果dim=None或out=None,則忽略該參數。默認值為False,不保留
  • out(Tensor, optional):tensor的輸出。如果dim=None或out=None,則忽略該參數。
  • dtype(torch.dtype,optional):指定返回tensor的期望數據類型。如果指定了該參數,在執行該操作時輸入tensor將被轉換成 :attr:’dtype’

 

可見2范數求的就是距離

 

 舉例說明:

>>> import torch
>>> a = torch.arange(9, dtype=torch.float) - 4
>>> a
tensor([-4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.])
>>> b = a.reshape(3,3)
>>> b
tensor([[-4., -3., -2.],
        [-1.,  0.,  1.],
        [ 2.,  3.,  4.]])
>>> torch.norm(a)
tensor(7.7460)
>>> torch.norm(b)
tensor(7.7460)

>>> torch.norm(a, float('inf'))
tensor(4.)
>>> torch.norm(b, float('inf'))
tensor(4.)

1)如果不指明p,則是計算Frobenius范數:

所以上面的例子中a,b的結果都相同7.7460 = √(16*2 + 9*2 +4*2 + 1*2)

 

2)p = 'inf',則是求出矩陣或向量中各項元素絕對值中的最大值,所以為4

 

>>> c = torch.tensor([[1,2,3],[-1,1,4]], dtype=torch.float)
>>> c
tensor([[ 1.,  2.,  3.],
        [-1.,  1.,  4.]])
>>> torch.norm(c, dim=0)
tensor([1.4142, 2.2361, 5.0000])
>>> torch.norm(c, dim=0).size()
torch.Size([3])
>>> torch.norm(c, dim=1)
tensor([3.7417, 4.2426])
>>> torch.norm(c, p=1, dim=1)
tensor([6., 6.])

1)指定dim = 0,因為c的size() = (2,3),所以會去掉其dim=0,得到size()=(3)的結果,所以是縱向求值,計算Frobenius范數

2)p=1, dim=1 : 即是表示去掉維度1,使用1-范數,得到size()=(2)的結果。所以橫向計算各個元素絕對值的和,為([6,6])

 

下面是多維的情況,其實結果類似:

>>> d = torch.arange(8, dtype=torch.float).reshape(2,2,2)
>>> d
tensor([[[0., 1.],
         [2., 3.]],

        [[4., 5.],
         [6., 7.]]])

>>> torch.norm(d, dim=(1,2))
tensor([ 3.7417, 11.2250])
>>> d.size()
torch.Size([2, 2, 2])
>>> torch.norm(d, dim=0)
tensor([[4.0000, 5.0990],
        [6.3246, 7.6158]])
        
>>> d[0,:,:]
tensor([[0., 1.],
        [2., 3.]])
>>> d[0,:,:].size()
torch.Size([2, 2])

>>> torch.norm(d[0,:,:])
tensor(3.7417)
>>> torch.norm(d[1,:,:])
tensor(11.2250)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM