TypeError:张量是不可散列的。相反,使用 tensor.ref() 作为键。在 Keras 外科医生

Posted

技术标签:

【中文标题】TypeError:张量是不可散列的。相反,使用 tensor.ref() 作为键。在 Keras 外科医生【英文标题】:TypeError: Tensor is unhashable. Instead, use tensor.ref() as the key. in Keras Surgeon 【发布时间】:2020-07-18 06:33:11 【问题描述】:

我正在使用 Kerassurgeon 模块进行修剪。我在谷歌 colab 中使用 VGG-16 时遇到了这个错误。它适用于其他模型。有人可以帮我解决这个问题。

---> 17   model_new = surgeon.operate()<br>
     18   return model_new

>>/usr/local/lib/python3.6/dist-packages/kerassurgeon/surgeon.py in operate(self)
    152             sub_output_nodes = utils.get_node_inbound_nodes(node)
    153             outputs, output_masks = self._rebuild_graph(self.model.inputs,
--> 154                                                         sub_output_nodes)
    155 
    156             # Perform surgery at this node

>>/usr/local/lib/python3.6/dist-packages/kerassurgeon/surgeon.py in _rebuild_graph(self, graph_inputs, output_nodes, graph_input_masks)
    264         # Call the recursive _rebuild_rec method to rebuild the submodel up to
    265         # each output layer
--> 266         outputs, output_masks = zip(*[_rebuild_rec(n) for n in output_nodes])
    267         return outputs, output_masks
    268 

>>/usr/local/lib/python3.6/dist-packages/kerassurgeon/surgeon.py in <listcomp>(.0)
    264         # Call the recursive _rebuild_rec method to rebuild the submodel up to
    265         # each output layer
--> 266         outputs, output_masks = zip(*[_rebuild_rec(n) for n in output_nodes])
    267         return outputs, output_masks
    268 

>>/usr/local/lib/python3.6/dist-packages/kerassurgeon/surgeon.py in _rebuild_rec(node)
    216             # Check for replaced tensors before any other checks:
    217             # these are created by the surgery methods.
--> 218             if node_output in self._replace_tensors.keys():
    219                 logging.debug('bottomed out at replaced output: 0'.format(
    220                     node_output))

>>/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py in __hash__(self)
    724     if (Tensor._USE_EQUALITY and executing_eagerly_outside_functions() and
    725         (g is None or g.building_function)):
--> 726       raise TypeError("Tensor is unhashable. "
    727                       "Instead, use tensor.ref() as the key.")
    728     else:

**TypeError: Tensor is unhashable. Instead, use tensor.ref() as the key.**

【问题讨论】:

至少获得一个负责您发布的错误的代码会很有帮助。 如果你想解决这个问题,请告诉我们,我被困在这里了! 【参考方案1】:

当我尝试Deep learning example with GradientExplainer 时,我已经解决了类似的问题。这是版本不兼容造成的。 添加以下代码可能会有所帮助:

import tensorflow.compat.v1.keras.backend as K
import tensorflow as tf
tf.compat.v1.disable_eager_execution()

tf 版本是 2.3.1 kerase 版本是 2.4.0 形状版本为 0.36

【讨论】:

【参考方案2】:

请尝试以下代码:

import tensorflow.compat.v1.keras.backend as K
import tensorflow as tf
tf.compat.v1.disable_eager_execution()

1.compat 允许您编写可在 TensorFlow 1.x 和 2 中运行的代码,并且应该 根据版本导入解决任何错误。

2.eager_execution 是一个接口,一旦被调用就允许操作 来自 Python。开启它可以让 Tensorflow 更加直观。

3.但是为什么要禁用 eager_execution 呢? ->eager_executiongraph_execution 慢。它逐行运行操作 这使得潜在的加速机会毫无用处。

4.运行 tf.executing_eagerly() 来检查 eager_execution 是打开还是关闭。

希望这有助于减轻您的错误。

【讨论】:

【参考方案3】:

我解决了这个错误。这是由于版本的变化。使用 Kerassurgeon 而不是 tfkerassurgeon。

使用以下版本

tf 1.x , keras > 2.2 , kerassurgeon 

【讨论】:

【参考方案4】:

我遇到了类似的问题,我已经使用下一行解决了它:

import tensorflow.compat.v1.keras.backend as K
import tensorflow as tf
tf.compat.v1.disable_eager_execution()

【讨论】:

以上是关于TypeError:张量是不可散列的。相反,使用 tensor.ref() 作为键。在 Keras 外科医生的主要内容,如果未能解决你的问题,请参考以下文章

Python字典:TypeError:不可散列的类型:'list'

TypeError:使用一组 UDT 创建 Cassandra Python 驱动程序模型时不可散列的类型 UserType

如何在其上制作一个简单的 Django URLconf 和 reverse() 进行测试? (获取TypeError:不可散列的类型:'list')

nltk 的朴素基分类器给出不可散列的类型错误

多标签计算类权重 - 不可散列的类型

使用 vmap 时,Jax 不支持不可散列的静态参数