2017-06-20 2 views
0

Ich erhalte die folgende Fehlermeldung:Wie man einen Tensor im Tensorfluss iteriert?

TypeError: 'Tensor' object is not iterable.

Ich versuche, einen Platzhalter zu verwenden und FIFOQueue Daten zu füttern. Aber das Problem hier ist, dass ich die Daten nicht stapelweise verarbeiten kann. Könnte jemand eine Lösung anbieten?

Ich bin neu in TensorFlow und verwechselte das Konzept von Platzhalter und Tensor. Hier

ist der Code:

#-*- coding:utf-8 -*- 
import tensorflow as tf 
import sys 

q = tf.FIFOQueue(1000,tf.string) 
label_ph = tf.placeholder(tf.string,name="label") 
enqueue_op = q.enqueue_many(label_ph) 
qr = tf.train.QueueRunner(q,enqueue_op) 
m = q.dequeue() 

sess_conf = tf.ConfigProto() 
sess_conf.gpu_options.allow_growth = True 
sess = tf.Session(config=sess_conf) 
sess.run(tf.global_variables_initializer()) 
coord = tf.train.Coordinator() 
tf.train.start_queue_runners(coord=coord, sess=sess) 

image_batch = tf.train.batch(
     m,batch_size=3, 
     enqueue_many=True, 
     capacity=9 
     ) 

for i in range(0, 10): 
    print "-------------------------" 
    #print(sess.run(q.dequeue())) 
    a = ['a','b','c','a1','b1','c1','a','b','c2','a','b','c3',] 
    sess.run(enqueue_op,{label_ph:a}) 
    b = sess.run(m) 
    print b 
q.close() 
coord.request_stop() 

Antwort

0

Ich glaube, Sie in das gleiche Problem laufen ich bin. Wenn Sie die Sitzung ausführen, haben Sie keinen Zugriff auf die Daten, stattdessen haben Sie Zugriff auf die Datengrafik. Sie sollten sich also die Tensor-Objekte wie Knoten in einem Graphen vorstellen und nicht wie Datenbrocken, mit denen Sie Dinge tun können. Wenn Sie Dinge mit dem Graphen machen wollen, müssen Sie tf. * Funktionen aufrufen oder die Variablen in einen sess.run() Aufruf bringen. Wenn Sie das tun, wird tensorflow herausfinden, wie Sie diese Daten basierend auf ihren Abhängigkeiten erhalten und die Berechnung ausführen.

Wie für Ihre Frage, überprüfen Sie das QueueRunner-Beispiel auf dieser Seite.

Eine andere Möglichkeit, wie Sie es tun könnten (was ich wechselte) ist, dass Sie Ihre Daten auf der CPU mischen und dann alles auf einmal kopieren können. Dann behalten Sie den Überblick über den Schritt und greifen auf die Daten für diesen Schritt zu. Ich helfe, den GPU-Feed mit Daten zu halten und Speicherkopien zu reduzieren.

all_shape = [num_batches, batch_size, data_len] 
    local_shape = [batch_size, data_len] 

    ## declare the data variables 
    model.all_data = tf.Variable(tf.zeros(all_shape), dtype=tf.float32) 
    model.step_data=tf.Variable(tf.zeros(local_shape), dtype=tf.float32) 
    model.step = tf.Variable(0, dtype=tf.float32, trainable=False, name="step") 

    ## then for each step in the epoch grab the data 
    index = tf.to_int32(model.step) 
    model.step_data = model.all_data[index] 

    ## inc the step counter 
    tf.assign_add(model.step, 1.0, name="inc_counter") 
+0

Ich brauche Batch zu verwenden. Könnten Sie bitte eine Batch-Lösung bereitstellen? – JerryWind

+0

Der Code, den ich oben habe, ist die allgemeine Idee. Sie benötigen einen 3D-Tensor aus [num_batches, batch_size, data_len] und dann für jeden Stapel das benötigte Stück. – ReverseFall

Verwandte Themen