Python TensorFlow签名是否能识别;是";操作人员

Python TensorFlow签名是否能识别;是";操作人员,python,tensorflow,Python,Tensorflow,考虑下面的Python代码 @tf.function(autograph=True) def foo(x, flag): if flag is True: x = tf.add(x, 1) return x 现在考虑,该代码中唯一的区别是“IS”被更改为“==” 如果标志是张量,则第一个代码的计算结果不正确。我认为“签名”无法识别“is”操作员。有谁能帮助我理解为什么会出现这种情况,以及我如何在代码的其余部分中修复它,而无需手动查找和替换“is”运算符。如果有人能证实

考虑下面的Python代码

@tf.function(autograph=True)
def foo(x, flag):
   if flag is True:
       x = tf.add(x, 1)
   return x

现在考虑,该代码中唯一的区别是“IS”被更改为“==”


如果
标志
是张量,则第一个代码的计算结果不正确。我认为“签名”无法识别“is”操作员。有谁能帮助我理解为什么会出现这种情况,以及我如何在代码的其余部分中修复它,而无需手动查找和替换“is”运算符。如果有人能证实这是一个问题,而不是我的愚蠢,我会在GitHub上打开一个问题。

像Tensorflow、sympy、SQLAlchemy和其他一些库利用Python的“操作符重载”特性,也就是说,对于那些库中定义的特殊对象,比较操作符“==,>,这看起来像是我期望的行为,不是吗?在第一种情况下,
标志是一个张量对象,因此它不是
True
对象,即使它包含
True
对象。在第二种情况下,
=
成功,因为
张量
s
\uuuu eq\uuuu
的写入方式使其计算结果为
。Hmmm。。。是的,我明白你的意思。我不确定这个设计模式是否符合PEP285。True和False应被视为单态,如果Autograph能够识别此类张量的使用是单态而不是张量,那将是一件好事。我之所以这么说,是因为虽然可能有True,但False值是python对象,亲笔签名可能会将它们转换为张量,因此不再是python单例。感谢您的帮助,尽管Frederik:)使用
,您真正的意思是
=
是不好的做法,无论涉及的类型如何<在布尔上下文中,code>flag
本身几乎总是比
flag==True
更可取。但是,AutoGraph不应该能够转换Python代码并在与单例进行比较的上下文中识别“is”的使用吗?但是谢谢-这个解释是有道理的。我不知道签名,但它很可能会提取源代码,并使用自己的语义重新编译,而其他一切都可以通过运算符重载实现。这是有道理的!谢谢!自TF2.0发布以来,Autograph一直在调试方面给我带来各种各样的问题,而使用默认的急切执行速度非常慢,内存效率低下。TF1.15课程要好得多,尽管这意味着在学术研究方面落后于PyTorch。
@tf.function(autograph=True)
def foo(x, flag):
   if flag == True:
       x = tf.add(x, 1)
   return x