Высокая точность как при обучении, так и при проверке, но очень низкая тестовая установка - PullRequest
0 голосов
/ 21 мая 2019

Моя модель 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)

Здесь мы можем видеть поведение модели acc_loss_image во время обучения, и я заметил, что точность проверки всегда выше, чем точность обучения.Так почему это происходит?Почему такая низкая точность на тестовом наборе и почему точность проверки выше точности обучения?Каковы возможные решения?

1 Ответ

2 голосов
/ 21 мая 2019

Возможно, вы делаете что-то необычное с метками на тестовом наборе, чего не происходит с поездом / проверкой.

Почему вы передаете classes=["test"] тестовому данных, а не другим?

Из документации : "классы: необязательный список подкаталогов классов (например, ['dogs',' cats ']). По умолчанию: Нет. Если не указан, список классов будет автоматически выведен из имен / структуры подкаталога в каталоге, где каждый подкаталог будет обрабатываться как отдельный класс (и порядок классов, который сопоставляется с индексами меток, будет буквенно-цифровым.) Словарь, содержащий сопоставление имен классов и индексов классов, можно получить с помощью атрибута class_indices. "

Имеет ли папка 'original_data /' ту же папкуструктура, которую имеют наборы данных / training_set и наборы данных / valid_set /?

...