我关注了this tutorial 我对作者定义负对数似然损失函数的部分感到困惑。
def nll(input, target):
return -input[range(target.shape[0]), target].mean()
loss_func = nll
这里,target.shape[0]
是64
,而target
是长度为64的向量
tensor([5, 0, 4, 1, 9, 2, 1, 3, 1, 4, 3, 5, 3, 6, 1, 7, 2, 8, 6, 9, 4, 0, 9, 1, 1, 2, 4, 3, 2, 7, 3, 8, 6, 9, 0, 5, 6, 0, 7, 6, 1, 8, 7, 9, 3, 9, 8, 5, 9, 3, 3, 0, 7, 4, 9, 8, 0, 9, 4, 1, 4, 4, 6, 0])
。
该numpy索引如何导致损失函数?而且,当方括号内有range()和另一个数组时,numpy数组的输出应该是什么?
答案 0 :(得分:1)
在本教程中,input
和target
均为torch.tensor
。
对数似然损失的负值计算如下:
nll = -(1/B) * sum(logPi_(target_class)) # for all sample_i in the batch.
位置:
B
:批量大小C
:课程数量Pi
:形状为[num_classes,]个样本i
的预测概率矢量。通过样本logit
的{{1}}向量的softmax值获得。i
:logPi
的对数,我们可以简单地通过Pi
来获取它。让我们分解为一个简单的例子:
F.log_softmax(logit_i)
是input
的值,形状为log_softmax
。[B, C]
是形状为target
的地面真理类。为了减少混乱,让我们以
[B, ]
和B = 4
为例。
C = 3
两种计算方式相似。希望这会有所帮助。