Создание веб-приложения с открытым исходным кодом на JavaScript для распознавания нарисованных цифр.
Вся работа c нейронными сетями будет происходить в браузере клиента. Для серверной части воспользуемся Node.js и декларативным фреймворком Evado, который предоставляет уже готовый функционал для запуска полноценного веб-приложения с пользовательским интерфейсом, правами доступа и многим другим.
Итак, устанавливаем Node.js и базу данных MongoDB, клонируем репозиторий шаблона приложения Evado Boilerplate. В настройках config/default добавляем новый модуль front.
Интерфейс модуля будет состоять из четырех страниц:
Начальная страница
Начальная страница содержит только описание и кнопки переходов на остальные страницы.
Шаблон разметки находится в файле view/template/default/_main.
Для дизайна пользовательского интерфейса во фреймворке Evado по умолчанию используется Bootstrap 5.
Страница распознавания цифр
Здесь пользователь может нарисовать мышкой или пальцем цифру и попытаться ее распознать, выбрав нейронную сеть (созданную локально или загруженную с сервера).
Шаблон разметки находится в файле view/template/default/_recognition.
Страница обучения нейросети
На этой странице можно обучать сеть, задавая различные начальные параметры. Для обучения используется набор данных MNIST из десятков тысяч рукописных цифр.
Обученную сеть можно сохранить либо в локальном хранилище, либо удаленно на сервер (при наличии прав доступа).
Локально хранимые нейросети доступны только в текущем браузере. Удаленно хранимые доступны всем пользователям.
Страница тестирования
Проверка нейронной сети - это подсчет распознанных цифр из тестового набора данных, которые отличаются от обучающих.
Шаблон разметки находится в файле view/template/default/_testing.
Реализация нейронной сети
В приложении реализована структура нейронной сети с одним скрытым слоем. В качестве входных параметров (i) используются 784 пикселя (яркость 0 - 255) матрицы изображения (28 на 28) . Количество нейронов скрытого слоя (h) можно задавать произвольно. Размер выходного слоя (o) равен количеству всех цифр (от 0 до 9).
- Класс Layer содержит ссылки на нейроны слоя. По сути это агрегирующий класс для общих операций над нейронами одного слоя.
Обучение и тестирование нейронной сети весьма ресурсоемкие операции, поэтому для корректной работы браузера запускать их необходимо в отдельных потоках (см. статью по многопоточности в браузере на примере игры в шашки). Для этого определены скрипты trainingWorker и testingWorker.
Для обучения сети используется стохастический градиентный спуск, при котором каждая ошибка распознавания корректирует веса связей.
Несмотря на простоту как структуры сети, так реализации, обеспечивается высокий процент распознавания на тестовом наборе:
- более 90% для 8 нейронов скрытого слоя
- более 94% для 16 нейронов скрытого слоя
- более 96% для 32 нейронов скрытого слоя
Ссылка на онлайн демо-версию приложения. Репозиторий приложения доступен на GitHub.