首页 文章

fit_generator中“samples_per_epoch”和“steps_per_epoch”之间的区别是什么

提问于
浏览
12

我好几天都对这个问题感到困惑......

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

如果我将 batch_size 设置为 11 epochtraining time 大约为 180 ~ 200 sec . 如果我将 batch_size 设置为 201 epochtraining time 大约为 3000 ~ 3200 sec .

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

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

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

我已经看到了这个合并PR的更新,但似乎这个改变不会影响任何东西 . (用法和原来用法一样)

link这里是我自定义生成器的要点和fit_generator的一部分 .

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

2 回答

  • 0

    使用_104149时,还应考虑以下函数参数:

    max_queue_sizeuse_multiprocessingworkers

    max_queue_size - 可能导致加载的数据超出实际预期,这取决于您的生成器代码可能会做一些意外或不必要的事情,这会减慢执行时间 .

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

  • 20

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

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

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

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

相关问题