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)
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)问题。
| 归档时间: |
|
| 查看次数: |
4888 次 |
| 最近记录: |