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


我的问题很简单, 什么是验证数据 传递给Sequential模型中的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中的验证集是否还有其他任何目标?


2877
2017-09-19 19:28


起源

如果他们帮助您解决问题,请不要忘记接受任何答案,以便其他人看到此线程已解决。 - petezurich


答案:


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

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

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

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

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


11
2017-09-19 19:33



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


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

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

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

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

拥有验证集还可以深入了解您的模型是否过度拟合。这可以通过比较来解释 acc 和 loss 从你的训练样本到 val_acc 和 val_loss 来自您的验证样本。例如,如果你的 acc 很高,但你的 val_acc 落后了,这很好地表明你的模型过度拟合。


3
2017-09-20 00:12