我收到以下错误:
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()
答案 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")