Dans tensorflow Quelle est la différence entre tf.ajouter et l'opérateur (+)?

Dans tensorflow tutoriels, je vois les deux codes comme tf.add(tf.matmul(X, W), b) et tf.matmul(X, W) + b, quelle est la différence entre l'utilisation de la fonction mathématique tf.add(), tf.assign(), etc et les opérateurs + et =, etc, de précision ou d'autres aspects?

31
demandé sur platinor 2016-06-18 22:19:27

1 réponses

Il n'y a pas de différence de précision entre a+b et tf.add(a, b). Le premier se traduit par a.__add__(b) qui est mappé à tf.add au moyen de ligne suivante dans math_ops.py

_OverrideBinaryOperatorHelper(gen_math_ops.add, "add")

La seule différence est que le nom du nœud dans le graphique sous-jacent est add au lieu de Add. Vous pouvez généralement comparer les choses en regardant la représentation graphique sous-jacente comme ceci

tf.reset_default_graph()
dtype = tf.int32
a = tf.placeholder(dtype)
b = tf.placeholder(dtype)
c = a+b
print(tf.get_default_graph().as_graph_def())

Vous pouvez également le voir directement en inspectant la méthode __add__. Il y a un extra niveau d'indirection parce que c'est une fermeture, mais vous pouvez obtenir la fonction sous-jacente comme suit

real_function = tf.Tensor.__add__.im_func.func_closure[0].cell_contents
print(real_function.__module__ + "." + real_function.__name__)
print(tf.add.__module__ + "." + tf.add.__name__)

Et vous verrez la sortie ci-dessous, ce qui signifie qu'ils appellent la même fonction sous-jacente

tensorflow.python.ops.gen_math_ops.add
tensorflow.python.ops.gen_math_ops.add

Vous pouvez voir à partir de {[12] } que les méthodes spéciales Python suivantes sont potentiellement surchargées par les versions TensorFlow appropriées

{'__abs__',
 '__add__',
 '__and__',
 '__div__',
 '__floordiv__',
 '__ge__',
 '__getitem__',
 '__gt__',
 '__invert__',
 '__le__',
 '__lt__',
 '__mod__',
 '__mul__',
 '__neg__',
 '__or__',
 '__pow__',
 '__radd__',
 '__rand__',
 '__rdiv__',
 '__rfloordiv__',
 '__rmod__',
 '__rmul__',
 '__ror__',
 '__rpow__',
 '__rsub__',
 '__rtruediv__',
 '__rxor__',
 '__sub__',
 '__truediv__',
 '__xor__'}

Ces méthodes sont décrites dans référence Python 3.3.7 : émulation de types numériques. Notez que le modèle de données Python ne fournit pas manière de surcharger l'opérateur d'affectation = ainsi, l'affectation utilise toujours une implémentation Python native.

40
répondu Yaroslav Bulatov 2016-06-18 21:35:09