tf.train.batch中的错误-FIFOQueue已关闭并且元素不足

时间:2018-06-28 04:52:02

标签: tensorflow

我正在尝试使用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中的任何字符加入队列之前出队,但是我不确定如何解决它。

请帮助,谢谢。

1 个答案:

答案 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()

这是herehere

讨论的一种变体

输出是这个。

   [b'a' b'b']
   [b'c' b'd']
   [b'e' b'f']