Почему ценность klog дает мне nan in keras - PullRequest
2 голосов
/ 06 ноября 2019

Я пишу пользовательскую функцию потерь и хочу взять 1 - логарифм вычисленного значения. Я пишу в кератах с бэкэндом тензорного потока следующим образом:

nonlabels = list(np.where(predictions<threshold)[1])
loss_fg_nT = 0
probs_nT = tf.gather(probs_fg,nonlabels,axis=3)
for i in range(len(nonlabels)):
    probs_temp = tf.reshape(probs_nT[:,:,:,i],[-1])
    prob_max = tf.math.reduce_max(probs_temp)
    const = tf.constant(0.000001)
    prob_max = tf.math.add(prob_max,const)
    #prob_max = tf.math.subtract(tf.constant(1.0),prob_max)
    val = K.log(prob_max)
    loss_fg_nT -= val
    loss_fg_nT = loss_fg_nT/(len(nonlabels)+0.000001)

Если я удаляю строку prob_max = tf.math.subtract(tf.constant(1.0),prob_max), функция работает нормально, но когда я беру журнал значения (1-prob_max), она дает nanстоимость. Я не мог понять причину этого, так как я добавляю номинальную стоимость, чтобы также не брать log 0. Может кто-нибудь помочь мне исправить эту ошибку.

1 Ответ

0 голосов
/ 06 ноября 2019

Вы получаете ошибку nan, потому что вы K.log () для значения минус. Кроме того, вы получите ошибку inf, если для K.log () установлено нулевое значение. Я прикрепляю изображение, чтобы продемонстрировать, что attach_1

Я также прилагаю код, который использовал для отладки, надеюсь, что эту помощь вы сможете отладить вручную в будущем attach_2

Удачного кодирования!

...