python - Keras 损失仅在 epoch 结束时变为 nan

标签 python tensorflow machine-learning keras deep-learning

我观察到 Keras 的一些奇怪行为。我正在训练一个小模型,其中训练损失仅在第一个时期结束时才变为 nan。

因此,如果我有 100 个批处理,并且我在第 99 个批处理终止训练,然后恢复另外 99 个批处理,则训练效果良好。否则,一旦到达一个纪元的末尾,它总是返回 nan。

我正在使用自定义损失函数:

def corr(x, y):
    xc = x - K.mean(x)
    yc = y - K.mean(y)
    r_num = K.mean(xc*yc) 
    r_den = K.std(x)*K.std(y)
    return r_num/r_den

我已经尝试了所有标准技巧,例如降低学习率、削减梯度的范数和值以及增加批量大小。只有在将批量大小增加到不切实际的情况,例如 100,000(我有 100 万个数据点)时,它实际上才会持续经过一个纪元,但我想了解最后发生了什么导致了这种奇怪的行为。我还尝试了不同的优化器(当前使用 Adam),并在不同的系统上进行了尝试,以确保这在我的一台计算机上不是问题。

我的输入和输出是一维的,我的模型总结如下。

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_7 (InputLayer)         (None, 1)                 0         
_________________________________________________________________
dense_7 (Dense)              (None, 100)               200       
_________________________________________________________________
dense_8 (Dense)              (None, 100)               10100     
_________________________________________________________________
dense_9 (Dense)              (None, 1)                 101       
=================================================================
Total params: 10,401
Trainable params: 10,401
Non-trainable params: 0
_________________________________________________________________

Keras 在一个时代结束时有什么特别的吗?除了标准记录器回调之外,我找不到任何其他东西。我还编写了一个自定义回调,它每批评估我的模型并存储输出,当我随着时间的推移绘制它时,它似乎不会爆炸或做任何奇怪的事情。看起来只是在慢慢改善,然后训练就结束了。

最佳答案

可能是由损失函数中除以零引起的。通过添加一个小常数来确保分母始终为正。您可以使用 K.epsilon() 来实现此目的:

    return r_num / (r_den + K.epsilon())

关于python - Keras 损失仅在 epoch 结束时变为 nan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52880384/

相关文章:

python - 使用 ImageIO 和 Python 将 EXR 转换为 JPEG

machine-learning - 使用 TensorFlow 加载波士顿住房数据集

python - 从 XGBoost 保存树

tensorflow - 机器学习 : Tensorflow v/s Tensorflow. js v/s Brain.js

python - 解析谷歌图片搜索结果

python - 在 Python 中将函数应用于多个列表

python - 删除整数的最后一个数字

tensorflow - 在 WSL2 上安装 Tensorflow-GPU

tensorflow - 使用 keras 在 gcloud ml-engine 上处理 TB 数据的最佳方法

machine-learning - Tensorflow:损失变为 'NaN'