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

标签 parameters keras generator data-fitting

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

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

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

  • 发电机 :一个python训练数据批量生成器;无休止地循环遍历其训练数据
  • 验证数据 : - 在我的情况下 - 一个 python 验证数据批处理生成器;该文档没有提到对其验证数据的无限循环
  • step_per_epoch :number of training batches = uniqueTrainingData / batchSize
  • 验证步骤 :??? ; =唯一验证数据/批量大小???
  • use_multiprocessing : bool 值;不要传递不可picklable的参数???
  • worker : 最大使用进程数

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

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

  • 关于 use_multiprocessing 的附加问题:
  • numpy 数组是可腌制的还是我必须将它们转换为多维列表?
  • 最佳答案

    验证生成器的工作原理与训练生成器完全一样。您可以定义每个 epoch 将使用的批次数量。

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

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

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

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

    时代:

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

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

    因此,理论上每个时代都会产生:
  • steps_per_epoch = TotalTrainingSamples / TrainingBatchSize
  • validation_steps = TotalvalidationSamples / ValidationBatchSize

  • 基本上,这两个变量是:每个 epoch 将产生多少批次。
    这确保在每个时期:
  • 你完全训练你的整个训练集
  • 您完全验证了整个验证集

  • 然而,如何分离训练和验证数据完全取决于您。

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

    关于parameters - Keras Sequential fit_generator 参数列表中validation_steps的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45943675/

    相关文章:

    java - 这个方法返回什么?

    python - 将 CNN 更改为 LSTM keras tensorflow

    python - return_sequence=True 的 LSTM 之后的 Keras Dense 层

    python - 控制嵌套列表/字符串的递归(不检查类型)

    python - 如何检查 Generator 类型对象?

    command-line - 通过 ICA 文件从客户端 CMD 传递参数以启动已发布的 Citrix 应用程序

    javascript - JS - 访问作用域外的函数参数数组

    c# - 将属性作为参数传递

    python - Keras LSTM - 为什么 "same"模型和相同权重的结果不同?

    python - 递归生成器