Вопрос или проблема
Здравствуйте, у меня классификация между двумя классами 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, убедитесь, что ваши обучающий / тестовый наборы совпадают.
Удачи в вашем расследовании!
Ответ или решение
Доброго времени суток!
Ваш вопрос о высокой точности на обучающих и тестовых данных, но низкой производительности на реальных данных, действительно требует тщательного анализа.
-
Представительность данных: Возможно, ваша модель сильно переобучилась на наборы данных, используемые для обучения и валидации. Это часто случается, если данные, на которых вы обучаете, не репрезентативны по отношению к реальным данным. Проверьте, насколько различные примеры в вашем тренировочном, валидационном и тестовом наборах представляют реальные условия. Например, используемые вами изображения могут быть из существенно отличающихся источников или условий.
-
Количество и качество данных: Убедитесь, что у вас достаточно разнообразных данных как в обучающем наборе, так и в тестовом. Если у вас ограниченное количество изображений, модель может лишь запомнить образы, а не научиться их обобщать. Использование методов аугментации данных (как вы уже делаете) может помочь улучшить качество модели, но все же лучше иметь разнообразие в оригинальных данных.
-
Метрики оценки: Если у вас сбалансированные классы, то точность (accuracy) может быть хорошим показателем, однако, если есть даже незначительное смещение в классах, стоит использовать другие метрики, такие как F1-мера или ROC-AUC, для более глубокого анализа. Это особенно важно, если классы неравномерно представлены в реальных данных.
-
Проверка тестового набора: Убедитесь, что ваш тестовый набор действительно независим от вашего обучающего набора. Если вы случайно включили одинаковые или слишком схожие изображения в оба набора, это может исказить результаты. Более того, избежать смешивания данных поможет использование фильтров и отборов, чтобы четко разграничить тестовый и обучающий наборы.
-
Дискриминационная способность модели: Возможно, вашей модели не хватает дискриминационной способности для различения более сложных или неожиданных паттернов в реальных данных. Для проверки, попробуйте провести визуальный анализ ошибок, чтобы увидеть, какие именно примеры она неправильно классифицирует. Это может помочь определить, какие дополнительные данные или аугментации могут понадобиться.
-
Тестирование с реальными данными: Как вы уже упомянули, имейте в виду, что реальным данным нужны свежие примеры. Пробуйте собирать и наносить данные из реальной среды, чтобы убедиться, что модель адаптируется к условиям, отличным от тех, на которых она было обучена.
-
Регуляризация и оптимизация модели: Возможно, следует исследовать применение различных техник регуляризации (например, L2-регуляризацию или изменение структуры сети) или попробовать другие архитектуры нейронных сетей, чтобы лучше справляться с новым набором данных.
Если вы учтете все эти рекомендации, это может помочь улучшить производительность вашей модели на реальных данных. Удачи вам в вашем исследовании и обучении модели!