images, labels = tf.train.batch([image, label], batch_size=32, num_threads=4)
我经常看到用num_threads
创建的队列,并且据说这些线程用于入队操作。我不太了解为入队设置多个线程的目的,因为我看到它的方式,排队只是在队列的末尾放置一个值。
答案 0 :(得分:1)
来自Threading and Queues tutorial:
例如,典型的输入架构是使用a
RandomShuffleQueue
为培训模型准备投入:
- 多个线程准备培训示例并将其推入队列。
- 训练线程执行使小批量队列出局的训练操作 从队列中。
TensorFlow Session对象是多线程的,因此有多个线程 可以轻松使用相同的会话并并行运行操作。
这个想法是数据管道通常是I / O密集型的:数据可以从磁盘中获取,甚至可以从网络流式传输。 GPU 很可能不是计算中的瓶颈,仅仅是因为数据没有足够快地输入以使其饱和。
在多个线程中读取解决了这个问题:当一个线程正在等待I / O任务时,另一个线程已经有一些GPU的数据。处理此数据时,希望第一个线程接收并准备其批处理,依此类推。这就是tf.train.batch
,tf.train.shuffle_batch
和其他函数支持多线程数据处理的原因。设置num_threads = 1
会使批处理确定,但如果有多个线程,则无法保证队列中的数据顺序。