代码:x.norm(p=2,dim=1,keepdim=True)
功能:求指定维度上的范数。
函数原型:【返回输入张量给定维dim 上每行的p范数】
torch.norm(input, p, dim, out=None,keepdim=False) → Tensor
注:范数求法:【对N个数据求p范数】
函数参数:
input (Tensor) – 输入张量
p (float) – 范数计算中的幂指数值
dim (int) – 缩减的维度,dim=0是对0维度上的一个向量求范数,返回结果数量等于其列的个数,也就是说有多少个0维度的向 量, 将得到多少个范数。dim=1同理。
out (Tensor, optional) – 结果张量
keepdim(bool)– 保持输出的维度 。当keepdim=False时,输出比输入少一个维度(就是指定的dim求范数的维度)。而 keepdim=True时,输出与输入维度相同,仅仅是输出在求范数的维度上元素个数变为1。这也是为什么有时 我们把参数中的dim称为缩减的维度,因为norm运算之后,此维度或者消失或者元素个数变为1。
例子说明:
已知一个3×4矩阵,如下:
tensor([[ 1., 2., 3., 4.],
[ 2., 4., 6., 8.],
[ 3., 6., 9., 12.]])
1)dim参数,分别对其行和列分别求2范数:
inputs1 = torch.norm(inputs, p=2, dim=1, keepdim=True)
print(inputs1)
inputs2 = torch.norm(inputs, p=2, dim=0, keepdim=True)
print(inputs2)
结果分别为:
tensor([[ 5.4772],
[10.9545],
[16.4317]])
tensor([[ 3.7417, 7.4833, 11.2250, 14.9666]])
2)keepdim参数
inputs3 = inputs.norm(p=2, dim=1, keepdim=False)
print(inputs3)
inputs3为:
tensor([ 5.4772, 10.9545, 16.4317])
输出inputs1和inputs3的shape:
print(inputs1.shape)
print(inputs3.shape)
torch.Size([3, 1])
torch.Size([3])
可以看到inputs3少了一维,其实就是dim=1(求范数)那一维(列)少了,因为从4列变成1列,就是3行中求每一行的2范数,就剩1列了,不保持这一维不会对数据产生影响。或者也可以这么理解,就是数据每个数据有没有用[]扩起来。
即:
keepdim = True,用[]扩起来;
keepdim = False,不用[]括起来;
【不写keepdim,则默认不保留dim的那个维度】:
inputs4 = torch.norm(inputs, p=2, dim=1)
print(inputs4)
tensor([ 5.4772, 10.9545, 16.4317])
【不写dim,则计算Tensor中所有元素的2范数】:
inputs5 = torch.norm(inputs, p=2)
print(inputs5)
tensor(20.4939)
等价于这句话:
inputs6 = inputs.pow(2).sum().sqrt()
print(inputs6)
tensor(20.4939)
总之,norm操作后dim这一维变为1或者消失。