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

dan*_*idc 34 python validation training-data keras 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))
Run Code Online (Sandbox Code Playgroud)

我调查了一下,我看到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并不用于在训练期间验证任何东西,它的唯一用途是获得关于训练模型在完全独立集合的每个时期中如何执行的反馈.因此,使用相同的验证和测试集会很好,对吧?

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

pet*_*ich 42

如果要构建实体模型,则必须遵循将数据拆分为三组的特定协议:一个用于培训,一个用于验证,一个用于最终评估,即测试集.

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

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

这正是您只评估模型最终得分的原因,这些数据既不是您的模型也不是您自己使用的 - 这是第三块数据,即您的测试集.

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

  • 好吧,我已经弄清楚了,但它就像你说的那样.基本上,因为我们可以使用验证准确性和损失来学习模型,我们需要一个不同的测试集来验证我们学到的东西.例如,如果我有3个模型,我在相同的训练数据中训练它们,我得到每个用于选择"最佳模型"的验证准确度,然后我在不同的测试集中测试我选择的模型所以我可以得到模型的准确性.如果我使用了验证集,则结果会有偏差. (3认同)

bla*_*tor 11

此YouTube视频介绍了验证集是什么,为什么它有用,以及如何在Keras中实现验证集:在Keras中 创建验证集

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

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

这样做的目的是让您能够判断模型的概括性.意思是,您的模型能够在数据上预测它在训练时没有看到的情况.

拥有验证集还可以深入了解您的模型是否过度拟合.这可以通过比较来解释acc,并loss从你的训练样本的val_accval_loss从您的验证样品.例如,如果你的acc位置很高,但是你val_acc的落后,那么这就是你的模型过度拟合的良好迹象.


haf*_*031 9

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

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

总结:

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

这里又是一些实际问题:

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


小智 5

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