Как реализован flow_from_directory? - PullRequest
0 голосов
/ 14 мая 2019

Мой главный вопрос: перебирает ли он каждый образец в каталоге для каждой эпохи? У меня есть каталог с 6 классами с почти одинаковым количеством выборок в каждом классе, когда я обучал модель с batch_size=16, она вообще не работала, правильно предсказывал только 1 класс. Сделав batch_size=128, он может предсказывать 3 класса с высокой точностью, а 3 других никогда не появлялись в тестовых предсказаниях. Почему так? Каждый ли steps_per_epoch генерируется однозначно и запоминает только образцы этой партии? Это означает, что он не запоминает последние использованные выборки партии и создает новую случайную партию с возможностью использовать уже использованные выборки и пропускать другие, если это так, то это означает, что он пропускает выборки целого класса, и единственный способ преодолеть это - увеличение batch_size чтобы он запомнил это в одной партии. Я не могу увеличить batch_size более чем на 128, потому что на моем GPU недостаточно памяти.
Так что мне делать?
Вот мой код для ImageDataGenerator

train_d = ImageDataGenerator(rescale=1. / 255, shear_range=0.2, zoom_range=0.1, validation_split=0.2,
                             rotation_range=10.,
                             width_shift_range=0.1,
                             height_shift_range=0.1)
train_s = train_d.flow_from_directory('./images/', target_size=(width, height),
                                      class_mode='categorical',
                                      batch_size=32, subset='training')

validation_s = train_d.flow_from_directory('./images/', target_size=(width, height), class_mode='categorical',
                                           subset='validation')

А вот код для fit_generator

classifier.fit_generator(train_s, epochs=20, steps_per_epoch=100, validation_data=validation_s,
                                   validation_steps=20, class_weight=class_weights)

1 Ответ

0 голосов
/ 14 мая 2019

Да, он повторяется для каждого семпла в каждой папке каждую эпоху.Это определение эпохи, полного прохода по всему набору данных.

steps_per_epoch должен быть установлен на len(dataset) / batch_size, тогда проблема возникает только тогда, когда размер партии не делит точно количество выборок, ив этом случае вы округляете steps_per_epoch вверх, а последняя партия меньше batch_size.

...