【问题标题】:What does "shuffle" do in fit_generator in keras?在 keras 的 fit_generator 中“洗牌”有什么作用?
【发布时间】:2018-08-08 04:36:35
【问题描述】:

我手动构建了一个数据生成器,每次调用都会生成一个 [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)

来自 Keras API:

shuffle:是否在开头打乱批次的顺序 每个时代的。仅与 Sequence 的实例一起使用 (keras.utils.Sequence)

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

【问题讨论】:

    标签: machine-learning neural-network keras


    【解决方案1】:

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

    如果您使用的是“简单”生成器(例如 keras.preprocessing.image.ImageDataGenerator,或您自己的自定义非序列生成器),那么该生成器会实现一个返回单个批次的方法(使用 yield - 您可以在this question 中了解更多信息)。因此,只有生成器本身控制返回什么批次。

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

    序列是一种更安全的多处理方式。这种结构 保证网络只会在每个样本上训练一次 生成器不是这样的纪元。

    为此,您需要实现一个通过批处理索引返回批处理的方法(允许同步多个工作人员):__getitem__(self, idx)。如果启用 shuffle 参数,__getitem__ 方法将被随机调用索引。

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

    【讨论】:

    • 那么如果我使用自己的自定义非序列生成器并在 fit-generator 中设置 shuffle=True 会发生什么?
    • 什么也没发生。如果你看源码:github.com/keras-team/keras/blob/…,这个参数只在你的生成器是Sequence的时候使用。
    • 在方法 __getitem_(...) 中,有没有办法知道哪个工人(线程)ID 正在抓取该特定批次(由“idx”标识)?问的动机是我想将工作量分散到 2 个构建单独数据集的工作人员(例如负样本)。理想情况下,这应该在on_epoch_end中完成,但多进程可能不会完成?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2022-12-06
    • 2020-04-25
    • 2019-10-27
    • 2019-05-18
    • 1970-01-01
    相关资源
    最近更新 更多