【发布时间】: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