TensorFlow中的除法操作:0/0=:0

9
我希望在tensorflow应用程序中,对于0./0.,除法能够返回0而非NaN或错误。我知道如何在numpy中实现[1], [2],但是我对tensorflow还不熟悉。请问如何实现这个功能?

9
tf.where(tf.less(s, 1e-7), s, 1./s) - Yaroslav Bulatov
1
是的,关于健壮性,通常不应在浮点数上进行精确相等性测试,这些测试可能会在现代硬件上出现非确定性失败(http://blog.nag.com/2011/02/wandering-precision.html)。 - Yaroslav Bulatov
1
@YaroslavBulatov 我想要等同于 tf.realdiv(a, b) 的函数,而不仅仅是简单的倒数。使用 div0 = lambda s: tf.where(tf.less(s, 1e-7), s, 1./s),我可以使用 a * div0(b),但这既不易读,也不够健壮 / 最优性能。 - A Sz
1
无论谁看到这个消息,Yaroslav Bulatov的建议可能会导致NaN,尽管 NaN出现在tf.where调用的未采用分支上。请参见github上的此问题:https://github.com/tensorflow/tensorflow/issues/20091 - Moos Hueting
1
即使这个问题比较老了,tf.math.divide_no_nan (https://www.tensorflow.org/api_docs/python/tf/math/divide_no_nan) 应该会完全满足您的需求。 - Frithjof
显示剩余4条评论
1个回答

6
这个问题是2年前提出的,不确定当时是否支持该API,但现在Tensorflow 2.X确实支持它:
#Computes a safe divide which returns 0 if the y is zero.
tf.math.divide_no_nan(
    x, y, name=None
)

参数:

x:张量。必须是以下类型之一:float32、float64。

y:一个张量,其数据类型与x兼容。

name:操作的名称(可选)。

返回值:

x除以y的元素级值。

您需要注意参数类型,它们应该只是tf.float32或tf.float64,如果使用tf.int*或tf2.x会报错。以下是我在Colab中运行正确的测试代码:

import tensorflow as tf
myShape=(30,30)
a = tf.constant(2, shape=myShape, dtype=tf.float32)
z = tf.constant(0, shape=myShape, dtype=tf.float32 )
cz2 = tf.math.divide_no_nan(a, z)
print(cz2)

1
起初,我的测试代码出了问题,因为我没有将dtype分配为tf.float*,它的默认类型是整数类型,这会导致错误,不确定为什么TensorFlow团队能忍受这种限制。 - Clock ZHONG
1
似乎该方法仅在2.0版本中引入,然后被迁移到了1.15版本(于2019年10月16日发布),因为它不出现在1.14 API中。因此,在最初提问问题时,它绝对不在API中。 - A Sz
@ASz,是的,Tensorflow仍处于活跃的开发状态,这些API经常会发生变化,新的API和修改有时会在最近的版本中添加。与Tensorflow的索引机制相比,我更喜欢使用numpy API,numpy API更灵活、更稳定,但当前状态下的限制较少。 - Clock ZHONG

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