Добавляет ли ImageDataGenerator больше изображений в мой набор данных?

Я пытаюсь сделать классификацию изображений с моделью Inception V3. Есть ли ImageDataGenerator из Keras создавать новые изображения, которые добавляются в мой набор данных? Если у меня есть 1000 изображений, будет ли эта функция удваивать ее до 2000 изображений, которые используются для обучения? Есть ли способ узнать, сколько изображений было создано и загружено в модель?

8 ответов

В каждую эпоху ImageDataGenerator применяет преобразование к имеющимся изображениям и использует преобразованные изображения для обучения. Набор преобразований включает в себя вращение, масштабирование и т. Д. Делая это, вы каким-то образом создаете новые данные (то есть также называемые дополнением данных), но, очевидно, сгенерированные изображения не полностью отличаются от исходных. Таким образом, изученная модель может быть более надежной и точной, поскольку она обучается различным вариациям одного и того же изображения.

Вам нужно установить steps_per_epoch аргумент fit метод для n_samples / batch_size, где n_samples это общее количество данных об обучении, которое у вас есть (т.е. 1000 в вашем случае). Таким образом, в каждой эпохе каждая обучающая выборка увеличивается только один раз, и поэтому в каждую эпоху будет сгенерировано 1000 преобразованных изображений.

Вот моя попытка ответить, так как я тоже думал об этом.

ImageDataGeneratorНЕ будет добавлять новые изображения в ваш набор данных в том смысле, что это не сделает ваши эпохи больше. Вместо этого в каждую эпоху он будет предоставлять слегка измененные изображения (в зависимости от вашей конфигурации). Он всегда будет генерировать новые изображения, независимо от того, сколько у вас эпох.

Так что в каждую эпоху модель будет тренироваться на разных изображениях, но не слишком разных. Это должно предотвратить переобучение и некоторым образом имитировать онлайн-обучение.

Все эти изменения происходят в памяти, но если вы хотите увидеть эти изображения, вы можете сохранить их на диск, изучить их, посмотреть, сколько из них было сгенерировано, и понять, как ImageDataGeneratorработает. Для этого пройдитеsave_to_dir=/tmp/img-data-gen-outputs функционировать flow_from_directory. См. Документы.

Как официально написано здесь ImageDataGenerator это пакетный генератор тензорных изображений с дополнением данных в реальном времени. Данные будут зациклены (в пакетном режиме). Это означает, что на лету будут применены преобразования к пакету изображений случайным образом. Например:

train_datagen = ImageDataGenerator(
    rescale=1./255, #scale images from integers 0-255 to floats 0-1.
    shear_range=0.2,
    zoom_range=0.2, # zoom in or out in images
    horizontal_flip=True) #horizontal flip of images

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

Все зависит от того, сколько эпох вы запускаете, как ответил @today, установка модели с генератором заставит генератор предоставить столько изображений, сколько необходимо, в зависимости от steps_per_epoch.

Чтобы упростить понимание, поместите, например, 20 изображений в две любые папки (имитируя секретные данные), создайте генератор из родительской папки и запустите простой цикл for

count = 0
for image, label in my_test_generator:
    count += 1
    print(count)

Первым делом вы должны подтвердить, что видите сообщение Found 20 images belonging to 2 classes., и сам цикл НЕ остановится после 20 итераций, но он просто будет продолжать увеличиваться и печатать бесконечно (я получил 10k и остановил его вручную). Генератор предоставит столько изображений, сколько потребуется, независимо от того, были ли они дополнены или нет.

Также обратите внимание, что: эти дополненные изображения не сохраняются в памяти, они генерируются на лету во время тренировки и теряются после тренировки. Вы не можете снова прочитать эти дополненные изображения.

Не хранить эти изображения - хорошая идея, потому что у нас очень скоро не хватит памяти для хранения огромного количества изображений

Позвольте мне попытаться рассказать вам наиболее простым способом на примере.
Например:

  • у вас есть набор из 500 изображений
  • вы применили к набору данных с помощью batch_size = 25
  • теперь вы запускаете свою модель, скажем, 5 эпох с
    steps_per_epoch=total_samples/batch_size
  • так , steps_per_epoch будет равно 20
  • теперь ваша модель будет работать на всех 500 изображениях (случайным образом преобразованных в соответствии с инструкциями, предоставленными для ImageDataGenerator) в каждую эпоху

Класс ImageDataGenerator гарантирует, что модель получает новые вариации изображений в каждую эпоху. Но он возвращает только преобразованные изображения и не добавляет их к исходному корпусу изображений. Если бы это действительно было так, то модель могла бы видеть исходные изображения несколько раз, что определенно соответствовало бы нашей модели.

https://www.analyticsvidhya.com/blog/2020/08/image-augmentation-on-the-fly-using-keras-imagedatagenerator/

Когда мы пытаемся решить проблему с меньшим количеством данных, разве не стоит увеличить набор данных, добавляя дополненные изображения?

https://medium.com/nanonets/how-to-use-deep-learning-when-you-have-limited-data-part-2-data-augmentation-c26971dc8ced

Возьмите приведенную выше ссылку для ссылки, где автор упомянул о возможности добавления дополненных изображений в наш учебный набор данных.

Итак, что нужно сделать, следует ли нам увеличивать изображения и save_to_dir и чем обучать модель или мы просто должны использовать steps_per_epoch = 2 * (n_samples / batch_size) и обучать вдвое больше данных за эпоху?

Другие вопросы по тегам