Вопрос или проблема
Я использую набор данных CelebA для обучения своей модели CNN для обнаружения ключевых точек на лицах. Вот моя модель
class LandmarkModel:
def __init__(self, inp_shape):
self.model = models.Sequential()
self.model.add(layers.Conv2D(16, (3, 3), activation='relu', input_shape=inp_shape))#l1
self.model.add(layers.Conv2D(32, (3, 3), activation='relu'))
self.model.add(layers.MaxPooling2D((2, 2)))
self.model.add(layers.Conv2D(64, (3, 3), activation='relu'))
self.model.add(layers.Flatten())
self.model.add(layers.Dense(512))
self.model.add(layers.Dense(10))
def getModel(self):
return self.model
Я обучил свою модель на примерно 5k-6k изображениях с убытком 0.1. Когда я использую изображение из набора данных, которое находится вне обучающей выборки, я получаю правильное предсказание. Но когда я использую свои собственные фотографии, предсказания совершенно неверные. Я сделал фотографии точно так же, как в наборе данных. Я также пробовал с загруженными изображениями знаменитостей, но предсказания все равно неверные. В чем причина такого поведения?
На это может быть много причин. Например, изображения иногда представлены числами в диапазоне 0-1, а иногда в диапазоне 0-255, и очень легко перепутать эти диапазоны для данных из набора / внешних, так как модель может работать с ошибками без каких-либо предупреждений.
В общем, если одна и та же модель дает вам разные результаты, значит, изображения не совсем одинаковые. Я предлагаю взять одно и то же изображение из вашего набора данных и интернета и сравнить сырые данные на входе модели. Если результаты разные, значит, входные тензоры должны отличаться, и вы можете проверить ваш процесс предобработки шаг за шагом, чтобы найти точку несоответствия.
Отладочные инструменты, такие как ipdb, обычно очень полезны в таких ситуациях.
Ответ или решение
Существует несколько причин, по которым ваша сверточная нейронная сеть (CNN) может не предсказывать правильно результаты на изображениях, которые не входят в обучающую выборку, даже если вы уверены, что они схожи с изображениями из набора данных CelebA.
-
Предобработка изображений: Как было упомянуто, одна из самых распространенных проблем — различие в предобработке изображений. Например, если изображения из вашего набора данных были нормализованы (например, приведены к диапазону значений от 0 до 1), а в ваших собственных изображениях этого не было сделано, это может привести к значительным отличиям в входных тензорах. Убедитесь, что все изображения, которые вы собираетесь подавать на вход модели, проходят ту же процедуру предобработки, что и изображения из набора данных (например, изменение размера, нормализация и т. д.).
-
Качество изображений: Ваши собственные фотографии могут отличаться по качеству, освещению или углу съемки от изображений в наборе данных. Даже если на первый взгляд они выглядят похожими, визуальные искажения могут повлиять на предсказания модели. Попробуйте использовать более качественные изображения и проверьте различные условия освещения.
-
Объем обучающего набора: Вы упомянули, что ваше обучение произошло на 5000-6000 изображений. Хотя это количество может быть достаточным для некоторых задач, для более сложных задач детекции лиц или landmark detection может потребоваться больше данных для достижения обобщающей способности. Попробуйте увеличить объем обучающего набора, добавив больше изображений из CelebA или других аугментированных данных.
-
Аугментация данных: Если вы не использовали аугментацию данных во время обучения, это может оказать влияние на способность вашей модели обобщать. Попробуйте включить методы аугментации, такие как вращение, изменение яркости или обрезка.
-
Архитектура модели: Хотя ваша модель может хорошо работать на обучающем наборе, её архитектура может не быть достаточно глубокой или сложной для учёта всех вариаций во внешних данных. Рассмотрите возможность использования более сложной архитектуры, такой как ResNet или EfficientNet, которые могут лучше справляться с различными задачами.
-
Изменение стиля изображения: Даже если вы сделали фотографии в аналогичном стиле, различия в текстурах, цветах, или даже других аспектах изображения могут повлиять на результаты. Используйте модели, предварительно обученные на больших наборах данных, чтобы они могли учитываться визуальные стили.
В качестве следующего шага я рекомендую протестировать свою модель, предоставляя изображения, которые максимально соответствуют условиям входных изображений из вашего обучающего набора, а также отладить процесс предобработки, чтобы удостовериться, что ваши входные данные формируются таким же образом.
Еще одним методом диагностики может быть сравнение массива чисел на входе модели для ваших изображений и изображений из набора данных. Попробуйте вывести значения входных тензоров и убедитесь, что они совпадают, чтобы выявить возможные проблемы в шаге предобработки.
Надеюсь, эти рекомендации помогут вам обнаружить источник проблемы и улучшить предсказания вашей модели.