为什么我的损失函数会返回nan?

时间:2017-03-13 23:18:50

标签: tensorflow keras gradient-descent

因此,我使用Tensorflow后端在Keras中定义此自定义丢失函数,以最小化背景提取自动编码器。它应该确保预测x_hat不会偏离批量B0所采用的预测的中位数。

def ben_loss(x, x_hat):

    B0 = tf_median(tf.transpose(x_hat))
    sigma = tf.reduce_mean(tf.sqrt(tf.abs(x_hat - B0) / 0.4), axis=0)
    # I divide by sigma in the next step. So I add a small float32 to sigma
    # so as to prevent background_term from becoming a nan.
    sigma += 1e-22 
    background_term = tf.reduce_mean(tf.abs(x_hat - B0) / sigma, axis=-1)
    bce = binary_crossentropy(x, x_hat)
    loss = bce + background_term

    return loss

当我尝试使用此损失函数最小化网络时,损失几乎立即变为NaN。有谁知道为什么会这样?您可以通过克隆我的存储库并运行此script来重现错误。

1 个答案:

答案 0 :(得分:4)

这是因为tf.abs(x_hat - B0)接近张量,所有零都是条目。这使得西格玛的衍生物变成了NaN。解决方案是为该数量添加一个小值。

'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),