2015-11-13 4 views
20

Sto provando a passare una lista in feed_dict, tuttavia ho problemi a farlo. Ho dire:Problema di inserire un elenco in feed_dict in TensorFlow

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

cui ingressi viene alimentato in qualche funzione outputs che voglio calcolare. Quindi, per eseguire questo in tensorflow, ho creato una sessione e fatto funzionare il seguente:

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

ma ottengo un errore, TypeError: unhashable type: 'list'. Tuttavia, sono in grado di trasmettere l'elemento-saggio dei dati in questo modo:

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

Quindi mi chiedo se c'è un modo per risolvere questo problema. Ho anche provato a costruire un dizionario (utilizzando un ciclo for), tuttavia questo si traduce in un dizionario con un unico elemento, dove chiave è: tensorflow.python.framework.ops.Tensor at 0x107594a10

+0

Hai provato sess.run (uscite, feed_dict = dict (zip (input, dati)))? –

+0

Sì, ho lo stesso problema con il metodo ciclo for. –

risposta

34

ci sono due questioni che causano problemi qui:

Il primo problema è che la chiamata Session.run() accetta solo un piccolo numero di tipi come le chiavi del feed_dict. In particolare, gli elenchi dei tensori sono non supportati come chiavi, quindi è necessario inserire ciascun tensore come chiave separata. * Un modo conveniente per farlo è usare la comprensione dizionario:

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

Il secondo problema è che il 10 * [tf.placeholder(...)] sintassi in Python crea un elenco con dieci elementi, dove ogni elemento è oggetto stesso tensore (ad esempio, ha la stessa proprietà ed è identica al riferimento se si confrontano due elementi dall'elenco utilizzando inputs[i] is inputs[j]). Questo spiega perché, quando provasti a creare un dizionario usando gli elementi della lista come chiavi, finivi con un dizionario con un singolo elemento - perché tutti gli elementi della lista erano identici.

Per creare 10 diversi tensori segnaposto, come desiderato, si dovrebbe invece effettuare le seguenti operazioni:

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

Se si stampa gli elementi di questo elenco, vedrete che ogni elemento è un tensore con un nome diverso


EDIT:* Si può ora passare tuple come i tasti di un feed_dict, perché questi possono essere utilizzati come chiavi del dizionario.

+0

* le liste di tensori non sono supportate come chiavi, quindi devi mettere ciascun tensore come chiave separata * @mrry, è ancora vero? Nel mio caso, sto passando una tupla di oggetti LSTMStateTuple come chiave per 'sess.run()', in TensorFlow r0.11 – martianwars

+0

Le tuple ora funzionano come chiavi, ma le liste generano ancora un errore perché gli elenchi Python non sono utilizzabili come tasti del dizionario. Ho aggiornato la risposta per chiarire. – mrry

+0

Cosa succede se nutro più iterazioni? ex) feed_dict = {x: y per x, y in (nodi, input), node_another: input_another} #questo non funziona – sdr2002

4

Ecco un esempio corretto:

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

Ed ecco una cosa strana che vedo nel tuo approccio. Per qualche motivo si utilizza 10 * [tf.placeholder(...)], che crea 10 tensori di dimensione (batch_size, input_size). Non ho idea del motivo per cui lo fai, se puoi creare solo il Tensore di rango 3 (dove la prima dimensione è 10).

Poiché si dispone di un elenco di tensori (e non di un tensore), non è possibile alimentare i dati in questo elenco (ma nel mio caso posso alimentare il mio tensore).

+0

Quindi la ragione per cui l'ho fatto è che sto provando ad usare il metodo rnn fornito in tensorflow, e quando passo un tensore tridimensionale ottengo un errore: "TypeError: input deve essere una lista". –

+0

Oh ok, capisco perché l'implementazione funziona ora. –

+0

Quindi sono stato anche in grado di risolvere il problema passando un tensore 3-d e poi dividendolo e schiacciandolo e passando l'input alla mia operazione/funzione in quel modo. Grazie. –