Keras: низкая производительность с ImageDataGenerator - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь увеличить данные моего изображения, используя Keras ImageDataGenerator. Моя задача - это регрессионная задача, в которой входное изображение приводит к другому преобразованному изображению. Пока все хорошо, работает довольно хорошо.

Здесь я хотел применить увеличение данных с помощью ImageDataGenerator. Чтобы преобразовать оба изображения одинаково, я использовал подход, описанный в Keras docs , где описано преобразование изображения с соответствующей маской. Мой случай немного отличается, так как мои изображения уже загружены и их не нужно извлекать из каталога. Эта процедура уже была описана в другом посте StackOverlow .

Чтобы проверить мою реализацию, я сначала использовал ее без дополнения и использовал ImageDataGenerator без указания какого-либо параметра. Согласно справочному классу в Keras docs , это не должно изменять изображения. Посмотреть этот фрагмент:

img_val = img[0:split_seperator]
img_train = img[split_seperator:]

target_val = target[0:split_seperator]
target_train = target[split_seperator:]

data_gen_args = dict()

# define data preparation
src_datagen = ImageDataGenerator(**data_gen_args)
target_datagen = ImageDataGenerator(**data_gen_args)

# fit parameters from data
seed = 1
src_datagen.fit(img_train, augment=False, seed=seed)
target_datagen.fit(target_train, augment=False, seed=seed)

training_generator = zip(
    src_datagen.flow(img_train, batch_size=batch_size_training, seed=seed),
    target_datagen.flow(target_train, batch_size=batch_size_training, seed=seed))

_ = model.fit_generator(
    generator=training_generator,
    steps_per_epoch=image_train.shape[0] // batch_size_training,
    epochs=num_epochs, verbose=1,
    validation_data=(img_val, target_val), callbacks=callbacks)

К сожалению, у моей реализации, похоже, есть некоторые проблемы. Я не получаю ожидаемых выступлений. Потеря проверки как-то стабильна около определенного значения и лишь немного уменьшается (см. Изображение ниже). Здесь я ожидаю, так как я не использовал никакого дополнения, такую ​​же потерю, как и без расширенного базового уровня.

Comparisson of validation loss

Для сравнения, моя тренировка без ImageDataGenerator выглядит как

_ = model.fit(img, target,
              batch_size=batch_size_training,
              epochs=num_epochs, verbose=1,
              validation_split=0.2, callbacks=cb)

Полагаю, я как-то перепутал использование функций ImageDataGenerator, flow и fit. Итак, мои вопросы:

  • является одной из примененных функций fit или flow избыточной и вызывает такое поведение?
  • есть ли у меня проблема с реализацией?
  • имеет ли эта реализация вообще смысл?
  • имеет ли смысл устанавливать исправление набора проверки или его тоже нужно расширять?

Обновление (2019-01-23 и продолжение): Что я уже пробовал до сих пор (в ответах на ответы):

  • создание генератора и для данных проверки
  • удаление примененной функции подгонки
  • настройка shuffle=True в функции потока (данные уже перетасованы)

Ни один из этих подходов не помог улучшить результаты.

1 Ответ

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

Наконец, я понимаю, что вы пытаетесь сделать, это должно сделать работу.

aug = ImageDataGenerator(**data_gen_args)

# train the network
H = model.fit_generator(aug.flow(img_train, target_train, batch_size=image_train.shape[0]),
    validation_data=(img_val, target_val), steps_per_epoch=image_train.shape[0] // BS,
    epochs=EPOCHS)

Дайте мне знать, если это работает.

...