images, labels = tf.train.batch([image, label], batch_size=32, num_threads=4)
我经常看到一个用num_threads
创建的队列,线程被认为是用于入队操作的。我不太理解为入队设置多个线程的目的,因为在我看来,入队只是将一个值放在队列的末尾。
发布于 2018-02-10 15:27:40
来自Threading and Queues tutorial
例如,典型的输入架构是使用
RandomShuffleQueue
来准备用于训练模型的输入:
TensorFlow会话对象是多线程的,因此多个线程可以很容易地使用同一会话并并行运行操作。
这个想法是,数据管道通常是I/O密集型的:数据可以从磁盘获取,甚至可以从网络流式传输。GPU很有可能不会成为计算中的瓶颈,原因很简单,因为数据馈送的速度不够快,无法使其饱和。
多线程读取解决了这个问题:当一个线程正在等待I/O任务时,另一个线程已经有了一些GPU的数据。在处理此数据时,第一线程有望接收并准备其批处理,依此类推。这就是为什么tf.train.batch
、tf.train.shuffle_batch
和其他函数支持多线程数据处理。设置num_threads = 1
使批处理具有确定性,但如果有多个线程,则不能保证队列中数据的顺序。
https://stackoverflow.com/questions/48721620
复制