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

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

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

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


обновление: Я закончил тем, что расширил класс DirectoryIterator для случая multilabel. Теперь вы можете установить атрибут "class_mode" в значение "multilabel" и предоставить словарь "multlabel_classes", который сопоставляет имена файлов на их этикетках. Код: https://github.com/tholor/keras/commit/29ceafca3c4792cb480829c5768510e4bdb489c5

2 ответов


вы можете написать пользовательский класс генератора, который будет считывать файлы из каталога и применять маркировку. Этот пользовательский генератор также может принимать экземпляр 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(), ...)

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


вы можете просто использовать 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 дизайн.