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

时间:2018-02-02 22:14:44

标签: tensorflow

我想知道我们是否可以在Tensorflow中培训当前批次时加载和预先存储下一批数据。

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

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

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

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 个答案:

答案 0 :(得分:1)

首先,您的代码无法执行。也许MVCE可以帮助人们更好地理解您的问题。

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

  1. 程序在CPU中启动。那么问题很简单。我注意到您可能正在使用feed_dict来加载数据。还有另外两种加载数据的方法,请参阅here。您可以尝试使用tf.train.QueueRunnerQueueRunner的某些包装函数来预取数据,它可能适用于您的问题。看到链接,你可以找到一切。但至少对我来说,需要做出一些努力来理解这种机制。

  2. 如果程序是在GPU中启动的。然后,您遇到的问题可能与CPU和GPU之间的通信有关,请参阅Tensorflow hereanswer的建议以解释原因。但我认为您的情况中的问题可以通过QueueRunner来解决。