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

What is validation data used for in a Keras Sequential model?

我的问题很简单,在顺序模型中传递给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 之类的变量(可以从回调访问)。 keras.models.training.fit 还调用了 keras.models.training._fit_loop,它将验证数据添加到 callbacks.validation_data,还调用了 keras.models.training._test_loop,它将验证数据分批循环到 self.test_function模型的。此函数的结果用于填充日志的值,这些值是可从回调中访问的值。

看完这些,我觉得传递给model.fit的验证集在训练过程中并没有用来验证任何东西,它的唯一用途是得到关于训练模型在每个epoch中表现如何的反馈对于一个完全独立的集合。因此,使用相同的验证和测试集就可以了,对吧?

谁能确认 model.fit 中的验证集除了从回调中读取外还有其他目标吗?

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

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

您的模型不会“看到”您的验证集,也不会以任何方式对其进行训练,但您作为超参数的架构师和大师调整模型根据这个数据。 因此它会间接影响您的模型,因为它会直接影响您的设计决策。您推动您的模型与验证数据很好地配合使用,这可能会带来倾斜。

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

只有这个过程才能确保您对模型质量有一个不受影响的看法,并且能够概括在完全看不见的数据上学到的东西。

这个 YouTube 视频解释了什么是验证集、它为什么有用,以及如何在 Keras 中实现验证集:Create a validation set in Keras

对于验证集,您实际上是从训练集中取出一小部分样本,或者一起创建一个全新的集合,并从训练中保留该集合中的样本。

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

这样做的目的是让你能够判断你的模型泛化能力如何。意思是,您的模型能够预测在训练时未看到的数据的能力如何。

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

我认为对训练集、验证集和测试集进行全面讨论会有所帮助:

  • Train-Set: 训练模型的数据集。这是在反向传播期间更新权重的 唯一 数据集。
  • 验证集(开发集): 我们希望模型在其上表现良好的数据集。在训练过程中,我们调整超参数,使模型在开发集上表现良好(但不要使用开发集进行训练,它仅用于查看性能,以便我们可以决定如何更改超参数-参数,在改变超参数后,我们继续我们在训练集上的训练)。 Dev-set 仅用于调整超参数以使模型有资格在未知数据上很好地工作(这里 dev-set 被认为是未知数据集的代表,因为它不直接用于训练,另外说 hyper -参数就像调整旋钮来改变训练方式)并且在开发集上没有反向传播发生,因此没有直接从中学习。
  • 测试集:我们只是用它来进行无偏估计。与开发集一样,测试集上没有训练。与验证集(开发集)的唯一区别是我们甚至在这里调整超参数,只是看看我们的模型学习泛化的程度。尽管与测试集一样,开发集不直接用于训练,但是随着我们反复调整针对开发集的超参数,我们的模型间接地从开发集学习模式并且开发集不再是未知的到模型。因此,我们需要另一个 dev-set 的新副本,它甚至没有用于超参数调整,我们将这个新的 dev-set 副本称为测试集。根据测试集的定义,模型应该是 "unknown"。但是,如果我们不能像这样管理一个新鲜的、看不见的测试集,那么有时我们会把开发集称为测试集。

总结:

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

这里又是一些实际问题:

  • 对于培训,您可以从任何地方收集数据。如果您收集的所有数据不是来自将使用模型的同一域,那也没关系。例如,如果真实域是用智能手机相机拍摄的照片,则没有必要只用智能手机照片制作数据集。您可以包括来自互联网、高端或低端相机或任何地方的数据。
  • 对于开发集和测试集,有必要反映模型实际使用的真实域数据。它还应该包含所有可能的情况以便更好地估计。
  • 开发集和测试集不需要那么大。只要确保它几乎涵盖了真实数据中可能出现的所有情况或情况即可。在确保它尝试提供尽可能多的数据来构建训练集之后。

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