tensorflow-佇列(4)
#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Thu Sep 6 10:16:37 2018 @author: myhaspl """ import tensorflow as tf n = 100 xQueue=tf.FIFOQueue(100,dtypes=[tf.int32],shapes=[]) with tf.Session() as sess: for i in xrange(n): if i%3==0: sess.run(xQueue.enqueue(i)) sess.run(xQueue.close()) myx=sess.run(xQueue.dequeue_up_to(100)) print myx print sum(myx)
使用close後,再使用dequeue_up_to,不會有阻塞
[ 0 3 6 ... 93 96 99]
1683
但下面程式會報錯
#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Thu Sep 6 10:16:37 2018 @author: myhaspl """ import tensorflow as tf n = 100 xQueue=tf.FIFOQueue(100,dtypes=[tf.int32],shapes=[]) with tf.Session() as sess: for i in xrange(n): if i%3==0: sess.run(xQueue.enqueue(i)) sess.run(xQueue.close()) myx=sess.run(xQueue.dequeue_many(100)) print myx print sum(myx)
OutOfRangeError (see above for traceback): FIFOQueue '_2_fifo_queue_2' is closed and has insufficient elements (requested 100, current size 34)``
Class RandomShuffleQueue
繼承自: QueueBase
以隨機順序從元素中取出佇列的佇列類。
屬性
dtypes
佇列元素中每個元件的dtypes列表。
name
底層佇列的名字
names
佇列元素每個元件的名字列表
queue_ref
底層佇列的引用
shapes
佇列元素中每個元件的形狀列表。
方法
init
init(
capacity,
min_after_dequeue,
dtypes,
shapes=None,
names=None,
seed=None,
shared_name=None,
name='random_shuffle_queue'
)
建立一個以隨機順序從元素中取出元素的佇列。
隨機佇列具有有限的容量;支援多個併發生產者和消費者;並提供正確的一次傳遞。
RandomShuffleQueue則包含容量最大元素的列表。每個元素都是一個定長張量元組,其dtype由dtypes描述,其形狀可由shapes描述。
如果指定了shapes引數,那麼佇列元素的每個元件必須具有各自的固定形狀。如果沒有指定,不同的佇列元素可能有不同的形狀,但是不允許使用dequeue_many。
min_after_dequeue引數允許呼叫者指定在dequeue_many操作完成後留在佇列中的元素的最小數量,以確保元素的最小混合級別。通過阻塞這些操作來維護這個不變式,直到有足夠的元素被加入佇列。在佇列關閉後,min_after_dequeue引數將被忽略。
引數:
capacity:一個整數 ,可能儲存在此佇列中的元素數量的上限。
min_after_dequeue: 一個整數
dtypes: DType物件的列表。dtypes的長度必須等於每個佇列元素中的張量的數量。
shapes: (Optional.) (可選)與dtype長度相同或沒有長度相同的完整定義的TensorShape物件列表。
names: (Optional.) (可選)。與dtypes或None長度相同的佇列中元件的字串列表。如果指定了dequeue方法,則返回一個名稱為鍵的字典。
seed: 用於建立隨機種子。看到tf.set_random_seed 行為。
shared_name: (Optional.) (可選)。如果不是空的,這個佇列將在多個會話之間以給定的名稱共享。
名稱:
name: 佇列操作的可選名稱。
close
close(
cancel_pending_enqueues=False,
name=None
)
關閉此佇列。
這個操作表明沒有更多的元素將被放入給定佇列中。隨後的入佇列和入佇列很多操作都會失敗。如果佇列中仍然有足夠的元素,後續的dequeue_many操作將繼續成功。隨後,將阻塞等待更多元素(如果沒有呼叫close)的dequeue和dequeue_many操作將立即失敗。
如果cancel_pending_enqueues為真,所有未決請求也將被取消。
引數:
cancel_pending_enqueues: (可選)。一個布林值,預設為False(如上所述)。
name: 操作的名稱(可選)。
返回:
關閉佇列的操作。
dequeue
dequeue(name=None)
從這個佇列中取出一個元素。
如果執行此操作時佇列為空,它將阻塞,直到有一個元素要出佇列為止。
在執行時,如果佇列是tf.QueueBase.close,在執行之前或執行期間則此操作可能引發錯誤。如果佇列是關閉的,佇列是空的,這裡沒有可以完成此請求的掛起出隊操作,將會出現tf.errors.OutOfRangeError。如果會話是tf.Session.close、 tf.errors,tf.errors.CancelledError 錯誤將被觸發。
引數:
name: 操作名字(可選)
返回:
出隊的張量元組。
dequeue_many
dequeue_many(
n,
name=None
)
從這個佇列中取出並連線n個元素。
這個操作沿著第0維串聯排隊元素分量張量,形成單個分量張量。dequeue_tuple中的所有元件的大小都是第0維的n。
在執行時,如果佇列是tf.QueueBase,則此操作可能引發錯誤。在執行之前或執行期間關閉。如果佇列是關閉的,則該佇列包含的元素不超過n個,並且沒有可執行此請求tf.errors的掛起排隊操作。將會出現OutOfRangeError。如果會話是tf.Session.close,則tf.errors.CancelledError將觸發。
引數:
n: 一個標量Tensor,出列元素的數量
name: 操作名字(可選)
返回:
出列的連線張量的列表。