2017-10-17 4 views
-1

tensorflow remplace plusieurs opérateurs pour la classe Tensor, including __lt__, __ge__, etc.Pourquoi Tensorflow ne remplace pas __eq__?

Cependant, la mise en œuvre de __eq__seems to be conspicuously absent:

ops.Tensor._override_operator("__lt__", gen_math_ops.less) 
ops.Tensor._override_operator("__le__", gen_math_ops.less_equal) 
ops.Tensor._override_operator("__gt__", gen_math_ops.greater) 
ops.Tensor._override_operator("__ge__", gen_math_ops.greater_equal) 

Pourquoi == pour les tenseurs de tensorflow se comportent pas de la même manière que pour les tableaux numpy?

Exemple de code:

a = tf.constant([1,2]) 
b = tf.constant([3,4]) 
a == b 
>>> False 
a < b 
>>> <tf.Tensor 'Less:0' shape=(2,) dtype=bool> 

Avec numpy, d'autre part:

a = np.asarray([1,2]) 
b = np.asarray([3, 4]) 
a == b 
>>> array([False, False], dtype=bool) 
+1

Vous basez-vous sur l'affirmation que '__eq__' n'est pas défini uniquement sur ces lignes? Parce que je vois [autre code qui gère les remplacements de l'opérateur d'une manière générique] (https://github.com/tensorflow/tensorflow/blob/27767d8e9c1325979cf32ff5b81c10df9006fd57/tensorflow/python/ops/math_ops.py#L875-L935) par exemple. –

+1

'importer tensorflow comme tf', puis' __eq__ dans vars (tf.Tensor) 'produit' True', donc il définit le crochet. Il est défini [directement sur la classe] (https://github.com/tensorflow/tensorflow/blob/27767d8e9c1325979cf32ff5b81c10df9006fd57/tensorflow/python/framework/ops.py#L489-L491). –

+0

@MartijnPieters Non, mes observations étaient basées sur mon code ne faisant pas ce que je m'attendais à faire. Les liens ont été produits après quelques fouilles. Aussi, je sais que l'égalité des tenseurs est définie. Cependant, il n'est pas compatible avec les tableaux 'numpy'. J'espère que le code ajouté clarifie la question. –

Répondre

1

tenseurs ne pas mettre en œuvre__eq__, mais the implementation only tests for identity. J'ai trouvé this GitHub issue, ce qui explique pourquoi tenseurs test identité et ne pas diffuser:

Cela peut être une complication de fait que tenseurs peuvent être utilisés comme clés dans les dictionnaires, que je crois utiliser == pour trouver l'objet correspondant avec le même hachage

Le commentaire est correct; si __eq__ était surchargé pour diffuser, vous ne pouviez pas utiliser de tenseurs comme clés dans un dictionnaire. Les objets qui définissent une méthode __hash__ (requis si vous souhaitez utiliser des objets tels que des clés dans un dictionnaire), doivent produire la même valeur de hachage pour deux objets égaux; voir le __hash__ method:

La seule propriété requise est que les objets qui comparent égale ont la même valeur de hachage

mais la diffusion produirait un objet tenseur « true » pour les objets avec des valeurs de hachage différentes.

(la spéculation selon laquelle __eq__ interromprait le test booléen est erronée, le test booléen utilise __bool__, que les tenseurs implémentent). Si vous devez effectuer des tests d'égalité élémentaire sur les tenseurs, vous pouvez utiliser les fonctions tf.equal() et tf.not_equal().

+0

@musically_ut: bien, '__eq__' est défini, explicitement, comme un test d'identité. –

+0

Wow! La décision de conception d'utiliser des tenseurs comme clés dans le 'feed_dict' conduit à' __eq__' * non * étant défini de la même manière que pour 'numpy' pour 'tf.Tensors'! –

+0

@ user2357112: merci pour les informations supplémentaires! –