我好几天都对这个问题感到困惑......
我的问题是为什么训练时间与我的生成器的batch_size设置为“1”和“20”之间存在巨大差异 .
如果我将 batch_size 设置为 1 , 1 epoch 的 training time 大约为 180 ~ 200 sec . 如果我将 batch_size 设置为 20 , 1 epoch 的 training 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 回答
使用_104149时,还应考虑以下函数参数:
max_queue_size
,use_multiprocessing
和workers
max_queue_size
- 可能导致加载的数据超出实际预期,这取决于您的生成器代码可能会做一些意外或不必要的事情,这会减慢执行时间 .use_multiprocessing
与workers
一起 - 可能会启动额外的进程,这些进程将导致序列化和进程间通信的额外工作 . 首先,您将使用pickle序列化您的数据,然后您将数据发送到目标进程,然后您将在这些进程内进行处理,然后整个通信过程向后重复,您腌制结果,并将它们发送到主进程通过RPC . 在大多数情况下,它应该很快,但如果您正在处理数十GB的数据或者以次优的方式实现您的生成器,那么您可能会得到您描述的减速 .使用fit_generator时,每个纪元处理的样本数为batch_size * steps_per_epochs . 来自fit_generator的Keras文档:https://keras.io/models/sequential/
这与'fit'的行为不同,其中增加batch_size通常会加快速度 .
总之,当您使用fit_generator增加batch_size时,如果您希望训练时间保持不变或更低,则应将steps_per_epochs减少相同的因子 .