Классификация изображений за 10 минут с помощью набора данных MNIST

Использование сверточных нейронных сетей для классификации рукописных цифр с помощью TensorFlow и Keras | Контролируемое глубокое обучение

Если вы читаете эту статью, я уверен, что мы разделяем схожие интересы и находимся / будем работать в схожих отраслях. Итак, подключимся через Linkedin! Пожалуйста, не стесняйтесь отправить запрос на контакт! Орхан Г. Ялчин - Linkedin

Прежде чем углубиться в эту статью, я просто хочу сообщить вам, что если вы занимаетесь глубоким обучением, я считаю, что вам следует также ознакомиться с другими моими статьями, такими как:

1 - Снижение шума изображения за 10 минут с помощью глубоких сверточных автоэнкодеров, где мы научились создавать автоэнкодеры для шумоподавления изображения;

2 - Предсказать завтрашнюю цену биткойнов (BTC) с помощью рекуррентных нейронных сетей, где мы используем RNN для прогнозирования цен BTC, и, поскольку он использует API, результаты всегда остаются актуальными.

Когда вы начинаете изучать глубокое обучение с разными архитектурами нейронных сетей, вы понимаете, что одним из самых мощных контролируемых методов глубокого обучения является сверточная нейронная сеть (сокращенно CNN). Окончательная структура CNN на самом деле очень похожа на обычные нейронные сети (RegularNets), где есть нейроны с весами и смещениями. Вдобавок, как и в RegularNets, мы используем функцию потерь (например, кроссэнтропию или softmax) и оптимизатор (например, оптимизатор Адама) в CNN [CS231]. Кроме того, в CNN есть также сверточные слои, слои объединения и сглаживание слоев. CNN в основном используются для классификации изображений, хотя вы можете найти и другие области применения, такие как обработка естественного языка.

Почему сверточные нейронные сети

Основная структурная особенность RegularNets заключается в том, что все нейроны связаны друг с другом. Например, когда у нас есть изображения размером 28 на 28 пикселей в оттенках серого, мы получим 784 (28 x 28 x 1) нейронов в слое, который кажется управляемым. Однако у большинства изображений намного больше пикселей, и они не имеют шкалы серого. Поэтому, предполагая, что у нас есть набор цветных изображений в 4K Ultra HD, у нас будет 26 542 080 (4096 x 2160 x 3) различных нейронов, связанных друг с другом в первом слое, что на самом деле не поддается управлению. Следовательно, мы можем сказать, что RegularNets не масштабируются для классификации изображений. Однако, особенно когда дело доходит до изображений, кажется, что между двумя отдельными пикселями мало корреляции или взаимосвязи, если они не расположены близко друг к другу. Это приводит к идее сверточных слоев и слоев пула.

Слои в CNN

Мы можем использовать множество разных слоев в сверточной нейронной сети. Однако наиболее важными из них являются свертка, объединение и полносвязные слои. Поэтому я быстро представлю эти слои, прежде чем реализовывать их.

Сверточные слои

Сверточный слой - это самый первый слой, на котором мы извлекаем функции из изображений в наших наборах данных. Из-за того, что пиксели связаны только с соседними и близкими пикселями, свертка позволяет нам сохранить взаимосвязь между различными частями изображения. Свертка - это в основном фильтрация изображения с помощью фильтра меньших пикселей для уменьшения размера изображения без потери взаимосвязи между пикселями. Когда мы применяем свертку к изображению 5x5 с помощью фильтра 3x3 с шагом 1x1 (сдвиг на 1 пиксель на каждом шаге). В итоге мы получим результат 3x3 (снижение сложности на 64%).

Уровень объединения

При построении CNN обычно вставляют уровни объединения после каждого сверточного слоя, чтобы уменьшить пространственный размер представления, чтобы уменьшить количество параметров, что снижает вычислительную сложность. Кроме того, объединение слоев также помогает решить проблему переобучения. Обычно мы выбираем размер пула, чтобы уменьшить количество параметров, выбирая максимальное, среднее или суммарное значения внутри этих пикселей. Максимальный пул, один из наиболее распространенных методов объединения, можно продемонстрировать следующим образом:

Набор полностью связанных слоев

Полностью подключенная сеть - это наша RegularNet, где каждый параметр связан друг с другом, чтобы определить истинное отношение и влияние каждого параметра на метки. Поскольку наша пространственно-временная сложность значительно снижается благодаря слоям свертки и объединения, мы можем в конце концов построить полностью связанную сеть для классификации наших изображений. Набор полносвязных слоев выглядит так:

Теперь, когда у вас есть некоторое представление об отдельных слоях, которые мы будем использовать, я думаю, что пришло время поделиться обзором полной сверточной нейронной сети.

И теперь, когда у вас есть представление о том, как построить сверточную нейронную сеть, которую вы можете построить для классификации изображений, мы можем получить наиболее шаблонный набор данных для классификации: набор данных MNIST, что означает модифицированная база данных Национального института стандартов и технологий. Это большая база данных рукописных цифр, которая обычно используется для обучения различных систем обработки изображений.

Скачивание набора данных MNIST

Набор данных MNIST - один из наиболее распространенных наборов данных, используемых для классификации изображений и доступных из множества различных источников. Фактически, даже Tensorflow и Keras позволяют нам импортировать и загружать набор данных MNIST прямо из их API. Поэтому я начну со следующих двух строк, чтобы импортировать набор данных TensorFlow и MNIST в Keras API.

