我正在使用带有张量流的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)完成时并行加载数据(下一个纪元),这样我可以节省加载时间吗?
答案 0 :(得分:1)
是的,您可以使用fit_generator
代替fit
并传递参数use_multiprocessing=True
和workers=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中完成此任务。