【问题标题】:unhashable type: 'numpy.ndarray' error in tensorflow不可散列的类型:张量流中的“numpy.ndarray”错误
【发布时间】:2019-04-30 20:18:02
【问题描述】:
data = pd.read_excel("/Users/madhavthaker/Downloads/Reduced_Car_Data.xlsx")

train = np.random.rand(len(data)) < 0.8

data_train = data[train]
data_test = data[~train]


x_train = data_train.ix[:,0:3].values
y_train = data_train.ix[:,-1].values
x_test = data_test.ix[:,0:3].values
y_test = data_test.ix[:,-1].values

y_label = tf.placeholder(shape=[None,1], dtype=tf.float32, name='y_label')
x = tf.placeholder(shape=[None,3], dtype=tf.float32, name='x')
W = tf.Variable(tf.random_normal([3,1]), name='weights')
b = tf.Variable(tf.random_normal([1]), name='bias')
y = tf.matmul(x,W)  + b

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    summary_op = tf.summary.merge_all()
    #Fit all training data
    for epoch in range(1000):
        sess.run(train, feed_dict={x: x_train, y_label: y_train})

        # Display logs per epoch step
        if (epoch+1) % display_step == 0:
            c = sess.run(loss, feed_dict={x: x_train, y_label:y_train})
            print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \
                "W=", sess.run(W), "b=", sess.run(b))

    print("Optimization Finished!")
    training_cost = sess.run(loss, feed_dict={x: x_train, y_label: y_train})
    print("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')

这是错误:

x---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-37-50102cbac823> in <module>()
      6     #Fit all training data
      7     for epoch in range(1000):
----> 8         sess.run(train, feed_dict={x: x_train, y_label: y_train})
      9 
     10         # Display logs per epoch step

TypeError: unhashable type: 'numpy.ndarray'

这是我输入的两个 numpy 数组的形状:

y_train.shape = (78,)
x_train.shape = (78, 3)

我不知道是什么原因造成的。我所有的形状都匹配,我不应该有任何问题。如果您需要更多信息,请告诉我。

编辑:从我对以下答案之一的评论来看,似乎我必须为占位符指定特定的大小。 None 不满意。当我改变它并重新运行我的代码时,一切正常。仍然不太清楚为什么会这样。

【问题讨论】:

    标签: python numpy tensorflow linear-regression


    【解决方案1】:

    就我而言,问题在于将输入参数命名为与占位符变量相同的名称。当然,这会将您的 tensorflow 变量替换为输入变量;导致 feed_dict 的键不同。

    张量流变量是可散列的,但您的输入参数 (np.ndarray) 不是。因此,不可散列的错误是您尝试将参数作为键而不是 tensorflow 变量传递的结果。一些代码可以可视化我想说的内容:

    a = tf.placeholder(dtype=tf.float32, shape=[1,2,3])
    b = tf.identity(a)
    
    with tf.Session() as sess:
        your_var = np.ones((1,2,3))
        a = your_var
        sess.run(b, feed_dict={a: a})
    

    希望这对以后遇到此问题的人有所帮助!

    【讨论】:

      【解决方案2】:

      请仔细检查您提供的数据类型 "x_train/y_train" 和您由 'tf.placeholder(...)' 定义的张量 "x/y_label"

      我遇到了同样的问题。原因是我的代码中的 x_train 是“np.float64”,但我通过 tf.placeholder() 定义的是 tf.float32。日期类型 float64 和 float32 不匹配。

      【讨论】:

      • 我的代码就是这种情况。将 numpy 类型更改为 np.float32 以匹配 tf.float32 的 Tensorflow 类型
      【解决方案3】:

      我认为问题在于定义字典。字典键必须是“可散列类型”,例如一个数字、一个字符串或一个元组是常见的。列表或数组不起作用:

      In [256]: {'x':np.array([1,2,3])}
      Out[256]: {'x': array([1, 2, 3])}
      In [257]: x=np.array([1,2,3])
      In [258]: {x:np.array([1,2,3])}
      ...
      TypeError: unhashable type: 'numpy.ndarray'
      

      我对 tensorflow 的了解还不够,不知道这些是什么:

      y_label = tf.placeholder(shape=[None,1], dtype=tf.float32, name='y_label')
      x = tf.placeholder(shape=[None,3], dtype=tf.float32, name='x')
      

      错误表明它们是 numpy 数组,而不是字符串。 xname 属性吗?

      或者字典应该指定为:

      {'x': x_train, 'y_label': y_train}
      

      【讨论】:

      • 这很有趣。似乎我必须为占位符指定特定的大小。 None 不满意。当我改变它并重新运行我的代码时,一切正常。仍然不太清楚为什么会这样。
      【解决方案4】:

      奇怪,我也有这个问题。在我关闭 python shell 并从文件运行代码后,即使在 shell 中我也没有成功重现它(它只是在没有错误的情况下工作)。

      【讨论】:

        猜你喜欢
        • 2018-04-24
        • 2018-08-03
        • 1970-01-01
        • 2012-02-19
        • 1970-01-01
        • 2020-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多