"val_loss" 没有从 INF 中改善,但损失减少得很好



我正在用一个自定义函数训练一个Keras模型,我以前已经成功测试过了。最近,我用一个新的数据集训练它,得到了一个奇怪的结果:模型训练得很好,但val_loss给出了nan。损失如下:

def Loss(y_true,y_pred):
y_pred = relu(y_pred)
z = k.maximum(y_true, y_pred)
y_pred_negativo = Lambda(lambda x: -x)(y_pred)
w = k.abs(add([y_true, y_pred_negativo])) 
if k.sum(z) == 0:
error = 0
elif k.sum(y_true) == 0 and k.sum(z) != 0:
error = 100
elif k.sum(y_true) == 0 and k.sum(z) == 0:
error = 0
else:
error = (k.sum(w)/k.sum(z))*100
return error

我尝试过很多东西:

  1. 查看了NaN的数据
  2. 正常化-打开和关闭
  3. 剪裁-打开和关闭
  4. 辍学-打开和关闭

有人告诉我CUDA安装可能有问题,但我不确定。

你知道问题出在哪里,或者我该如何诊断吗?

问题原来是逐零除法,但发生这种情况的原因有点棘手。正如你所看到的,上面的定义有一些条件,这些条件本应排除每零的除法。然而,编写它们是为了处理NumPy对象,而不是张量,后者是Keras方法传递的对象。因此,它们从来没有发生过,而且每零除法经常发生。

为了修复它,我不得不根据Keras条件重写Loss——提醒,避免将纯Keras与tf.Keras混合——就像我在这里发布的那样。欢迎任何进一步的评论!

相关内容

最新更新