在Keras的fit_generator中"shuffle"做了什么?

Tu *_*Bui 7 machine-learning neural-network keras

我手动构建了一个数据生成器,产生[input, target]每个调用的元组.我将我的发生器设置为每个时期对训练样本进行洗牌.然后我fit_generator用来调用我的generator,但是在这个函数的"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)
Run Code Online (Sandbox Code Playgroud)

来自Keras API:

shuffle:是否在每个时代开始时改组批次的顺序.仅用于Sequence的实例(keras.utils.Sequence)

我认为"洗牌"应该是工作的generator.当我的自定义generator决定在每次迭代中输出哪个批次时,它如何改变批次的顺序?

Mar*_*man 8

正如您引用的文档所述,shuffle参数仅与实现keras.utils.Sequence的生成器相关.

如果您使用的是"简单的"发生器(如keras.preprocessing.image.ImageDataGenerator,或自己的自定义非序列发生器),比发生器实现返回单个批次(使用收益率的方法-你可以了解更多有关它在这个问题).因此,只有生成器本身控制返回的批处理.

引入了keras.utils.Sequence以支持多处理:

序列是一种更安全的多处理方式.这种结构保证了网络每个时期每个样本只训练一次,而发电机不是这种情况.

为此,你需要实现由一批指数(它允许多个工人同步)返回一个批次的方法:__getitem__(self, idx).如果启用shuffle参数,__getitem__则将使用随机顺序的索引调用该方法.

但是,您也可以将其设置为false,并通过实现该on_epoch_end方法来自我洗牌.