web-dev-qa-db-fra.com

Surcharge de l'opérateur TensorFlow

Quelle est la différence entre 

   tf.add(x, y)

et 

   x + y

dans TensorFlow? Qu'est-ce qui serait différent dans votre graphe de calcul lorsque vous construisez votre graphe avec + au lieu de tf.add()

Plus généralement, + ou d’autres opérations sont-ils surchargés pour les tenseurs?

29
Transcendental

Si au moins un de x ou y est un tf.Tensor object, les expressions tf.add(x, y) et x + y sont équivalentes. La raison principale pour laquelle vous pouvez utiliser tf.add() est de spécifier un argument explicite name pour l'opération créée, ce qui n'est pas possible avec la version de l'opérateur surchargée.

Notez que si ni x ni y n'est un tf.Tensor, par exemple s'il s'agit de tableaux NumPy, alors x + y ne créera pas d'opération TensorFlow. tf.add() crée toujours une opération TensorFlow et convertit ses arguments en objets tf.Tensor. Par conséquent, si vous écrivez une fonction de bibliothèque pouvant accepter à la fois des tenseurs et des tableaux NumPy, vous préférerez peut-être utiliser tf.add().

Les opérateurs suivants sont surchargés dans l'API TensorFlow Python:

  • __neg__ (unary -)
  • __abs__ (abs())
  • __invert__ (unary ~)
  • __add__ (binaire +)
  • __sub__ (binaire -)
  • __mul__ (binaire par élément *)
  • __div__ (/ binaire en Python 2)
  • __floordiv__ (// binaire en Python 3)
  • __truediv__ (/ binaire en Python 3)
  • __mod__ (binaire %)
  • __pow__ (binaire **)
  • __and__ (binaire &)
  • __or__ (binaire |)
  • __xor__ (binaire ^)
  • __lt__ (binaire <)
  • __le__ (binaire <=)
  • __gt__ (binaire >)
  • __ge__ (binaire >=)

Veuillez noter que __eq__ (binaire ==) est pas surchargé. x == y retournera simplement un booléen Python si x et y se rapportent au même tenseur. Vous devez utiliser tf.equal() explicitement pour vérifier l’égalité des éléments. Idem pour non égal, __ne__ (binaire !=).

60
mrry

Mrry a gentiment expliqué qu'il n'y avait pas de réelle différence. J'ajouterai que l'utilisation de tf.add est bénéfique.

tf.add a un paramètre important qui est name. Il vous permet de nommer l'opération dans un graphique qui sera visible dans tensorboard. Donc, ma règle de base, s’il serait avantageux de nommer une opération dans tensorboard, j’utilise tf. équivalent, sinon j’utilise la brièveté et j’utilise la version surchargée.

0
Salvador Dali