Keras ImageDataGenarator: Несоответствие в параметре функций потока - PullRequest
0 голосов
/ 14 января 2019

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Поток обычно используется вместе с классом 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)
0 голосов
/ 15 января 2019

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

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

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

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

0 голосов
/ 14 января 2019

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

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

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

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

...