2016-10-22 39 views
1

對於性能監控,我想關注當前排隊的示例。我正在平衡用於填充隊列的線程數量和隊列的最優最大大小。 如何獲取此信息?我正在使用tf.train.batch(),但我猜這些信息可能在FIFOQueue的某個地方? 我會期望這是一個局部變量,但我沒有找到它。Tensorflow - 獲取隊列中的樣本量?

回答

4

tldr:如果您的隊列由創建,您可以用sess.run("batch/fifo_queue_Size:0")

一個FIFOQueue對象提供了size()方法,它創建一個運算,讓在隊列中的元素數量獲得規模。但是,如果您使用的是,則在該方法內部會創建FIFOQueue,並且該對象不會在外部公開。

尤其是你input.py

queue = _which_queue(dynamic_pad)(
    capacity=capacity, dtypes=types, shapes=shapes, shared_name=shared_name) 
print("Enqueueing: ", enqueue_many, tensor_list, shapes) 
_enqueue(queue, tensor_list, num_threads, enqueue_many) 
summary.scalar("queue/%s/fraction_of_%d_full" % (queue.name, capacity), 
       math_ops.cast(queue.size(), dtypes.float32) * 
       (1./capacity)) 

看到這一點,因爲queue是本地的,你不能得到它的size()方法的保持。但是,由於size()已被調用以構建摘要,因此圖中可以使用相應的size op,您可以按名稱調用它。你可以做這樣的事情

x = tf.constant(1) 
q = tf.train.batch([x], 2) 
tf.get_default_graph().as_graph_def() 

找到節點的名稱,您將看到

node { 
    name: "batch/fifo_queue_Size" 
    op: "QueueSize" 
    input: "batch/fifo_queue" 
    attr { 
    key: "_class" 
    value { 
     list { 

從這裏就可以告訴大家,batch/fifo_queue_Size是運算的名稱,因此batch/fifo_queue_Size:0是名第一輸出的,所以你可以做這樣的事情得到大小:

sess.run("batch/fifo_queue_Size:0") 

如果您有多個batch OPS,該名稱將被引渡omatically重複數據刪除到batch_1/fifo_queue_Sizebatch_2/fifo_queue_Size

或者你可以打電話給你的節點與tf.batch(...name="mybatch")然後張的名字將是mybatch/fifo_queue_Size:0

+0

優秀的寫了。也完全錯過批量內的標量總結 - 這是因爲我不做'merge_all_summaries',而是從我自己的範圍中獲取它們。謝謝你的時間雅羅斯拉夫。 – TimZaman