因此,我使用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来重现错误。
答案 0 :(得分:4)
这是因为tf.abs(x_hat - B0)接近张量,所有零都是条目。这使得西格玛的衍生物变成了NaN。解决方案是为该数量添加一个小值。
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),