我正在尝试使用Tensorflow(版本1.6)中的队列生成一批字符:
import tensorflow as tf
list1 = tf.placeholder(tf.string, shape=(4,))
list2 = tf.placeholder(tf.string, shape=(4,))
char1, char2 = tf.train.slice_input_producer([list1, list2])
init_op = tf.group(tf.global_variables_initializer(),
tf.local_variables_initializer(), tf.initialize_local_variables())
sess = tf.Session()
char1_batch, char2_batch = tf.train.batch([char1, char2], 2, 20)
with sess.as_default():
sess.run(init_op)
coord = tf.train.Coordinator()
tf.train.start_queue_runners(sess=sess, coord=coord)
while True:
try:
x, y = sess.run([char1_batch, char2_batch], feed_dict={list1: ['a', 'b', 'c', 'd'], list2: ['e', 'f', 'g', 'h']})
print x, y
except tf.errors.OutOfRangeError:
print "Queue Empty!!"
break
sess.close()
但是,在循环开始时出现了OutOfRangeError。我检查了其他类似的帖子。他们中的大多数建议通过tf.initialize_local_variables()初始化局部变量,但这无济于事。该错误可能是因为批处理操作试图在另一个线程将char1和char2中的任何字符加入队列之前出队,但是我不确定如何解决它。
请帮助,谢谢。
答案 0 :(得分:1)
当我在您的代码中打开像这样的调试时
tf.logging.set_verbosity(tf.logging.DEBUG)
我看到此错误,然后是问题中提到的错误。
INFO:tensorflow:Error reported to Coordinator: <class 'tensorflow.python.framework.errors_impl.InvalidArgumentError'>,
You must feed a value for placeholder tensor 'Placeholder' with dtype string and shape [4] [[Node: Placeholder = Placeholder[dtype=DT_STRING, shape=[4], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
因此,我尝试了两种不同的方法。首先,我删除了批处理调用,这个简单的案例起作用了。第二个变体可以处理批处理,但涉及线程框架。应该谨慎使用线程。
import tensorflow as tf
import threading
tf.logging.set_verbosity(tf.logging.DEBUG)
list1 = tf.placeholder(tf.string,name="x")
queue = tf.FIFOQueue(capacity=50, dtypes=[tf.string], shapes=[()])
enqueue_op = queue.enqueue_many(list1)
dequeue_op = queue.dequeue()
data_batch = tf.train.batch([dequeue_op], batch_size=2, capacity=40)
init_op = tf.group(tf.global_variables_initializer(),
tf.local_variables_initializer(), tf.initialize_local_variables())
sess = tf.Session()
def put():
sess.run(enqueue_op, feed_dict={list1: ['a', 'b', 'c', 'd', 'e', 'f']})
mythread = threading.Thread(target=put, args=())
mythread.start()
tf.train.start_queue_runners(sess)
try:
while True:
print (sess.run(data_batch))
except tf.errors.OutOfRangeError:
print ("Queue empty")
sess.close()
讨论的一种变体
输出是这个。
[b'a' b'b']
[b'c' b'd']
[b'e' b'f']