Tensorflow 中的 log(1+exp(X))(避免欠流和溢流)
log(1+exp(X)) in Tensorflow (avoiding under and over flows)
我正在调试我的程序,我意识到我的损失输出了 NaN。这些 NaN 值来自于我正在计算 tf.log(1 + tf.exp(X))
其中 X 是二维张量。实际上,当 X 的值足够大时,tf.exp() returns +Inf 等 tf.log(1 + exp(X))
将 return +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 > threshold
和log(1+exp(X)) 否则不是很整洁。
谢谢
此函数已在名为 tf.math.softplus
的 tensorflow 中实现,并处理上溢和下溢。
我正在调试我的程序,我意识到我的损失输出了 NaN。这些 NaN 值来自于我正在计算 tf.log(1 + tf.exp(X))
其中 X 是二维张量。实际上,当 X 的值足够大时,tf.exp() returns +Inf 等 tf.log(1 + exp(X))
将 return +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 > threshold
和log(1+exp(X)) 否则不是很整洁。
谢谢
此函数已在名为 tf.math.softplus
的 tensorflow 中实现,并处理上溢和下溢。