unhashable类型:tensorflow中的'numpy.ndarray'错误

mad*_*aks 3 python numpy linear-regression tensorflow

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')
Run Code Online (Sandbox Code Playgroud)

这是错误:

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'
Run Code Online (Sandbox Code Playgroud)

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

y_train.shape = (78,)
x_train.shape = (78, 3)
Run Code Online (Sandbox Code Playgroud)

我不知道造成这种情况的原因.我的所有形状都匹配,我不应该有任何问题.如果您需要更多信息,请与我们联系.

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

And*_*löw 10

在我的例子中,问题是将输入参数命名为与占位符变量相同.当然,这会用输入变量替换tensorflow变量; 导致feed_dict的不同键.

tensorflow变量是可清除的,但您的输入参数(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})
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助任何人在将来绊倒这个问题!


小智 5

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

我遇到了同样的问题.而原因就是x_train在我的代码是"NP.float64 ",但我通过tf.placeholder定义(什么)为TF.float32.日期类型float64和float32不匹配.


hpa*_*ulj 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'
Run Code Online (Sandbox Code Playgroud)

我对张量流了解不够,不知道这些是什么:

y_label = tf.placeholder(shape=[None,1], dtype=tf.float32, name='y_label')
x = tf.placeholder(shape=[None,3], dtype=tf.float32, name='x')
Run Code Online (Sandbox Code Playgroud)

该错误表明它们是 numpy 数组,而不是字符串。有x一个name

或者也许字典应该指定为:

{'x': x_train, 'y_label': y_train}
Run Code Online (Sandbox Code Playgroud)