PyTorchLogSoftmax与Softmax的CrossEntropyLoss
我知道 PyTorch 的 LogSoftmax 函数基本上只是一种在数值上更稳定的计算Log(Softmax(x)). Softmax 可让您将线性层的输出转换为分类概率分布。
该pytorch文件说,CrossEntropyLoss联合收割机nn.LogSoftmax()和nn.NLLLoss()在一个单独的类。
看着NLLLoss,我还是很困惑......是否有2个日志正在使用?我认为负日志是事件的信息内容。(如熵)
多看几眼后,我认为NLLLoss假设您实际上是在传递对数概率,而不仅仅是概率。这样对吗?如果是这样,这有点奇怪......
回答
是的,NLLLoss以对数概率 ( log(softmax(x))) 作为输入。为什么?。因为如果你在模型输出的最后一层添加一个nn.LogSoftmax(或F.log_softmax),你可以很容易地使用 获得概率torch.exp(output),而为了获得交叉熵损失,你可以直接使用nn.NLLLoss。当然,如你所说,log-softmax 更稳定。
而且,只有一个日志(在 中nn.LogSoftmax)。没有登录nn.NLLLoss。
nn.CrossEntropyLoss()结合nn.LogSoftmax()( log(softmax(x))) 和nn.NLLLoss()在一个单一的类。因此,传入的网络输出nn.CrossEntropyLoss需要是网络的原始输出(称为 logits),而不是 softmax 函数的输出。
- Given that the network gives raw output to the Cross Entropy Loss during training, do I need to add a LogSoftMax layer during inference?
THE END
二维码