You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ShuffleNet中accuracy准确率计算函数的correct变量逻辑疑问

accuracy函数correct变量计算逻辑拆解

首先先明确函数输入的张量形状:

  • output:形状为[batch_size, num_classes],每一行对应一个样本在所有类别上的预测得分
  • target:形状为[batch_size],每个元素是对应样本的真实类别索引

我们逐行拆解到correct的计算过程:

  1. maxk = max(topk):取需要计算的topk的最大值,比如传入topk=(1,5)时maxk=5,表示要取每个样本得分最高的前5个预测类别
  2. _, pred = output.topk(maxk, 1, True, True):topk接口返回的第一个值是前maxk个预测的得分,我们不需要,取第二个返回值pred,它的形状是[batch_size, maxk],每一行是单个样本的前maxk个预测类别索引,按得分从高到低排序
  3. pred = pred.t():对pred做转置,形状变为[maxk, batch_size],此时每一列对应一个样本的前maxk个预测类别
  4. 处理target适配比对维度:target.view(1, -1)会把原本一维的target转为形状[1, batch_size]的二维张量,再调用.expand_as(pred)会把这个张量沿第0维复制maxk次,最终形状和转置后的pred一致为[maxk, batch_size],此时这个扩展后的target每一行都是完整的batch真实标签
  5. pred.eq(target.view(1, -1).expand_as(pred)):对应位置逐元素做相等判断,此时pred的每一列是单个样本的前maxk个预测,扩展后的target每一列全是该样本的真实标签,对应位置为True就说明该位次的预测命中了真实类别。

举个直观的小例子,假设batch_size=2,maxk=3:

  • 转置后的pred为:
[[2, 5],
 [7, 2],
 [9, 1]]
  • 真实target为[7, 1],扩展后形状和pred一致:
[[7, 1],
 [7, 1],
 [7, 1]]

eq后的correct结果为:

[[False, False],
 [True, False],
 [False, True]]

可以看到第一个样本(第一列)的第二位预测命中,说明top2精度下该样本算预测正确;第二个样本(第二列)的第三位预测命中,说明top3精度下该样本算预测正确。

后续的精度计算就是取前k行的correct值求和,得到topk下的命中样本总数,除以batch size再乘100就是对应的百分比精度。

内容的提问来源于stack exchange,提问作者Afsaneh Ebrahimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:18:00