如何迭代张量流中的张量?

时间:2017-06-20 09:25:09

标签: python tensorflow pipeline

我收到以下错误:

  

TypeError:'Tensor'对象不可迭代。

我正在尝试使用占位符和FIFOQueue来提供数据。但问题是我无法批量处理数据。任何人都可以提供解决方案吗?

我是TensorFlow的新手,并且混淆了占位符和张量的概念。

以下是代码:

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

1 个答案:

答案 0 :(得分:0)

我认为你遇到的问题与我相同。当您运行会话时,您实际上无法访问数据,而是可以访问数据图。因此,您应该将张量对象视为图形中的节点,而不是像您可以使用的数据块。如果你想对图形做一些事情,你必须调用tf。*函数或在sess.run()调用中获取变量。当你这样做时,tensorflow将找出如何根据其依赖关系获取数据并运行计算。

关于您的问题,请查看此页面上的QueueRunner示例。 https://www.tensorflow.org/programmers_guide/threading_and_queues

你可以做的另一种方式(我切换到的方法)是你可以在cpu上随机播放你的数据,然后立即复制它。然后,您可以跟踪您所处的步骤,并获取该步骤的数据。我帮助保持gpu feed的数据并减少内存副本。

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