在 keras fit_generator() 中未调用 on_epoch_end()

rai*_*bow 5 python training-data deep-learning keras tensorflow

我按照本教程使用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)
Run Code Online (Sandbox Code Playgroud)

steps_per_epochNone,因此每个 epoch 的步数由 Keras__len()__方法计算。

正如上面的链接所说:

在这里,该方法on_epoch_end在每个 epoch 的开始和结束时触发一次。如果shuffle参数设置为True,我们将在每次通过时获得一个新的探索顺序(否则只保留线性探索方案)。

我的问题是该on_epoch_end()方法仅在最开始时被调用,而不会在每个时代结束时被调用。因此,在每个时期,批次顺序始终相同。

我尝试使用np.ceil而不是np.floorin__len__()方法,但没有成功。

你知道为什么on_epoch_end不在每个纪元结束时调用吗?您能告诉我在每个时代结束时(或开始时)调整批次顺序的任何解决方法吗?

非常感谢!

小智 4

我遇到了同样的问题。我不知道为什么会发生这种情况,但有一种方法可以解决:on_epoch_end()在 内调用__len__(),因为__len__()每个纪元都会被调用。