Подтвердить что ты не робот

Какая разница между "samples_per_epoch" и "steps_per_epoch" в fit_generator

Я был смущен этой проблемой в течение нескольких дней...

Мой вопрос в том, почему время обучения имеет такое огромное различие между тем, что я установил batch_size как "1" и "20" для моего генератора.

Если я установил batch_size как 1, время обучения 1 эпоха примерно 180 ~ 200 с. Если я установил batch_size 20, время обучения 1 эпоха примерно 3000 ~ 3200 с.

Однако эта ужасная разница между этими тренировочными временами кажется ненормальной..., так как это должен быть обратный результат: batch_size = 1, время тренировки → 3000 ~ 3200 сек. batch_size = 20, время тренировки → 180 ~ 200 с.

Вход в мой генератор не является файловым путем, но массивы numpy, которые уже загружены в памяти через вызов "np.load()". Поэтому я думаю, что проблема компиляции ввода-вывода не существует.

Я использую Keras-2.0.3, а мой backend - tenorflow-gpu 1.0.1

Я видел обновление этого объединенного здесь является сутью моего самоопределяемого генератора и частью моего fit_generator.

Может кто-нибудь помочь мне объяснить эту проблему? Большое вам спасибо:)

4b9b3361

Ответ 1

Когда вы используете fit_generator, количество образцов, обработанных для каждой эпохи, - batch_size * steps_per_epochs. Из документации Keras для fit_generator: https://keras.io/models/sequential/

steps_per_epoch: общее количество шагов (партии выборок), которые нужно получить от генератора, прежде чем объявить одну эпоху законченной и начать следующую эпоху. Он обычно должен быть равен количеству уникальных образцов вашего набора данных, разделенных размером партии.

Это отличается от поведения "fit", где увеличение batch_size обычно ускоряет работу.

В заключение, когда вы увеличиваете batch_size с помощью fit_generator, вы должны уменьшить step_per_epochs тем же коэффициентом, если вы хотите, чтобы время обучения оставалось таким же или ниже.

Ответ 2

При работе с fit_generator необходимо также учитывать следующие параметры функции:

max_queue_size, use_multiprocessing и workers

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

use_multiprocessing вместе с workers - может use_multiprocessing дополнительные процессы, что приведет к дополнительной работе по сериализации и межпроцессному взаимодействию. Сначала вы бы сериализовали свои данные с помощью pickle, затем вы отправили бы свои данные этим целевым процессам, затем вы бы выполнили обработку внутри этих процессов, а затем вся процедура связи повторяется в обратном направлении, вы выбираете результаты и отправляете их в основной процесс. через RPC. В большинстве случаев это должно быть быстрым, но если вы обрабатываете десятки гигабайт данных или ваш генератор реализован неоптимальным образом, вы можете получить описанное замедление.

Ответ 3

Все это:

fit_generator() fit() работает быстрее, чем fit_generator() поскольку она может обращаться к данным непосредственно в памяти.

fit_generator() fit() переносит данные в виде массивов в память, а fit_generator() получает данные из генератора последовательностей, такого как keras.utils.Sequence который работает медленнее.