范数(norm)

向量范数表示一个向量的大小(这里的大小(size)不涉及维度,而是份量的大小),是将向量映射为一个标量的函数$f$。
通用的$L^P$范数定义如下:

$L_1$范数计算的是向量所有元素绝对值的和,$L_2$范数计算的是向量元素所有平方和的平方根,$L_\infty$范数计算的则是向量中最大元素的取值。

向量范数的性质

  1. 正定性:$|x|\geq0$,当且仅当$x$=0时,$|x|=0$
  2. 齐次性:如果我们按常数因子$\alpha$缩放向量的所有元素,其范数也会按照相同的常数因子的绝对值缩放:
  3. 三角不等式与$L_2$范数相比,$L_1$范数受异常值影响较小。

矩阵范数示例

1
2
3
x = torch.full([8],1,dtype = torch.float) 
a = x.view(2,4)
a,a.norm(1),a.norm(2),a.norm(3)
1
2
3
4
5
(tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.]]),
tensor(8.),
tensor(2.8284),
tensor(2.))

范数

常用操作

torch.min()最小值
torch.max()最大值
torch.mean()均值
torch.prod()累乘
torch.sum()求和
torch.argmin()最小值的索引,这里返回的是打平后的索引
torch.argmax()最大值的索引,这里返回的是打平后的索引
torch.argmin(dim)最小值的索引,这里返回的是某个维度上的索引
torch.argmax(dim)最大值的索引,这里返回的是某个维度上的索引

1
2
a = torch.arange(8).view(2,4).float()
a,a.min(),a.max(),a.mean(),a.prod(),a.sum(),a.argmin(),a.argmax(),a.argmin(1),a.argmax(1)
1
2
3
4
5
6
7
8
9
10
11
(tensor([[0., 1., 2., 3.],
[4., 5., 6., 7.]]),
tensor(0.),
tensor(7.),
tensor(3.5000),
tensor(0.),
tensor(28.),
tensor(0),
tensor(7),
tensor([0, 0]),
tensor([3, 3]))

a是一个[2,4]的tensor,在dim = 1argmax(),最后会得到一个[2]的tensor
注意:这里输出的是索引不是具体的值。
min()max()如果不指定维度,会打平后找出最值并返回最值,不返回索引;如果指定了维度,那么返回的是一个tuple,包含了valuesindex,所以如果直接查看.shape会报错,此时需用c.max(dim).values.shape取出value后再查看shape

1
2
3
4
5
6
c = torch.rand(2,3)
print(c,'\n')
print(c.min(1),'\n')
print(c.min(1).values.shape,'\n')#默认keepdim = 0,不保持维度
print(c.min(1 , keepdim = True).values.shape,'\n')
print(type(c.min(1)))
1
2
3
4
5
6
7
8
9
10
11
12
tensor([[0.9270, 0.1358, 0.1365],
[0.1293, 0.6586, 0.7564]])

torch.return_types.min(
values=tensor([0.1358, 0.1293]),
indices=tensor([1, 0]))

torch.Size([2])

torch.Size([2, 1])

<class 'torch.return_types.min'>

dim和keepdim

我们在哪个维度求最值,相当于消掉了这个维度,比如:[2,4]在dim=1求最值,得到的结果为[2]。
但是keepdim可以在求最值的时候把维度保持不变。

1
2
3
4
5
6
a = torch.arange(8).view(2,4).float()
print(a.argmin(1,keepdim=True))
print(a.argmax(1,keepdim=True))
print(a.shape)
print(a.argmin(1,keepdim=True).shape)
print(a.argmax(1,keepdim=True).shape)
1
2
3
4
5
6
7
8
tensor([[0],
[0]])
tensor([[3],
[3]])
#注意:这里输出的是索引不是具体的值。
torch.Size([2, 4])
torch.Size([2, 1])
torch.Size([2, 1])

维度保持住了。

取前k大/前k小/第k小的概率值及其索引(Top-k和k-th)

topk

.topk(num,dim,Largest)Largest不填或者Largest=True会返回最大的k个值和他们的索引,能返回比max()更多的数据,Largest=False会返回最大的k个值和他们的索引。

1
2
3
4
a = torch.randint(1, 10,[4,10])
print(a,'\n')
print(a.topk(3,dim=1),'\n')
a.topk(3,dim=1).values.shape
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
tensor([[1, 4, 2, 2, 9, 6, 1, 1, 3, 8],
[3, 9, 3, 5, 7, 5, 6, 1, 7, 8],
[3, 7, 6, 3, 1, 4, 3, 2, 3, 8],
[1, 2, 1, 2, 8, 7, 5, 9, 2, 7]])

torch.return_types.topk(
values=tensor([[9, 8, 6],
[9, 8, 7],
[8, 7, 6],
[9, 8, 7]]),
indices=tensor([[4, 9, 5],
[1, 9, 4],
[9, 1, 2],
[7, 4, 5]]))

torch.Size([4, 3])

kthvalue

.kthvalue(num,dim)返回第num个小的(只能返回小的)。

1
2
3
a = torch.randint(1, 10,[4,10])
print(a,'\n')
a.kthvalue(3,dim=1)#返回第三小的
1
2
3
4
5
6
7
8
tensor([[3, 5, 8, 7, 9, 2, 4, 5, 6, 5],
[2, 2, 5, 5, 5, 2, 6, 8, 3, 3],
[7, 9, 4, 2, 7, 4, 9, 1, 6, 2],
[8, 3, 9, 4, 4, 9, 7, 8, 8, 5]])

torch.return_types.kthvalue(
values=tensor([4, 2, 2, 4]),
indices=tensor([6, 5, 9, 4]))

compare

运算符有< , <= , > , >= , != , == ,会返回一个布尔类型的BoolTensor

1
2
3
a = torch.rand([2,2])
print(a,'\n')
print(a > 0)
1
2
3
4
5
tensor([[ 0.0720, -0.5518],
[ 0.6547, -3.0380]])

tensor([[ True, False],
[ True, False]])