2015-11-13 3 views
20

Ich versuche, eine Liste in feed_dict zu übergeben, aber ich habe Probleme damit. Sagen, ich habe:Problem beim Einspeisen einer Liste in feed_dict in TensorFlow

inputs = 10 * [tf.placeholder(tf.float32, shape=(batch_size, input_size))] 

wo Eingänge in eine Funktion zugeführt wird outputs, die ich berechnen möchten. So laufen diese in tensorflow, habe ich eine Sitzung erstellt und lief wie folgt vor:

sess.run(outputs, feed_dict = {inputs: data}) 
#data is my list of inputs, which is also of length 10 

aber ich erhalte eine Fehlermeldung, TypeError: unhashable type: 'list'. aber ich bin in der Lage, das Datenelement weise passieren, wie so:

sess.run(outputs, feed_dict = {inputs[0]: data[0], ..., inputs[9]: data[9]}) 

Ich frage mich, ob es eine Möglichkeit gibt, dieses Problem zu lösen. Ich habe auch versucht, ein Wörterbuch (unter Verwendung eine for Schleife) zu konstruieren, aber dies mit einem einzelnen Elemente in einem Wörterbuch führt, wo sie Schlüssel ist: tensorflow.python.framework.ops.Tensor at 0x107594a10

+0

Haben Sie versucht sess.run (Ausgaben, feed_dict = dict (zip (Eingaben, Daten)))? –

+0

Ja, ich bekomme das gleiche Problem wie bei der for-Schleife-Methode. –

Antwort

34

Es gibt zwei Probleme, die Probleme hier verursachen:

Das erste Problem ist, dass der Session.run() Anruf nur eine kleine Anzahl von Typen wie die Tasten der feed_dict akzeptiert. Insbesondere sind Listen von Tensoren nicht unterstützt als Schlüssel, so dass Sie jeden Tensor als separaten Schlüssel setzen müssen. * Eine bequeme Möglichkeit, dies zu tun, ist ein Wörterbuch Verständnis mit:

inputs = [tf.placeholder(...), ...] 
data = [np.array(...), ...] 
sess.run(y, feed_dict={i: d for i, d in zip(inputs, data)}) 

Das zweite Problem ist, dass die 10 * [tf.placeholder(...)] Syntax in Python eine Liste mit zehn Elementen erzeugt, wobei jedes Element der gleichen Tensor Objekt ist (dh hat dieselbe name Eigenschaft, dieselbe id Eigenschaft, und ist Referenz-identisch, wenn Sie zwei Elemente aus der Liste mit inputs[i] is inputs[j] vergleichen). Dies erklärt, warum Sie beim Erstellen eines Wörterbuchs mit den Listenelementen als Schlüssel ein Wörterbuch mit einem einzelnen Element gefunden haben, weil alle Listenelemente identisch waren.

zu 10 verschiedene Platzhalter Tensoren erstellen, wie Sie beabsichtigten, sollten Sie die folgenden stattdessen tun:

inputs = [tf.placeholder(tf.float32, shape=(batch_size, input_size)) 
      for _ in xrange(10)] 

Wenn Sie die Elemente dieser Liste zu drucken, werden Sie sehen, dass jedes Element mit einem Tensor ist anderer Name.


EDIT:* können Sie jetzt Tupeln wie die Tasten eines feed_dict passieren, weil diese als Dictionary-Schlüssel verwendet werden können.

+0

* Listen von Tensoren werden nicht als Schlüssel unterstützt, daher muss jeder Tensor als separater Schlüssel eingegeben werden * @mrry, stimmt das noch? In meinem Fall übergebe ich ein Tuple von LSTMStateTuple-Objekten als Schlüssel zu 'sess.run()', in TensorFlow r0.11 – martianwars

+0

Tupel funktionieren jetzt als Schlüssel, aber Listen erzeugen immer noch einen Fehler, weil Python-Listen nicht verwendbar sind als Wörterbuchschlüssel. Ich habe die Antwort aktualisiert, um zu klären. – mrry

+0

Was passiert, wenn ich mehrere Iterationen füttere? ex) feed_dict = {x: y für x, y in (Knoten, Eingänge), node_another: input_another} #dies funktioniert nicht – sdr2002

4

hier ein richtiges Beispiel ist:

batch_size, input_size, n = 2, 3, 2 
# in your case n = 10 
x = tf.placeholder(tf.types.float32, shape=(n, batch_size, input_size)) 
y = tf.add(x, x) 

data = np.random.rand(n, batch_size, input_size) 

sess = tf.Session() 
print sess.run(y, feed_dict={x: data}) 

Und hier ist eine seltsame Dinge, die ich in Ihrem Ansatz sehe. Aus irgendeinem Grund verwenden Sie 10 * [tf.placeholder(...)], die 10 Tensoren der Größe (batch_size, input_size) erstellt. Keine Ahnung, warum tust du das, wenn du nur Tensor mit Rang 3 erstellen kannst (wo die erste Dimension 10 ist).

Da Sie eine Liste von Tensoren (und keinen Tensor) haben, können Sie Ihre Daten nicht dieser Liste zuführen (aber in meinem Fall kann ich zu meinem Tensor führen).

+0

Der Grund, warum ich das getan habe, war, weil ich versuche, die rnn-Methode in Tensorflow verwendet, und wenn ich einen 3-dimensionalen Tensor übergeben bekomme ich einen Fehler: "TypeError: Eingaben müssen eine Liste sein". –

+0

Oh ok, ich verstehe, warum diese Implementierung jetzt funktioniert. –

+0

Also war ich auch in der Lage, das Problem zu lösen, indem ich einen 3-ten Tensor passierte und ihn dann aufteilte und drückte und die Eingabe so in meine Operation/Funktion übertrug. Vielen Dank. –