我的自定义交叉熵损失函数有什么问题?

时间:2019-08-05 14:20:19

标签: python tensorflow math

我正在训练一个U-Net模型,用于对象和前景的二进制分割。目前,我正在尝试重新创建交叉熵函数,以允许我为其添加超参数。与背景像素相比,此超参数可以对不正确的对象像素标记进行更高程度的惩罚。这是必要的,因为训练集中的对象的像素倾向于占据总像素的较小部分。这个想法来自:空中LaneNet:车道标记语义 使用的航空影像分割 小波增强的成本敏感对称完全 卷积神经网络(方程11)

@ https://arxiv.org/pdf/1803.06904

我尝试了各种值 lambda_lane 包括1,它应产生与tensorflow.keras.losses.binarty_cross_entropy()相同的结果,但事实并非如此。

这是我重新创建功能的尝试。

def binary_cross_entropy(y_true, y_pred):
  N = 512. ** 2
  lambda_lane = 1e0
  y_true_f = tf.reshape(y_true, [-1])
  y_pred_f = tf.reshape(y_pred, [-1]) 
  loss =  tf.reduce_sum(lambda_lane * y_true_f * tf.math.log(y_pred_f) + (1. - y_true_f) * tf.math.log(1. - y_pred_f)) 
  return  -loss/N

在训练过程中,我的损失值存在大约十几个步骤(取决于学习率),然后到inf几个步骤,之后它的值是nan(前进的精度接近0)。 / p>

1 个答案:

答案 0 :(得分:0)

该功能没有任何问题。我发现问题的唯一可能原因是您使用的常量N可能是错误的。您应该使用N = tf.size(y_true_f)