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

Python 相等比较在TensorFlow 2.0 tf.function()中不起作用,python,tensorflow,tensorflow2.0,Python,Tensorflow,Tensorflow2.0,在关于的讨论之后,我一直在玩游戏,并注意到不平等比较,如和,我在本文的第3部分中分析了这种行为(我强烈建议阅读所有三个部分,了解如何正确编写函数,然后在答案底部添加tf.function-链接) 对于\uuu eq\uu和tf.equal问题,答案是: 简而言之,\uuuuueq\uuuuu运算符(用于tf.Tensor)已被重写,但该运算符不使用tf.equal检查张量相等,它只检查Python变量标识(如果您熟悉Java编程语言,这与字符串对象上使用的==运算符完全相同)原因是tf.Tens

在关于的讨论之后,我一直在玩游戏,并注意到不平等比较,如
,我在本文的第3部分中分析了这种行为(我强烈建议阅读所有三个部分,了解如何正确编写函数,然后在答案底部添加
tf.function
-链接)

对于
\uuu eq\uu
tf.equal
问题,答案是:

简而言之,
\uuuuueq\uuuuu
运算符(用于
tf.Tensor
)已被重写,但该运算符不使用
tf.equal
检查张量相等,它只检查Python变量标识(如果您熟悉Java编程语言,这与字符串对象上使用的==运算符完全相同)原因是
tf.Tensor
对象需要是可散列的,因为它在Tensorflow代码库中的任何地方都用作dict对象的键

而对于所有其他运算符,答案是AutoGraph不会将Python运算符转换为TensorFlow逻辑运算符。在本节中,我展示了每个Python运算符都会转换为一个图形表示形式,该表示形式的计算结果总是为false

事实上,下面的示例生成输出“wat”

@tf.function
如果(a,b)为def:
如果a>b:
tf.打印(“a>b”,a,b)
如果a==b:
tf.print(“a==b”,a,b)
如果a
实际上,AutoGraph无法将Python代码转换为图形代码;我们只能使用TensorFlow原语来帮助它。在这种情况下,您的代码将按预期工作

@tf.function
如果(a,b)为def:
如果tf.math.greater(a,b):
tf.打印(“a>b”,a,b)
elif tf.数学等式(a,b):
tf.print(“a==b”,a,b)
elif tf.math.less(a,b):
tf.打印(“a
我把这三篇文章的链接放在这里,我想你会发现它们很有用:


我相信,因为在张量上下文中,等式运算符被保留/用于比较张量对象,并允许混合对象运算符“t1==t2”和代数运算符“t1==0”会导致很多混乱。公平地说,TF总是使用显式的运算符(如TF.greater_)、TF.add和对重载数学运算符的支持只是为了方便。AFAIK
==
for Tensor实际上检查它们是否是同一个对象。货币线:“实际上,AutoGraph无法将Python代码转换为图形代码;我们只能使用TensorFlow原语来帮助它。”我也会通读这些文章,看起来信息量很大。谢谢!离题了,你可能经常会遇到这种情况,但你在TensorFlow方面的知识很扎实。我正在进入一个需要成为优秀人才的行业(我的意思是说我真的很擅长)如果我可以问一下,你的学习过程是什么,回答关于堆栈溢出的问题是否有助于你丰富的TensorFlow知识?感谢你为绿豆提供的任何建议:)@cs95我通过解决问题来学习TensorFlow。当我还是研究员时,我必须自己学习如何进行对象分类和定位。当时(2015年底)tf是一种新东西,我花了很多时间学习它,一直都是为了解决这个任务。然后,当我对高级API更加自信时(我解决了我的研究问题)我开始回答这个问题,以检查我对框架结构的理解是否正确——这很有帮助,我强烈建议这样做。简言之,有一个目标,使用tf解决它并学习
@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.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>