Keras: загружать изображения пакетным способом для большого набора данных

В keras можно загружать только одну партию в памяти за один раз, так как у меня есть 40-гигабайтный набор данных.

Если набор данных мал, я могу использовать 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)

Я использую этот метод для сериализации входных данных в тензорном потоке, но я не знаю, как достичь этой задачи в Keras.

Ответ 1

В своих моделях fit_generator() имеет метод fit_generator(). Он принимает питон 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

Как бы вы внедрили обучение и валидацию по этому вопросу. model.fit_generator (imageLoader (fileList, batch_size), steps_per_epoch =..., epochs =...,...) Получает входные данные в виде всего файла. Как я могу разделить это на обучение и проверку?