我在 Python 中使用带有 Tensorflow 后端的 Keras。更精确的tensorflow 1.2.1 及其内置的 contrib.keras 库。
我想用fit_generator
顺序模型对象的方法,但我对应该作为方法参数传递的内容感到困惑。
从阅读文档 here我得到以下信息:
number of training batches = uniqueTrainingData / batchSize
???
; =唯一验证数据/批量大小??? 正如上面用 ???我真的不知道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 个 epoch 的 100 个验证批次,而不是 x 验证批次,其中 x 可能小于或大于指定的 epoch 数?或者:如果您的验证批次比 epoch 数量少得多,那么模型是否在没有验证的情况下对其余 epoch 进行了训练,或者验证集是否被重用/改组+重用? 关于
use_multiprocessing
的附加问题:最佳答案
验证生成器的工作原理与训练生成器完全一样。您可以定义每个 epoch 将使用的批次数量。
steps_per_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=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多处理时。序列几乎可以作为生成器工作,但它会跟踪每个批次的顺序/位置。
关于parameters - Keras Sequential fit_generator 参数列表中validation_steps的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45943675/