Вывод softmax делает вывод двоичной кросс-энтропии NAN, что мне делать? - PullRequest
2 голосов
/ 21 июня 2019

Я реализовал нейронную сеть в Tensorflow, где последний слой является слоем свертки, я передаю вывод этого слоя свертки в функцию активации softmax, а затем передаю ее в функцию кросс-энтропийной потери, которая определяется следующим образом:с метками, но проблема в том, что я получил NAN как вывод моей функции потерь, и я понял, что это потому, что у меня 1 на выходе softmax.Итак, мой вопрос: что мне делать в этом случае?Мой ввод - это изображение 16 на 16, где у меня есть 0 и 1 в качестве значений каждого пикселя (двоичная классификация)

Моя функция потерь:

#Loss function
def loss(prediction, label):
    #with tf.variable_scope("Loss") as Loss_scope:
    log_pred = tf.log(prediction, name='Prediction_Log')
    log_pred_2 = tf.log(1-prediction, name='1-Prediction_Log')
    cross_entropy = -tf.multiply(label, log_pred) - tf.multiply((1-label), log_pred_2) 

    return cross_entropy

1 Ответ

2 голосов
/ 21 июня 2019

Обратите внимание, что log(0) не определено, поэтому, если когда-либо prediction==0 или prediction==1, у вас будет NaN.

Чтобы обойти это, обычно добавляют очень маленькое значение epsilonв значение, переданное tf.log в любой функции потерь (мы также делаем то же самое при делении, чтобы избежать деления на ноль).Это делает нашу функцию потерь численно стабильной, а значение эпсилона достаточно мало, чтобы быть незначительным с точки зрения любой неточности, которую она вносит в нашу потерю.

Возможно, попробуйте что-то вроде:

#Loss function
def loss(prediction, label):
    #with tf.variable_scope("Loss") as Loss_scope:

    epsilon = tf.constant(0.000001)
    log_pred = tf.log(prediction + epsilon, name='Prediction_Log')
    log_pred_2 = tf.log(1-prediction + epsilon, name='1-Prediction_Log')

    cross_entropy = -tf.multiply(label, log_pred) - tf.multiply((1-label), log_pred_2) 
    return cross_entropy

ОБНОВЛЕНИЕ:

Как указывает jdehesa в своих комментариях - функции потерь «из коробки» уже хорошо справляются с проблемой численной стабильности

...