如何在keras fit_generator()中定义max_queue_size,worker和use_multiprocessing?

时间:2019-04-05 08:39:42

标签: python tensorflow machine-learning keras gpu

我正在使用GPU版本的keras在经过预训练的网络上应用转移学习。我不了解如何定义参数 max_queue_size workers use_multiprocessing 。如果我更改了这些参数(主要是为了加快学习速度),我不确定是否每个时期仍能看到所有数据。

max_queue_size

  • 内部训练队列的最大大小,该队列用于“预缓存”生成器中的样本

  • 问题:这是否表示在CPU上准备了多少批?它与workers有什么关系?如何最佳定义它?

workers

  • 并行生成批处理的线程数。批处理在CPU上并行计算,然后即时传递到GPU进行神经网络计算

  • 问题:我如何找出我的CPU可以/应该并行生成多少个批次?

use_multiprocessing

  • 是否使用基于进程的线程

  • 问题:如果更改workers,是否必须将此参数设置为true?它与CPU使用率有关吗?

相关问题可以在这里找到:

我正在使用fit_generator(),如下所示:

    history = model.fit_generator(generator=trainGenerator,
                                  steps_per_epoch=trainGenerator.samples//nBatches,     # total number of steps (batches of samples)
                                  epochs=nEpochs,                   # number of epochs to train the model
                                  verbose=2,                        # verbosity mode. 0 = silent, 1 = progress bar, 2 = one line per epoch
                                  callbacks=callback,               # keras.callbacks.Callback instances to apply during training
                                  validation_data=valGenerator,     # generator or tuple on which to evaluate the loss and any model metrics at the end of each epoch
                                  validation_steps=
                                  valGenerator.samples//nBatches,   # number of steps (batches of samples) to yield from validation_data generator before stopping at the end of every epoch
                                  class_weight=classWeights,                # optional dictionary mapping class indices (integers) to a weight (float) value, used for weighting the loss function
                                  max_queue_size=10,                # maximum size for the generator queue
                                  workers=1,                        # maximum number of processes to spin up when using process-based threading
                                  use_multiprocessing=False,        # whether to use process-based threading
                                  shuffle=True,                     # whether to shuffle the order of the batches at the beginning of each epoch
                                  initial_epoch=0)   

我的机器的规格是:

CPU : 2xXeon E5-2260 2.6 GHz
Cores: 10
Graphic card: Titan X, Maxwell, GM200
RAM: 128 GB
HDD: 4TB
SSD: 512 GB

1 个答案:

答案 0 :(得分:2)

Q_0:

  

问题:这是否指的是在CPU上准备多少批次?它与工人有什么关系?如何最佳定义它?

从发布的link中,您可以了解到CPU一直在创建批处理,直到队列达到最大队列大小或到达停止为止。您需要准备好批处理以供GPU“使用”,以便GPU不必等待CPU。 队列大小的理想值是使其足够大,以使您的GPU始终在接近最大值的情况下运行,而不必等待CPU准备新批处理。

Q_1:

  

问题:如何找出我的CPU可以/应该并行生成多少个批次?

如果您发现GPU处于空闲状态并且正在等待批处理,请尝试增加工作人员的数量,也许还增加队列的大小。

Q_2:

  

如果我更换工人,是否必须将此参数设置为true?它与CPU使用率有关吗?

Here是对将其设置为TrueFalse时发生的情况的实用分析。建议将Here设置为False以防止冻结(在我的设置中True可以正常工作而不会冻结)。也许其他人可以增进我们对该主题的理解。

总结:

请尝试不进行顺序设置,请尝试使CPU为GPU提供足够的数据。

还:您可以(应该吗?)下次再提出几个问题,以便更轻松地回答它们。