2015-12-08 7 views
7

Ich versuche, ein einfaches logistisches Regressionsmodell mit meinem eigenen Satz von Bildern trainiert, aber ich bin immer diese Fehlermeldung, wenn ich versuche, das Modell zu trainieren:Tensorflow (Python): "ValueError: Setzen eines Array-Elements mit einer Sequenz" 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. 

die Daten, die ich zu train_step.run({x: batch_xs, y_: batch_ys}) bin Fütterung sind wie folgt:

  • batch_xs: Liste der Tensor Objekte Bilder von 100x100 (10.000 langen Tensoren darstellen)
  • batch_ys: Liste der Etiketten a s schwimmt (1.0 oder 0.0)

Was mache ich falsch? Danke im Voraus!

EDIT 1: Es scheint, das Problem war, dass ich die Tensoren in batch_xs, bevor er sie zu train_step.run(...) bewerten hatte. Ich dachte, die Run-Methode würde dafür sorgen, aber ich glaube, ich lag falsch? Wie dem auch sei , so, wenn ich tat dies vor dem Aufruf der Funktion:

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: Ich hatte einige Probleme auch nach dem zu tun, was in den Antworten unten vorgeschlagen. Ich habe schließlich alles behoben, indem ich die Tensoren weggelassen und numpige Arrays benutzt habe.

Hoffnung hilft dies jemand anderes

Antwort

16

Dieser spezielle Fehler aus numpy kommt. Rufen Sie np.array auf einer Sequenz mit einer inkonsistenten Dimensionen kann es werfen.

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

ValueError: setting an array element with a sequence. 

Es sieht aus wie es an dem Punkt versagt hat, wo tf stellt sicher, dass alle Elemente des feed_dict sind numpy.array s.

Überprüfen Sie Ihre feed_dict.

+0

Danke! Ich hatte dieses Problem mit Bilddaten aus einem HDF5-Datensatz, wo jedes Bild eine andere Form hatte. –

5

feed_dict Das Argument Operation.run() (auch Session.run() und Tensor.eval()) akzeptiert ein Wörterbuch-Mapping Tensor Objekte (in der Regel tf.placeholder() Tensoren) zu einem numpy Array (oder Objekte, die zu einer trivially numpy Array umgewandelt werden können).

In Ihrem Fall übergeben Sie batch_xs, die eine Liste von numpy Arrays ist, und TensorFlow weiß nicht, wie Sie dies in ein numpy Array konvertieren. Lassen Sie uns sagen, dass batch_xs ist wie folgt definiert:

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

Beachten Sie, dass, wenn batch_ys eine Liste der Schwimmer ist, diese transparent sein:

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

Wir batch_xs in eine 32 x 100 x 100 Array mit dem folgenden umwandeln kann durch TensorFlow in ein 1-d Numpy-Array konvertiert, so dass Sie dieses Argument nicht konvertieren müssen.

EDIT: mdaoust macht einen wichtigen Punkt in den Kommentaren: Wenn übergeben Sie eine Liste von Arrays in np.array (und daher als Wert in einem feed_dict), wird es automatisch vstack ed sein wird, so sollte es keine Notwendigkeit, um deine Eingabe wie vorgeschlagen zu konvertieren. Stattdessen klingt es so, als ob die Formen Ihrer Listenelemente nicht übereinstimmen. Versuchen Sie, die folgenden:

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

... vor dem Aufruf von train_step.run(), und dies sollte zeigen, ob Sie eine Diskrepanz haben.

+0

np auto-stacks Array-Listen wie diese, so wette ich immer noch auf eine Inkonsistenz. 'p = tf.placeholder (tf.float32, [2,10,10]);" q = tf.identität (p); "q.eval (feed_dict = {p: [np.random.randn (10 , 10), np.random.randn (10,10)]}) .shape # ==> (2, 10, 10) ' – mdaoust

+1

@mrry gibt es eine Möglichkeit TF Tensoren zu' feed_dict' zu füttern? Wie Sie wissen read_and_decode ich Bilder rein in TF und jetzt das gleiche Problem, wenn –

+0

@HamedMP Fütterung: Es gibt derzeit keine Möglichkeit, einen (symbolischen) 'Tensor' als Wert in einem' feed_dict' zu füttern. Die drei Hauptentscheidungen sind: (i) werte den Tensor aus und übergebe seinen Wert, (ii) konstruiere den Graph so, dass du den Wert des "Tensors" im ursprünglichen Ausdruck verwendest, oder (iii) verwende eine "Warteschlange" als eine Indirektion, werte den Tensor aus und reihe ihn ein; Definieren Sie dann den ursprünglichen Ausdruck als eine Funktion von 'dequeue' und nicht als Platzhalter. – mrry

Verwandte Themen