pytorch torch,pytorch 函数
我们在做分类算法的时候,经常会看到@acc1和@acc5。@acc1容易实现,但一直苦于@acc5算法的实现。在这里,我们为您提供一个@topk的实现方法。本文主要介绍你快速了解pytorch中的torch.topk()函数。有需要的朋友可以参考一下。
00-1010函数功能:举个栗子:例子演示和总结
目录
该函数的作用即按字面意思理解,topk:取数组的前k个元素进行排序。
通常该函数返回2个值,第一个值为排序的数组,第二个值为该数组中获取到的元素在原数组中的位置标号。
函数作用:
将numpy作为np导入
进口火炬
将torch.utils.data.dataset作为数据集导入
从torch.utils.data导入数据集,数据加载器
# # # # # # # # # # # # # # #准备一个数组# # # # # # # # # # # # # #
tensor1=torch.tensor([[10,1,2,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,1],dtype=torch.float32)
打印这个原始数组
打印(张量1: )
打印(张量1)
# # # # # # # # # # # # #使用函数torch.topk () # # # # # # # # # # # # #
Print(使用函数torch.topk()获取:)
k=3表示从原数组中获取3个元素,dim=1表示从原数组中的第一维获取元素。
(在本例中,它们来自[10,1,2,1,1,1,1,1,10],[3,4,5,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]得到3个元素)
其中,maximum=True表示元素从最大到最小。
print(torch.topk(tensor1,k=3,dim=1,maximum=True))
# # # # # # # # # # # #打印此函数的第一个返回值# # # # # # # # # # # # #
Print(函数的第一个返回值topk[0]如下)
print(torch.topk(tensor1,k=3,dim=1,maximum=True)[0])
打印此函数的第二个返回值
Print(函数的第二个返回值topk[1]如下)
print(torch.topk(tensor1,k=3,dim=1,maximum=True)[1])
# # # # # # # # # # # # # # #运行结果# # # # # # # # # # #
张量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.]])
使用函数torch.topk()获得:
得到的值是原始数组dim=1中从最大到最小的四组三个元素值;
所获得的索引是所获得的元素值在原始数组dim=1中的位置。
torch.return_types.topk(
值=张量([[10。 10. 2.],
[ 5. 4. 3.],
[ 9. 8. 7.],
[ 7. 4. 1.]]),
indices=张量([[ 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 torch
import torch.utils.data.dataset as Dataset
from 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)
# 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,会得到两个东西,我们需要的是第二个indices
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]])
总结
到此这篇关于pytorch中torch.topk()函数快速理解的文章就介绍到这了,更多相关pytorchtorch.topk()函数理解内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。