【问题标题】:Meaning of validation_steps in Keras Sequential fit_generator parameter listKeras Sequential fit_generator参数列表中validation_steps的含义
【发布时间】:2018-02-07 04:19:10
【问题描述】:

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

我想使用 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) 的形式标记元组。与此相反,上述声明表明必须有多个“在每个 epoch 结束时从验证生成器产生的步骤”,在这种情况下,这意味着在每个训练 epoch 之后将产生多个验证批次。

关于validation_steps的问题:

  • 真的如此吗?如果是这样:为什么?我认为在每个 epoch 之后,一个验证批次(理想情况下以前没有使用过)用于验证,以确保训练得到验证,而不会冒“训练”模型以在已使用的验证集上表现更好的风险。
  • 在上一个问题的上下文中:为什么推荐的验证步骤数量是uniqueValidationData / batches 而不是uniqueValidationData / epochs?拥有例如不是更好吗? 100 个验证批次用于 100 个 epoch,而不是 x 个验证批次,其中 x 可能小于或大于指定的 epoch 数?或者:如果您的验证批次比 epoch 的数量少得多,那么模型是在没有对其余 epoch 进行验证的情况下训练的,还是验证集被重用/重新洗牌+重用?
  • 训练和验证批次具有相同的批次大小是否重要(除数 trainingDataCount 和 validationDataCount 的共享除数)?

关于use_multiprocessing的其他问题:

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

【问题讨论】:

    标签: parameters keras generator data-fitting


    【解决方案1】:

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

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

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

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

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

    时代:

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

    这就是他们建议validation_steps = total_validation_samples // validation_batch_size的原因。
    从理论上讲,您可以在每个 epoch 测试整个数据,因为理论上您还应该在每个 epoch 训练您的整个数据。

    因此,理论上每个时期都会产生:

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

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

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

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

    如果您确实希望每个 epoch 有一个不同的批次(epoch 使用的数据少于您的全部数据),没关系,只需传递 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。这些序列几乎可以作为生成器工作,但它会跟踪每个批次的顺序/位置。

    【讨论】:

    • 非常感谢。我知道训练和验证数据没有直接关系。我只是对文档参数描述对我的真正含义感到困惑。还要感谢关于验证批次和多处理的最佳使用的澄清。
    • 我在上面的step 变量中做了一些更正,它们除以批次大小而不是批次数量。所有的想法都没有改变,只是公式错了。
    • @DanielMöller 我仍然对您的回答感到困惑。假设我设置了我的steps_per_epochs = 25 & epoch= 100 & validation_step = 3。对于每个 epoch,有 25 个步骤,对于每个步骤,生成器生成形状为 X_train : (233, 100, 4) & Y_train : (233, 100, 2) 的训练数据并进行训练。上述过程每 25 步继续,并在第 25 步结束时开始验证,生成器 yield X_validate: (33,100,4) & Y_validate : (33, 100, 2) 3 times 和 validation acc & loss 打印在结果中。
    • @DanielMöller 我的问题是: 1. batch_size in my case (for both training & Validation) 是什么? 2. 在验证过程中,生成器产生3 times X_validate & Y_validate arrays,因为我给出了validation_steps = 3。那么 loss 和 val_acc 是如何计算的呢?是否会为每一步计算并最终平均结果?还是其他方法?
    • 批量大小分别为 233 和 33。我不确定 Keras 是如何计算损失的。可能是每批的平均值。
    猜你喜欢
    • 2019-10-26
    • 2018-03-01
    • 2017-12-30
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2019-08-27
    相关资源
    最近更新 更多