当计算gpu时,有没有办法并行加载数据?

时间:2017-10-27 03:02:29

标签: python tensorflow deep-learning keras conv-neural-network

我正在使用带有张量流的keras进行深度学习。我使用稍大的数据集(图像),因此我无法一次加载整个数据集,而是加载批量的8000个图像,并使用model.fit()进行训练(下面的代码片段)。

for epochs in range(50): # number of epochs
    for i in range(num_batches): # 5 batches with 8000 images each
        #### load the data here (train, val)
        history_train = model.fit(train_image, train_gt, batch_size=16, epochs=1, verbose=1, shuffle=False, validation_data=(val_image,val_gt))
        if history_train.history['val_loss'][0] < total_val_loss:
            model.save_weights(weights_file)
            total_val_loss = history_train.history['val_loss'][0]

当然不是一种有效的方法。加载批次(8000张图像)需要花费大量时间,而不是学习时间(每个时期的运行时间)。有没有更好的方法可以做到这一点?或任何其他方式来优化它?我可以在计算(GPU)完成时并行加载数据(下一个纪元),这样我可以节省加载时间吗?

2 个答案:

答案 0 :(得分:1)

是的,您可以使用fit_generator代替fit并传递参数use_multiprocessing=Trueworkers=n(其中n是工作线程数)来执行此操作。要加载数据集,您需要创建一个生成每个批次的生成器方法。它应该看起来像这样(我假设你的输入数据集是一个四维形状的数组(num_images,高度,宽度,通道),所以根据需要进行调整):

def generator(dataset_x, dataset_y):
    while True:
        for i in range(num_batches):
            yield dataset_x[i*8000:(i+1)*8000, :, :, :], dataset_y[i*8000:(i+1)*8000, :]

请注意,这将返回大小为8000的批次 - 您可能需要使用另一个返回批量大小(例如16)的循环将其减少更多。 并且为了训练模型:

history_train = model.fit_generator(generator=generator, steps_per_epoch=5, epochs=50, use_multiprocessing=True, workers=16, validation_data=val_generator, validation_steps=5)

您可能想要生成2个生成器:一个用于训练数据,另一个用于验证数据。此外,Keras可能会向您发出有关对多个工作程序使用多处理的警告 - 您应该通过封装它们或使用keras.utils.Sequence使您的生成器成为线程安全的(在Keras文档中有关于此的更多信息)。

答案 1 :(得分:0)

我有40GB的数据集,所以我可以在内存中加载所有图像。因此,我必须批量加载。生成器在这里将数据集拆分为&#39; N&#39;批次数,但需要在内存中加载图像。

keras中是否有任何方法可以执行类似于以下张量流代码的操作:

path_queue = tf.train.string_input_producer(input_paths, shuffle= False)
paths, contents = reader.read(path_queue)
inputs = decode(contents)
input_batch = tf.train.batch([inputs], batch_size=2)

我正在使用此方法序列化张量流中的输入,但我不知道如何在Keras中完成此任务。