Каковы некоторые общие советы по улучшению моего классификатора MNIST?

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

Я создал 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.

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

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