时间:2021-05-22
听名字就知道这个函数是用来求tensor中某个dim的前k大或者前k小的值以及对应的index。
用法
torch.topk(input, k, dim=None, largest=True, sorted=True, out=None) -> (Tensor, LongTensor)input:一个tensor数据
k:指明是得到前k个数据以及其index
dim: 指定在哪个维度上排序, 默认是最后一个维度
largest:如果为True,按照大到小排序; 如果为False,按照小到大排序
sorted:返回的结果按照顺序返回
out:可缺省,不要
topk最常用的场合就是求一个样本被网络认为前k个最可能属于的类别。我们就用这个场景为例,说明函数的使用方法。
假设一个,N是样本数目,一般等于batch size, D是类别数目。我们想知道每个样本的最可能属于的那个类别,其实可以用torch.max得到。如果要使用topk,则k应该设置为1。
import torchpred = torch.randn((4, 5))print(pred)values, indices = pred.topk(1, dim=1, largest=True, sorted=True)print(indices)# 用max得到的结果,设置keepdim为True,避免降维。因为topk函数返回的index不降维,shape和输入一致。_, indices_max = pred.max(dim=1, keepdim=True)print(indices_max == indices)# predtensor([[-0.1480, -0.9819, -0.3364, 0.7912, -0.3263], [-0.8013, -0.9083, 0.7973, 0.1458, -0.9156], [-0.2334, -0.0142, -0.5493, 0.0673, 0.8185], [-0.4075, -0.1097, 0.8193, -0.2352, -0.9273]])# indices, shape为 【4,1】,tensor([[3], #【0,0】代表 第一个样本最可能属于第一类别 [2], # 【1, 0】代表第二个样本最可能属于第二类别 [4], [2]])# indices_max等于indicestensor([[True], [True], [True], [True]])现在在尝试一下k=2
import torchpred = torch.randn((4, 5))print(pred)values, indices = pred.topk(2, dim=1, largest=True, sorted=True) # k=2print(indices)# predtensor([[-0.2203, -0.7538, 1.8789, 0.4451, -0.2526], [-0.0413, 0.6366, 1.1155, 0.3484, 0.0395], [ 0.0365, 0.5158, 1.1067, -0.9276, -0.2124], [ 0.6232, 0.9912, -0.8562, 0.0148, 1.6413]])# indicestensor([[2, 3], [2, 1], [2, 1], [4, 1]])可以发现indices的shape变成了【4, k】,k=2。
其中indices[0] = [2,3]。其意义是说明第一个样本的前两个最大概率对应的类别分别是第3类和第4类。
大家可以自行print一下values。可以发现values的shape和indices的shape是一样的。indices描述了在values中对应的值在pred中的位置。
以上这篇PyTorch中topk函数的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C语言中qsort函数的用法实例详解快速排序是一种用的最多的排序算法,在C语言的标准库中也有快速排序的函数,下面说一下详细用法。qsort函数包含在中qsort
Pytorch的线性函数主要封装了Blas和Lapack,其用法和接口都与之类似。常用的线性函数如下:函数功能trace对角线元素之和(矩阵的迹)diag对角线
pytorch中的gather函数pytorch比tensorflow更加编程友好,所以准备用pytorch试着做最近要做的一些实验。立个flag开始学习pyt
详解C++中十六进制字符串转数字(数值)主要有两个方法,其实都是对现有函数的使用:方法1:sscanf()函数名:sscanf功能:从字符串格式化输入用法:in
C++中构造函数的实例详解c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++