用法介绍
pytorch中的torch.norm主要用于计算矩阵和向量的 p p p范数,具体的用法如下所示:
torch.norm(input, p=‘fro’, dim=None, keepdim=False, out=None, dtype=None)
- input (Tensor): 输入的张量,数据类型必须是浮点型或复杂输入。对于复杂输入,使用每个元素的绝对值计算范数。如果输入很复杂,并且未指定dtype或out,则结果的数据类型将是相应的浮点类型
- p (int, float, inf, -inf, ‘fro’,‘nuc’, optional): 表示指定的范数,其中默认类型’fro’为Frobenius范数,'nuc’表示矩阵的核范数
- dim (int, tuple of python:ints, list of python:ints, optional): 指定要计算范数的输入维度。如果dim为None,则将在输入的所有维度上计算范数。
- keepdim (bool, optional): 输出的张量是否保持不变,默认值是False,如果dim = None和out = None,则该参数会被省略掉
- out (Tensor, optional): 输出的张量,如果dim = None和out = None,则该参数会被省略掉
- dtype (torch.dtype, optional): 返回的张量的所需数据类型。如果指定,则在执行操作时将输入张量转换为dtype。默认值是None
代码实例
在图像中会用到torch.norm函数来计算图像中 L 2 L_2 L2范数。给定一批图像 X ∈ R b × c × w × h X \in \mathbb{R}^{b \times c \times w \times h} X∈Rb×c×w×h,则该图像的 L 2 L_2 L2范数的定义为: L 2 ( X b , : , w , h ) = ∑ l = 1 c X b , l , w , h 2 L_2(X_{b,:,w,h})=\sqrt{\sum\limits_{l=1}^{c}X_{b,l,w,h}^2} L2(Xb,:,w,h)=l=1∑cXb,l,w,h2 X b , c , w , h ′ = X b , c , w , h L 2 ( X b , : , w , h ) X^{\prime}_{b,c,w,h}=\frac{X_{b,c,w,h}}{L_2(X_{b,:,w,h})} Xb,c,w,h′=L2(Xb,:,w,h)Xb,c,w,h相关的代码实例如下所示
import torch
import torch
def l2_norm(input, p_, dim_, keepdim_):
norm = torch.norm(input, p=p_, dim=dim_, keepdim=keepdim_)
return norm
if __name__ == '__main__':
input = torch.rand(4,3,32,32)
print(l2_norm(input, 2, None, False).shape)
input = torch.rand(4,3,32,32)
print(l2_norm(input, 2, 1, True).shape)
给定一批图片 X ∈ R B × C × W × H X\in \mathbb{R}^{B \times C\times W \times H} X∈RB×C×W×H,如果针对每一张图片 X i ∈ R C × W × H X_i\in \mathbb{R}^{C \times W \times H} Xi∈RC×W×H要计算 ζ = ∥ X i ∥ 0 ∥ X i ∥ 2 \zeta=\frac{\|X_i\|_0}{\|X_i\|_2} ζ=∥Xi∥2∥Xi∥0则有如下程序
import torch
inputs = torch.rand(5, 1, 28, 28)
outputs_L0_norm = torch.norm(inputs, p=0, dim=(2,3), keepdim=True)
outputs_L2_norm = torch.norm(inputs, p=2, dim=(2,3), keepdim=True)
outputs = outputs_L0_norm / outputs_L2_norm * torch.ones(inputs.shape)
print(outputs)