Keras - вычисление steps_per_epoch не совпадает с выводом ImageDataGenerator - PullRequest
0 голосов
/ 03 сентября 2018

Я работаю над основной задачей классификации с Keras, и мне кажется, что я столкнулся с проблемой, когда мне нужна помощь.

У меня есть 200 образцов для обучения и 100 для проверки. Я намерен использовать ImageDataGenerator для увеличения количества обучающих образцов для своей задачи. Я хочу убедиться в общем количестве тренировочных образов, которые передаются в fit_generator ().

Я знаю, что steps_per_epoch определяет общее количество партий, которые мы получаем от генератора, и в идеале это должно быть число выборок, деленное на размер пакета.

Однако, это то, где вещи не складываются для меня. Вот фрагмент моего кода:

num_samples = 200
batch_size = 10
gen = ImageDataGenerator(horizontal_flip = True,
                     vertical_flip = True,
                     width_shift_range = 0.1,
                     height_shift_range = 0.1,
                     zoom_range = 0.1,
                     rotation_range = 10
                    )
x,y = shuffle(img_data,img_label, random_state=2)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.333, random_state=2)
generator = gen.flow(x_train, y_train, save_to_dir='check_images/sample_run')
new_network.fit_generator(generator, steps_per_epoch=len(x_train)/batch_size, validation_data=(x_test, y_test), epochs=1, verbose=2)

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

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

Буду очень признателен за любую помощь, которая поможет мне понять вычисления в этом коде. Кто-нибудь сталкивался с подобными проблемами?

ТИА

1 Ответ

0 голосов
/ 05 сентября 2018

gen.flow () создает внутренний NumpyArrayIterator, который, в свою очередь, использует Iterator для вычисления steps_per_epoch. В идеале, если значение steps_per_epoch равно None, тогда вычисление выполняется следующим образом: steps_per_epoch = (x.shape [0] + batch_size - 1) // batch_size, который приблизительно равен вашему вычислению.

Не уверен, почему вы видите больше образцов. Не могли бы вы вычислить x.shape [0] и дважды проверить, соответствует ли ваш код тому, что вы объяснили?

...