【问题标题】:Dice loss becomes NAN after some epochs骰子损失在一些时期后变为 NAN
【发布时间】: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


【解决方案1】:

我的分割模型也遇到了同样的问题。当我同时使用骰子损失和加权交叉熵损失时,我遇到了这个问题。如果有人仍然有同样的问题,我找到了解决方案。

我专注于我的自定义损失,但后来我发现 nan 值在计算时来自模型内部。因为relu,内部值变高然后变nan。

为了解决这个问题,我在每次使用 relu 卷积后使用批量归一化,它对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2019-03-23
    • 2021-03-08
    • 2017-10-12
    • 1970-01-01
    • 2021-02-03
    相关资源
    最近更新 更多