tensorflow多线程之Queue的小总结

只总结一下用的最多的先进先出队列FIFOQueue吧,其他队列一样,只不过出队的数据次序不同罢了。
队列的性质,数据结构课程都会讲到,不在重复总结,TF为此结构准备了四个常用操作以符合队列的性质:
FIFOQueue.enqueue():单个数据元素入队
FIFOQueue.enqueue_many():多个元素批量入队
FIFOQueue.dequeue():单个数据元素出队
FIFOQueue.dequeue_many():多个元素批量入队

Queuel类型的基操就是
1.建立一个Queue对象
2.用此对象出入队列元素
简单示例:

import tensorflow as tf
q = tf.FIFOQueue(3, "float")#第一个参数为队列的元素数量,所谓的队列容量,第二个参数是队列元素的类型,定义方式千奇百怪,有'float','tf.float32',['float']等,经过小范围测试,貌似没啥区别
init = q.enqueue_many(([0,0,0],))
x = q.dequeue()
y = x+1
q_inc = q.enqueue(y)
with tf.Session() as sess:
    init.run()
    q_inc.run()
    q_inc.run()
    q_inc.run()
    print(x.eval())  # 返回1
    print(x.eval())  # 返回2
    print(x.eval())  # 返回3

上面的代码输出:
1.0
1.0
1.0

这个代码比较费解的就是enqueue_many的第一个参数。总结一下个人的经验:这个参数必须为元组,列表类型,enqueue_many函数会读取元组的第一个元素(下标为0)作为待入队的数据集作为入队数据,数据可以是实数,也可是张量,所以元组内可以没有第二个元素,但是代表第二个元素的位置必须保留,这就是逗号保留的意义。(可以在IDE中打开enqueue_many函数的implementation追根溯源看看)
如上例,函数将[0,0,0]里面的三个元素作为入队的数据。
现在我们假设要入队的数据不是实数,而是三个1维的张良:[0,0,0][1,1,1][2,2,2]。可以参照上面的规则构造出下面的格式:([ [0,0,0],[1,1,1],[2,2,2] ],),函数调用形式就是:
init = q.enqueue_many(([[0,0,0],[1,1,1],[2,2,2]],))
修改后的完整代码如下:

import tensorflow as tf

q = tf.FIFOQueue(3, "float")
init = q.enqueue_many(([[0,0,0],[1,1,1],[2,2,2]],))
'''
或者这么写:
d0=[0,0,0]
d1=[1,1,1]
d2=[2,2,2]
init = q.enqueue_many(([d0,d1,d2],))
'''
x = q.dequeue()
y = tf.add(x,1)
q_inc = q.enqueue(y)
with tf.Session() as sess:
    init.run()
    q_inc.run()
    q_inc.run()
    q_inc.run()
    print(x.eval())  # 返回1
    print(x.eval())  # 返回2
    print(x.eval())  # 返回3

运行代码输出如下:
[1. 1. 1.]
[2. 2. 2.]
[3. 3. 3.]

注意:上述代码会在如下情况下挂起:
1.队列满,但是仍在入队
2.队列空但是仍在出队
为了验证,可以把队列的容量改为2试试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值