1. 程式人生 > >tensorflow-佇列(4)

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: 操作名字(可選)
返回:

出列的連線張量的列表。