Keras Sequential 模型中使用的验证数据是啥?
Posted
技术标签:
【中文标题】Keras Sequential 模型中使用的验证数据是啥?【英文标题】:What is validation data used for in a Keras Sequential model?Keras Sequential 模型中使用的验证数据是什么? 【发布时间】:2018-02-28 16:58:35 【问题描述】:我的问题很简单,什么是验证数据传递给序列模型中的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
之类的变量(可以从回调中访问)。 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 中的验证集除了从回调中读取之外还有其他目标吗?
【问题讨论】:
【参考方案1】:如果您想构建一个实体模型,您必须遵循将数据分成三组的特定协议:一组用于训练,一组用于验证,一组用于最终评估,也就是测试集。
我们的想法是,您使用您的训练数据进行训练,并使用您从验证集中获得的指标结果(准确度、损失等)来调整您的模型。
您的模型没有“看到”您的验证集,也没有以任何方式对其进行训练,但您作为超参数的架构师和大师,会根据这些数据调整模型。 因此,它会间接影响您的模型,因为它直接影响您的设计决策。您推动您的模型与验证数据很好地配合,这可能会导致倾斜。
正是因为这个原因,您只根据您的模型和您自己都没有使用过的数据评估模型的最终得分——这就是第三组数据,即您的测试集。
只有这个过程才能确保您对模型质量和概括从完全看不见的数据上学到的知识的能力没有影响。
【讨论】:
好吧,我已经想通了,但和你说的完全一样。基本上,因为我们可以使用验证准确度和损失来了解模型的某些内容,所以我们需要一个不同的测试集来验证我们学到的东西。例如,如果我有 3 个模型,我会在相同的训练数据中训练它们,我会为每个模型获得验证准确度,用于选择“最佳模型”,然后在不同的测试集中测试我选择的模型所以我可以得到模型的准确性。如果我为此使用验证集,结果会有所偏差。 当我们想对 keras 中的大型数据集使用 train_on_batch() 时,相同的验证解决方法是什么? 当使用“model.fit(X_train, Y_train, validation_data=(X_test, Y_test))”时,是否仍然需要使用“.predict()”或“.evaluate()”(使用 X_test , Y_test 还是其他集合)? @Ben 是的。 “另一个”集合称为测试集。这对于无偏估计是必要的。如果你能做到,那总是好的(或者至少没有害处)。您可以查看我的答案以了解更多详细信息。 感谢您的明确解释。今天我有一位资深数据科学家当面告诉我,如果未能保留第三组测试数据将导致过度拟合,从而使我的结果无效。根据您here的解释,潜在的偏见并非无效,是有区别的。我非常需要这种健全性检查,并且我进一步得出结论,如果我承诺在最终看到新的“测试”数据时不进一步改变超参数,那么我什至没有潜在的偏见?【参考方案2】:所以基本上在验证集中,模型会尝试进行预测,但不会更新其权重(这意味着它不会从中学习),因此您将清楚地了解模型可以找到的效果训练数据中的模式并将其应用于新数据。
【讨论】:
【参考方案3】:我认为对训练集、验证集和测试集进行全面讨论会有所帮助:
训练集: 训练模型的数据集。这是在反向传播期间更新权重的唯一数据集。 验证集(开发集):我们希望模型在其上表现良好的数据集。在训练过程中,我们调整超参数,使模型在 dev-set 上表现良好(但不要使用 dev-set 进行训练,它仅用于查看性能,以便我们可以决定如何更改超-parameters 并且在更改超参数后,我们继续在训练集上进行训练)。 Dev-set 仅用于调整超参数以使模型有资格在未知数据上正常工作(这里 dev-set 被认为是未知数据集的代表,因为它不直接用于训练并且另外表示超-参数就像调整旋钮以改变训练方式)并且在开发集上不会发生反向传播,因此不会直接从中学习。 测试集:我们只是将它用于无偏估计。与开发集一样,在测试集上不会进行任何训练。与验证集(开发集)的唯一区别是我们不甚至在这里调整超参数,只是看看我们的模型如何学会泛化。尽管与测试集一样,开发集并不直接用于训练,但随着我们反复调整针对开发集的超参数,我们的模型间接地从开发集学习模式,并且开发集不再未知到模型。因此,我们需要另一个 dev-set 的新副本,它甚至不用于超参数调整,我们将这个 dev-set 的新副本称为测试集。根据测试集的定义,模型应该是“未知的”。但是,如果我们不能像这样管理一个新的、看不见的测试集,那么有时我们会将开发集称为测试集。总结:
Train-Set:用于训练。 Validation-Set / Dev-Set:用于调整超参数。 测试集:用于无偏估计。这里又是一些实际问题:
对于培训,您可以从任何地方收集数据。如果您收集的所有数据不是来自将使用模型的同一域,那也没关系。例如,如果真实领域是智能手机相机拍摄的照片,则无需仅使用智能手机照片进行数据集。您可能包含来自互联网、高端或低端相机或任何地方的数据。 对于开发集和测试集,必须反映实际使用模型的领域数据。它还应该包含所有可能的情况,以便更好地估计。 开发集和测试集不需要那么大。只要确保它几乎涵盖了真实数据中可能出现的所有情况或情况。在确保它尝试提供尽可能多的数据来构建训练集之后。【讨论】:
最佳答案..我也曾经认为超参数与参数相同..你的答案让我在谷歌上搜索..对于像我这样的人来说这是你的答案datascience.stackexchange.com/questions/14187/… 这个超参数调整是自动完成的还是我必须手动完成?权重会通过反向传播自动更新,我想知道超参数调整是由另一种算法完成的。 @VansFannel,超参数是我们用来控制如何完成学习过程的变量。如果它是自动完成的,那么我们将无法控制训练过程。如果您不想调整它们,您始终可以为它们选择默认值。在大多数情况下,这是可以的,但如果您事先不知道如何处理该数据,则有时特别针对新情况,建议手动调整它们。 @VansFannel 是的,如果您事先不知道要选择哪个值或者您不确定模型的行为方式,建议您这样做。但是您最初可以为这些超参数选择默认值。如果它满足您的需求,那么您就完成了。否则逐渐改变它们并查看行为。一次不要更改多个超参数,否则您将无法真正知道是谁对某个更改负责。所以一一改变。您可以使用学习率调度程序逐渐降低学习率。您也可以尝试对超参数进行网格搜索。 @VansFannel 网格搜索可以在这种情况下为您提供帮助。它将从您那里获取可能的超参数输入,并将全部尝试。最后,它将通知您针对特定数据进行特定模型训练的最有希望的配置。它在 Scikit-Learn 中可用。更多详情请看这里:scikit-learn.org/stable/modules/generated/…【参考方案4】:此 YouTube 视频解释了验证集是什么、为什么有用以及如何在 Keras 中实现验证集:Create a validation set in Keras
使用验证集,您实际上是从训练集中取出一小部分样本,或者一起创建一个全新的集,并从训练中取出该集中的样本。
在每个 epoch 期间,模型将根据训练集中的样本进行训练,但不会根据验证集中的样本进行训练。相反,模型将仅对验证集中的每个样本进行验证。
这样做的目的是让您能够判断模型的泛化能力。意思是,您的模型对训练时看不到的数据的预测能力如何。
拥有验证集还可以很好地了解您的模型是否过度拟合。这可以通过将训练样本中的 acc
和 loss
与验证样本中的 val_acc
和 val_loss
进行比较来解释。例如,如果您的 acc
很高,但您的 val_acc
远远落后,这很好地表明您的模型过度拟合。
【讨论】:
当我们想对 keras 中的大型数据集使用 train_on_batch() 时,相同的验证解决方法是什么?以上是关于Keras Sequential 模型中使用的验证数据是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Keras学习手册,Keras 模型-Sequential API
尝试使用 Keras 上的回调保存我的模型时,Sequential' 对象没有属性 '_ckpt_saved_epoch' 错误