平等比较在TensorFlow 2.0 tf.function()中不起作用

时间:2019-06-16 05:59:11

标签: python tensorflow tensorflow2.0

在讨论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> 函数中起作用,而相等比较却不起作用?

1 个答案:

答案 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)

我在这里给出了所有三篇文章的链接,我想您会发现它们很有用:

part 1part 2part 3