Keras Sequential fit_generator参数列表中validation_steps的含义

Meaning of validation_steps in Keras Sequential fit_generator parameter list

我在 Python 中使用带有 Tensorflow 后端的 Keras。更准确地说,tensorflow 1.2.1 及其内置 contrib.keras lib.

我想使用 Sequential 模型对象的 fit_generator 方法,但我对应该作为方法参数传递的内容感到困惑。

通过阅读文档 here 我得到以下信息:

如上所示 ???我真的不知道 validation_steps 是什么意思。 我知道上述链接文档 (Number of steps to yield from validation generator at the end of every epoch) 的定义,但这只会让我在给定的上下文中感到困惑。从文档中我知道 validation_data 生成器必须生成数据,以 (inputs, targets) 的形式标记元组。与上面的陈述相反,表明必须有多个 "steps to yield from validation generator at the end of every epoch",在这种情况下这意味着,在每个训练时期之后将产生多个验证批次。

关于validation_steps的问题:

关于 use_multiprocessing 的其他问题:

验证生成器的工作方式与训练生成器完全相同。您定义每个时期将使用多少批次。

  • 训练生成器将产生 steps_per_epoch 个批次。
  • 当纪元结束时,验证生成器将产生 validation_steps 个批次。

但是验证数据与训练数据完全没有关系。 没有必要根据训练批次分离验证批次(我什至会说这样做没有意义,除非你有非常具体的意图)。此外,训练数据中的样本总数与测试数据中的样本总数无关。

拥有多个批次的目的只是为了节省计算机内存,因此您一次测试一个较小的包装。您可能会找到适合您的记忆或预期训练时间的批量大小并使用该大小。

也就是说,Keras 为您提供了一种完全免费的方法,因此您可以根据需要确定训练和验证批次。

纪元:

理想情况下,您一次使用所有验证数据。如果您只使用部分验证数据,您将获得每个批次的不同指标,这可能会让您认为您的模型变得更糟或更好,而实际上并没有,您只是测量了不同的验证集。

这就是为什么他们建议 validation_steps = total_validation_samples // validation_batch_size
从理论上讲,您每个时期都会测试整个数据,因为理论上您也应该每个时期都训练整个数据。

因此,从理论上讲,每个时代都会产生:

  • steps_per_epoch = TotalTrainingSamples / TrainingBatchSize
  • validation_steps = TotalvalidationSamples / ValidationBatchSize

基本上,这两个变量是:每个时期你将产生多少批次。
这确保在每个时期:

  • 您完全训练了整个训练集
  • 您完全验证了整个验证集

不过,如何分离训练数据和验证数据完全取决于您。

如果您确实希望每个时期有一个不同的批次(时期使用的数据少于您的全部数据),没关系,例如,只需传递 steps_per_epoch=1validation_steps=1。生成器不会在每个 epoch 后重置,因此第二个 epoch 将采用第二批,依此类推,直到再次循环到第一批。

我更喜欢每个 epoch 训练整个数据,如果时间太长,我使用一个 callback 在每个批次结束时显示日志:

from keras.callbacks import LambdaCallback

callbacks = callbacks=[LambdaCallback(on_batch_end=lambda batch,logs:print(logs))]

多处理

我一直无法使用 use_multiprocessing=True,它在第一个纪元开始时冻结。

我注意到 workers 与从生成器预加载的批次数量有关。如果您定义 max_queue_size=1,您将精确地预加载 workers 个批次。

他们建议您在多处理时使用 keras Sequences。这些序列的工作原理与生成器非常相似,但它会跟踪每个批次的 order/position。