pytorch:norm/argmax/argmin/topk/kthvalue以及比较函数

import torch

norm 范数

||x||p = (||x1||p + ||x2||p + … + ||x3||p)1/p

  • 1范数:所有元素绝对值相加
  • 2范数:所有元素平方和开根号
  • ∞范数:所有元素绝对值中的最大值
a = torch.randint(-10,11,[2,3,2])
a = a.to(torch.float64)
a
tensor([[[ -7.,  -5.],
         [  6.,  -5.],
         [ -1.,  10.]],

        [[-10.,  -9.],
         [ -5.,  -4.],
         [ -8.,   2.]]], dtype=torch.float64)
a.norm(1)
tensor(72., dtype=torch.float64)
a.norm(2)
tensor(22.9347, dtype=torch.float64)
  • norm带有dim的情况:
  • 设X是一个IJK的矩阵,xijk是里面的元素
  • Y = X.norm(n,dim=0) 生成一个J*K的矩阵,y12是所有xi12的n范数 y23是所有xi23的n范数
  • Y = X.norm(n,dim=1) 生成一个I*K的矩阵,y12是所有x1j2的n范数 y23是所有x2j3的n范数
  • Y = X.norm(n,dim=[1,2]) 生成一个size=I的vector y1是所有x1ij的n范数 y2是所有x2ij的n范数
a.norm(1,dim=0) #17=abs(-7)+abs(-10) 14=abs(-5)+abs(-9) ...
tensor([[17., 14.],
        [11.,  9.],
        [ 9., 12.]], dtype=torch.float64)
a.norm(1,dim=1) #14=abs(-7)+abs(6)+abs(-1) 20=abs(-5)+abs(-5)+abs(10) ...
tensor([[14., 20.],
        [23., 15.]], dtype=torch.float64)
a.norm(1,dim=2) #12=abs(-7)+abs(-5) 11=abs(6)+abs(-5)
tensor([[12., 11., 11.],
        [19.,  9., 10.]], dtype=torch.float64)
a.norm(1,dim=[0,1])
tensor([37., 35.], dtype=torch.float64)
a.norm(1,dim=[0,2])
tensor([31., 20., 21.], dtype=torch.float64)

最大值、最小值及索引

a = torch.randint(-20,21,[2,2,3,2]).to(torch.float64)
a
tensor([[[[-17., -17.],
          [ -3.,  17.],
          [  7.,   0.]],

         [[  7., -20.],
          [-16., -18.],
          [ 18.,  -5.]]],


        [[[ 14., -20.],
          [  5., -12.],
          [  5., -13.]],

         [[-16., -20.],
          [ 16.,  -9.],
          [ -1.,  15.]]]], dtype=torch.float64)
print(a.argmax()) #把a拉平成一维vector 然后再找最大值索引
print(a.argmin()) #把a拉平成一维vector 然后再找最小值索引
tensor(10)
tensor(19)
  • argmax带dim:
  • 设X是一个PQM*N的tensor
  • Y=a.argmax(dim=0) Y是一个QMN的tensor Y112是所有Xp112中最大的那个的索引 Y234是所有Xp234中最大的那个的索引
  • Y=a.argmax(dim=3) Y是一个PQM的tensor Y112是所有X112q中最大的那个的索引 Y234是所有X234p中最大的那个的索引
  • argmin同理
  • max\min带dim 思路和上面一样,只是返回的东西包含两部分,第一部分是值,第二部分是索引
print(a.argmax(dim=0)) 
print(a.argmin(dim=0)) 
tensor([[[1, 0],
         [1, 0],
         [0, 0]],

        [[0, 1],
         [1, 1],
         [0, 1]]])
tensor([[[0, 1],
         [0, 1],
         [1, 1]],

        [[1, 1],
         [0, 0],
         [1, 0]]])
print(a.argmax(dim=1))
print(a.argmax(dim=2))
tensor([[[1, 0],
         [0, 0],
         [1, 0]],

        [[0, 1],
         [1, 1],
         [0, 1]]])
tensor([[[2, 1],
         [2, 2]],

        [[0, 1],
         [1, 2]]])
print('索引:\n',a.max(dim=2)[1])
print('值:\n',a.max(dim=2)[0])
索引:
 tensor([[[2, 1],
         [2, 2]],

        [[0, 1],
         [1, 2]]])
值:
 tensor([[[  7.,  17.],
         [ 18.,  -5.]],

        [[ 14., -12.],
         [ 16.,  15.]]], dtype=torch.float64)

topk

  • b的size是pqj
  • b.topk(n,dim=0) 返回的东西包括两个nqj的tensor,第一个tensor是value 第二个tensor是indice 其他思路和max差不多
  • b.topk(n,dim=1) 返回的东西包括两个pnj的tensor,第一个tensor是value 第二个tensor是indice 其他思路和max差不多
  • dim不写 默认为最大的 比如本例中就是2
  • largest=False则返回的是最小的n个
