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)