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 количество партий, которые вы будете принимать от генератора.

вы также можете реализовать свой собственный Керрас Последовательности. Это немного больше работы, но они рекомендуют использовать это, если вы собираетесь сделайте многопоточную обработку.