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?
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.