Вопрос или проблема
Я создал модель keras, которая принимает 3 изображения на вход, передает их в отдельные CNN backbone (mobilenet_v2) и объединяет результаты из 3 отдельных потоков. Эти объединенные выходы далее проходят через FCN и дают вероятностные значения для 10 классов. Теперь, когда я передаю 3 изображения в свою модель, используя model.predict(), я получаю выходные данные размером 3×10 (список из 3 выходов с 10 значениями в каждом).
А вот выходные данные
*[[0.04718336 0.07464679 0.1329775 0.09312231 0.12029872 0.10404643 0.08732469 0.03571845 0.16900443 0.13567731]
[0.0726063 0.0712122 0.12180576 0.07443767 0.14696348 0.10402806 0.09013776 0.03013403 0.17304562 0.11562922]
[0.06313297 0.06455057 0.11175603 0.06945134 0.16163406 0.12042907 0.10410044 0.04393855 0.12963305 0.13137391]]*
Есть идеи, что здесь происходит?
Это возвращает вероятности того, что данный образец принадлежит какому-либо классу. У вас есть 10 классов. Вы можете увидеть, какой класс предсказывает ваша модель, добавив;
y_pred = y_pred.argmax(axis=1)
Ответ или решение
Проблема, с которой вы столкнулись при использовании вашей модели Keras, связана с некорректным интерпретированием выходных данных, а не с ошибками в самой архитектуре сети или процессе предсказания. Давайте разберемся более подробно.
Описание проблемы
Вы создали модель Keras, которая принимает на вход три изображения и обрабатывает их с помощью индивидуальных сверточных нейронных сетей (CNN). Затем результаты этих потоков объединяются, и обрабатываются через полносвязную нейронную сеть (FCN) для генерации вероятностей для 10 классов.
На выходе вы получили массив размерности 3×10, что означает, что ваша модель производит предсказания для трех входных изображений. Каждый из этих векторов вероятностей указывает, насколько вероятно, что соответствующее изображение относится к каждому из 10 классов.
Анализ результата
Исходные данные, которые вы представили, показывают, что для каждого из трёх изображений модель возвращает вектор из 10 вероятностей. Эти вероятности призваны отразить уверенность в принадлежности каждого изображения к различным классам.
Чтобы сделать окончательное предсказание о том, к какому классу относится конкретное изображение, вы можете воспользоваться методом argmax()
, который возвращает индекс класса с максимальной вероятностью. Это достигается с помощью следующего кода:
y_pred = y_pred.argmax(axis=1)
Этот код преобразует ваш выходной массив (3×10) в одномерный массив, где каждый элемент соответствует указанному классу для каждого изображения.
Возможные проблемы
-
Неочевидная интерпретация выходов: Как упомянуто выше, формат выхода 3×10 может быть неочевиден, особенно если вы ожидаете предсказание только для одного изображения. Убедитесь, что правильно интерпретируете ваши выходные данные.
-
Обработка входных данных: Убедитесь, что все три изображения проходят через одну и ту же предварительную обработку (например, изменение размера, нормализация). Разные подходы к предварительной обработке могут привести к несбалансированным выводам.
-
Правильная тренировка модели: Проверьте, что ваша модель хорошо обучена на достаточном количестве данных. Переобучение или недообучение могут привести к низким вероятностям для всех классов.
-
Фузия выходов: Проверьте, как вы объединяете выходные данные из отдельных потоков. Неправильная операция может привести к неправильному расчету итоговых вероятностей.
Рекомендации
- Проведите дополнительные тесты с вашими входными изображениями, чтобы выяснить, правильно ли модель предсказывает классы.
- Визуализируйте выходы с помощью графиков, чтобы лучше понять, как модель реагирует на различные входные данные.
- Убедитесь, что ваше обучение проходит на достаточном объеме данных и что они хорошо сбалансированы между классами.
Если все упомянутое выше выполнено, а результаты по-прежнему не удовлетворительные, возможно, вам потребуется провести дополнительную настройку архитектуры вашей модели или попробовать другие стратегии объединения извлеченных признаков.