听说你的模型损失是NaN
有时候,模型跑着跑着,损失就莫名变NaN了。不过,经验告诉我们,大部分NaN主要是因为除数是0或者传给log的数值不大于0。下面说说是log出NaN的几种常见解决方法。
毕竟, 计算机的是无法表示所有实数的,尽管有些函数得出的结果只能无限近似0,但是由于计算机精度问题,最后的结果往往被表示为0。比如sigmoid函数,取值在0到1之间。
下面介绍TensorFlow的解决log出NaN的常见方法:
方法1:在保证传给log的数值不会有负数的情况下,可以直接加一个比较小的常数
tf.log(x + 1e-10)
这种方法不是很推荐,因为有时候需要log的输出作为别的输入。
方法2:利用clip,或者maximum
tf.log(tf.maximum(x, 1e-15))
tf.log(tf.clip_by_value(x, 1e-15, np.inf))
方法3:如果你计算的是log loss,那么最好的推荐是利用TensorFlow的内建log损失函数
tf.nn.log_softmax(x)