2018-04-05

           详解tensorflow数据读取机制

如何在tensorflow中创建上述的两个队列呢?
1.对于文件名队列,我们使用tf.train.string_input_producer函数。这个函数需要传入一个文件名list,系统会自动将它转为一个文件名队列.此外tf.train.string_input_producer还有两个重要的参数,一个是num_epochs,它就是我们上文中提到的epoch数。另外一个就是shuffle.
2.在tensorflow中,内存队列不需要我们自己建立,我们只需要使用reader对象从文件名队列中读取数据就可以了
3.在我们使用tf.train.string_input_producer创建文件名队列后,整个系统其实还是处于“停滞状态”的,也就是说,我们文件名并没有真正被加入到队列中。此时如果我们开始计算,因为内存队列中什么也没有,计算单元就会一直等待,导致整个系统被阻塞.而使用tf.train.start_queue_runners之后,才会启动填充队列的线程,这时系统就不再“停滞”。此后计算单元就可以拿到数据并进行计算,整个程序也就跑起来了,这就是函数tf.train.start_queue_runners的用处。


image
import tensorflow as tf 

# 新建一个Session
with tf.Session() as sess:
# 我们要读三幅图片A.jpg, B.jpg, C.jpg
filename = ['A.jpg', 'B.jpg', 'C.jpg']
# string_input_producer会产生一个文件名队列
filename_queue = tf.train.string_input_producer(filename, shuffle=False, num_epochs=5)
# reader从文件名队列中读数据。对应的方法是reader.read
reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)
# tf.train.string_input_producer定义了一个epoch变量,要对它进行初始化
tf.local_variables_initializer().run()
# 使用start_queue_runners之后,才会开始填充队列
threads = tf.train.start_queue_runners(sess=sess)
i = 0
while True:
    i += 1
    # 获取图片数据并保存
    image_data = sess.run(value)
    with open('read/test_%d.jpg' % i, 'wb') as f:
        f.write(image_data)

https://zhuanlan.zhihu.com/p/27238630

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • MachineLP阅读 317评论 0 0
  • 昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否,知否?应是绿肥红瘦。 ...
    蓝羽鱼阅读 269评论 0 1
  • 01 欧洲杯来了,男人们疯了,小A也疯了。 她说,只要有球赛,男朋友必定跟他的狐朋狗友出去浪。球赛又都集中在后半夜...
    草言阅读 2,549评论 2 0
  • 早在两个月前哲同学计划放寒假了骑车回老家――拾桥,从荆门到拾桥差不多70公里路,以为他只是说说而已,没在意。...
    胡胡_9e10阅读 136评论 2 2
  • 在日常生活中,我们常会看到诸多有关癌症治疗费用的新闻事件,很多患者因无力承担高昂的治疗费用,而放弃治疗,失去生命;...
    fb08048623c0阅读 1,388评论 0 0