我被这个问题搞糊涂了好几天......
我的问题是,为什么训练时间与我将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的一部分。
有人可以帮我解释一下这个问题吗? 非常感谢你:))
答案 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 = 32
和 epochs = 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 :(得分:0)
使用fit_generator
时,还应考虑以下功能参数:
max_queue_size
,use_multiprocessing
和workers
max_queue_size
-可能导致加载比实际预期更多的数据,这取决于生成器代码可能会执行意外或不必要的操作,从而减慢执行时间。
use_multiprocessing
与workers
一起使用-可能会增加其他进程,从而导致序列化和进程间通信的额外工作。首先,您将使用pickle序列化数据,然后将数据发送到目标流程,然后在这些流程中进行处理,然后整个通信过程向后重复,将结果腌制,并将它们发送到主流程通过RPC。在大多数情况下,它应该很快,但是如果您要处理数十GB的数据或以次优的方式实现生成器,则可能会遇到您描述的速度降低的情况。
答案 3 :(得分:-1)
整个事情是:
fit()
的运行速度比fit_generator()
快,因为它可以直接访问内存中的数据。
fit()
将numpy数组数据存储到内存中,而fit_generator()
则从诸如keras.utils.Sequence
之类的序列生成器中获取数据,后者运行速度较慢。