我是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()
中将洗牌改为False似乎没有任何影响。但是当我取消第二行注释并使用x_train, _, y_train, _ = train_test_split(x_train, y_train, test_size=0.01, random_state = 0, shuffle=True)
对数据集进行洗牌时,模型达到了超过80%的val_accuracy !不管model.fit()
, shuffle设置为True或False
这怎么可能?在拟合模型之前对数据进行洗牌应该没有任何区别,因为它的训练数据在每个epoch之前都是洗牌的?还是我理解错了model.fit()
的参数变换?还是在train_test_split()
中发生了其他魔法?
您正在使用验证分割为。2。现在是每个模型。Fit文档
The validation data is selected from the last samples in the x and y data provided, before shuffling.
所以我唯一能想到的是当你不使用train_testrongplit模型使用的验证数据。Fit总是从未洗牌的训练数据中取出相同的数据。当您使用train_testrongplit时,训练数据被打乱,因此在本例中验证数据是不同的。如果验证集的大小很小,这可能会对计算的验证精度产生巨大的影响,因为两种情况下的验证样本是不同的。我认为这对模特来说是很差的练习。适合从训练数据的末尾选择验证数据。它应该从训练数据中随机选择。即使有相当多的验证样本,如果训练样本末尾的数据与其余训练数据的概率分布明显不同,这可能会导致验证精度低得多。例如,如果你正在对狗和猫进行分类,并且在训练集中最后的所有图像都是猫,那么验证图像将都是猫。