首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sklearn.train_test_split:使用model.fit()混洗数据不会改变,但是Keras()会改变

Sklearn.train_test_split:使用model.fit()混洗数据不会改变,但是Keras()会改变
EN

Stack Overflow用户
提问于 2021-01-28 06:35:10
回答 1查看 474关注 0票数 1

我是Keras的新手,面临着一个我不理解的问题,到目前为止,我在互联网上也找不到任何解决方案。

我使用以下几行代码在UrbanSound8K数据集上训练一个简单的模型:

代码语言:javascript
复制
x_train, y_train, _, _ = load_data(["data_1.pickle", "data_5.pickle"])
#x_train, _, y_train, _ = train_test_split(x_train, y_train, test_size=0.01, random_state = 0, shuffle=True)

model = Sequential()

model.add(Dense(256, input_shape=(40,)))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(10))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')

model.fit(x_train, y_train, validation_split=0.2, batch_size=32, epochs=50, shuffle=True)

当我训练这个模型时,它达到了大约50%的val_accuracy。在model.fit()中将shuffle更改为False似乎没有任何影响。但是,当我取消注释第二行并使用x_train, _, y_train, _ = train_test_split(x_train, y_train, test_size=0.01, random_state = 0, shuffle=True)对数据集进行混洗时,模型的val_accuracy超过80%!与model.fit()无关,将shuffle设置为True或False。

这怎麽可能?在拟合模型之前混洗数据应该没有什么不同,因为它的训练数据在每个时期之前都会被混洗?或者我误解了model.fit()的参数随机排列?或者,在train_test_split()中有没有什么额外的魔力

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-28 07:45:14

您正在使用.2的验证拆分。现在,根据model.fit文档,它声明

代码语言:javascript
复制
 The validation data is selected from the last samples in the x and y data provided, before shuffling. 

因此,我能想到的唯一一件事是,当您不使用train_test_split时,model.fit使用的验证数据始终是从未洗牌的训练数据的末尾获取的相同数据。当您使用train_test_split时,训练数据被打乱,因此在这种情况下验证数据是不同的。如果验证集的大小很小,这可能会在计算的验证精度方面产生显着差异,因为对于两种情况,验证样本是不同的。我认为对于model.fit来说,从训练数据的末尾选择验证数据是一种糟糕的做法。它应该从训练数据中随机选择它。即使有相当多的验证样本,如果训练样本末尾的数据具有与其余训练数据显着不同的概率分布,这可能导致验证精度大大降低。例如,如果你正在对狗和猫进行分类,并且在训练集中,所有最后的图像都是猫的,那么验证图像就都是猫。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65928428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档