因为我有40GB的图像数据集,所以在keras中一次只能在内存中加载一个批处理。
如果数据集很小,我可以使用ImageDataGenerator生成批次,但是由于大型数据集,我无法将所有图像加载到内存中。
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中完成此任务。
答案 0 :(得分:23)
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 Sequence。这是一个更多的工作,但如果你要进行多线程处理,他们建议使用它。