Вы можете посмотреть на модель, которую мы собираемся построить, здесь. Детальнее изучить код и модели, использованные в этой статье, вы можете, проследовав в этот репозиторий на GitHub. Отлично. Теперь давайте приступим к построению модели сверточной нейронной сети, которая преобразует язык жестов в английский алфавит. Преобразование языка жестов в текст можно свести к задаче предсказания английской буквы, соответствующей репрезентации в языке жестов. Мы будем использовать MNIST-датасет языка жестов от Kaggle, который распространяется под лицензией CC0: Public Domain. Пара слов об этом наборе данных: Для букв J и Z нет репрезентаций (Причина: жесты J и Z используют движения). Изображения черно-белые. Значения пикселей лежат в диапазоне от 0 до 255. Каждое изображение содержит 784 пикселя. Метки кодируются цифрами, которые варьируются от 0 до 25 в соответствии от A до Z. Данные содержат обучающий и тестовый наборы, каждая группа которых включает в себя изображения, содержащие 784 пикселя и соответствующую метку. В качестве метрики оценки мы будем использовать точность. Точность – это отношение правильно классифицированных экземпляров к их общему количеству. Сверточные нейронные сети — лучший выбор для задачи классификации изображений. Сверточная нейронная сеть (Convolutional Neural Network - CNN) — это искусственная нейронная сеть, состоящая из сверточных слоев. Сверточные нейронные сети очень хорошо показывают себя в работе с изображениями. Главное отличие сверточных (convolutional) слоев от полносвязных (dense) слоев, заключается в том, что в них каждый нейрон связан только с определенным набором нейронов из предыдущего слоя. Каждый сверточный слой содержит набор фильтров(filters)/ядер(kernels)/карт признаков(feature maps), которые помогают идентифицировать различные паттерны на изображении. Чем больше слоев проходит изображение, тем сложнее паттерны, которые могут определять сверточные нейронные сети. Еще одно преимущество использования сверточных нейронных сетей в противовес типичным полносвязным, заключается в том, что, изучив паттерн в определенной части изображения, они могут идентифицировать его в любом другом месте. Необходимые нам импорты: Считаем CSV-файл (sign_mnist_train.csv) с помощью pandas и перетасуем все обучающие данные. Разделение пикселей и меток изображений позволит нам задействовать методы предварительной обработки (preprocessing) категориальных признаков. Подготовка данных: Нормализация входных данных очень важна, особенно при использовании градиентного спуска, который на нормализованных данных с большей вероятностью будет сходиться быстрее. Группировка обучающих данных в батчи также сокращает время, необходимое для обучения модели. Нормализация и группировка в батчи: Ниже приведен пример изображения из обучающей выборки после предварительной обработки:   LabelBinarizer из библиотеки Scikit-Learn бинаризирует метки по принципу one-vs-all (или one-vs-rest) и возвращает унитарно закодированный (one-hot) вектор. Бинаризация меток: Валидационные (проверочные) данные помогут нам с выбором лучшей модели. Если мы используем вместо них данные из тестового набора, то в результате выберем модель, которая будет слишком оптимистична для наших тестовых данных. Разделение данных: Ниже мы займемся определением модели сверточной нейронной сети. Для того, чтобы построить сверточную нейронную сеть, нам будет необходимо выбрать несколько типовых элементов: Выберите набор сверточных и пулинговых слоев.  Увеличьте количество нейронов в более глубоких сверточных слоях. Добавьте набор полносвязных слоев после сверточных и пулинговых слоев. Сверточная нейронная сеть: Теперь нам необходимо определить ключевые элементы в рамках построения модели: loss — Определяет функцию потерь, которую мы стремимся минимизировать. Поскольку наши метки приведены к унитарному виду, мы можем выбрать в качестве функции потерь категориальную перекрестную энтропию (categorical cross entropy). optimizer — Этот алгоритм находит лучшие веса, которые минимизируют функцию потерь. Adam — один из таких алгоритмов, который хорошо работает в большинстве случаев. Мы можем указать любые метрики, которые будут задействованы в оценке нашей модели. Для построения нашей модели, мы выбрали точность (accuracy). Определение функции потерь, оптимизатора и метрик: ModelCheckpoint — Сохраняет лучшую модель, найденную в процессе обучения в каждую эпоху, проверяя показатели модели на проверочных данных. EarlyStopping — Прерывает обучение, когда на протяжении указанного количества эпох перестает наблюдаться прогресс. Контрольные точки: Подгонка данных: Объект history содержит сведения о функции потерь и указанных метриках, полученные во время обучения модели. Эту информацию можно использовать для формирования кривых обучения и доступа к процессу обучения и показателям модели в каждую эпоху. Сохранение истории: Для получения более подробной информации о кривых обучения, полученных во время процесса обучения, вы можете перейдя по этой ссылке. Теперь нам нужно извлечь лучшую модель, полученную во время обучения, поскольку модель, сформированная в конце обучения, не обязательно будет самой лучшей. Лучшая модель: Запуск на тестовом наборе: Точность: 94% Весь код и полученные модели с оптимизированными гиперпараметрами можно найти здесь. Когда дело доходит до оптимизации гиперпараметров, существует целая куча вариантов, как мы можем поднастроить нашу сверточную нейронную сеть. Некоторые из наиболее важных и распространенных гиперпараметров, которые необходимо оптимизировать, включают: Этот гиперпараметр определяет количество Conv2D и MaxPooling2D пар, которые мы объединяем вместе в рамках нашей сверточной нейронной сети. По мере того, как мы наслаиваем все больше пар, сеть становится все глубже и глубже, увеличивая способность модели идентифицировать более сложные паттерны изображений. Но наложение слишком большого количества слоев отрицательно сказывается на показателях модели (размеры входного изображения начинают быстро уменьшаться по мере того, как оно углубляется в нейронную сеть), а также увеличивает время, необходимое на обучение, поскольку количество обучаемых параметров модели резко возрастает. Фильтры определяют количество выходных карт признаков. Матричный фильтр как раз и представляет из себя операцию свертки, которая позволяет находить одни и те же паттерны в разных частях изображения. В большинстве случаев увеличение количества фильтров в последовательных слоях дает хорошие результаты. В качестве размера фильтра принято брать нечетные числа, чтобы мы могли получить центральную позицию. Одна из основных проблем с фильтрами четного размера заключается в том, что они требуют асимметричного заполнения. Вместо использования одного сверточного слоя, состоящего из фильтров большего размера, например (7x7, 9x9), мы можем использовать несколько сверточных слоев с фильтрами меньшего размера, что, скорее всего, улучшит показатели модели, поскольку более глубокие сети могут обнаруживать более сложные паттерны. Дропаут (прореживание или исключение) служит в качестве регуляризатора и предотвращает переобучение модели. Дропаут-слой сводит на нет вклад одних нейронов в следующий слой и оставляет другие без изменений. Коэффициент дропаута определяет вероятность того, что вклад конкретного нейрона будет отменен. На ранних эпохах мы можем столкнуться с тем, что потери при обучении будут больше, чем потери при валидации, поскольку некоторые нейроны могут быть отброшены во время обучения, а при валидации используется полная сеть со всеми нейронами. С помощью расширения данных (data augmentation) мы можем создавать слегка измененные копии имеющихся изображений и использовать их для модели обучения. Такие изображения с измененной ориентацией помогают модели идентифицировать объекты с разной ориентацией. Например, мы можем ввести небольшой поворот, масштабирование и смещение изображений. Расширение данных: Другие гиперпараметры, которые вы можете попробовать: Батч-нормализация — нормализует входные данные. Глубина нейронной сети — например, замена одного сверточного слоя с размером фильтра (5X5) двумя последовательными слоями с размером фильтра (3X3). Размерность полносвязных слоев и само их количество. Замена MaxPooling-слоя сверточным слоем сстрайдом > 1 Оптимизаторы Скорость обучения оптимизатора Оценка модели: Точность: 96% Streamlit — это фантастическая платформа, которая избавляет от всех хлопот, связанных с ручным развертыванием. Со Streamlit все, что от нас требуется, — это GitHub-репозиторий, содержащий скрипт Python, который определяет структуру приложения. Вы можете установить библиотеку Streamlit с помощью приведенной ниже команды: Чтобы запустить Streamlit-приложение, используйте streamlit run <script_name>.py Полный код Streamlit-приложения можно найти здесь. Чтобы преобразовать вывод модели обратно в соответствующие метки, нам понадобится наилучшая модель, полученная после оптимизации гиперпараметров, и LabelBinarizer. Декоратор @st.cache запускает функцию только один раз, предотвращая излишние перезапуски при повторном отображении страницы. Мы должны переформатировать загруженное изображение в 28x28, так как это разрешение для входных данных нашей модели. Мы также должны сохранить соотношение сторон загруженного изображения. Затем мы можем использовать предварительно обработанное изображение в качестве входных данных модели и получить соответствующий прогноз, который можно с помощью label_binarizer преобразовать обратно в метку, представляющую английскую букву английского алфавита. Предварительная обработка и прогнозирование. Зарегистрируйте Streamlit-аккаунт здесь. Подключите свой GitHub-аккаунт к своему Streamlit-аккаунту, предоставив все необходимые разрешения для доступа к вашим репозиториям. Убедитесь, что репозиторий содержит файл requirements.txt, в котором указаны все зависимости приложения. Нажмите на кнопку “New App” здесь. Предоставьте данные о репозитории, имени ветки и скрипта Python, который содержит структуру нашего приложения. Нажмите кнопку “Deploy”.  Теперь ваше приложение будет развернуто в интернете и будет обновляться всякий раз, когда вы обновляете репозиторий. В этом туториале мы разобрали следующее: Процесс разработки решения с использованием глубокого обучения для решения данной задачи; Предварительная обработка изображений; Обучение сверточной нейронной сети; Оценка модели; Оптимизация гиперпараметров; Развертывание. Обратите внимание, что в этом туториале мы лишь кратко коснулись полного процесса разработки решения с использованием методов глубокого обучения. На практике этот процесс состоит из огромного количества тренировок, поиска гораздо более широкого диапазона гиперпараметров и показателей оценки, специфичных для конкретной задачи. Чтобы выстроить процесс решения сложных задач требуется более глубокое понимание модели, данных и широкого набора методов предварительной обработки изображений. Модель можно найти здесь. Дополнительные сведения о коде или моделях, использованных в этой статье, смотрите в этом GitHub-репозитории. Приглашаем на открытое занятие «Пишем первую нейронную сеть». Рассмотрим основные этапы создания и обучения своей первой нейронной сети, и попробуем решить известную задачу классификации MNIST полносвязной и сверточной нейронными сетями на примере фреймворка PyTorch. Регистрация по ссылке.