Моя модель 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
Учебный набор содержит около 40 тыс. Изображений, действительный набор содержит около 10 тыс. Изображений, а тестовый набор состоит из 5,5 тыс. Изображений.Вот моя реализация
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)
Здесь мы можем видеть поведение модели во время обучения, и я заметил, что точность проверки всегда выше, чем точность обучения.Так почему это происходит?Почему такая низкая точность на тестовом наборе и почему точность проверки выше точности обучения?Каковы возможные решения?