我的问题很简单,什么是验证数据在序列模型中传递给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_acc
和val_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中的验证集是否还有其他目标?
答案 0 :(得分:27)
如果您想构建一个实体模型,您必须遵循将数据分成三组的特定协议:一个用于培训,一个用于验证,一个用于最终评估,这是测试集。
我们的想法是,您可以训练您的训练数据,并根据您从验证集中获得的指标(准确性,损失等)的结果来调整您的模型。
您的模型没有“看到”您的验证集,也没有以任何方式接受过培训,但您作为超参数的架构师和主人根据此数据调整模型。 因此它间接影响您的模型,因为它直接影响您的设计决策。您轻松推动您的模型与验证数据一起使用,并且可能会导致倾斜。
正是这就是你只评估你的模型最终得分的原因,你的模型和你自己都没有使用过 - 这是你的测试集的第三个数据块。
只有这个程序才能确保您获得模型质量的未受影响的视图,并能够概括在完全看不见的数据上学到的内容。
答案 1 :(得分:8)
此YouTube视频介绍了验证集是什么,为什么有用,以及如何在Keras中实现验证集:Create a validation set in Keras
使用验证集,您基本上可以从训练集中取出一小部分样本,或者一起创建一个全新的集合,并通过训练保留此集合中的样本。
在每个时期,模型将在训练集中的样本上进行训练,但不会对验证集中的样本进行训练。相反,该模型将仅对验证集中的每个样本进行验证。
这样做的目的是让您能够判断模型的概括程度。这意味着,您的模型能够如何预测在训练时未看到的数据。
拥有验证集还可以深入了解您的模型是否过度拟合。这可以通过将您的训练样本中的acc
和loss
与验证样本中的val_acc
和val_loss
进行比较来解释。例如,如果您的acc
很高,但val_acc
落后,则表明您的模型过度拟合。
答案 2 :(得分:7)
我认为,对训练集,验证集和测试集进行整体讨论会有所帮助:
总结:
在这里再次遇到一些实际问题:
答案 3 :(得分:2)
所以基本上在验证集中,模型将尝试预测但不会更新其权重(这意味着它不会从中学习)因此您将清楚地了解您的模型可以找到多好训练数据中的模式并将其应用于新数据。