我的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)
在这里我们可以看到训练期间模型的行为,我注意到验证准确性始终高于训练准确性。那么为什么会这样呢?为什么测试集的精度如此之低,为什么验证精度高于训练精度?有什么可能的解决方案?
答案 0 :(得分:2)
您可能正在使用测试集中未在训练/验证中出现的标签进行一些时髦的操作。
您为什么将classes=["test"]
传递给测试数据源,而不传递给其他人?
来自documentation:“类:类子目录的可选列表(例如['dogs','cats'])。默认值:无。如果未提供,则从子目录中自动推断出类列表。目录下的名称/结构,其中每个子目录将被视为一个不同的类(并且类的顺序(映射到标签索引)将是字母数字)。包含从类名到类索引的映射的字典可以是通过属性class_indices获得。”
“原始数据/”是否具有与“数据集/ training_set”和“数据集/ valid_set /”相同的文件夹结构?