训练和验证的准确性都很高,而测试集的准确性却很低

时间:2019-05-21 12:57:21

标签: python machine-learning keras neural-network

我的CNN模型在训练集和验证集上的准确率均约为96%至97%。但是,提交测试集时,其准确度仅为24%。 这是我的模型:

def build_cnn_model():
    classifier = Sequential()
    classifier.add(Convolution2D(32, (3, 3), input_shape=(64, 64, 3), activation='relu'))
    classifier.add(MaxPooling2D())
    classifier.add(Convolution2D(32, (3, 3), activation='relu'))
    classifier.add(MaxPooling2D())
    classifier.add(Convolution2D(64, (3, 3), activation='relu'))
    classifier.add(MaxPooling2D())
    classifier.add(Flatten())
    classifier.add(Dense(64, activation='relu'))
    classifier.add(Dropout(0.5))
    classifier.add(Dense(4, activation='softmax'))

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

    return classifier

训练集包含约40k图像,有效集包含约10k图像,测试集包含5.5k图像。这是我的实现方式

train_datagen = ImageDataGenerator(rescale=1./255)
valid_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

training_set = train_datagen.flow_from_directory(
    'datasets/training_set',
    target_size=(64, 64),
    batch_size=32,
    seed=42,
    class_mode='categorical')

valid_set = valid_datagen.flow_from_directory(
    'datasets/valid_set/',
    target_size=(64, 64),
    batch_size=32,
    seed=42,
    class_mode='categorical')

test_set = test_datagen.flow_from_directory(
    'original_data/',
    classes=['test'],
    target_size=(64, 64),
    seed=42,
    class_mode=None,
    batch_size=1)

test_set.reset()

classifier = build_cnn_model()

classifier.fit_generator(
    training_set,
    epochs=10,
    steps_per_epoch=1222,
    validation_data=valid_set,
    validation_steps=305)

在这里我们可以看到训练期间模型acc_loss_image的行为,我注意到验证准确性始终高于训练准确性。那么为什么会这样呢?为什么测试集的精度如此之低,为什么验证精度高于训练精度?有什么可能的解决方案?

1 个答案:

答案 0 :(得分:2)

您可能正在使用测试集中未在训练/验证中出现的标签进行一些时髦的操作。

您为什么将classes=["test"]传递给测试数据源,而不传递给其他人?

来自documentation:“类:类子目录的可选列表(例如['dogs','cats'])。默认值:无。如果未提供,则从子目录中自动推断出类列表。目录下的名称/结构,其中每个子目录将被视为一个不同的类(并且类的顺序(映射到标签索引)将是字母数字)。包含从类名到类索引的映射的字典可以是通过属性class_indices获得。”

“原始数据/”是否具有与“数据集/ training_set”和“数据集/ valid_set /”相同的文件夹结构?