Добавляет ли 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 гарантирует, что модель получает новые вариации изображений в каждую эпоху. Но он возвращает только преобразованные изображения и не добавляет их к исходному корпусу изображений. Если бы это действительно было так, то модель могла бы видеть исходные изображения несколько раз, что определенно соответствовало бы нашей модели.
Когда мы пытаемся решить проблему с меньшим количеством данных, разве не стоит увеличить набор данных, добавляя дополненные изображения?
Возьмите приведенную выше ссылку для ссылки, где автор упомянул о возможности добавления дополненных изображений в наш учебный набор данных.
Итак, что нужно сделать, следует ли нам увеличивать изображения и save_to_dir и чем обучать модель или мы просто должны использовать steps_per_epoch = 2 * (n_samples / batch_size) и обучать вдвое больше данных за эпоху?