on_epoch_end () не вызывается в keras fit_generator () - PullRequest
5 голосов
/ 08 января 2020

Я следовал этому руководству , чтобы генерировать данные на лету с помощью метода fit_generator() Keras, чтобы обучить свою модель нейронной сети.

Я создал генератор с помощью keras.utils.Sequence класс. Вызов fit_generator():

history = model.fit_generator(generator=EVDSSequence(images_train, TRAIN_BATCH_SIZE, INPUT_IMG_DIR, INPUT_JSON_DIR, SPLIT_CHAR, sizeArray, NCHW, shuffle=True),
                              steps_per_epoch=None, epochs=EPOCHS,
                              validation_data=EVDSSequence(images_valid, VALID_BATCH_SIZE, INPUT_IMG_DIR, INPUT_JSON_DIR, SPLIT_CHAR, sizeArray, NCHW, shuffle=True),
                              validation_steps=None,
                              callbacks=callbacksList, verbose=1,
                              workers=0, max_queue_size=1, use_multiprocessing=False)

steps_per_epoch равен None, поэтому число шагов за эпоху рассчитывается методом Keras __len()__.

Как сказано в ссылке выше:

Здесь метод on_epoch_end запускается один раз в самом начале, а также в конце каждой эпохи. Если для параметра shuffle установлено значение True, мы будем получать новый порядок исследования на каждом проходе (или просто сохранять схему линейного исследования в противном случае).

Моя проблема в том, что on_epoch_end() метод вызывается только в самом начале, но никогда в конце каждой эпохи. Таким образом, в каждую эпоху порядок партий всегда был одинаковым.

Я пытался использовать np.ceil вместо np.floor в __len__() методе, но безуспешно.

Do Вы знаете, почему on_epoch_end не вызывается в конце каждой эпохи? Не могли бы вы сказать мне какой-нибудь обходной путь, чтобы перетасовать порядок моих партий в конце (или в начале) каждой эпохи?

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 11 января 2020

Я столкнулся с той же проблемой. Я понятия не имею, почему это произошло, но есть способ обойти: позвоните on_epoch_end() в пределах __len__(), так как __len__() будет называться в каждую эпоху.

0 голосов
/ 15 апреля 2020

Может быть связано с проблемой: Keras model.fit not calling Sequence.on_epoch_end() #35911

Быстрое решение проблемы - использовать LambdaCallback (обратите внимание, что я использую fit, который должен достаточно, поскольку fit_generator устарело)

from tf.keras.callbacks import LambdaCallback

model.fit(generator, callbacks=[LambdaCallback(on_epoch_end=generator.on_epoch_end)])

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...