什么是Keras Sequential模型中使用的验证数据?

时间:2017-09-19 19:28:00

标签: python validation keras training-data keras-2

我的问题很简单,什么是验证数据在序列模型中传递给model.fit 用于

并且,它是否会影响模型的训练方式(通常使用验证集,例如,在模型中选择超参数,但我认为这不会发生在这里)?

我说的是可以像这样传递的验证集:

# Create model
model = Sequential()
# Add layers
model.add(...)

# Train model (use 10% of training set as validation set)
history = model.fit(X_train, Y_train, validation_split=0.1)

# Train model (use validation data as validation set)
history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test))

我调查了一下,我看到keras.models.Sequential.fit调用keras.models.training.fit,它会创建val_accval_loss等变量(可以从Callbacks访问)。 keras.models.training.fit还调用keras.models.training._fit_loop,将验证数据添加到callbacks.validation_data,并调用keras.models.training._test_loop,这将在self.test_function批量循环验证数据该模型。此函数的结果用于填充日志的值,这些值是可从回调中访问的值。

看到这一切之后,我觉得传递给model.fit的验证集并不用于在训练期间验证任何内容,它唯一的用途是获得有关受训模型在每个时期内如何执行的反馈完全独立的。因此,使用相同的验证和测试集会很好,对吗?

除了从回调中读取之外,有没有人可以确认model.fit中的验证集是否还有其他目标?

4 个答案:

答案 0 :(得分:27)

如果您想构建一个实体模型,您必须遵循将数据分成三组的特定协议:一个用于培训,一个用于验证,一个用于最终评估,这是测试集。

我们的想法是,您可以训练您的训练数据,并根据您从验证集中获得的指标(准确性,损失等)的结果来调整您的模型。

您的模型没有“看到”您的验证集,也没有以任何方式接受过培训,但您作为超参数的架构师和主人根据此数据调整模型。 因此它间接影响您的模型,因为它直接影响您的设计决策。您轻松推动您的模型与验证数据一起使用,并且可能会导致倾斜。

正是这就是你只评估你的模型最终得分的原因,你的模型和你自己都没有使用过 - 这是你的测试集的第三个数据块。

只有这个程序才能确保您获得模型质量的未受影响的视图,并能够概括在完全看不见的数据上学到的内容。

答案 1 :(得分:8)

此YouTube视频介绍了验证集是什么,为什么有用,以及如何在Keras中实现验证集:Create a validation set in Keras

使用验证集,您基本上可以从训练集中取出一小部分样本,或者一起创建一个全新的集合,并通过训练保留此集合中的样本。

在每个时期,模型将在训练集中的样本上进行训练,但不会对验证集中的样本进行训练。相反,该模型将仅对验证集中的每个样本进行验证

这样做的目的是让您能够判断模型的概括程度。这意味着,您的模型能够如何预测在训练时未看到的数据。

拥有验证集还可以深入了解您的模型是否过度拟合。这可以通过将您的训练样本中的accloss与验证样本中的val_accval_loss进行比较来解释。例如,如果您的acc很高,但val_acc落后,则表明您的模型过度拟合。

答案 2 :(得分:7)

我认为,对训练集,验证集和测试集进行整体讨论会有所帮助:

  • 训练集::要在其上训练模型的数据集。这是唯一数据集,权重在反向传播期间更新。
  • 验证集(开发集):我们希望模型在其上表现良好的数据集。在训练过程中,我们调整超参数,以使模型在开发集上表现良好(但不要使用开发集进行训练,它仅用于查看性能,以便我们可以决定如何更改超级集。参数,并在更改超参数后,我们将继续训练火车。 Dev-set仅用于调整超参数,以使模型适合在未知数据上正常工作(此处dev-set被视为未知数据集的代表,因为它不直接用于训练,还称其为Hyper -参数就像调整旋钮以更改训练方式),并且在开发集上不会发生向后传播,因此无法从中进行直接学习。
  • 测试集::我们仅将其用于无偏估计。与开发集一样,测试集上也不会进行任何训练。与验证集(devset)的唯一区别是,我们甚至在这里调整超参数,只是看我们的模型学习了多大的概括。尽管像测试集一样,开发集不直接用于训练,但是随着我们反复调整针对开发集的超参数,我们的模型间接地从开发集学习模式,并且开发集不再是未知的到模型。因此,我们需要另一个甚至没有用于超参数调整的 dev-set的新副本,我们将这个dev-set的新副本称为测试集。根据测试集的定义,模型应“未知”。但是,如果我们不能像这样管理一个新的,看不见的测试集,那么有时我们将开发集称为测试集。

总结:

  • 火车设置:用于训练。
  • 验证集/开发集:用于调整超参数。
  • 测试集:用于无偏估计。

在这里再次遇到一些实际问题:

  • 对于培训,您可以从任何地方收集数据。如果您收集的所有数据都不来自将使用该模型的同一域,也可以。例如,如果真实域是使用智能手机相机拍摄的照片,则不必仅使用智能手机照片进行数据设置。您可以包括来自互联网,高端或低端相机或任何地方的数据。
  • 对于开发集和测试集,必需以反映实际将在其中使用模型的真实域数据。它还应包含所有可能的情况,以便进行更好的估计。
  • 开发集和测试集不必太大。只需确保它几乎涵盖了实际数据中可能发生的所有情况。确保它完成后,尝试提供尽可能多的数据来构建火车。

答案 3 :(得分:2)

所以基本上在验证集中,模型将尝试预测但不会更新其权重(这意味着它不会从中学习)因此您将清楚地了解您的模型可以找到多好训练数据中的模式并将其应用于新数据。