【问题标题】:tf.losses.log_loss and tf.nn.softmax in Tensorflow and PytorchTensorflow 和 Pytorch 中的 tf.losses.log_loss 和 tf.nn.softmax
【发布时间】:2018-12-11 15:02:54
【问题描述】:

我正在尝试在 Pytorch 中实现一个具有以下损失函数定义的网络

logits = F.log_softmax(layer_output)
loss = F.nll_loss(logits, labels)

此链接https://discuss.pytorch.org/t/pytorch-equivalence-to-sparse-softmax-cross-entropy-with-logits-in-tensorflow/18727 提到应该使用 log_softmax 而不是 softmax,因为它在计算 nll 损失之前更稳定

在张量流中我有以下代码

logits = tf.nn.log_softmax(layer_output)
loss = .tf.losses.log_loss(logits, labels)

这会导致第一次迭代的损失出现 NAN 值。如果我使用 tf.nn.softmax 我没有 NAN 值。但链接提到 log_loss 更稳定。这有什么具体原因吗?我可以使用 tf.clip_by_value 摆脱 NAN,但这会导致梯度消失。

【问题讨论】:

  • 您可以使用 tf.nn.softmax_cross_entropy_with_logits_v2 这将获取原始 logits,将其放入 softmax,然后计算交叉熵损失。 tensorflow.org/api_docs/python/tf/nn/…
  • [stackoverflow.com/questions/47245113/… .如果我理解正确,使用 log_loss 应该会给出更好的结果,因为它也可以计算负面示例。我已经尝试使用 tf.nn.softmax,然后将这些 logits 用于 log_loss,它给出了合理的损失值。但由于最初的实现有 log_softmax ,我很好奇为什么这给了我 NAN 损失值

标签: tensorflow machine-learning computer-vision pytorch cross-entropy


【解决方案1】:

这是错误的命名约定:

logits 应该进入softmaxlog_softmaxlogsoftmax)。

这两行是等价的:

r = F.nll_loss(F.log_softmax(a, -1), p)
r = F.cross_entropy(a, p)

你在 PyTorch 中搜索的是 F.cross_entropy

tf.nn.softmax_cross_entropy_with_logits in tf

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 2019-06-25
    • 2020-10-01
    相关资源
    最近更新 更多