使用tf.reduce_prod时得到nan,可能是由于tensorflow浮点精度

时间:2018-04-02 08:09:05

标签: tensorflow floating-point precision

我有一个张量流模型在使用log(x)时运行正常,我沿着轴做了一个tf.reduce_sum。但是当我改为没有日志,并采取tf.reduce_prod时,我最终得到nan参数值。逻辑对我来说似乎完全没问题。我尝试将所有值都转换为tf.float64,但没有区别。 一开始:

log_prob_v = self.poisson._log_prob(v_value)
log_prob_c = self.bernoulli._log_prob(c_value)
log_prob_c_v = tf.add(log_prob_c, log_prob_v)
log_prob_c_v = tf.cast(log_prob_c_v, tf.float64) 

添加日志问题:

reduce_sum_log_prob = tf.reduce_sum(log_prob_c_v, axis=-1)
reduce_sum_log_prob = tf.reshape(reduce_sum_log_prob, shape=[self.N, 1])

乘以概率失败:

prob_c_v = tf.exp(log_prob_c_v)        
reduce_prob = tf.reduce_prod(prob_c_v, axis=1)
reduce_prob = tf.reshape(reduce_prob, shape=[self.N, 1])
log_reduce_prob = tf.log(reduce_prob)

任何人都知道造成这种差异的原因是什么?

1 个答案:

答案 0 :(得分:0)

您最有可能获得中间下溢:如果存在< -744(如果使用32位浮点数,则为< -103),则其exp将为0.0。这也会产生0.0产品,而log的{​​{1}}应该给出负无穷大,但也许张流会做一些有趣的事情来返回NaN。

通过直接对日志概率求和,可以避免这个问题。