【发布时间】:2020-11-11 00:32:16
【问题描述】:
我正在训练 3D U-Net 并尝试使用 Tensorflow 实现 Dice 损失。我创建了以下函数,它可以返回 Dice 分数或相应的损失(1-score)。
def dice_coefficient(_type="score", empty_score = 1.0):
""" Computes Dice
Args:
_type: "score" or "loss"
empty_score: score if union is empty
Returns:
either Dice score or Dice loss (-score)
"""
def dice_score(y_true, y_pred):
# Flatten
y_true_f = K.cast(K.flatten(y_true), y_pred.dtype)
y_pred_f = K.flatten(y_pred)
im_sum = K.sum(y_true_f) + K.sum(y_pred_f)
if im_sum == 0:
return empty_score
im_sum = K.cast(im_sum, tf.float32)
# Compute Dice coefficient
intersection = K.sum(y_true_f * y_pred_f)
intersection = K.cast(intersection, tf.float32)
return 2. * intersection / im_sum
def dice_loss(y_true, y_pred):
return 1-dice_score(y_true, y_pred)
if _type == "score":
return dice_score
elif _type == "loss":
return dice_loss
在训练模型时,我设置了损失和分数。
model.compile(optimizer=optimizer,
loss=dice_coefficient(_type="loss"),
metrics=dice_coefficient(_type="score"))
但是我得到 nan 的损失和分数的数值:损失不应该是上面定义的 1-score 吗?
144/Unknown - 68s 473ms/step - loss: nan - dice_score: 0.0209
【问题讨论】:
标签: python tensorflow keras loss-function