在TensorFlow运行计算图的过程中,sess.run()那行可能会出现报错 unhashable type: 'numpy.ndarray' error
大致意思为不可哈希的类型
问题出现在feed_dict
里面。我们知道,feed_dict
参数一般存放占位符placeholder
所指向的具体的数据,以字典方式存储。而Python中字典的key和value类型是有限制的,并不是所有类型都能充当字典中的key和value。
所以此处的问题就是在存储在feed_dict中的键或值出了问题,一般key设置为placeholder
,新手在使用的时候可能会在key上面出现问题,注意排查一下就好。
但是除了以上说的那个问题以外,其他有可能出现的情况是placeholder
和真实数据的类型不一样,比如placeholder
为tf.int32
,而真实数据为np.int64
,这里需要将所对应的类型设为一致。不一致有可能会导致以上问题。参考链接:
https://stackoverflow.com/questions/43081403/unhashable-type-numpy-ndarray-error-in-tensorflow
ps:顺带简要复习一下Python字典的特点
1.健必须是可散列的,即不可变
用户自己实现的对象默认都是可散列的,因为id()不同。一个可散列对象应该有以下属性:
支持hash()函数,通过hash()方法得到的散列值是不变的。
Python的基本类型如字符串、整数、浮点数还有元组都是不可变的,都可以作为 key(list类型不可以)。
2.字典内存开销大,但访问速度快
因为字典是由散列表实现的,散列表中肯定对出现一些稀疏,这就导致了字典会占用一些空间。当然和字典的速度相比这点内存是可以忽略的。
3.字典的健顺序不是唯一的
由于散列表在插入或者读取时候可能会产生散列冲突,这就导致了字典中健的顺序不是唯一的,但是不管字典健的顺序怎么变,如果两个字典健值对都一样那么这两个字典都是相等的