keras写的代码训练过程中loss出现Nan
损失函数是通过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