tf.losses.log_loss и tf.nn.softmax в Tensorflow и Pytorch - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь реализовать сеть, которая имеет следующее определение функции потерь в 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 упоминает, что вместо softmax следует использовать log_softmax, поскольку она более стабильнаперед вычислением потерь nll

В тензорном потоке у меня есть следующий код

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

Это приводит к значению NAN в потерях от первой итерации.Если я использую tf.nn.softmax, у меня нет значения NAN.Но ссылка упоминает log_loss является более стабильным.Есть ли какая-то конкретная причина для этого?Я мог бы избавиться от NAN, используя tf.clip_by_value, но это привело к исчезновению градиентов.

1 Ответ

0 голосов
/ 09 июля 2019

Это неправильное соглашение об именах:

logits должно входить в softmax или log_softmax (log из softmax).

Эти две строки эквивалентны:

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

Вы ищете F.cross_entropy в PyTorch или

tf.nn.softmax_cross_entropy_with_logits в tf

...