web-dev-qa-db-fra.com

type inshashable: erreur 'numpy.ndarray' dans 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')

Voici l'erreur:

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'

Voici les formes des deux tableaux numpy que je saisis:

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

Je n'ai aucune idée de ce qui cause ceci. Toutes mes formes se ressemblent et je ne devrais avoir aucun problème. Faites-moi savoir si vous avez besoin de plus d'informations.

Edit: D'après mon commentaire sur l'une des réponses ci-dessous, il me semble que je dois spécifier une taille spécifique pour mes espaces réservés. None n'était pas satisfaisant. Lorsque j'ai changé cela et que j'ai relancé mon code, tout a bien fonctionné. Je ne sais toujours pas pourquoi.

2
madsthaks

Veuillez vérifier soigneusement le type de données que vous alimentez "x_train/y_train" et le tenseur "x/y_label" défini par 'tf.placeholder (...)'

J'ai rencontré le même problème avec vous. Et la raison est x_train dans mon code est "np. float64 ", mais ce que j'ai défini par tf.placeholder () est tf. float32 . Le type de date float64 et float32 ne correspond pas.

5
zero

Dans mon cas, le problème était de nommer le paramètre d'entrée de la même manière que la variable d'espace réservé. Ceci, bien sûr, remplace votre variable tensorflow par la variable d'entrée; résultant en une clé différente pour le feed_dict.

Une variable tensorflow est hashable, mais votre paramètre d'entrée (np.ndarray) ne l'est pas. L'erreur inexploitable résulte donc de votre tentative de passer votre paramètre comme clé à la place d'une variable tensorflow. Un code pour visualiser ce que j'essaye de dire:

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

J'espère que cela aidera quiconque à trébucher sur ce problème à l'avenir!

5
Andreas Forslöw

Je pense que le problème réside dans la définition du dictionnaire. Une clé de dictionnaire doit être de type 'hashable', par exemple. un nombre, une chaîne ou un tuple sont communs. Une liste ou un tableau ne fonctionne pas:

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'

Je ne connais pas assez de tensorflow pour savoir ce que sont:

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

L'erreur indique qu'ils sont des tableaux numpy, pas des chaînes. Est-ce que x a un attribut name?

Ou peut-être que le dictionnaire devrait être spécifié comme suit:

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

Étrange, j'ai eu ce problème aussi. Après avoir fermé python Shell et exécuté le code à partir d’un fichier, je n’ai pas réussi à le reproduire même dans le shell (cela ne fonctionne tout simplement pas sans erreur). 

0
ChaosPredictor