Найти в Дзене
The Dawn Project

Нейронные сети с нуля - 2. Нейронная сеть для распознования рукописных цифр на Python.

Приветствую всех в Дзене. Те кто не знаком с первой частью, то рекомендую ознакомиться. Существует множество областей, где нейронные сети справляются гораздо лучше и быстрее, чем человек. Наиболее распространенные из них: финансы, экономика, производство, медицина, военная промышленность и авиация, энергетика, научные исследования, информационные технологии и т. д. Но есть области, в которых НС справляются хуже. Например, распознавание фото, рукописного текста, цифр, также распознавание речи и множество других областей. В этой статье пойдет речь, как раз о довольно сложной для нейронных сетей области – это распознавание рукописных цифр. Строение нейронной сети За основу мы возьмем нейронную сеть из прошлой статьи, а именно персептрон Розенблатта. И обучим её на БД Mnist, в ней находится 60000 изображений для обучения и 10000 изображений для тестирования, изображения хранятся в разрешении 28 на 28 пикселей. Разберем строение нашей новой НС (рис. 1): входной слой состоит из 784 нейронов
Оглавление

Приветствую всех в Дзене. Те кто не знаком с первой частью, то рекомендую ознакомиться.

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

Строение нейронной сети

За основу мы возьмем нейронную сеть из прошлой статьи, а именно персептрон Розенблатта. И обучим её на БД Mnist, в ней находится 60000 изображений для обучения и 10000 изображений для тестирования, изображения хранятся в разрешении 28 на 28 пикселей. Разберем строение нашей новой НС (рис. 1): входной слой состоит из 784 нейронов, также скрытый слой состоит из 40 нейронов и выходной слой из 10 нейронов.

Рис. 1. Строение нейронной сети для распознование рукописных цифр
Рис. 1. Строение нейронной сети для распознование рукописных цифр

Также к скрытому и выходному слою применяется функция активации. К скрытому функция активации ReLu. ReLu возвращает X, если X положительно, и 0 в противном случае. В выходном слое использовалась функция активация SoftMax (рис. 2). Она переводит обычный массив чисел в процентное соотношение.

Рис. 2. Функция активации SoftMax.
Рис. 2. Функция активации SoftMax.

Реализация нейронной сети на языке Python

Работа и обучение нейронной сети, остается такой же, как и в первой статье, поэтому приступим к реализации на Python.

Но нужно сделать некоторую подготовку, мы будем работать с библиотекой Numpy, она нужна нам для работы с матрицами. Если её не изучали, то следует почитать о ней пару статей.

Нам нужно установить некоторые библиотеки, а именно Numpy, Keras (она нужна только для того, чтобы установить БД Mnist, полноценно ей будем пользоваться в будущем) и OpenCV(необязательно, но если хотите проверить результат обучения на своих нарисованных цифрах, то стоит установить). Надеюсь вы умеете устанавливать библиотеки на python и программировать на нём, если нет, то лучше пройдите некоторые курсы, дальше мы будем работать только с Python'ом.

Итак, начнём, сначала загрузим базу данных Mnist:

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

После загрузки и подготовки данных мы должны на них начать обучать нейронную сеть. Обучение нейронной сети:

Вот реализация обучения, все подписано в комментариях. Всё, что в этом коде описано было в прошлой статье. Единственное, что может быть не понятно, что за переменная alpha. Данная переменная регулирует скорость обучения нейронной сети, чем больше значение этой переменной, тем быстрее идёт обучение. Но если запустить обучение со значением alpha равным 1, то произойдет сразу же на первой интерации переобучение, так как сеть слишком быстро обучалась.

Также так как я не писал о функциях активации в прошлой статье, то я соответственно не написал, что для изменения веса нужно ещё умножить на производную функции активации.

Давайте запустим нашу программу и посмотрим, что у нас выводиться (Рис. 3).

Рис. 3. Вывод работы обучения нейронной сети
Рис. 3. Вывод работы обучения нейронной сети

Как мы видим из обучения, у нас было две интерации, и на них нейронная сеть обучилась неплохо. Что означает каждый из параметров, Epoch - показывает какая сейчас интерация, Error - показывает ошибку нейронной сети на обучающей выборке, Acc - процент правильных ответов на обучающей выборке, Test_Error - показывает ошибку нейронной сети на тестовой выборке, Test_Acc - процент правильных ответов на тестовой выборке.

Теперь нам нужно предсказать цифру, которую мы сами нарисовали (рис. 4).

Рис. 4. Цифра, на которой мы проверим работу сети.
Рис. 4. Цифра, на которой мы проверим работу сети.

Код для предсказания:

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

Вывод:

За эту статью, надеюсь, вы научились писать нейронную сеть, математическую модель которой мы разбирали в прошлой статье. Если будут вопросы или вы заметите какие-либо ошибки, то пишите комментарии.

Весь код программы: