Keras ImageDataGenarator: Несоответствие в параметре функций потока

Я борюсь с увеличением изображения в Керасе.

Концепция, в которой я определяю ImageDataGenerator для изменения данных и функцию потока для ее применения к данным, мне (или кажется) ясна.

Но почему функции потока (flow, flow_from_dataframe, flow_from_directory) отличаются друг от друга? Их цель мне ясна: они обрабатывают данные из разных типов источников.

Я имею в виду разницу в параметрах для прохождения. Особенно мне на ум приходит одно отличие: для потока (где я увеличиваю данные, которые уже загружены)

У меня нет возможности указать механизм интерполяции. Но разве я не нуждаюсь в этом тогда?

3 ответа

Решение

Спасибо за все ваши сообщения и комментарии. К сожалению, ни один из опубликованных ответов не относится полностью к моему вопросу. Я провел небольшое исследование, просмотрел весь код Keras и нашел ответ, с которым теперь могу работать.

Я думаю, документация Keras немного сбила меня с толку. Я неверно истолковал аргумент interpolation из flow_from_directory() а также flow_from_directory() метод. Мысль, что это также используется для увеличения изображения. В документации это должно быть указано более четко.

Во-первых, точка Карла действительна. Каждая из этих функций больше подходит для определенного объема данных и источника, откуда их взять. Здесь начинается интерполяция, где это применяется только к загруженным изображениям. Для изображений, обработанных с flow Функция предполагает, что эти изображения уже имеют желаемый размер изображения. Следовательно, это должно быть сделано заранее.

fill_mode Параметр также не работает для интерполяции, поскольку он предназначен только для установки виртуального пикселя вокруг фактического изображения, чтобы выполнить аффинное преобразование.

Вы выбираете подходящую функцию потока в зависимости от того, сколько у вас есть данных и как вы их организовали.

flow() для небольших наборов данных, которыми вы можете полностью управлять в памяти.

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

flow_from_dataframe() будет читать файлы и метки, как указано в панде DataFrame. Эта функция добавлена ​​совсем недавно и является наиболее гибким выбором, поскольку вы можете хранить одну копию своих файлов, используя любую структуру каталогов, которую вы предпочитаете, и вы можете сгенерировать свой DataFrame из метаданных, хранящихся в виде файла CSV, базы данных, или любой другой метод, который поддерживает панда.

Поток обычно используется вместе с классом ImageDataGenerator

Где конвейер дополнения в целом основан на объекте ImageDataGeneration, который имеет аргумент fill_mode= 'nearest' - так вы сможете определить свой механизм интерполяции.

Смотрите рабочий пример из документации здесь:

(x_train, y_train), (x_test, y_test) = cifar10.load_data()
y_train = np_utils.to_categorical(y_train, num_classes)
y_test = np_utils.to_categorical(y_test, num_classes)

datagen = ImageDataGenerator(
    featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True,
    fill_mode= 'nearest')

datagen.fit(x_train)

# fits the model on batches with real-time data augmentation:
model.fit_generator(datagen.flow(x_train, y_train, batch_size=32),
                    steps_per_epoch=len(x_train) / 32, epochs=epochs)
Другие вопросы по тегам