我手动构建了一个数据生成器,每个调用产生一个[input, target]
元组。我将我的发生器设置为每个时期对训练样本进行洗牌。然后我使用fit_generator
来呼叫我的generator
,但是在#34; shuffle"这个函数中的参数:
fit_generator(self, generator, steps_per_epoch=None, epochs=1, verbose=1, callbacks=None, validation_data=None, validation_steps=None, class_weight=None, max_queue_size=10, workers=1, use_multiprocessing=False, shuffle=True, initial_epoch=0)
来自Keras API:
shuffle :是否在开始时改组批次的顺序 每个时代仅用于Sequence的实例 (keras.utils.Sequence)
我想" shuffle"应该是generator
的工作。当我的自定义generator
决定在每次迭代中输出哪个批处理时,它如何改变批次的顺序?
答案 0 :(得分:7)
正如您引用的文档所述, shuffle 参数仅与实现keras.utils.Sequence的生成器相关。
如果您使用的是“简单”生成器(例如keras.preprocessing.image.ImageDataGenerator或您自己的自定义非序列生成器),那么该生成器会实现一个返回单个批处理的方法(使用yield - 您可以在this question中了解有关它的更多信息。因此,只有生成器本身控制返回的批处理。
引入了keras.utils.Sequence来支持多处理:
序列是一种更安全的多处理方式。这种结构 保证网络每个样本只训练一次 时代不是发电机的情况。
为此,您需要实现一个通过批处理索引返回批处理的方法(允许多个工作程序同步):__getitem__(self, idx)
。如果启用 shuffle 参数,则将使用随机顺序的索引调用__getitem__
方法。
但是,您也可以将其设置为false,并通过实施on_epoch_end
方法自行播放。