" samples_per_epoch"之间的区别是什么?和" steps_per_epoch"在fit_generator

时间:2017-04-17 19:05:18

标签: keras

我被这个问题搞糊涂了好几天......

我的问题是,为什么训练时间与我将batch_size设置为" 1"之间存在巨大差异。和" 20"为我的发电机。

如果我将 batch_size 设置为 1 1纪元的培训时间 < / em>大约 180~200秒。 如果我将 batch_size 设置为 20 1纪元培训时间约为 3000~ 3200秒

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

我的生成器的输入不是文件路径,而是已经加载到的生成器中的numpy数组 记忆通过调用&#34; np.load()&#34;。 所以我认为I / O权衡问题并不存在。

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

我已经看到此合并PR的更新, 但似乎这种变化根本不会影响任何事情。 (用法与原始用法相同)

这里link是我自定义生成器的主旨和fit_generator的一部分。

有人可以帮我解释一下这个问题吗? 非常感谢你:))

4 个答案:

答案 0 :(得分:32)

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

  

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

这与&#39; fit&#39;的行为不同,其中增加batch_size通常可以加快速度。

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

答案 1 :(得分: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/

enter image description here

答案 2 :(得分:0)

使用fit_generator时,还应考虑以下功能参数:

max_queue_sizeuse_multiprocessingworkers

max_queue_size-可能导致加载比实际预期更多的数据,这取决于生成器代码可能会执行意外或不必要的操作,从而减慢执行时间。

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

答案 3 :(得分:-1)

整个事情是:

fit()的运行速度比fit_generator()快,因为它可以直接访问内存中的数据。

fit()将numpy数组数据存储到内存中,而fit_generator()则从诸如keras.utils.Sequence之类的序列生成器中获取数据,后者运行速度较慢。