【问题标题】:Suppress use of Softmax in CrossEntropyLoss for PyTorch Neural Net禁止在 PyTorch 神经网络的 CrossEntropyLoss 中使用 Softmax
【发布时间】:2020-01-27 01:39:43
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python neural-network pytorch softmax cross-entropy


    【解决方案1】:

    nn.CrossEntropyLoss 的文档说,

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

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

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

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

    更新

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

    torch.log(prob_scores + 1e-20)
    

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

    【讨论】:

    • 感谢您的澄清,我混淆了 Softmax 和 Logsoftmax。您的最后评论实际上是一个明显的天才想法,我认为这正是我想要的。谢谢!
    • 编辑:我没想到的是:由于来自 log(0) 的 -inf,应用日志会产生很多 nan 值..
    • 是的,解决了这个问题,可能只是由于一个非常罕见的舍入问题而发生。再次按预期工作,非常感谢!
    【解决方案2】:

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

    Here 是 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)
    

    【讨论】:

    • 感谢您的输入,我正在寻找相同的方法,但使用nn.Softmax 而不是nn.LogSoftmax。我希望输出绑定到 [0,1],但不幸的是 LogSoftmax 不是。
    猜你喜欢
    • 2018-12-16
    • 2018-05-02
    • 2021-03-19
    • 2018-02-28
    • 1970-01-01
    • 2021-03-11
    • 2019-03-08
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多