【问题标题】:What's the difference between "samples_per_epoch" and "steps_per_epoch" in fit_generatorfit_generator 中的“samples_per_epoch”和“steps_per_epoch”有什么区别
【发布时间】:2017-09-13 10:45:04
【问题描述】:

我被这个问题迷惑了好几天...

我的问题是,为什么训练时间与我将生成器的 batch_size 设置为“1”和“20”之间存在如此大的差异。

如果我将 batch_size 设置为 11 epoch训练时间 大约是 180 ~ 200 秒。 如果我将batch_size设置为201个epoch训练时间约为3000~ 3200 秒

但是,这些训练时间之间的这种可怕差异似乎是不正常的......,因为它应该是相反的结果: batch_size = 1,训练时间 -> 3000 ~ 3200 秒。 batch_size = 20, 训练时间 -> 180 ~ 200 sec.

我的生成器的输入不是文件路径,而是已经加载到 通过调用“np.load()”来存储内存。 所以我认为不存在 I/O 权衡问题。

我使用的是 Keras-2.0.3,我的后端是 tensorflow-gpu 1.0.1

我看到了这个合并PR的更新, 但似乎这种变化根本不会影响任何事情。 (用法和原来一样)

这里的link是我的自定义生成器的要点,也是我的fit_generator的一部分。

【问题讨论】:

    标签: keras


    【解决方案1】:

    让我们清除它:

    假设您有一个包含 8000 个样本(数据行)的数据集,并且您选择了 batch_size = 32epochs = 25

    这意味着数据集将分为 (8000/32) = 250 个批次,每批次有 32 个样本/行。 模型权重将被更新每批之后。

    一个 epoch 将训练 250 个批次或 250 次模型更新。

    这里steps_per_epoch = 批次数

    50 个 epoch,模型将遍历整个数据集 50 次。

    参考 - https://machinelearningmastery.com/difference-between-a-batch-and-an-epoch/

    【讨论】:

      【解决方案2】:

      整件事是:

      fit()fit_generator() 工作得更快,因为它可以直接访问内存中的数据。

      fit() 将 numpy 数组数据存入内存,而fit_generator() 从序列生成器(如keras.utils.Sequence)中获取数据,它的工作速度较慢。

      【讨论】:

      • fit_generator() 用于实现多处理和多个 CPU 核心的使用,这与您的说法相矛盾(参见 use_multiprocessingworkers)。
      【解决方案3】:

      在使用fit_generator 时,您还应该考虑以下函数参数:

      max_queue_sizeuse_multiprocessingworkers

      max_queue_size - 可能会导致加载比您实际预期更多的数据,这取决于您的生成器代码可能会做一些意想不到或不必要的事情,从而减慢您的执行时间。

      use_multiprocessingworkers - 可能会启动额外的进程,从而导致序列化和进程间通信的额外工作。首先,您将使用 pickle 序列化数据,然后将数据发送到目标进程,然后在这些进程中进行处理,然后整个通信过程向后重复,您 pickle 结果,并将它们发送到主进程通过 RPC。在大多数情况下,它应该很快,但是如果您正在处理数十 GB 的数据,或者您的生成器以次优方式实现,那么您可能会遇到您所描述的减速。

      【讨论】:

        【解决方案4】:

        使用 fit_generator 时,每个 epoch 处理的样本数为 batch_size * steps_per_epochs。来自 fit_generator 的 Keras 文档:https://keras.io/models/sequential/

        steps_per_epoch:在声明一个 epoch 完成并开始下一个 epoch 之前从生成器产生的步骤总数(样本批次)。它通常应该等于数据集的唯一样本数除以批量大小。

        这与 'fit' 的行为不同,增加 batch_size 通常会加快速度。

        总之,当您使用 fit_generator 增加 batch_size 时,如果您希望训练时间保持不变或更低,您应该将 steps_per_epochs 减少相同的因子。

        【讨论】:

        • 感谢您的回答!我认为我的原件与它相同(steps_per_epochs 应该等于 #total samples/batch_size)。但是合并的拉取请求让我很困惑......好吧,我终于明白了!非常感谢!
        • 我没有看到 fit_generator() 例程中任何地方指定的 batch_size。那么它是从哪里推断出 batch_size 的呢?他们是否将 batch_size 定义为(生成器的长度)/(steps_per_epoch)?他们说它“通常相等”,但这意味着它完全相等。
        • 快速提问,为什么“适合”增加 batch_size 会加快速度?这对我来说似乎违反直觉,我可能只是不明白“fit”和“fit_generator”的运作方式之间的区别。
        猜你喜欢
        • 2018-03-01
        • 1970-01-01
        • 2020-01-02
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 2018-03-30
        • 2020-03-14
        • 1970-01-01
        相关资源
        最近更新 更多