Как вручную указать метки классов в keras flow_from_directory?

Проблема: я обучаю модель распознаванию изображений с несколькими метками. Поэтому мои изображения связаны с несколькими метками y. Это противоречит удобному методу keras "flow_from_directory" ImageDataGenerator, где каждое изображение должно находиться в папке соответствующей метки (https://keras.io/preprocessing/image/).

Временное решение. В настоящее время я считываю все изображения в массиве numpy и использую оттуда функцию "потока". Но это приводит к большой загрузке памяти и медленному процессу чтения.

Вопрос: Есть ли способ использовать метод "flow_from_directory" и вручную указать (несколько) меток классов?


Обновление: в итоге я расширил класс DirectoryIterator для использования с несколькими метками. Теперь вы можете установить атрибут «class_mode» на значение «Multilabel» и предоставить словарь «multlabel_classes», который сопоставляет имена файлов с их метками. Код: https://github.com/tholor/keras/commit/29ceafca3c4792c5685488485808985


comment
flow_from_directory предполагает, что изображения разделены между каталогами, а имя каждого каталога является целью. Общая идея Keras состоит в том, чтобы упростить использование (по сравнению с TF и ​​Theano), но это связано с отсутствием настройки. Вы не должны загружать все изображения в память, вместо этого создавайте каталоги, которые представляют различные классы и хранят соответствующие изображения внутри. Взгляните на очень красивый учебник Ф. Шолле: blog.keras.io/   -  person thecheech    schedule 29.03.2017
comment
Хранение изображений в каталогах, представляющих различные классы, в ситуации с несколькими ярлыками нецелесообразно. Имея 100 классов и 1-6 классов на изображение, возможные комбинации уже огромны. Если нет другого обходного пути, я, вероятно, расширю класс DirectoryIterator в keras / preprocessing / image.py   -  person Malte    schedule 29.03.2017
comment
Отличное исправление. Вы создали для этого пулреквест? Я думаю, что это то, что разработчики могли бы / должны подумать о добавлении.   -  person gaw89    schedule 03.04.2017
comment
Я только что создал запрос на перенос: github.com/fchollet/keras/pull/6128   -  person Malte    schedule 03.04.2017


Ответы (3)


Вы можете написать собственный класс генератора, который будет считывать файлы из каталога и применять маркировку. Этот настраиваемый генератор также может принимать экземпляр ImageDataGenerator, который будет создавать пакеты с помощью flow ().

Я представляю себе что-то вроде этого:

class Generator():

    def __init__(self, X, Y, img_data_gen, batch_size):
        self.X = X
        self.Y = Y  # Maybe a file that has the appropriate label mapping?
        self.img_data_gen = img_data_gen  # The ImageDataGenerator Instance
        self.batch_size = batch_size

    def apply_labels(self):
        # Code to apply labels to each sample based on self.X and self.Y

    def get_next_batch(self):
        """Get the next training batch"""
        self.img_data_gen.flow(self.X, self.Y, self.batch_size)

Тогда просто:

img_gen = ImageDataGenerator(...)
gen = Generator(X, Y, img_gen, 128)

model.fit_generator(gen.get_next_batch(), ...)

* Отказ от ответственности: я на самом деле не тестировал это, но теоретически это должно работать.

person gaw89    schedule 29.03.2017
comment
Вам также может понадобиться while True: ... в методе get_next_batch (), поскольку ожидается, что генератор будет предоставлять данные в бесконечном цикле. - person gaw89; 30.03.2017

Вы можете просто использовать flow_from_directory и расширить его до мультикласса следующим образом:

def multiclass_flow_from_directory(flow_from_directory_gen, multiclasses_getter):
    for x, y in flow_from_directory_gen:
        yield x, multiclasses_getter(x, y)

Где multiclasses_getter назначает мультиклассовый вектор / ваше мультиклассовое представление вашим изображениям. Обратите внимание, что x и y - это не отдельные примеры, а наборы примеров, поэтому это должно быть включено в ваш multiclasses_getter дизайн.

person Marcin Możejko    schedule 29.03.2017
comment
Разве вы не имеете в виду Multilabel_flow_from_directory и Multilabeles_getter? - person traveh; 24.01.2018

# Training the model
history = model.fit(train_generator, steps_per_epoch=steps_per_epoch, epochs=3, validation_data=val_generator,validation_steps=validation_steps, verbose=1,
                    callbacks= keras.callbacks.ModelCheckpoint(filepath='/content/results',monitor='val_accuracy', save_best_only=True,save_weights_only=False))

validation_steps или steps_per_epoch могут превышать исходные параметры.

steps_per_epoch= (int(num_of_training_examples/batch_size) может помочь. Аналогично validation_steps= (int(num_of_val_examples/batch_size) поможет

person rushikesh chopade    schedule 03.08.2020
comment
Добро пожаловать в Stack Overflow. См. Как написать хороший ответ?. В частности, позаботьтесь о том, чтобы правильно отформатировать разделы кода и объяснить, как включенный код отвечает / решает вопрос OP. - person Ivo Mori; 03.08.2020