损失函数是通过keras已经封装好的函数进行的线性组合, 如下:

def spares_mse_mae_2scc(y_true, y_pred):
    return mean_squared_error(y_true, y_pred) + categorical_crossentropy(y_true, y_pred) + 2 * mean_absolute_error(y_true, y_pred)

在训练的过程中出现Nan, 发现是因为使用categorical_crossentropy(交叉熵)函数是0出现在了log的位置, 是的出现log(0)的情况出现.

可能的原因:

1  学习率的原因, 可以适当降低学习率,并设置学习率衰减;

2  BatchNormlization原因, 可能在正则化的过程中出现大量的0.

3  数据不干净

我所遇到的问题基本排除上面三种, 我的解决方法:

def mse_mae_2bcc(y_true, y_pred):
    return
mean_squared_error(y_true, y_pred) + binary_crossentropy(y_true,
y_pred) + 2 * mean_absolute_error(y_true, y_pred)

这样定义损失函数就可以直接避免这个问题, 原因还不太清楚, 有时间推导一下在补充.

 

参考:

1.  https://stackoverflow.com/questions/33712178/tensorflow-nan-bug

2.  https://oldpan.me/archives/careful-train-loss-nan-inf

3.  https://blog.csdn.net/hahajinbu/article/details/84035486