(已编辑w.r.t.@quirk的答案)
我在网上读到一些tensorflow代码,看到了下面的语句:
threshold = tf.select(input > RLSA_THRESHOLD, positive, negative)
来源:https://github.com/Raverss/tensorflow-RLSA-NMS/blob/master/source.py#L31
positive
是一个只有1
的张量,negative
也是一个和0
大小相同的张量,输入是一些相同大小的热图(/张量)(都是tf.float32
类型)。
对于我来说,代码片段似乎相当高级,可以假定,如果没有特定的原因使用tf.select(...)
表达式,作者将只使用tf.cast(input > RLSA_THRESHOLD, tf.float32)
。特别是因为这将消除对变量positive
和negative
的需要,并且将节省内存,因为它们只是存储0
和1
的昂贵冗余方式。
前面提到的tf.select(...)
表达式是否等同于tf.cast(input > RLSA_THRESHOLD, tf.float32)
?如果没有,为什么不呢?
注意:我通常使用Keras,如果我在这里碰到一些非常琐碎的东西,我很抱歉。
嗯,RTD(阅读文档)!
tf.select根据
condition
张量中元素的boolness从positive
或negative
张量中选择元素。(摘自官方文件。)
所以在你的情况下:
threshold = tf.select(input > RLSA_THRESHOLD, positive, negative)
input > RLSA_THRESHOLD
将是bool
或逻辑值(0
或1
)的张量,这将有助于从positive
向量或negative
向量中选择值。例如,假设你有一个0.5的
RLSA_THRESHOLD
,而你的input
向量是一个从0到1的实数连续值的四维向量。你的positive
和negative
向量本质上分别是[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
只需返回逻辑(布尔)值的张量。逻辑值不能与数值很好地混合。不能将它们用于任何实际的数值计算。如果positive
和/或negative
张量是实数,那么您可能需要threshold
张量也有实数,以防您打算进一步使用它们。不,他们不是。一个是函数,另一个是张量。
我要给你一个怀疑的好处,假设你想问:
不,他们不是。如上所述,
input > RLSA_THRESHOLD
是数据类型为bool
的逻辑张量。threshold
,另一方面,是与positive
和negative
具有相同数据类型的张量。注意:您始终可以使用tensorflow中可用的任何casting方法将逻辑张量转换为数值张量(或任何其他受支持的数据类型)。
最好的理解方法是亲自尝试:
对于张量中的每个值>;
0.5
,您将在同一索引处得到一个1.
,否则该值为0.
。inputs > .5
的结果是布尔张量(满足条件的值为True
,否则为False
)。相关问题 更多 >
编程相关推荐