【发布时间】:2019-11-06 03:24:13
【问题描述】:
我正在编写一个自定义损失函数,我想取 1 - 计算值的对数。我在 keras 中使用 tensorflow 后端编写如下:
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。有人可以帮我纠正这个错误。
【问题讨论】:
-
对于
prob_max的哪个值,K.log会产生 nans?您可以通过try-except块查找;还可以考虑使用K.epsilon()而不是0.00..1,确保所有reduce_max输出都是正数,并尝试使用tf.math.log而不是K.log -
它为每个值提供
nan。我使用K.epsilon()并且也使用tf.math.abs(probs_max)只是为了避免负值并使用tf.math.log。但我仍然面临同样的问题。这太奇怪了! -
是的,这很奇怪——太奇怪了;可能的安装问题。在去那里之前,
print(K.get_value(K.log(tf.constant(0.9)))的输出是什么?如果nan,请告诉我,这是一个损坏的安装,我可以建议步骤。最后,您从哪里导入您的keras.backend?确保它与其他导入一致,并且它不是tf.python.keras -
@OverLordGoldDragon,
print(K.get_value(K.log(tf.constant(0.9))),这给了我适当的价值,而不是nan。我将 keras 后端导入为keras.backend。 -
我会发现this script 的输出很有帮助;您可以将其粘贴为 pastebin
标签: python tensorflow keras deep-learning conv-neural-network