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 我得到以下信息:
- generator : 一个python训练数据批量生成器;无休止地循环其训练数据
- validation_data: -在我的例子中 - python 验证数据批生成器;该文档没有提到对其验证数据进行无限循环
- steps_per_epoch :
number of training batches = uniqueTrainingData / batchSize
- 验证步骤 :
???
; = uniqueValidationData / 批量大小 ???
- use_multiprocessing:布尔值;不要传递不可腌制的参数 ???
- workers:最大使用进程数
如上所示 ???我真的不知道 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
的问题:
- 真的是这样吗?如果是这样:为什么?我认为在每个 epoch 之后,一个验证批次(理想情况下以前没有使用过)用于验证,以确保训练得到验证,而不会有 "train" 模型在已经使用的验证集上表现更好的风险。
- 在上一个问题的上下文中:为什么建议的验证步骤数量是
uniqueValidationData / batches
而不是 uniqueValidationData / epochs
?拥有例如不是更好吗? 100 个验证批次用于 100 个时期,而不是 x 个验证批次,其中 x 可能小于或大于指定的时期数?或者:如果您的验证批次比纪元数少得多,那么模型是否在没有对其余纪元进行验证的情况下进行训练,或者验证集是否得到重用/重新洗牌+重用?
- 训练和验证批次具有相同的批次大小(股息 trainingDataCount 和 validationDataCount 的共享除数)是否重要?
关于 use_multiprocessing
的其他问题:
- numpy 数组是可腌制的还是我必须将它们转换为多维列表?
验证生成器的工作方式与训练生成器完全相同。您定义每个时期将使用多少批次。
- 训练生成器将产生
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=1
或 validation_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。
我在 Python 中使用带有 Tensorflow 后端的 Keras。更准确地说,tensorflow 1.2.1 及其内置 contrib.keras lib.
我想使用 Sequential 模型对象的 fit_generator
方法,但我对应该作为方法参数传递的内容感到困惑。
通过阅读文档 here 我得到以下信息:
- generator : 一个python训练数据批量生成器;无休止地循环其训练数据
- validation_data: -在我的例子中 - python 验证数据批生成器;该文档没有提到对其验证数据进行无限循环
- steps_per_epoch :
number of training batches = uniqueTrainingData / batchSize
- 验证步骤 :
???
; = uniqueValidationData / 批量大小 ??? - use_multiprocessing:布尔值;不要传递不可腌制的参数 ???
- workers:最大使用进程数
如上所示 ???我真的不知道 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
的问题:
- 真的是这样吗?如果是这样:为什么?我认为在每个 epoch 之后,一个验证批次(理想情况下以前没有使用过)用于验证,以确保训练得到验证,而不会有 "train" 模型在已经使用的验证集上表现更好的风险。
- 在上一个问题的上下文中:为什么建议的验证步骤数量是
uniqueValidationData / batches
而不是uniqueValidationData / epochs
?拥有例如不是更好吗? 100 个验证批次用于 100 个时期,而不是 x 个验证批次,其中 x 可能小于或大于指定的时期数?或者:如果您的验证批次比纪元数少得多,那么模型是否在没有对其余纪元进行验证的情况下进行训练,或者验证集是否得到重用/重新洗牌+重用? - 训练和验证批次具有相同的批次大小(股息 trainingDataCount 和 validationDataCount 的共享除数)是否重要?
关于 use_multiprocessing
的其他问题:
- numpy 数组是可腌制的还是我必须将它们转换为多维列表?
验证生成器的工作方式与训练生成器完全相同。您定义每个时期将使用多少批次。
- 训练生成器将产生
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=1
或 validation_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。