tf.select有什么用?

Her*_*ert 5 python tensorflow

(编辑 wrt @ quirk的回答)

我在线阅读一些tensorflow代码并看到了这些陈述:

threshold = tf.select(input > RLSA_THRESHOLD, positive, negative)
Run Code Online (Sandbox Code Playgroud)

来源:https://github.com/Raverss/tensorflow-RLSA-NMS/blob/master/source.py#L31

positive是一个张量只是1's,negative同样大小的0's和输入是一些相同大小的热图(/张量)(所有类型tf.float32).

代码片段似乎合理地提前让我假设tf.cast(input > RLSA_THRESHOLD, tf.float32)如果没有特定的tf.select(...)表达原因,作者会使用它.特别是因为这会消除了对变量的需求positivenegative,并会节省内存,因为它们只是昂贵的冗余存储的方式01.

上述tf.select(...)表达式是否相当于tf.cast(input > RLSA_THRESHOLD, tf.float32)?如果没有,为什么不呢?

注意:我通常使用Keras,如果我在这里触摸一些非常微不足道的事情,我很抱歉.

Qui*_*irk 3

嗯,RTD(阅读文档)!

tf.select根据张量中元素的布尔值positive从或张量中选择元素。negativecondition

tf.select(condition, t, e, name=None)
根据条件从 t 或 e 中选择元素。
t 和 e 张量必须具有相同的形状,并且输出也将具有该形状。

(来自官方文档。)

所以在你的情况下:

threshold = tf.select(input > RLSA_THRESHOLD, positive, negative)

input > RLSA_THRESHOLD将是一个张量bool或逻辑值(01符号),这将有助于从positive向量或negative向量中选择一个值。

例如,假设 aRLSA_THRESHOLD为 0.5,input向量是由 0 到 1 范围内的实连续值组成的 4 维向量。你的positivenegative向量本质上分别是[1, 1, 1, 1][0, 0, 0, 0]input[0.8, 0.2, 0.5, 0.6]

threshold[1, 0, 0, 1]

注意: positive并且negative可以是任何类型的张量,只要尺寸与condition张量一致即可。比如说,“曾经positive”和“曾经”分别是“你本来会是” 。negative[2, 4, 6, 8][1, 3, 5, 7]threshold[2, 3, 5, 8]


对于我来说,代码片段似乎相当先进,假设input > RLSA_THRESHOLD如果没有特定原因,作者就会使用tf.select.

这是有充分理由的。input > RLSA_THRESHOLD只会返回逻辑(布尔)值的张量。逻辑值与数值不能很好地混合。您不能将它们用于任何实际的数值计算。如果positive和/或negative张量是真实值的,您可能会要求您的threshold张量也具有真实值,以防您计划进一步使用它们。


相当于?tf.selectinput > RLSA_THRESHOLD如果没有,为什么不呢?

不,他们不是。一个是函数,另一个是张量。

我将假定您想问:

相当于?thresholdinput > RLSA_THRESHOLD如果没有,为什么不呢?

不,他们不是。如上所述,input > RLSA_THRESHOLD是一个数据类型为 的逻辑张量boolthreshold另一方面, 是一个与positive和具有相同数据类型的张量negative

注意:您始终可以使用中提供的任何转换方法将逻辑张量转换为数值(或任何其他支持的数据类型)张量。

  • 从版本 1.0 开始,“tf.select”已消失,现在使用“tf.where”。https://github.com/tensorflow/tensorflow/blob/64edd34ce69b4a8033af5d217cb8894105297d8a/RELEASE.md (5认同)