2015-12-08 9 views
7

Sto cercando di implementare un semplice modello di regressione logistica addestrato con il mio set di immagini, ma sono ottenere questo errore quando provo per addestrare il modello:Tensorflow (python): "ValueError: impostazione di un elemento di array con una sequenza" in train_step.run (...)

Traceback (most recent call last): 
File "main.py", line 26, in <module> 
model.entrenar_modelo(sess, training_images, training_labels) 
File "/home/jr/Desktop/Dropbox/Machine_Learning/TF/Míos/Hip/model_log_reg.py", line 24, in entrenar_modelo 
train_step.run({x: batch_xs, y_: batch_ys}) 
File "/home/jr/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1267, in run 
_run_using_default_session(self, feed_dict, self.graph, session) 
File "/home/jr/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2763, in _run_using_default_session 
session.run(operation, feed_dict) 
File "/home/jr/.local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 334, in run 
np_val = np.array(subfeed_val, dtype=subfeed_t.dtype.as_numpy_dtype) 
ValueError: setting an array element with a sequence. 

I dati che sto alimentazione a train_step.run({x: batch_xs, y_: batch_ys}) è come questo:

  • batch_xs: elenco degli oggetti tensore che rappresentano immagini di 100x100 (10.000 lunghi tensori
  • batch_ys: elenco di etichette a s floats (1.0 o 0.0)

Cosa sto facendo male? Thx in anticipo!

EDIT 1: 'cuciture il problema era che dovevo valutare i tensori in batch_xs prima di passarli a train_step.run(...). Pensavo che il metodo di esecuzione si sarebbe occupato di questo, ma immagino di aver sbagliato? In ogni caso, quindi una volta che ho fatto questo prima di chiamare la funzione:

for i, x in enumerate(batch_xs): 
    batch_xs[i] = x.eval() 
    #print batch_xs[i].shape 
    #assert all(x.shape == (100, 100, 3) for x in batch_xs) 
# Now I can call the function 

EDIT 2: ho avuto diversi problemi anche dopo aver fatto quanto suggerito nelle risposte qui sotto. Alla fine ho risolto tutto abbandonando i tensori e usando gli array numpy.

Spero che questo aiuti qualcun altro

risposta

16

Questo particolare errore sta uscendo da numpy. Chiamare np.array su una sequenza con dimensioni inconsistenti può lanciarlo.

>>> np.array([1,2,3,[4,5,6]]) 

ValueError: setting an array element with a sequence. 

E sembra che sia mancato nel punto in cui tf assicura che tutti gli elementi del feed_dict sono numpy.array s.

Controlla il tuo feed_dict.

+0

Grazie! Stavo avendo questo problema usando i dati di immagine da un set di dati hdf5 in cui ogni immagine aveva una forma diversa. –

5

La feed_dict argomento Operation.run() (anche Session.run() e Tensor.eval()) accetta una mappatura dizionario Tensor oggetti (solitamente tf.placeholder() tensori) ad una matrice NumPy (o oggetti che possono essere banalmente convertito in un array di NumPy).

Nel tuo caso, stai passando batch_xs, che è un elenco di array numpy, e TensorFlow non sa come convertire questo in un array numpy. Diciamo che batch_xs è definito come segue:

batch_xs = [np.random.rand(100, 100), 
      np.random.rand(100, 100), 
      ...,      # 29 rows omitted. 
      np.random.rand(100, 100)] # len(batch_xs) == 32. 

possiamo convertire batch_xs in un array 32 x 100 x 100 utilizzando il seguente:

# Convert each 100 x 100 element to 1 x 100 x 100, then vstack to concatenate. 
batch_xs = np.vstack([np.expand_dims(x, 0) for x in batch_xs]) 
print batch_xs.shape 
# ==> (32, 100, 100) 

Si noti che, se batch_ys è un elenco di carri allegorici, questo sarà trasparente convertito in un array numpy 1-D da TensorFlow, quindi non è necessario convertire questo argomento.

EDIT: mdaoust fa un valido punto nei commenti: Se si passa un elenco di array in np.array (e quindi come valore in un feed_dict), sarà automaticamente vstack ndr, quindi non ci dovrebbe essere alcun bisogno per convertire il tuo input come suggerito. Invece, sembra che tu abbia una discrepanza tra le forme degli elementi della tua lista. Prova ad aggiungere il seguente:

assert all(x.shape == (100, 100) for x in batch_xs) 

... prima della chiamata a train_step.run(), e questo dovrebbe rivelare se si dispone di una mancata corrispondenza.

+0

np auto-impila elenchi di array come questo, quindi sto ancora scommettendo sulla dimensione di un'incoerenza. 'p = tf.placeholder (tf.float32, [2,10,10]);' 'q = tf.identity (p);' 'q.eval (feed_dict = {p: [np.random.randn (10 , 10), np.random.randn (10,10)]}) .shape # ==> (2, 10, 10) ' – mdaoust

+1

@mrry C'è un modo per alimentare i tensori TF a' feed_dict'? Come sapete, ho letto e_decode le immagini esclusivamente in TF e ora ho lo stesso problema quando si alimenta –

+0

@HamedMP: Al momento non c'è modo di alimentare un ('simbolico)' Tensore 'come valore in un 'feed_dict'. Le tre scelte principali qui sono: (i) valutare il tensore e passare il suo valore, (ii) costruire il grafico in modo da utilizzare il valore del 'Tensore' nell'espressione originale, o (iii) utilizzare una" coda "come un'indirizzamento indiretto, valuta il 'Tensore 'e accodalo; quindi definire l'espressione originale come una funzione di 'dequeue' piuttosto che un segnaposto. – mrry

Problemi correlati