2017-10-17 150 views
-1

Tensorflow覆蓋多個運營商爲Tensor類,including __lt__, __ge__爲什麼Tensorflow不會覆蓋__eq__?

然而,__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) 

爲什麼==爲tensorflow的張量不行爲的方式爲numpy的數組一樣嗎?

代碼示例:

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

隨着numpy的,在另一方面:

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

你是否認爲'__eq__'沒有單獨定義在這些行上?因爲我看到[其他代碼以通用方式處理運算符覆蓋](例如,https://github.com/tensorflow/tensorflow/blob/27767d8e9c1325979cf32ff5b81c10df9006fd57/tensorflow/python/ops/math_ops.py#L875-L935)。 –

+1

'將tensorflow導入爲tf',然後'__eq__ in vars(tf.Tensor)'產生'True',所以它確定了鉤子。它是[直接在課堂上]定義的(https://github.com/tensorflow/tensorflow/blob/27767d8e9c1325979cf32ff5b81c10df9006fd57/tensorflow/python/framework/ops.py#L489-L491)。 –

+0

@MartijnPieters不,我的觀察結果是基於我的代碼沒有做到我期望的。鏈接是在一些挖掘後產生的。另外,我知道張量的平等是被定義的。但是,它不符合'numpy'數組。我希望附加的代碼能夠澄清這個問題。 –

回答

1

張量實施__eq__,但the implementation only tests for identity。我發現this GitHub issue,這可以解釋爲什麼身份張量測試,並且不播:

這可能是事實的併發症,張量可以作爲字典中的鍵,我相信使用==找到匹配對象使用相同的哈希值

評論者是正確的;如果__eq__超載進行廣播,則不能將張量用作字典中的鍵。定義__hash__方法的對象(如果要將這些對象用作字典中的鍵,則是必需的),必須爲兩個相等的對象生成相同的散列值;看到__hash__ method

僅有一個要求,就是其比較相等的對象具有相同的哈希值

但廣播會產生的不同哈希值的對象「真」張量對象。

(推測__eq__會打破布爾測試是錯誤的;布爾測試使用__bool__,張量確實實現)。

如果您需要對張量進行基於元素的相等性測試,則可以使用tf.equal()tf.not_equal()函數。

+0

@musically_ut:好吧,'__eq__'被明確定義爲身份測試。 –

+0

哇!在'feed_dict'中使用張量作爲關鍵字的設計決定會導致'__eq__' * not *的定義方式與'tf.Tensors'的'numpy'相同! –

+0

@ user2357112:感謝您的額外信息! –

相關問題