尝试对tf.train.string_input_producer
(r1.3)创建的队列大小进行完整性检查,但是当预期大小为3时,只需获得零大小
import tensorflow as tf
file_queue = tf.train.string_input_producer(['file1.csv','file2.csv','file3.csv'])
print('type(file_queue): {}'.format(type(file_queue)))
with tf.Session() as sess:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
file_queue_size = sess.run(file_queue.size())
coord.request_stop()
coord.join(threads)
print('result of queue size operation: {}'.format(file_queue_size))
我的预感是有一些懒惰的初始化正在进行,所以我想我会在队列中询问一个项目并看看之后的大小
import tensorflow as tf
file_queue = tf.train.string_input_producer(['file1.csv','file2.csv','file3.csv'])
print('type(file_queue): {}'.format(type(file_queue)))
with tf.Session() as sess:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
item = sess.run(file_queue.dequeue())
file_queue_size = sess.run(file_queue.size())
coord.request_stop()
coord.join(threads)
print('result of queue size operation: {}'.format(file_queue_size))
虽然大小不再为零,但提供的大小不是两个,并且每次运行代码时都会更改。
我觉得获得大小是一件简单的事情,但也许这不是与data_flow_ops.FIFOQueue
互动的方式。任何洞察力来解释这里发生的事情将非常感激。
答案 0 :(得分:1)
这是异步性质的工件,队列运行器填充队列。试试这段代码:
# if defined(_WIN32) || defined(__CYGWIN__) // Windows default, including MinGW and Cygwin
# define BOOST_WINDOWS_API
# else
# define BOOST_POSIX_API
# endif
输出应该说import tensorflow as tf
import time
file_queue = tf.train.string_input_producer(['file1.csv','file2.csv','file3.csv'])
print('type(file_queue): {}'.format(type(file_queue)))
with tf.Session() as sess:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
time.sleep(1)
file_queue_size = sess.run(file_queue.size())
coord.request_stop()
coord.join(threads)
print('result of queue size operation: {}'.format(file_queue_size))
。通过暂停主线程,队列运行程序可以运行足够长的时间来填充队列。
为什么result of queue size operation: 32
而不是32
?让我们看一下3
的签名:
string_input_producer
这里有两点需要注意:
string_input_producer(
string_tensor,
num_epochs=None,
shuffle=True,
seed=None,
capacity=32,
shared_name=None,
name=None,
cancel_op=None
)
表示永远继续迭代项目列表。仅在设置num_epochs=None
时迭代列表。您还需要致电num_epochs=1
。使用sess.run(tf.local_variables_initializer())
如果在出列后运行大小op,则会看到缩小的大小。num_epochs=1
这是队列的默认容量。这就是为什么我们在上面的输出中看到capacity=32
而不是32
。