Keras: пакетная загрузка изображений для большого набора данных
в keras можно загружать только одну партию в память за раз, так как у меня есть набор данных 40GB изображений.
если dataset мал, я могу использовать 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, но я не знаю, как достичь этой задачи в Керрас.
1 ответов
Keras имеет метод fit_generator()
в своих моделях. Он принимает python generator
или керрас 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
количество партий, которые вы будете принимать от генератора.
вы также можете реализовать свой собственный Керрас Последовательности. Это немного больше работы, но они рекомендуют использовать это, если вы собираетесь сделайте многопоточную обработку.