我正在观察Keras的一些奇怪行为。我正在训练一个小模型,该模型的训练损失在第一个时期结束时变为“仅”。
因此,如果我有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在某个时代结束时有什么特别之处吗?除了标准的记录器回调外,我什么都找不到。我还编写了一个自定义回调,该回调对每个批次的模型进行评估并存储输出,并且随着时间的流逝,它似乎不会爆炸或发生任何奇怪的事情。看起来好像它正在慢慢改善,然后培训终止了。
答案 0 :(得分:1)
可能是由损失函数中的零除引起的。通过在分母上添加一个小常数,确保分母始终为正。为此,您可以使用K.epsilon()
:
return r_num / (r_den + K.epsilon())