Высокая точность на тестовых и валидационных данных, но все еще не удается предсказать на реальных данных

Вопрос или проблема

Здравствуйте, у меня классификация между двумя классами A и B, и я обучил модель CNN. У меня высокая точность на всех трех наборах данных: обучающем (98.7%), валидационном (99.3%) и тестовом (98%), но я все равно не могу предсказать на реальных данных. Кто-нибудь, пожалуйста, помогите разобраться с проблемой.
p.s. У меня сбалансированные данные.

train_augmented = ImageDataGenerator(rescale=1./255,
                                   rotation_range = 40,
                                   horizontal_flip = True,
                                   
                                   zoom_range = 0.2
                                   )
test_augmented = ImageDataGenerator(rescale=1./255)
validation_augmented = ImageDataGenerator(rescale=1./255)

training_set = train_augmented.flow_from_directory(train,
                                                    target_size=(150,150),
                                                    batch_size = 32,
                                                    class_mode="binary",
                                                    
                                                    color_mode="rgb",
                                                    shuffle=True
                                                    )
test_set = test_augmented.flow_from_directory(test,
                                                    target_size=(150,150),
                                                    batch_size = 32,
                                                    class_mode="binary",
                                                    color_mode="rgb",
                                                    shuffle=False
                                                    )
validation_set = validation_augmented.flow_from_directory(validation,
                                                    target_size=(150,150),
                                                    batch_size = 32,
                                                    class_mode="binary",
                                                    color_mode="rgb",
                                                    shuffle=False
                                                    )
model = Sequential()
model.add(Conv2D(32,(3,3),activation='relu',input_shape=(150,150,3)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))

model.add(Conv2D(64,(3,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(256,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1,activation='sigmoid'))
model.summary()
model.compile(Adam(learning_rate=0.001),loss="binary_crossentropy",metrics=['accuracy'])
history = model.fit_generator(training_set,
                    epochs = 30,
                    validation_data = validation_set)

Это означает, что ваши обучающие/валидационные/тестовые данные не являются представительными для реального мира.

Вам следует получить новые данные из реального мира и использовать их вместо этого.

Конечно, я доверяю, что ваши обучающие/валидационные/тестовые директории не содержат дубликатов.

Прежде всего, сбалансирован ли ваш набор данных? Если нет, то точность — плохая метрика для использования, так как она будет сильно зависеть от наиболее представленного класса. Вы можете использовать F&-меру, которая будет лучше.

Вы уверены, что ваш тестовый набор отличается от обучающего набора?

В противном случае, как предлагает @nicolas-raoul, убедитесь, что ваши обучающий / тестовый наборы совпадают.

Удачи в вашем расследовании!

Ответ или решение

Доброго времени суток!

Ваш вопрос о высокой точности на обучающих и тестовых данных, но низкой производительности на реальных данных, действительно требует тщательного анализа.

  1. Представительность данных: Возможно, ваша модель сильно переобучилась на наборы данных, используемые для обучения и валидации. Это часто случается, если данные, на которых вы обучаете, не репрезентативны по отношению к реальным данным. Проверьте, насколько различные примеры в вашем тренировочном, валидационном и тестовом наборах представляют реальные условия. Например, используемые вами изображения могут быть из существенно отличающихся источников или условий.

  2. Количество и качество данных: Убедитесь, что у вас достаточно разнообразных данных как в обучающем наборе, так и в тестовом. Если у вас ограниченное количество изображений, модель может лишь запомнить образы, а не научиться их обобщать. Использование методов аугментации данных (как вы уже делаете) может помочь улучшить качество модели, но все же лучше иметь разнообразие в оригинальных данных.

  3. Метрики оценки: Если у вас сбалансированные классы, то точность (accuracy) может быть хорошим показателем, однако, если есть даже незначительное смещение в классах, стоит использовать другие метрики, такие как F1-мера или ROC-AUC, для более глубокого анализа. Это особенно важно, если классы неравномерно представлены в реальных данных.

  4. Проверка тестового набора: Убедитесь, что ваш тестовый набор действительно независим от вашего обучающего набора. Если вы случайно включили одинаковые или слишком схожие изображения в оба набора, это может исказить результаты. Более того, избежать смешивания данных поможет использование фильтров и отборов, чтобы четко разграничить тестовый и обучающий наборы.

  5. Дискриминационная способность модели: Возможно, вашей модели не хватает дискриминационной способности для различения более сложных или неожиданных паттернов в реальных данных. Для проверки, попробуйте провести визуальный анализ ошибок, чтобы увидеть, какие именно примеры она неправильно классифицирует. Это может помочь определить, какие дополнительные данные или аугментации могут понадобиться.

  6. Тестирование с реальными данными: Как вы уже упомянули, имейте в виду, что реальным данным нужны свежие примеры. Пробуйте собирать и наносить данные из реальной среды, чтобы убедиться, что модель адаптируется к условиям, отличным от тех, на которых она было обучена.

  7. Регуляризация и оптимизация модели: Возможно, следует исследовать применение различных техник регуляризации (например, L2-регуляризацию или изменение структуры сети) или попробовать другие архитектуры нейронных сетей, чтобы лучше справляться с новым набором данных.

Если вы учтете все эти рекомендации, это может помочь улучшить производительность вашей модели на реальных данных. Удачи вам в вашем исследовании и обучении модели!

Оцените материал
Добавить комментарий

Капча загружается...