Keras:针对大型数据集批量加载图像

16

Keras可以一次只加载一个批次的数据,因为我的图像数据集大小为40GB。

如果数据集很小,我可以使用ImageDataGenerator生成批次,但由于数据集很大,我无法将所有图像都加载到内存中。

在Keras中是否有类似以下TensorFlow代码的方法:

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)

我正在使用这种方法在tensorflow中对输入进行序列化,但我不知道如何在Keras中实现此任务。


train_on_batch 是怎么样的呢? - desertnaut
1个回答

33

Keras模型中有一个名为fit_generator()的方法,它可以接受Python中的generator或Keras中的Sequence作为输入。

您可以像这样创建一个简单的生成器:

fileList = listOfFiles     

def imageLoader(files, batch_size):

    L = len(files)

    #this line is just to make the generator infinite, keras needs that    
    while True:

        batch_start = 0
        batch_end = batch_size

        while batch_start < L:
            limit = min(batch_end, L)
            X = someMethodToLoadImages(files[batch_start:limit])
            Y = someMethodToLoadTargets(files[batch_start:limit])

            yield (X,Y) #a tuple with two numpy arrays with batch_size samples     

            batch_start += batch_size   
            batch_end += batch_size

并适合于这样:

model.fit_generator(imageLoader(fileList,batch_size),steps_per_epoch=..., epochs=..., ...)

通常,您需要将从生成器中获取的批次数传递给steps_per_epoch参数。

您也可以实现自己的Keras序列。这需要更多的工作,但如果您打算进行多线程处理,则建议使用它。


2
如果您有一个相同大小的图像列表,您可以使用 X = np.array(X) - Daniel Möller
2
它必须是4D的:(50, 256, 256, 3),例如RGB图像。或者对于灰度图像是(50, 256, 256, 1) - Daniel Möller
2
是的,对于传统的自编码器,您可以使用 yield (x,x) - Daniel Möller
@DanielMöller 你如何添加验证训练集? - henry
@DanielMöller 非常感谢您的回答!因此,我可以简单地重复使用相同的生成器,但加载一个验证数据集。 - henry
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接