【问题标题】:Why does Tensorflow not override __eq__ for Tensors?为什么 Tensorflow 不覆盖张量的 __eq__?
【发布时间】:2026-02-19 03:00:02
【问题描述】:

Tensorflow 覆盖 Tensor 类、including __lt__, __ge__ 等的多个运算符。

但是,__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)

【问题讨论】:

  • 您是否基于__eq__ 并非仅根据这些行定义的断言?因为我看到了other code that handles operator overrides in a generic manner 例如。
  • import tensorflow as tf,然后__eq__ in vars(tf.Tensor) 产生True,所以它确实定义了钩子。它被定义为directly on the class
  • @MartijnPieters 不,我的观察是基于我的代码没有按照我的预期去做。这些链接是在一些挖掘之后产生的。另外,我知道定义了张量的相等性。但是,它不符合numpy 数组。我希望添加的代码可以澄清问题。
  • 为什么在测试相等性时张量应该广播?该项目明确决定改为测试身份。
  • 是的,有一些特别之处;我发现了一个解释原因的 github 问题。

标签: python numpy tensorflow


【解决方案1】:

张量实现__eq__,但the implementation only tests for identity。我找到了this GitHub issue,这解释了为什么张量测试身份,而不是广播:

这可能是一个复杂的事实,张量可以用作字典中的键,我相信使用== 来查找具有相同哈希的匹配对象

评论者是正确的;如果__eq__ 被重载到广播,那么你不能使用张量作为字典中的键。定义__hash__ 方法的对象(如果您想将此类对象用作字典中的键,则需要),必须为两个相等的对象生成相同的哈希值;见__hash__ method:

唯一需要的属性是比较相等的对象具有相同的哈希值

但广播会为具有不同哈希值的对象生成一个“真实”张量对象。

(关于__eq__ 会破坏布尔测试的推测是错误的;布尔测试使用了张量实现的__bool__)。

如果您需要对张量进行逐元素相等性测试,您可以使用tf.equal()tf.not_equal() 函数。

【讨论】:

  • @musically_ut:嗯,__eq__ 被明确定义为身份测试。
  • 哇!使用张量作为 feed_dict 中的键的设计决策导致 __eq__ not 的定义方式与 numpytf.Tensors!
  • 它似乎没有这么简单。例如,tf.constant([0]) == tf.constant([0]) 是一个包含 [True] 的 tf.Tensor,至少在 tf2 中是这样。似乎急切的执行有效果