【发布时间】:2020-09-27 05:51:19
【问题描述】:
我正在开发一个损失函数为 Dice 损失的图像分割应用程序。问题是损失函数在一些时期后变成了 NAN。我正在做 5 折交叉验证,并检查每折的验证和训练损失。对于某些弃牌,损失很快变为 NAN,而对于某些弃牌,需要一段时间才能达到 NAN。我在损失函数公式中插入了一个常数,以避免溢出/不足,但仍然会出现同样的问题。我的输入在 [-1, 1] 范围内缩放。我见过有人建议使用正则化器和不同的优化器,但我不明白为什么损失首先会出现在 NAN 上。我已经粘贴了损失函数,以及下面一些时期的训练和验证损失。最初只有验证损失和验证损失的骰子分数变为 NAN,但后来所有指标都变为 NAN。
def dice_loss(y_true, y_pred): #y_true--> ground-truth, y_pred-->predictions
smooth=1.
y_true_f = tf.keras.backend.flatten(y_true)
y_pred_f = tf.keras.backend.flatten(y_pred)
intersection = tf.keras.backend.sum(y_true_f * y_pred_f)
return 1-(2. * intersection +smooth) / (tf.keras.backend.sum(y_true_f) +
tf.keras.backend.sum(y_pred_f) +smooth)
epoch train_dice_score train_loss val_dice_score val_loss
0 0.42387727 0.423877264 0.35388064 0.353880603
1 0.23064087 0.230640889 0.21502239 0.215022382
2 0.17881058 0.178810576 0.1767999 0.176799848
3 0.15746565 0.157465705 0.16138957 0.161389555
4 0.13828343 0.138283484 0.12770002 0.127699989
5 0.10434002 0.104340041 0.0981831 0.098183098
6 0.08013707 0.080137035 0.08188484 0.081884826
7 0.07081806 0.070818066 0.070421465 0.070421467
8 0.058371827 0.058371854 0.060712796 0.060712777
9 0.06381426 0.063814262 nan nan
10 0.105625264 0.105625251 nan nan
11 0.10790708 0.107907102 nan nan
12 0.10719114 0.10719115 nan nan
【问题讨论】:
-
骰子损失函数输入是[-1, 1]还是[0, 1]?如果前者为真,则除法可能导致除以零。
-
模型的图像输入在 [-1,1] 范围内。我提到这一点是因为很多人建议检查输入是否有任何“inf”或“nan”值。所以模型的输入是干净的。
-
奇怪的是它只发生在验证而不是训练中。你确定你的预测不会是负面的吗?
-
经过一些时期后,NAN 也传播到训练阶段。我使用 softmax 作为末端密集层的激活,它不应该产生负面预测。请注意,当我删除没有正样本的图像(具有完全黑色背景的图像)时,问题就消失了。但我不明白为什么没有正面实例的图像会造成问题?
-
@samrairshad 有什么解决方案吗??我没有完整的黑场真相,但仍然会出现 nan。
标签: tensorflow keras image-segmentation loss