База данных MNIST содержит 60 000 обучающих изображений и 10 000 тестовых изображений, полученных от сотрудников Американского бюро переписи населения и американских школьников [Википедия]. Поэтому во второй строке я разделил эти две группы на обучающую и тестовую, а также разделил метки и изображения. Части x_train и x_test содержат коды RGB в градациях серого (от 0 до 255), в то время как части y_train и y_test содержат метки от 0 до 9, которые представляют, какое число они на самом деле. Чтобы визуализировать эти числа, мы можем получить помощь от matplotlib.

Когда мы запустим приведенный выше код, мы получим визуализацию кодов RGB в оттенках серого, как показано ниже.

Нам также необходимо знать форму набора данных, чтобы направить его в сверточную нейронную сеть. Поэтому я буду использовать атрибут «shape» массива NumPy со следующим кодом:

Вы получите (60000, 28, 28). Как вы могли догадаться, 60000 представляет количество изображений в наборе данных поезда, а (28, 28) представляет размер изображения: 28 x 28 пикселей.

Изменение формы и нормализация изображений

Чтобы иметь возможность использовать набор данных в Keras API, нам нужны массивы NumPy с 4 размерами. Однако, как мы видим выше, наш массив 3-мерный. Кроме того, мы должны нормализовать наши данные, как это всегда требуется в моделях нейронных сетей. Мы можем добиться этого, разделив коды RGB на 255 (что является максимальным кодом RGB за вычетом минимального кода RGB). Это можно сделать с помощью следующего кода:

Построение сверточной нейронной сети

Мы построим нашу модель, используя высокоуровневый API Keras, который использует либо TensorFlow, либо Theano на бэкэнде. Я хотел бы упомянуть, что существует несколько высокоуровневых API-интерфейсов TensorFlow, таких как Layers, Keras и Estimators, которые помогают нам создавать нейронные сети с высокоуровневыми знаниями. Однако это может привести к путанице, поскольку все они различаются по структуре реализации. Поэтому, если вы видите совершенно разные коды для одной и той же нейронной сети, хотя все они используют TensorFlow, вот почему. Я буду использовать самый простой API - Keras. Поэтому я импортирую последовательную модель из Keras и добавлю слои Conv2D, MaxPooling, Flatten, Dropout и Dense. Я уже говорил о слоях Conv2D, Maxpooling и Dense. Кроме того, слои Dropout борются с переобучением, игнорируя некоторые нейроны во время обучения, в то время как слои Flatten сглаживают 2D-массивы до 1D-массивов перед построением полностью связанных слоев.

Мы можем поэкспериментировать с любым числом для первого плотного слоя; однако последний плотный слой должен иметь 10 нейронов, поскольку у нас есть 10 числовых классов (0, 1, 2,…, 9). Вы всегда можете поэкспериментировать с размером ядра, размером пула, функциями активации, коэффициентом отсева и количеством нейронов в первом плотном слое, чтобы получить лучший результат.

Компиляция и подгонка модели

С помощью приведенного выше кода мы создали неоптимизированную пустую CNN. Теперь пора настроить оптимизатор с заданной функцией потерь, которая использует метрику. Затем мы можем подогнать модель, используя данные нашего поезда. Для этих задач мы будем использовать следующий код:

Вы можете поэкспериментировать с оптимизатором, функцией потерь, метриками и эпохами. Однако я могу сказать, что оптимизатор адама обычно превосходит другие оптимизаторы. Я не уверен, что вы действительно можете изменить функцию потерь для мультиклассовой классификации. Не стесняйтесь экспериментировать и комментировать ниже. Номер эпохи может показаться немного маленьким. Однако вы достигнете точности теста 98–99%. Поскольку набор данных MNIST не требует больших вычислительных мощностей, вы также можете легко поэкспериментировать с номером эпохи.

Оценка модели

Наконец, вы можете оценить обученную модель с помощью x_test и y_test, используя одну строку кода:

Результаты неплохие для 10 эпох и для такой простой модели.

Мы достигли точности 98,5% с такой базовой моделью. Откровенно говоря, во многих случаях классификации изображений (например, для автономных автомобилей) мы не можем допустить даже ошибки в 0,1%, поскольку, по аналогии, это приведет к 1 ДТП из 1000 случаев. Тем не менее, для нашей первой модели, я бы сказал, результат все еще довольно хороший. Мы также можем делать индивидуальные прогнозы с помощью следующего кода:

Наша модель классифицирует изображение как «9», и вот визуальное представление изображения:

Хотя это не совсем удачный почерк числа 9, наша модель смогла классифицировать его как 9.

Поздравляю!

Вы успешно создали сверточную нейронную сеть для классификации рукописных цифр с помощью API Keras от Tensorflow. Вы достигли точности более 98%, и теперь вы даже можете сохранить эту модель и создать приложение для классификатора цифр! Если вам интересно сохранить свою модель, я хотел бы направить вас к Документации Keras. В конце концов, чтобы иметь возможность эффективно использовать API, нужно научиться читать и использовать документацию.

Подпишитесь на список рассылки, чтобы получить полный код

Если вы хотите иметь доступ к полному коду в Google Colab и доступ к моим последним материалам, подпишитесь на список рассылки: ✉️

"Подпишитесь сейчас"

Понравилась статья

Если вам понравилась эта статья, обратите внимание на другие мои похожие статьи: