ShuffleNet中accuracy准确率计算函数的correct变量逻辑疑问
accuracy函数correct变量计算逻辑拆解
首先先明确函数输入的张量形状:
output:形状为[batch_size, num_classes],每一行对应一个样本在所有类别上的预测得分target:形状为[batch_size],每个元素是对应样本的真实类别索引
我们逐行拆解到correct的计算过程:
maxk = max(topk):取需要计算的topk的最大值,比如传入topk=(1,5)时maxk=5,表示要取每个样本得分最高的前5个预测类别_, pred = output.topk(maxk, 1, True, True):topk接口返回的第一个值是前maxk个预测的得分,我们不需要,取第二个返回值pred,它的形状是[batch_size, maxk],每一行是单个样本的前maxk个预测类别索引,按得分从高到低排序pred = pred.t():对pred做转置,形状变为[maxk, batch_size],此时每一列对应一个样本的前maxk个预测类别- 处理target适配比对维度:
target.view(1, -1)会把原本一维的target转为形状[1, batch_size]的二维张量,再调用.expand_as(pred)会把这个张量沿第0维复制maxk次,最终形状和转置后的pred一致为[maxk, batch_size],此时这个扩展后的target每一行都是完整的batch真实标签 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
相关产品推荐
相关产品推荐

