千家信息网

pytorch中torch.topk()函数怎么用

发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,这篇文章主要介绍"pytorch中torch.topk()函数怎么用",在日常操作中,相信很多人在pytorch中torch.topk()函数怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的
千家信息网最后更新 2024年11月20日pytorch中torch.topk()函数怎么用

这篇文章主要介绍"pytorch中torch.topk()函数怎么用",在日常操作中,相信很多人在pytorch中torch.topk()函数怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"pytorch中torch.topk()函数怎么用"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

函数作用:

该函数的作用即按字面意思理解,topk:取数组的前k个元素进行排序。

通常该函数返回2个值,第一个值为排序的数组,第二个值为该数组中获取到的元素在原数组中的位置标号。

举个栗子:

import numpy as npimport torchimport torch.utils.data.dataset as Datasetfrom torch.utils.data import Dataset,DataLoader####################准备一个数组#########################tensor1=torch.tensor([[10,1,2,1,1,1,1,1,1,1,10],             [3,4,5,1,1,1,1,1,1,1,1],             [7,8,9,1,1,1,1,1,1,1,1],             [1,4,7,1,1,1,1,1,1,1,1]],dtype=torch.float32)####################打印这个原数组#########################print('tensor1:')print(tensor1)#################使用torch.topk()这个函数##################print('使用torch.topk()这个函数得到:')'''k=3代表从原数组中取得3个元素,dim=1表示从原数组中的第一维获取元素(在本例中是分别从[10,1,2,1,1,1,1,1,1,1,10]、[3,4,5,1,1,1,1,1,1,1,1]、  [7,8,9,1,1,1,1,1,1,1,1]、[1,4,7,1,1,1,1,1,1,1,1]这四个数组中获取3个元素)其中largest=True表示从大到小取元素'''print(torch.topk(tensor1, k=3, dim=1, largest=True))#################打印这个函数第一个返回值####################print('函数第一个返回值topk[0]如下')print(torch.topk(tensor1, k=3, dim=1, largest=True)[0])#################打印这个函数第二个返回值####################print('函数第二个返回值topk[1]如下')print(torch.topk(tensor1, k=3, dim=1, largest=True)[1])'''#######################运行结果##########################tensor1:tensor([[10.,  1.,  2.,  1.,  1.,  1.,  1.,  1.,  1.,  1., 10.],        [ 3.,  4.,  5.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],        [ 7.,  8.,  9.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],        [ 1.,  4.,  7.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.]])使用torch.topk()这个函数得到:'得到的values是原数组dim=1的四组从大到小的三个元素值;得到的indices是获取到的元素值在原数组dim=1中的位置。'torch.return_types.topk(values=tensor([[10., 10.,  2.],        [ 5.,  4.,  3.],        [ 9.,  8.,  7.],        [ 7.,  4.,  1.]]),indices=tensor([[ 0, 10,  2],        [ 2,  1,  0],        [ 2,  1,  0],        [ 2,  1,  0]]))函数第一个返回值topk[0]如下tensor([[10., 10.,  2.],        [ 5.,  4.,  3.],        [ 9.,  8.,  7.],        [ 7.,  4.,  1.]])        函数第二个返回值topk[1]如下tensor([[ 0, 10,  2],        [ 2,  1,  0],        [ 2,  1,  0],        [ 2,  1,  0]])'''

该函数功能经常用来获取张量或者数组中最大或者最小的元素以及索引位置,是一个经常用到的基本函数。

实例演示

任务一:

取top1(最大值):

pred = torch.tensor([[-0.5816, -0.3873, -1.0215, -1.0145,  0.4053],        [ 0.7265,  1.4164,  1.3443,  1.2035,  1.8823],        [-0.4451,  0.1673,  1.2590, -2.0757,  1.7255],        [ 0.2021,  0.3041,  0.1383,  0.3849, -1.6311]])print(pred)values, indices = pred.topk(1, dim=0, largest=True, sorted=True)print(indices)print(values)# 用max得到的结果,设置keepdim为True,避免降维。因为topk函数返回的index不降维,shape和输入一致。_, indices_max = pred.max(dim=0, keepdim=True)print(indices_max)print(indices_max == indices)输出:tensor([[-0.5816, -0.3873, -1.0215, -1.0145,  0.4053],        [ 0.7265,  1.4164,  1.3443,  1.2035,  1.8823],        [-0.4451,  0.1673,  1.2590, -2.0757,  1.7255],        [ 0.2021,  0.3041,  0.1383,  0.3849, -1.6311]])tensor([[1, 1, 1, 1, 1]])tensor([[0.7265, 1.4164, 1.3443, 1.2035, 1.8823]])tensor([[1, 1, 1, 1, 1]])tensor([[True, True, True, True, True]])

