我是Keras的新手,面临着一个我不理解的问题,到目前为止,我在互联网上也找不到任何解决方案。
我使用以下几行代码在UrbanSound8K数据集上训练一个简单的模型:
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()中有没有什么额外的魔力
发布于 2021-01-28 07:45:14
您正在使用.2的验证拆分。现在,根据model.fit文档,它声明
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来说,从训练数据的末尾选择验证数据是一种糟糕的做法。它应该从训练数据中随机选择它。即使有相当多的验证样本,如果训练样本末尾的数据具有与其余训练数据显着不同的概率分布,这可能导致验证精度大大降低。例如,如果你正在对狗和猫进行分类,并且在训练集中,所有最后的图像都是猫的,那么验证图像就都是猫。
https://stackoverflow.com/questions/65928428
复制相似问题