ChatGPT解决这个技术问题 Extra ChatGPT

Keras 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 的验证集在训练期间并没有用来验证任何东西,它的唯一用途是获得关于训练模型在每个 epoch 中对于完全独立集的表现的反馈。因此,使用相同的验证和测试集是没问题的,对吧?

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


x
xskxzr

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

这个想法是你在训练数据上进行训练,并使用你从验证集中获得的指标结果(准确性、损失等)来调整你的模型。

您的模型没有“看到”您的验证集,也没有以任何方式对其进行训练,但您作为超参数的架构师和大师,您可以根据这些数据调整模型。因此,它间接影响您的模型,因为它直接影响您的设计决策。你推动你的模型与验证数据一起工作,这可能会带来倾斜。

正是因为这个原因,你只评估你的模型和你自己都没有使用过的数据的模型的最终分数——这就是第三组数据,你的测试集。

只有这个过程才能确保您对模型的质量和概括在完全看不见的数据上学到的知识的能力有一个不受影响的看法。


好的,我已经想通了,但就像你说的那样。基本上,因为我们可以使用验证准确度和损失来了解模型的某些内容,所以我们需要一个不同的测试集来验证我们学到的东西。例如,如果我有 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的解释,潜在的偏见并非无效,是有区别的。我非常需要这种健全性检查,并且我进一步得出结论,如果我承诺在我最终看到新的“测试”数据时不进一步改变超参数,那么我什至没有潜在的偏见?
b
blackHoleDetector

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

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

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

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

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


当我们想对 keras 中的大型数据集使用 train_on_batch() 时,相同的验证解决方法是什么?
h
hafiz031

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

训练集:用于训练模型的数据集。这是在反向传播期间更新权重的唯一数据集。

验证集(开发集):我们希望模型在其上表现良好的数据集。在训练过程中,我们调整超参数,使模型在 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/…
A
Aaditya Shukla

所以基本上在验证集中,模型会尝试预测但它不会更新它的权重(这意味着它不会从中学习)所以你会清楚地知道你的模型在多大程度上可以找到模型中的模式训练数据并将其应用于新数据。