在Tensorflow中计算log(1+exp(X))(避免下溢和上溢)

3

我正在调试我的程序,发现输出了 NaN。这些 NaN 值来自于计算 tf.log(1 + tf.exp(X))

其中 X 是一个二维张量。当 X 的值足够大时,tf.exp() 的返回值会为 +Inf,因此 tf.log(1 + exp(X)) 将返回 +Inf。我在想是否存在一个巧妙的方法来避免在这种情况下出现下溢和上溢。

我已经尝试过:

def log1exp(x):
    maxi = tf.reduce_max(x)
    return maxi + tf.log(tf.exp(x - maxi) + tf.exp(-maxi))

但在这种情况下,它不能处理下溢...

此外,我看了一眼tf.reduce_logsumexp,但它必须沿着一个轴减少张量...而我想保持相同的形状!

最后,我知道tf.log(1 + exp(X))对于大的X值几乎等于X,但我认为设计一个函数,当X > 阈值时输出X,否则输出log(1+exp(X))不是很简洁。

谢谢

1个回答

4

这个函数在tensorflow中已经实现了,名字叫做tf.math.softplus,可以处理溢出和下溢的情况。


tf.nn.softplus 不会处理溢出,可以通过传递大输入来轻松验证。 - sk29910
with tf.Session() as sess: - DachuanZhao
tf.math.softplus(tf.math.exp(10.0*10)).eval() - DachuanZhao
它返回 Inf - DachuanZhao
@DachuanZhao 这是因为 exp(10.0*10) 超出了 float32 的范围。 - P-Gn
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接