Распознает ли TensorFlow Autograph оператор «есть»? - PullRequest
0 голосов
/ 17 апреля 2020

Рассмотрим следующий Python код

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

Теперь рассмотрим, этот код, единственным отличием которого является "is", заменен на "=="

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

В случае, когда flag является тензором, первый код оценивается неправильно. Я думаю, что AutoGraph не распознает оператор «есть». Может ли кто-нибудь помочь мне понять, почему это так и как я могу исправить это в оставшейся части моего кода без ручного поиска и замены операторов "is". Если кто-то может подтвердить, что это проблема, а не глупость, я открою проблему на GitHub.

1 Ответ

1 голос
/ 17 апреля 2020

Библиотеки, такие как Tensorflow, sympy, SQLAlchemy и другие, используют функцию «перегрузки операторов» Python, то есть для специализированных объектов, определенных в этих библиотеках, операторы сравнения, такие как "==,>, <, ! = "- фактически все остальные математические операторы -" +, -, *, / "и другие, которые являются словами, а не символами, такими как" in, not ", - являются специализированными, так что код, определенный в библиотеке, является вызывается при обнаружении оператора. </p>

Это позволяет библиотекам расширять поведение оператора. Дело в том, что некоторые из этих «операторов», которые синтаксически ведут себя так же, как и другие, не запускают и не могут запускать какой-либо пользовательский код - их поведение одинаково для всех объектов, и, когда кто-то задумывается об этом, они будут иначе не имеет смысла. Три таких оператора: «и, или, равно ».

В случае is, Python используйте его исключительно для сравнения идентификаторов - если объект слева является то же самое (и это подразумевает нахождение в той же ячейке памяти), что и объект справа.

Итак, если, как вы говорите, «flag - это тензор», он никогда не будет объектом True (который является синглтоном). И нет ничего, что может добавить тензорный поток в код для класса Tensor для изменения этого поведения.

С другой стороны, оператор == заставит Python вызвать метод __eq__ для класса объектов, который может выполнять все виды операций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...