Keras的fit函数的validation_split参数如何工作?


17

https://keras.io/models/sequential/上记录了Keras顺序模型拟合函数中的验证拆分:

validation_split:在0到1之间浮动。要用作验证数据的训练数据的分数。模型将分开训练数据的这一部分,不对其进行训练,并且将在每个时期结束时评估此数据的损失和任何模型度量。在改组之前,从提供的x和y数据中的最后一个样本中选择验证数据。

请注意最后一行:

在改组之前,从提供的x和y数据中的最后一个样本中选择验证数据。

这是否意味着验证数据始终是固定的,并且取自主数据集的底部?

有什么办法可以从主数据集中随机选择给定的数据部分?

Answers:


17

实际上,您实际上不想在每个时期之后对验证集重新采样。如果执行此操作,则将对数据集中的每个样本进行模型训练,因此将导致过度拟合。您希望始终在训练过程之前拆分数据,然后仅应使用训练数据的子集来训练算法。

设计的功能可确保以一种始终分离数据的方式分离数据,以便每个时期都在数据的相同部分上进行训练。如果选择了该选项,则所有训练都将在训练样本之间进行。

但是,对于某些数据集,获取最后几个实例是没有用的,特别是如果数据集是基于类进行重组的。然后,您的班级分配将出现偏差。因此,您将需要某种随机方法来提取数据的子集,以在训练和验证集中获得平衡的班级分布。为此,我一直喜欢使用sklearn函数,如下所示

from sklearn.model_selection import train_test_split

# Split the data
x_train, x_valid, y_train, y_valid = train_test_split(data, labels, test_size=0.33, shuffle= True)

这是一个很好用的函数,可以满足您的需求。变量datalabels是标准的numpy矩阵,第一个维度是实例。


1
我并不是说在每个时期后获得不同的测试集。我在问它从数据集的末尾获取数据的原因,因为许多数据集可能根据类进行排列(如您所述)。我知道train_test_split,现在您确认这是一个更好的方法,因为它将从数据集中随机获取测试/验证数据。
rnso

@rnso,很遗憾,Keras没有提供该选项。我想这实际上不在他们想要提供的范围之内。名称带有随机的2种不同的方法输入会使实现有些混乱。
JahKnows

您没有通过使用train_test_spli来混合验证和测试数据的定义吗?
bagustris '19

如果使用shuffle参数,是否还会shuffle.fitkeras模型中使用?
Shamoon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.