禁止在 PyTorch 神经网络的 CrossEntropyLoss 中使用 Softmax

Qua*_*iat 2 python neural-network softmax cross-entropy pytorch

我知道当用作损失函数时,不需要nn.Softmax()在神经网络的输出层中使用函数。nn.CrossEntropyLoss

但是我需要这样做,有没有办法抑制 softmax 的实现使用nn.CrossEntropyLoss,而是nn.Softmax()在神经网络本身的输出层上使用?

动机:我使用shap包来分析之后的特征影响,我只能将我训练过的模型作为输入。然而,输出没有任何意义,因为我正在查看未绑定的值而不是概率。

示例:我想要的不是 -69.36 作为模型一类的输出值,而是 0 到 1 之间的值,所有类的总和为 1。由于事后我无法更改它,因此输出在训练期间就必须是这样的。

在此输入图像描述

小智 5

您可以使用nn.NLLLoss()nn.CrossEntropyLoss计算输入分数的 log softmax 并计算负对数似然损失。如果您已经有了对数概率,则可以使用nn.NLLLoss().

是 PyTorchs 文档中的示例

m = nn.LogSoftmax(dim=1)
loss = nn.NLLLoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.tensor([1, 0, 4])
output = loss(m(input), target)
Run Code Online (Sandbox Code Playgroud)


Was*_*mad 5

nn.CrossEntropyLoss的文档说,

该标准将nn.LogSoftmax()nn.NLLLoss()组合在一个类别中。

我建议您坚持使用CrossEntropyLoss作为损失标准。但是,您可以使用softmax函数将模型的输出转换为概率值。

请注意,您始终可以使用模型的输出值,无需更改损失标准。

Softmax()但是如果您仍然想在网络中使用,那么您可以使用NLLLoss()作为损失准则,仅在将模型的输出输入准则函数之前应用log() 。同样,如果您LogSoftmax在网络中使用 相反,您可以应用exp()来获取概率值。

更新

要在输出log()上使用Softmax,请执行以下操作:

torch.log(prob_scores + 1e-20)
Run Code Online (Sandbox Code Playgroud)

通过向 中添加一个非常小的数字 (1e-20) prob_scores,我们可以避免该log(0)问题。