В этом посте мы рассмотрим сквозной проект машинного обучения, от создания модели и обучения до развертывания в качестве остаточного API. Мы также разработаем простое веб-приложение для взаимодействия пользователей с нашей моделью.

В веб-приложении пользователь сможет нарисовать на холсте цифру от 0 до 9 и отправить ее в нашу службу, которая вернет число, соответствующее рисунку. Для обучения нашей модели мы будем использовать популярный набор данных Mnist, состоящий из помеченных изображений рукописных цифр.

Проект состоит из 3-х частей:

  1. Создание модели: создайте модель глубокого обучения - в нашем случае сверточную нейронную сеть; обучить его на помеченном наборе данных; и сохраните его калиброванные веса в двоичном файле. Мы сделаем это в Python с помощью tensorflow 2.0, keras и tensorboard.
  2. Развертывание модели: разверните нашу модель как услугу для выполнения классификации невидимых изображений по запросу. Для этого мы создадим спокойный API на Python, используя Flask и Swagger. При запуске наш сервис загрузит обученную модель с шага 1 и начнет прослушивать запросы прогнозирования.
  3. Клиентский интерфейс: создайте веб-приложение на 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 наше приложение наконец выглядит так:

Заключение

Вот и все! Теперь вы должны иметь возможность рисовать цифры в веб-приложении, отправлять их в службу и просматривать результаты классификации. Полный проект доступен на гитхабе. Я надеюсь, что вы сочли полезным !

Спасибо за прочтение ! 🙂