首页 > 解决方案 > 使用张量是张量流中的字典键

问题描述

我在这里看到了答案。这不是我要找的。

我在 tensorflow2.0 上运行它

我在 TensorFlow 文档中阅读了以下句子:

除了 tf.Variable 之外,张量的值是不可变的,这意味着在单次执行的上下文中,张量只有一个值。但是,两次评估相同的张量可能会返回不同的值;例如,张量可以是从磁盘读取数据或生成随机数的结果。

我尝试使用张量作为字典键,但出现以下错误:

Tensor is unhashable if Tensor equality is enabled. Instead, use tensor.experimental_ref() as the key
  1. 这个错误是什么意思?
  2. tf.Variables 也可以散列吗?他们还定义了计算而不是计算,所以为什么存在“除了 tf.Variable 之外,张量的值是不可变的”的区别

标签: tensorflowtensorflow2.0

解决方案


这个错误是什么意思?

我想你可以在源代码中找到第一个问题的答案。

查看这一行和上面的注释,您必须显式地为张量启用散列,如下所示。

tf.compat.v1.disable_tensor_equality()

x = tf.ones(shape=[10,2], dtype=np.float32)
dct = {x: 1} # Works fine

发生的情况是现在__hash__返回正确的 ID 而不是引发错误。它允许您将其用作字典中的键。

禁用它的缺点是您不能再与张量进行逐元素比较。例如,

x = tf.ones(shape=[10,2], dtype=np.float32)
print((x==1.0))

启用平等的回报,

>>> tf.Tensor(
[[ True  True]
 [ True  True]
 ...
 [ True  True]
 [ True  True]], shape=(10, 2), dtype=bool)

随着平等禁用返回,

>>> False

tf.Variables 也可以散列吗?他们还定义了计算而不是计算,所以为什么存在“除了 tf.Variable 之外,张量的值是不可变的”的区别

对,他们是。如果您查看__hash__函数,它id(self)会返回在该对象的生命周期内对于该对象来说是唯一的(来源:here)。我不太了解如何使用id. 但只要它是独一无二的,应该不是问题。实际上,您也可以在变量值成为字典中的键后更改它。


推荐阅读