1. 程式人生 > >tensorflow-隊列(5)

tensorflow-隊列(5)

list 生成 使用 start 導致 numpy 行為 with implement

dequeue_up_to
?

dequeue_up_to(
? ? n,
? ? name=None
)

從這個隊列中取出並連接n個元素。

註意,不是所有隊列都支持此操作。如果隊列不支持DequeueUpTo,則出現tf.errors.UnimplementedError。

這個操作沿著第0維串聯隊列元素分量張量,形成單個分量張量。如果隊列沒有被關閉,那麽在隊列元組中的所有組件的大小都是第0維的n。

如果隊列是關閉的,並且有大於0但小於n個元素,那麽將立即返回小於n個元素,而不是像tf.QueueBase.dequeue_many那樣引發tf.error . outofrangeerror。。如果隊列是關閉的,並且隊列中還剩下0個元素,那麽tf.errors.OutOfRangeError將像在dequeue_many一樣拋出,否則,該行為與dequeue_many是相同的。

參數:

n: 一個標量Tensro,包括需要出列的元素數量
name: 操作名字(可選)
返回:

被出隊的連接張量的元組。

enqueue
?
enqueue(
? ? vals,
? ? name=None
)

將一個元素放入這個隊列。

如果執行此操作時隊列已滿,它將阻塞,直到元素被加入隊列。

在運行時,如果隊列是?tf.QueueBase.close,則此操作可能引發錯誤。隊列在執行之前或執行期間關閉,tf.errors.CancelledError將觸發。如果這個操作被阻塞,或者(i)隊列被cancel_pending_enqueues=True的關閉操作關閉或(ii)會話是tf.Session.close、tf.errors。tf.errors.CancelledError錯誤將被提升。

參數:

vals: 張量,張量的列表或元組,或包含要加入的值的字典。
name: 操作的名稱(可選)。
返回:

將新的張量元組排隊到隊列中的操作。

enqueue_many
?
enqueue_many(
? ? vals,
? ? name=None
)

將零個或多個元素放入此隊列。

這個操作沿著第0維對每個分量張量進行切片,以生成多個隊列元素。vals中的所有張量在第0維上必須具有相同的大小。

如果執行此操作時隊列已滿,它將阻塞,直到所有元素都已加入隊列。

在運行時,如果隊列是tf.QueueBase.close,則在執行之前或執行期關閉此操作可能引發錯誤。如果在此操作運行之前關閉隊列,tf.errors.CancelledError觸發。如果這個操作被阻塞,或者(i)隊列被cancel_pending_enqueues=True的關閉操作關閉,或者(ii)會話是tf.Session.close、tf.errors,tf.errors.CancelledError?錯誤將被觸發。

參數:

vals: 一個tensor,tensors元組的列表或從中取隊列元素字典。
name: 操作名字(可選)
返回:

入一批tensors元組到隊列的操作

from_list
?
from_list(
? ? index,
? ? queues
)

使用queues[index]中的隊列引用創建一個隊列。

參數:

queues:一個整數標量張量,它決定選擇的輸入。
queues:QueueBase對象的列表。
返回:

一個QueueBase對象。

Raises:

TypeError: 當隊列不是QueueBase對象的列表時,或者當隊列的數據類型不完全相同時。

is_closed
is_closed(name=None)

如果隊列關閉,返回true。

如果隊列是關閉的,此操作返回true;如果隊列是打開的,則返回false。

參數:

name: 操作名字(可選)
返回:

如果隊列是關閉的,為True;如果隊列是打開的,為false。

size
?
size(name=None)

計算這個隊列中的元素數量。

參數:

name: 操作的名稱(可選)。
返回:

一個標量張量,包含這個隊列中的元素數量。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Thu Sep  6 10:16:37 2018
@author: myhaspl
@email:[email protected]
"""

import tensorflow as tf

q=tf.RandomShuffleQueue(capacity=10,min_after_dequeue=2,dtypes="float")

with tf.Session() as sess:    
    for i in range(0,10):
        sess.run(q.enqueue(i))
    for i in range(0,8):
        print sess.run(q.dequeue())

4.0
5.0
8.0
7.0
3.0
0.0
2.0
1.0


#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Thu Sep  6 10:16:37 2018
@author: myhaspl
@email:[email protected]
"""

import tensorflow as tf

q=tf.RandomShuffleQueue(capacity=20,min_after_dequeue=2,dtypes="float")

with tf.Session() as sess:    
    for i in range(0,12):
        sess.run(q.enqueue(i))
    for i in range(0,12):
        print sess.run(q.dequeue())

因為需要保留2個元素,所以最後2個元素無法出列,導致阻塞

10.0
11.0
2.0
7.0
4.0
6.0
3.0
1.0
8.0
0.0
使用隊列管理器


#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Thu Sep  6 10:16:37 2018
@author: myhaspl
@email:[email protected]
"""

import tensorflow as tf
import numpy as np

q=tf.RandomShuffleQueue(capacity=200,min_after_dequeue=2,dtypes="float")

counter=tf.Variable(0.)
increment_op=tf.assign_add(counter,tf.constant(1.0))
enqueue_op=q.enqueue([counter])

init=tf.global_variables_initializer()
qr=tf.train.QueueRunner(q,enqueue_ops=[increment_op,enqueue_op]*1)
#主線程
with tf.Session() as sess: 
    sess.run(init)
    enqueue_threads=qr.create_threads(sess,start=True)#啟動入隊線程
    for i in range(0,10):
        print sess.run(q.dequeue())

6.0
12.0
20.0
27.0
36.0
49.0
57.0
66.0
76.0
81.0

隊列沒能按我們期待的自然數列輸出,且線程被阻斷。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Thu Sep  6 10:16:37 2018
@author: myhaspl
@email:[email protected]
"""

import tensorflow as tf
import numpy as np

q=tf.RandomShuffleQueue(capacity=200,min_after_dequeue=2,dtypes="float")
#x=np.random.randint(100,size=100)
counter=tf.Variable(0.)
increment_op=tf.assign_add(counter,tf.constant(1.0))
enqueue_op=q.enqueue([counter])

init=tf.global_variables_initializer()
qr=tf.train.QueueRunner(q,enqueue_ops=[increment_op,enqueue_op]*1)
#主線程
with tf.Session() as sess: 
    sess.run(init)
    coord=tf.train.Coordinator()#協調器,協調線程間的關系。
    enqueue_threads=qr.create_threads(sess,coord=coord,start=True)#啟動入隊線程
    for i in range(0,10):
        print sess.run(q.dequeue())
    coord.request_stop()#通知其它線程關閉
    coord.join(enqueue_threads)#關閉其它線程後,合並到主線程

4.0
15.0
24.0
36.0
46.0
57.0
68.0
78.0
89.0
98.0

tensorflow-隊列(5)