tensorflow-队列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tensorflow-队列相关的知识,希望对你有一定的参考价值。
#!/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: 操作名字(可选)
返回:
出列的连接张量的列表。
以上是关于tensorflow-队列的主要内容,如果未能解决你的问题,请参考以下文章