在讨论TensorFlow 2.0 AutoGraphs之后,我一直在玩耍,并注意到直接指定了>
和<
等不平等比较,而相等性比较则使用{{1 }}。
这是一个示例进行演示。此函数使用tf.equal
运算符,并且在调用时效果很好:
>
这是另一个使用相等比较的函数,但不起作用:
@tf.function
def greater_than_zero(value):
return value > 0
greater_than_zero(tf.constant(1))
# <tf.Tensor: id=1377, shape=(), dtype=bool, numpy=True>
greater_than_zero(tf.constant(-1))
# <tf.Tensor: id=1380, shape=(), dtype=bool, numpy=False>
如果将@tf.function
def equal_to_zero(value):
return value == 0
equal_to_zero(tf.constant(1))
# <tf.Tensor: id=1389, shape=(), dtype=bool, numpy=False> # OK...
equal_to_zero(tf.constant(0))
# <tf.Tensor: id=1392, shape=(), dtype=bool, numpy=False> # WHAT?
的相等比较更改为==
,它将起作用。
tf.equal
我的问题是:为什么使用不相等比较运算符在@tf.function
def equal_to_zero2(value):
return tf.equal(value, 0)
equal_to_zero2(tf.constant(0))
# <tf.Tensor: id=1402, shape=(), dtype=bool, numpy=True>
函数中起作用,而相等比较却不起作用?
答案 0 :(得分:1)
我在文章"Analysing tf.function to discover Autograph strengths and subtleties"的第3部分中对此行为进行了分析(强烈建议阅读所有3个部分,以了解在使用SELECT
`actors`.`id` , `actors`.`name_english` ,
`actors`.`picture` , `actors`.`link` ,
`actors_content` . *
FROM `actors` INNER JOIN `actors_content`
ON `actors_content`.`actors_id` = `actors`.`id`
WHERE `actors_content`.`content_id` = '".$getid."'
LIMIT 0, 30
装饰函数之前如何正确编写函数-底部的链接答案)。
对于tf.function
和__eq__
问题,答案为:
简而言之:
tf.equal
运算符(对于__eq__
)已被覆盖,但是该运算符不使用tf.Tensor
来检查Tensor是否相等,它只是检查Python变量身份(如果您熟悉Java编程语言,则就像在字符串对象上使用的==运算符一样)。原因是tf.equal
对象必须是可哈希的,因为它在Tensorflow代码库中的各处都用作dict对象的键。
对于所有其他运算符,答案是AutoGraph不会将Python运算符转换为TensorFlow逻辑运算符。在How AutoGraph (don’t) converts the operators部分中,我展示了每个Python运算符都将转换为始终表示为false的图形表示形式。
实际上,以下示例将输出“ wat”产生
tf.Tensor
实际上,AutoGraph无法将Python代码转换为图形代码。我们必须仅使用TensorFlow原语来帮助它。在这种情况下,您的代码将按预期工作。
@tf.function
def if_elif(a, b):
if a > b:
tf.print("a > b", a, b)
elif a == b:
tf.print("a == b", a, b)
elif a < b:
tf.print("a < b", a, b)
else:
tf.print("wat")
x = tf.constant(1)
if_elif(x,x)
我在这里给出了所有三篇文章的链接,我想您会发现它们很有用: