Keras Sequential fit_generator参数列表

时间:2017-08-29 16:04:44

标签: parameters keras generator data-fitting

我在Python中使用带有Tensorflow后端的Keras。更精确的张量流 1.2.1 及其内置的contrib.keras lib。

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

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

  • 生成器:一个python训练数据批量生成器;无休止地循环其培训数据
  • validation_data : - 在我的情况下 - 一个python验证数据批处理生成器;该文档没有提及其验证数据的无限循环
  • steps_per_epoch number of training batches = uniqueTrainingData / batchSize
  • 验证步骤???; = uniqueValidationData / batch size ???
  • use_multiprocessing :boolean;不通过不可拣选的论点???
  • 工作人员:最大使用过程数

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

关于validation_steps的问题:

  • 这真的有用吗?如果是这样:为什么?我认为在每个时期之后,一个理想的以前没有使用过的验证批次用于验证,以确保培训得到验证而不会冒险去培训"模型在已使用的验证集上表现更好。
  • 在上一个问题的背景下:为什么推荐的验证步骤uniqueValidationData / batches而不是uniqueValidationData / epochs?有没有比这更好的了100个时代的100个验证批次而不是x个验证批次,其中x可能小于或大于指定的时期数量?或者:如果你的验证批次少于epoches的数量,那么模型是否经过了其他时期的验证而不进行验证,或者验证集是否会重复使用/重新洗牌+重复使用?
  • 培训和验证批次是否具有相同的批量大小(红利trainingDataCount和validationDataCount的共享除数)是否很重要?

关于use_multiprocessing的其他问题:

  • numpy数组是可选择的还是我必须将它们转换为多维列表?

1 个答案:

答案 0 :(得分:29)

验证生成器的工作原理与训练生成器完全相同。您可以定义每个时期将使用的批次数。

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

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

批量处理的目的只是为了节省计算机的内存,因此您可以一次测试一个较小的数据包。您可能会发现批量大小适合您的记忆或预期的训练时间并使用该大小。

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

历元:

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

这就是为什么他们建议validation_steps = uniqueValidationData / batchSize。 从理论上讲,理论上你应该在每个时代训练你的整个数据。

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

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

基本上,两个变量是:每个时期会产生多少批次 这确保了在每个时代:

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

尽管如此,完全取决于您如何分离培训和验证数据。

如果您确实希望每个时期有一个不同的批次(使用少于整个数据的时期),那么可以,例如,只需传递steps_per_epoch=1validation_steps=1。每个纪元后都不会重置生成器,因此第二个纪元将采用第二批,依此类推,直到它再次循环到第一批。

我更喜欢每个时期训练整个数据,如果时间太长,我会使用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。序列几乎与生成器一样,但它跟踪每个批次的顺序/位置。