如何在 Tensorflow 中并行加载/预处理批处理数据和训练?



我想知道我们是否可以在 Tensorflow 中训练当前批次时加载和预拥有下一个批处理数据。

我的模型需要从不同的源加载多个图像,并为每个训练操作做一些预处理,整个过程非常慢。我的计算机加载/处理一批训练数据需要 1.4 秒,在 GPU 上训练需要 1.6 秒。我在想是否有一种方法可以让我在训练期间加载下一批数据,从而我可以显着加速训练过程。

顺便说一句,我已经在多线程处理我的预处理功能。

在训练阶段,我的代码的简化版本粘贴在下面:

with tf.Session as sess:
......
......
while step < max_global_step:
......
......
#This line takes 1.4 seconds to execute
images_batch = load_batch_data(*batch_image_paths)
feed = {train_batch, images_batch}
#This line takes bout 1.6 seconds to run
loss, summary, step= sess.run([loss, summary, global_step], feed_dict=feed)
......
......
......
......

所以一般来说,程序将花费 1.4 秒运行images_batch = load_batch_data(*batch_image_paths)和 1.6 秒运行loss, summary, step= sess.run([loss, summary, global_step], feed_dict=feed)

直觉告诉我,应该有某种方法可以为我读取数据并将其放入缓冲区 0 并使用缓冲区 1 中的数据馈送到网络并使用缓冲区 1 中的数据馈送到网络中并切换缓冲区,但如何实现呢?

或者,在像我这样的情况下,有什么方法可以提高总培训成本吗?

首先,你的代码是不可能执行的。也许MVCE可以帮助人们更好地理解你的问题。

要回答您的问题,有两种可能性:

  1. 该程序在 CPU 中启动。那么问题就很简单了。我注意到您可能正在使用feed_dict来加载数据。还有另外两种加载数据的方法,请参阅此处。您可以尝试使用tf.train.QueueRunner或一些包装的QueueRunner函数来预取数据,它可能非常适合您的问题。查看链接,您可以找到所有内容。但至少对我来说,需要一些努力来理解这种机制。

  2. 如果程序在 GPU 中启动。那么你遇到的问题可能与CPU和GPU之间的通信有关,请参阅Tensorflow的建议 这里 以及解释原因的答案。但我认为你情况的问题可以通过QueueRunner来解决.

最新更新