我有一个张量流模型在使用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)
任何人都知道造成这种差异的原因是什么?
答案 0 :(得分:0)
您最有可能获得中间下溢:如果存在< -744(如果使用32位浮点数,则为< -103),则其exp
将为0.0
。这也会产生0.0
产品,而log
的{{1}}应该给出负无穷大,但也许张流会做一些有趣的事情来返回NaN。
通过直接对日志概率求和,可以避免这个问题。