我正在尝试建立一个在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,但这会导致渐变消失。
答案 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_entropy
在tf.nn.softmax_cross_entropy_with_logits