【问题标题】:Using tensors are dictionary keys in tensorflow使用张量是张量流中的字典键
【发布时间】:2020-04-24 20:58:54
【问题描述】:

我已经看到答案here。这不是我要找的。​​p>

我在 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,张量的值是不可变的”的区别

【问题讨论】:

    标签: tensorflow tensorflow2.0


    【解决方案1】:

    这个错误是什么意思?

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

    查看this line 和上面的评论,您必须明确地为张量启用散列,如下所示。

    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 生成哈希 ID。但只要它是独一无二的,应该不是问题。事实上,你也可以在它成为字典中的键后更改变量值。

    【讨论】:

      猜你喜欢
      • 2018-02-13
      • 2017-12-01
      • 2018-06-09
      • 2017-11-05
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      相关资源
      最近更新 更多