Tensorflow和Pytorch中的tf.losses.log_loss和tf.nn.softmax

时间:2018-12-11 15:02:54

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

我正在尝试建立一个在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损失之前更加稳定

在tensorflow中,我有以下代码

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,但这会导致渐变消失。

1 个答案:

答案 0 :(得分:0)

这是错误的命名约定:

logits应该进入softmax的{​​{1}}或log_softmax({{1}中的log)。

这两行等效:

softmax

您搜索的是r = F.nll_loss(F.log_softmax(a, -1), p) r = F.cross_entropy(a, p) 在PyTorch或

F.cross_entropytf.nn.softmax_cross_entropy_with_logits