b = torch.rand(2,3,10) #假设2个batch,每个batch3张照片,10表示每张照片依次是0~9的概率
b
tensor([[[0.5304, 0.1505, 0.5322, 0.0247, 0.1890, 0.8630, 0.6212, 0.4308,
          0.3447, 0.9590],
         [0.7632, 0.1420, 0.7258, 0.8698, 0.6531, 0.2155, 0.8730, 0.3963,
          0.1711, 0.4374],
         [0.7572, 0.4117, 0.2699, 0.4153, 0.9025, 0.7338, 0.4403, 0.6043,
          0.6109, 0.9631]],

        [[0.5738, 0.9288, 0.2986, 0.8859, 0.2687, 0.9388, 0.4515, 0.9561,
          0.9277, 0.6534],
         [0.4825, 0.9142, 0.4260, 0.4814, 0.8739, 0.9296, 0.8225, 0.5581,
          0.8214, 0.2455],
         [0.5460, 0.6100, 0.5846, 0.7510, 0.5964, 0.4243, 0.8347, 0.7734,
          0.5279, 0.5943]]])
b.topk(1,dim=2)
# 0.9590表示第一个batch的第一张照片的10个概率值中,最大的是0.9590 并且我们可以看到它对应的indice是9 表示这张照片是“9”的概率为0.9590
# 0.9296表示第2个batch的第2张照片的10个概率值中,最大的是0.9296 并且我们可以看到它对应的indice是5 表示这张照片是“5”的概率为0.9590
torch.return_types.topk(
values=tensor([[[0.9590],
         [0.8730],
         [0.9631]],

        [[0.9561],
         [0.9296],
         [0.8347]]]),
indices=tensor([[[9],
         [6],
         [9]],

        [[7],
         [5],
         [6]]]))
b.topk(1)
torch.return_types.topk(
values=tensor([[[0.9590],
         [0.8730],
         [0.9631]],

        [[0.9561],
         [0.9296],
         [0.8347]]]),
indices=tensor([[[9],
         [6],
         [9]],

        [[7],
         [5],
         [6]]]))

kthvalue

  • kthvalue的分析思路和max带dim的分析思路一样,只是把最大换成第几大
  • 当kthvalue的dim不写的时候,默认为最大
print(b.shape,'\n')
print(b)
torch.Size([2, 3, 10]) 

tensor([[[0.5304, 0.1505, 0.5322, 0.0247, 0.1890, 0.8630, 0.6212, 0.4308,
          0.3447, 0.9590],
         [0.7632, 0.1420, 0.7258, 0.8698, 0.6531, 0.2155, 0.8730, 0.3963,
          0.1711, 0.4374],
         [0.7572, 0.4117, 0.2699, 0.4153, 0.9025, 0.7338, 0.4403, 0.6043,
          0.6109, 0.9631]],

        [[0.5738, 0.9288, 0.2986, 0.8859, 0.2687, 0.9388, 0.4515, 0.9561,
          0.9277, 0.6534],
         [0.4825, 0.9142, 0.4260, 0.4814, 0.8739, 0.9296, 0.8225, 0.5581,
          0.8214, 0.2455],
         [0.5460, 0.6100, 0.5846, 0.7510, 0.5964, 0.4243, 0.8347, 0.7734,
          0.5279, 0.5943]]])
print(b.kthvalue(2,dim=2)[0].shape,'\n')
print(b.kthvalue(2,dim=2))
torch.Size([2, 3]) 

torch.return_types.kthvalue(
values=tensor([[0.1505, 0.1711, 0.4117],
        [0.2986, 0.4260, 0.5279]]),
indices=tensor([[1, 8, 1],
        [2, 2, 8]]))

比较: > < == != torch.ge/gt/le/lt() torch.eq() torch.equal()

a = torch.tensor([[1,2],[7,8]])
b = torch.tensor([[1,4],[5,6]])
a>b
tensor([[False, False],
        [ True,  True]])
a == 0
tensor([[False, False],
        [False, False]])
torch.ge(a,b) #a>=b? element-wise 如果dim不合适,就broadcast
tensor([[ True, False],
        [ True,  True]])
torch.gt(a,b) #a>b?
tensor([[False, False],
        [ True,  True]])
torch.le(a,b) #a<=b
tensor([[ True,  True],
        [False, False]])
torch.lt(a,b) #a<b
tensor([[False,  True],
        [False, False]])
torch.eq(a,b)
tensor([[ True, False],
        [False, False]])
torch.equal(a,b)
False

发布了43 篇原创文章 · 获赞 1 · 访问量 757

猜你喜欢

转载自blog.csdn.net/weixin_41391619/article/details/104699683