TensorFlow字符串输入生产者大小()

时间:2017-08-31 18:00:31

标签: tensorflow

尝试对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互动的方式。任何洞察力来解释这里发生的事情将非常感激。

1 个答案:

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

这里有两点需要注意:

  1. 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,则会看到缩小的大小。
  2. num_epochs=1这是队列的默认容量。这就是为什么我们在上面的输出中看到capacity=32而不是32