在TensorFlow运行计算图的过程中,sess.run()那行可能会出现报错 unhashable type: 'numpy.ndarray' error 大致意思为不可哈希的类型 问题出现在feed_dict 里面。、
解决方法 1:
在启动sess并给placeholeder喂数据后报错:TypeError: unhashable type: 'numpy.ndarray'。 这是由于变量名与占位符名冲突导致的,看到莫名其妙的TypeError要考虑是否存在变量名重复。
解决方法2:
我们知道,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.字典的健顺序不是唯一的 由于散列表在插入或者读取时候可能会产生散列冲突,这就导致了字典中健的顺序不是唯一的,但是不管字典健的顺序怎么变,如果两个字典健值对都一样那么这两个字典都是相等的