2017-08-31 58 views
0

爭取做對tf.train.string_input_producer(R1.3)創建,但有望獲得的大小時,剛剛獲得零尺寸的隊列的大小健全性檢測3種TensorFlow字符串輸入監製尺寸()

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)) 

雖然大小不再是零,大小前提不是兩個而是改變s每次代碼運行時。

我覺得大小是一件簡單的事情,但也許這只是不與data_flow_ops.FIFOQueue交互的方式。任何洞察力來解釋這裏發生的事情將不勝感激。

回答

1

這是隊列由隊列填充隊列的異步特性的人工產物。試試這個代碼:

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 
) 

兩個主要的事情,這裏要注意:

  1. num_epochs=None手段不斷迭代的項目列表上永遠。遍歷列表只需設置一次num_epochs=1。您還需要致電sess.run(tf.local_variables_initializer())。使用num_epochs=1如果在出隊後運行大小操作,您將看到大小減小。
  2. capacity=32這是隊列的默認容量。這就是爲什麼我們在上面的輸出中看到32而不是3
+0

謝謝,這真的很有幫助,對TF文檔來說是很好的補充。 –