2017-06-20 1 views
0

Je reçois l'erreur suivante:Comment itérer un tenseur en tensorflow?

TypeError: 'Tensor' object is not iterable.

Je suis en train d'utiliser un espace réservé et FIFOQueue pour alimenter des données. Mais le problème ici est que je ne peux pas traiter les données. Quelqu'un pourrait-il fournir une solution?

Je suis nouveau dans TensorFlow et j'ai confondu le concept d'espace réservé et de tenseur.

Voici le 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() 

Répondre

0

Je pense que vous êtes en cours d'exécution dans le même problème que je suis. Lorsque vous exécutez la session, vous n'avez pas accès aux données, vous avez accès au graphique de données à la place. Donc, vous devriez penser aux objets tensoriels comme des nœuds dans un graphique et non comme des morceaux de données avec lesquels vous pouvez faire des choses. Si vous voulez faire des choses sur le graphique, vous devez appeler les fonctions tf. * Ou obtenir les variables dans un appel sess.run(). Lorsque vous faites cela, tensorflow va comprendre comment obtenir ces données en fonction de ses dépendances et exécuter le calcul.

Pour votre question, consultez l'exemple de QueueRunner sur cette page. https://www.tensorflow.org/programmers_guide/threading_and_queues

Une autre façon de le faire (qui est ce que je suis passé à) est que vous pouvez mélanger vos données sur le cpu, puis copiez-le tout à la fois. Ensuite, vous gardez une trace de ce que vous faites et saisissez les données pour cette étape. Je contribue à garder le flux gpu avec des données et réduit les copies de la mémoire.

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

J'ai besoin d'utiliser batch. Alors pourriez-vous s'il vous plaît fournir une solution par lots? – JerryWind

+0

Le code que j'ai ci-dessus est l'idée générale. Vous avez besoin d'un tenseur 3D de [num_batches, batch_size, data_len], puis pour chaque lot, vous récupérez la découpe dont vous avez besoin. – ReverseFall