web-dev-qa-db-ja.com

unhashable型:tensorflowの「numpy.ndarray」エラー

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'

これが私が入力している両方の派手な配列の形状です:

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

何が原因なのかわかりません。私の形はすべて一致していて、問題はないはずです。さらに情報が必要な場合はお知らせください。

編集:以下の回答の1つに対する私のコメントから、プレースホルダーに特定のサイズを指定する必要があるようです。 Noneは満足のいくものではありませんでした。それを変更してコードを再実行すると、すべてが正常に機能しました。それがなぜかはまだよくわかりません。

4
madsthaks

フィードするデータタイプ"x_train/y_train"と、テンソル"x/y_label"が 'tf.placeholder(...)'で定義したものを慎重に確認してください

私はあなたと同じ問題に会いました。そして、その理由は私のコードのx_trainは "np .float64"ですが、tf.placeholder()で定義したものはtf .float32です。日付型float64とfloat32が一致しません。

5
zero

私の場合、問題は入力パラメーターにプレースホルダー変数と同じ名前を付けることでした。もちろん、これはテンソルフロー変数を入力変数に置き換えます。その結果、feed_dictのキーが異なります。

Tensorflow変数はハッシュ可能ですが、入力パラメーター(np.ndarray)はハッシュ可能ではありません。したがって、ハッシュできないエラーは、テンソルフロー変数ではなくキーとしてパラメーターを渡そうとした結果です。私が言おうとしていることを視覚化するためのコード:

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})

これが将来この問題に遭遇した人を助けることを願っています!

5

問題は辞書の定義にあると思います。辞書キーは「ハッシュ可能なタイプ」でなければなりません。数字、文字列、タプルが一般的です。リストまたは配列は機能しません:

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'

私はこれらが何であるかを知るのに十分なテンソルフローを知りません:

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

エラーは、文字列ではなく、数の多い配列であることを示しています。 xにはname属性がありますか?

または、辞書を次のように指定する必要があります。

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

奇妙なことに、私もこの問題を抱えていました。 pythonシェルを閉じてファイルからコードを実行した後、シェルでもそれを再現できませんでした(エラーなしで機能します)。

0
ChaosPredictor