Вопрос или проблема
Я создал CNN с нуля на Python с использованием Numpy, чтобы решить задачу распознавания рукописных цифр MNIST. Он состоит из свертки (3 фильтра 3×3), слоя максимального объединения (пуллинг 2×2) и выходного слоя с 10 метками. Я использую softmax для функции активации на выходе и перекрестную энтропию в качестве функции потерь. Я пробовал запустить его с несколькими разными гиперпараметрами, и на данный момент лучшая точность, которую я получил, составляет 97%, когда обучался на всем обучающем наборе данных (60000 изображений) за одну эпоху и использовал SGD. Однако точность немного варьируется, обычно около 92-95% при этих условиях. Я пробовал только одну эпоху, используя весь набор данных, потому что на обучение моему алгоритму потребуется примерно 15 минут, используя 60000 изображений (с процессором на моем устаревшем школьном ноутбуке). Дело в том, что у меня нет представления о том, хорошо это или плохо, то есть сколько времени следует ожидать от такой сети и насколько точной она должна быть. Это действительно медленно и неточно? Я хотел бы получить несколько общих советов о том, как я могу улучшить свою сеть, будь то через методы оптимизации или грубую силу (увеличение количества слоев/нейронов). Я также пробовал реализовать мини-пакеты, но по каким-то причинам (возможно, ошибка в реализации?) это, похоже, лишь снижает точность.
Вам может быть интересно это OpenML
Там показаны несколько эталонов на разных наборах данных, чтобы вы могли увидеть, как различные модели оцениваются на одном и том же наборе данных
Для вашей задачи MNIST график показывает:
это может дать хорошее представление о том, насколько хорошо ваша модель работает по сравнению с другими реализациями/моделями
Кнопка Метрика в верхнем левом углу позволит вам сравнивать с точки зрения классификационных метрик и также с точки зрения времени выполнения
Тот факт, что вы используете точность в качестве метрики, указывает на то, что ваша модель работает плохо. Это слишком оптимистичная модель.
Причина в том, что для многоклассовой классификации никогда не следует использовать точность. Она всегда будет давать слишком оптимистичные результаты. Используйте categorical_accuracy
в качестве метрики и sparse_categorical_crossentropy
в качестве потерь.
Что касается повышения производительности вашей модели:
1.) Увеличьте количество эпох хотя бы до 50 или 100
2.) Используйте другую метрику, как предложено выше
3.) Используйте adam
или его модификацию в качестве оптимизатора
4.) Поскольку вы не упоминаете настройку гиперпараметров, я предполагаю, что вы еще этого не сделали. Попробуйте Keras Tuner для настройки гиперпараметров.
Что касается времени вычислений в CNN, 15 минут не являются вычислительно затратными. CNN даже при обучении на GPU занимает много времени, так что 15 минут — это ничего нового.
100% точность — это плохая цель. 93-97% точности считается приемлемым для подхода CNN. Некоторые образцы в MNIST неправильно помечены, что приводит к плохим градиентам обучения.
Ответ или решение
Для улучшения классификатора MNIST на основе сверточной нейронной сети (CNN), разработанного вами на Python с использованием Numpy, важно рассмотреть несколько ключевых аспектов: архитектуру сети, выбор гиперпараметров, обработку данных и методы оптимизации. Ниже приведены обоснованные рекомендации, которые помогут улучшить точность и производительность вашей модели.
1. Улучшение архитектуры сети
-
Добавьте больше слоев: Увеличение количества сверточных слоев может улучшить способность модели к извлечению признаков. Рассмотрите возможность добавления дополнительных сверточных и полносвязных слоев, сохраняя при этом разумные архитектурные принципы, такие как нормализация и регуляризация.
-
Используйте более сложные фильтры: Вместо 3×3 фильтров вы можете использовать комбинации разных размеров фильтров (например, 3×3 и 5×5) или даже использовать заранее обученные модели, такие как VGG или ResNet, в качестве основы.
-
Активирующие функции: Попробуйте различные функции активации, такие как ReLU или Leaky ReLU, для улучшения сходимости в процессе обучения.
2. Оптимизация гиперпараметров
-
Параметры обучения: Увеличение числа эпох обучения до 50-100 может значительно повысить точность, однако следите за переобучением. Используйте методы регуляризации, такие как Dropout, для уменьшения этого риска.
-
Оптимизаторы: Вместо градиентного спуска (SGD) попробуйте использовать более продвинутые оптимизаторы, такие как Adam или RMSprop, которые могут быстрее достигать оптимальных весов.
-
Размер батча: Попробуйте применять mini-batch размером 32 или 64 изображений. Это ускорит обучение и поможет избежать переобучения.
3. Обработка данных
-
Аугментация данных: Применение методов аугментации изображений, таких как вращение, сдвиг, изменение масштаба и отзывчивость, может помочь улучшить качество обучения, увеличив разнообразие обучающей выборки.
-
Нормализация: Убедитесь, что ваши данные нормализованы по шкале [0, 1] или имеют стандартное отклонение 0 и среднее значение 1. Это может помочь модели быстрее конвергироваться.
4. Оценка и валидация модели
-
Метрики: Вместо точности, рассматривать использование метрик, таких как
categorical_accuracy
иsparse_categorical_crossentropy
. Это поможет получить более точную картину эффективности вашей модели и устранить недочеты на этапе обучения. -
Кросс-валидация: Проведение кросс-валидации поможет вам в лучшем понимании стабильности модели на различных подвыборках данных.
5. Общие советы
-
Проведение анализа ошибок: После тренировки обращайте внимание на ошибки вашей модели. Возможно, некоторые экземпляры неправильно размечены или ваши гиперпараметры необходимо подкорректировать.
-
Сравнение с другими моделями: Используйте платформы, такие как OpenML, для анализа производительности ваших моделей в сравнении с другими реализациями.
-
Аппаратные ресурсы: Если время обучения все еще будет долгое, рассмотрите использование GPU для ускорения процесса, что значительно улучшит время обучения.
Заключение
Ваш текущий уровень точности в пределах 92-97% является хорошим начальным результатом, однако есть множество способов его улучшения. Уделите внимание архитектуре модели, гиперпараметрам, обработке данных и методам оценки. Постепенное внедрение этих рекомендаций позволит вам добиться лучших результатов и уверенно продвигаться в решении задачи классификации образов на базе MNIST.