【tensorflow】文件队列的两种创建和加载方式

来源:互联网 发布:南京网络作家协会 编辑:程序博客网 时间:2024/06/01 10:20
方式1:内存加载
①创建队列: queue=tf.FIFOQueue(...) or queue=tf.RandomShuffleQueue(...)
②添加enqueue op: enqueue=tf.enqueue(xxx) or enqueue=tf.enqueue_many([xxx])
③手动添加queue runner: qr=tf.train.QueueRunner(queue,enqueue*thread)
④异步启动qunue runner: thread=qr.create_threads(sess,corrd,start=True)  


说明:
1) corr=tf.train.Coordinator()用于线程之间协调,通过发送coord.request_stop()和接收corrd.should_stop()同步结束,用coord.join(thread)等待副线程的op执行完毕
2) thread会循环执行



方式2:文件加载
①创建文件名队列并加载: name_queue=tf.train.string_input_producer(list,epoch,...) or name_queue=tf.train.slice_input_producer([lists],epoch,...)
②读取并解码文件名队列对应的文件: contents=tf.read_file(name_queue),用decoded_contents=tf.image.decode_xxx(contents)解码
③创建文件队列并加载批次: batch=tf.train.batch(decoded_contents,...) or batch=tf.train.shuffle_batch(decoded_contents,...)
④启动线程: thread=tf.train.start_queue_runners(corrd)


说明:
1) tf.train.string_input_producer()和tf.train.batch()中隐含了queue runner的创建和enqueue op的创建
2) tf.train.start_queue_runners()中隐含了多个qr.create_threads()
3) 异步线程加载name_queue时,根据num_epoches参数循环
4) tf.train.string_input_producer()输入tensor list,返回queue tensor;tf.train.slice_input_producer()输入list of tensor list,返回list of queue tensor