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)