任务二:

按行取出topk,将小于topk的置为inf:

pred = torch.tensor([[-0.5816, -0.3873, -1.0215, -1.0145,  0.4053],        [ 0.7265,  1.4164,  1.3443,  1.2035,  1.8823],        [-0.4451,  0.1673,  1.2590, -2.0757,  1.7255],        [ 0.2021,  0.3041,  0.1383,  0.3849, -1.6311]])print(pred)top_k = 2  # 按行求出每一行的最大的前两个值filter_value=-float('Inf')indices_to_remove = pred < torch.topk(pred, top_k)[0][..., -1, None]print(indices_to_remove)pred[indices_to_remove] = filter_value  # 对于topk之外的其他元素的logits值设为负无穷print(pred) 输出:tensor([[-0.5816, -0.3873, -1.0215, -1.0145,  0.4053],        [ 0.7265,  1.4164,  1.3443,  1.2035,  1.8823],        [-0.4451,  0.1673,  1.2590, -2.0757,  1.7255],        [ 0.2021,  0.3041,  0.1383,  0.3849, -1.6311]])tensor([[4],        [4],        [4],        [3]])tensor([[0.4053],        [1.8823],        [1.7255],        [0.3849]])tensor([[ True, False,  True,  True, False],        [ True, False,  True,  True, False],        [ True,  True, False,  True, False],        [ True, False,  True, False,  True]])tensor([[   -inf, -0.3873,    -inf,    -inf,  0.4053],        [   -inf,  1.4164,    -inf,    -inf,  1.8823],        [   -inf,    -inf,  1.2590,    -inf,  1.7255],        [   -inf,  0.3041,    -inf,  0.3849,    -inf]])

任务三:

import numpy as npimport torchimport torch.utils.data.dataset as Datasetfrom torch.utils.data import Dataset,DataLoadertensor1=torch.tensor([[10,1,2,1,1,1,1,1,1,1,10],             [3,4,5,1,1,1,1,1,1,1,1],             [7,8,9,1,1,1,1,1,1,1,1],             [1,4,7,1,1,1,1,1,1,1,1]],dtype=torch.float32)# tensor2=torch.tensor([[3,2,1],#                       [6,5,4],#                       [1,4,7],#                       [9,8,7]],dtype=torch.float32)#print('tensor1:')print(tensor1)print('直接输出topk,会得到两个东西,我们需要的是第二个indices')print(torch.topk(tensor1, k=3, dim=1, largest=True))print('topk[0]如下')print(torch.topk(tensor1, k=3, dim=1, largest=True)[0])print('topk[1]如下')print(torch.topk(tensor1, k=3, dim=1, largest=True)[1])'''tensor1:tensor([[10.,  1.,  2.,  1.,  1.,  1.,  1.,  1.,  1.,  1., 10.],        [ 3.,  4.,  5.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],        [ 7.,  8.,  9.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],        [ 1.,  4.,  7.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.]])直接输出topk,会得到两个东西,我们需要的是第二个indicestorch.return_types.topk(values=tensor([[10., 10.,  2.],        [ 5.,  4.,  3.],        [ 9.,  8.,  7.],        [ 7.,  4.,  1.]]),indices=tensor([[ 0, 10,  2],        [ 2,  1,  0],        [ 2,  1,  0],        [ 2,  1,  0]]))topk[0]如下tensor([[10., 10.,  2.],        [ 5.,  4.,  3.],        [ 9.,  8.,  7.],        [ 7.,  4.,  1.]])topk[1]如下tensor([[ 0, 10,  2],        [ 2,  1,  0],        [ 2,  1,  0],        [ 2,  1,  0]])'''

到此,关于"pytorch中torch.topk()函数怎么用"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0