Добрый день, уважаемые читатели. Целью этой статьи является классификация изображений с помощью сверточных слоёв Keras. Всё это дело мы будем тестировать на стандартном наборе — MNIST. Этот набор содержит 70.000 изображений рукописных цифр (от 0 до 9-ти). Наша цель проста — сделать так, чтобы сверточная нейронная сеть правильно предсказала изображенную цифру.

Подпишись на группу Вконтакте и Телеграм-канал. Там еще больше полезного контента для программистов.

А на моем YouTube-канале ты найдешь обучающие видео по программированию. Подписывайся!

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

Сверточная нейронная сеть использует довольно интересный математический приём. Ядро — по факту матрица, содержащие веса, «исследует» исходное изображение путём выделения под-матрицы своего размера и выделения определённых признаков. Устройство данного алгоритма очень громоздко, потому рекомендую ознакомиться с русскоязычными статьями других авторов на эту тему:

Самая простая сверточная нейронная сеть

Теперь посмотрим на практике, как будет выглядеть простая свёрточная сеть. Конечно же, работу с данными мы начинаем с импортирования необходимых нам библиотек.

Мы загрузим MNIST прямо из наборов Keras, довольно удобно. Там же импортируем класс последовательность модели (Sequential) и необходимые слои: Dense (обычный персептрон), Flatten (преобразователь матриц в вектор), Dropout (один из методов регуляризации для противостояния переобучению), Conv2D (свёрточный слой) и MaxPooling2D — уменьшает размер исходной матрицы.

Загрузим данные и оценим их кол-во:

60.000 обучающих и 10.000 тестовых образцов, каждый из которых имеет форму (28, 28).

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

Добавляем сетку из 9 изображений, изменив размер фигуры для отображения. Теперь с помощью цикла изобразим 9 образцов, выключив оси для каждого объекта Axes.

Результат:

Теперь преобразуем наборы образцов, а также обработаем вектора с целевыми значениями:

Мы изменяем тип массива на float32, чтобы нормализировать его путём деления на 255. А «цели» мы преобразуем в категории от 0 до 9.

Теперь задумаемся над архитектурой модели:

Как она будет работать? Сначала у нас 2 свёрточных слоя, которые будут работать с поступающим им изображением. Потом мы уменьшим размер исходной матрицы с помощью слоя MaxPooling. Затем изменим несколько значений на ноль, развернём многомерный массив в вектор, проведём его через один линейный слой, заново откинем несколько значений и произведём классификацию с помощью функции активации softmax. В остальных слоях используя самая популярная активация — relu.

Создадим отчёт об архитектуре модели (именно для этого мы указывали форму ввода для первого слоя):

Обратите внимания на форму вывода каждого слоя (в частности для третьего и пятого слоёв).

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

Отчёт про обучение я вставлять не буду: хоть он и содержит всего 15 эпох, однако всё равно выглядит громоздко.

Мы не даром сохранили историю обучения, стандартным образом визуализируем её:

Если чтение отчёта вызывает у Вас трудности, то лучше вывести отдельно конечные точность и ошибку на тестовых данных:

Мы достигли точности в 0.9909. В официальном примере от Keras была достигнута точность в 0.9925. Могу сказать, что при многократной адаптации модели она показывала и лучшие результаты. Так я однажды получил точность в 0.9927. Это всё из-за того, что изначальные веса модели задаются случайно, что влияет на градиент обучения.

Заключение

Сегодня мы рассмотрели самую простую свёрточную сеть (можно сказать, даже на «Hello, world» в плане обработки изображений с помощью Keras), которая показала просто отличный результат на, казалось бы, довольно трудном наборе данных. Это в очередной раз доказывает, что появление cnn начало новую эпоху в сфере компьютерного зрения.

Оставляю ссылку на .ipynb документ, который вы сможете просмотреть и изменить на своё усмотрение.

Также рекомендую прочитать статью Анализ настроения с помощью Keras и Python. Подпишитесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для разработчиков.