В этом посте мы рассмотрим сквозной проект машинного обучения, от создания модели и обучения до развертывания в качестве остаточного API. Мы также разработаем простое веб-приложение для взаимодействия пользователей с нашей моделью.
В веб-приложении пользователь сможет нарисовать на холсте цифру от 0 до 9 и отправить ее в нашу службу, которая вернет число, соответствующее рисунку. Для обучения нашей модели мы будем использовать популярный набор данных Mnist, состоящий из помеченных изображений рукописных цифр.
Проект состоит из 3-х частей:
- Создание модели: создайте модель глубокого обучения - в нашем случае сверточную нейронную сеть; обучить его на помеченном наборе данных; и сохраните его калиброванные веса в двоичном файле. Мы сделаем это в Python с помощью tensorflow 2.0, keras и tensorboard.
- Развертывание модели: разверните нашу модель как услугу для выполнения классификации невидимых изображений по запросу. Для этого мы создадим спокойный API на Python, используя Flask и Swagger. При запуске наш сервис загрузит обученную модель с шага 1 и начнет прослушивать запросы прогнозирования.
- Клиентский интерфейс: создайте веб-приложение на html5 / javascript / css, используя популярную платформу React, где клиенты могут рисовать цифры на холсте, отправлять свой рисунок в службу и видеть результаты, полученные модель.
Общая архитектура будет выглядеть так:
Создание модели
Сначала загрузим набор данных Mnist, предоставленный keras; затем разделите ее на наборы для обучения и проверки, чтобы убедиться, что наша модель хорошо обобщается после обучения:
В этом наборе данных каждый образец представляет собой изображение, представленное в виде матрицы размером 28 * 28 пикселей; каждый пиксель имеет значение от 0 (черный) до 255 (белый). Построим несколько примеров:
Затем мы создаем сверточную нейронную сеть, используя tf.keras:
Выбираем функцию потерь (кросс-энтропию), оптимизатор (адам) и обучаем модель:
Во время обучения мы можем запустить сервер тензорной доски, чтобы собирать статистику обучения и отображать ее в красивых графиках. Для этого запустите tensorboard - logdir = ”C: \ temp \ tensorboard \”, затем перейдите к http: // localhost: 6006 /:
Теперь давайте развернем нашу модель как службу для приема запросов на прогнозирование.
Развертывание модели
Мы будем использовать Flask для запуска простого HTTP-сервера на Python. Давайте создадим файл server.py с приведенным ниже кодом.
Сервер начинает с загрузки модели, затем определяет модель API и конечные точки и начинает прослушивать запросы. Мы используем спецификацию swagger для документирования наших конечных точек с помощью пакета flask-restplus.
Чтобы запустить наш сервер, мы можем запустить: python server.py
Наша документация по API доступна по адресу http://127.0.0.1:5000/:
Отлично! Теперь, когда наш сервис запущен и может обрабатывать запросы, давайте создадим простое веб-приложение, в котором пользователи могут рисовать изображение и отправлять его в сервис для классификации.
Клиентский интерфейс
Мы создадим простое приложение React с помощью create-react-app. В нашем компоненте App мы добавляем холст и перехватываем события мыши, чтобы рисовать на нем. Мы также добавляем кнопку, связанную с функцией прогноз, чтобы отправлять значения пикселей холста на сервер по http.
Каждый пиксель в ImageData.data холста представлен в виде 4 числовых значений (формат RGBA), поэтому мы конвертируем их в 1 значение, чтобы получить изображение в градациях серого, подобное изображениям, используемым для обучения нашей модели.
Остальная часть кода - это больше обработки событий и манипуляций с диаграммами для отображения результатов прогноза:
После небольшого изменения CSS наше приложение наконец выглядит так:
Заключение
Вот и все! Теперь вы должны иметь возможность рисовать цифры в веб-приложении, отправлять их в службу и просматривать результаты классификации. Полный проект доступен на гитхабе. Я надеюсь, что вы сочли полезным !
Спасибо за прочтение ! 🙂