Гайд по работе сверточных нейронных сетей

Для распознавания изображений и видео используют особый тип нейросетей — сверточные. Например, они помогают анализировать результаты МРТ и рентгеновские снимки, чтобы поставить правильный диагноз.

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

2e933e4ffc330eb1a12164543ce9b478.pngМария Жарова

Data Scientist, Альфа-Банк

Что такое сверточные нейронные сети 

Сверточные нейронные сети — разновидность нейросетей для обработки данных с сеточной структурой: изображений и видео. 

Они анализируют пиксели, которые находятся близко друг к другу и содержат непрерывную визуальную информацию — яркость и оттенок. Например, если в одном пикселе нейросеть видит цветок, то и в стоящих рядом пикселях она тоже его распознает. 

Идея создания сверточных нейронных сетей обсуждалась еще в середине XX века. Но к ней вернулись лишь в 2012 году. Тогда математики Алекс Крижевски и Джефф Хинтон представили на международном конкурсе нейросеть ImageNet. По сравнению с аналогичными моделями она совершала почти на 50% меньше ошибок при распознавании изображений: их количество снизилось с 26 до 15%. Сейчас точность стала еще выше. Например, при распознавании лиц в толпе показатель составляет 99,8%.

Структура сверточных нейросетей 

У сверточных нейросетей два основных типа слоев — свертка и пулинг. 

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

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

  1. Фильтр, подобно сканеру, последовательно перемещается по картинке. 

  2. Каждый фильтр умножается на пиксели изображения под ним. Затем значения умноженных пар суммируются. 

  3. Полученное число записывается в новую матрицу. 

  4. Процесс повторяется для каждого возможного положения фильтра на изображении. 

  5. Результат — готовая матрица или карта признаков, которая содержит информацию о том, как и где определенные признаки присутствуют на изображении.

Принцип работы сверточного слоя, рисунок опубликован на платформе Medium. Источник

Принцип работы сверточного слоя, рисунок опубликован на платформе Medium. Источник

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

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

В итоге получаются полносвязные слои, которые используют найденные признаки для классификации или регрессии

В итоге получаются полносвязные слои, которые используют найденные признаки для классификации или регрессии

Как работают сверточные нейронные сети 

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

Работу сверточной нейросети можно разделить на два этапа:

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

    • В черно-белых картинках — число от 0 до 255 в зависимости от насыщенности. 

    • В цветных изображениях — трехмерную матрицу чисел в виде значений от 0 до 255 по интенсивности красного, зеленого и синего цветов. 

  1. Применение фильтров к изображению. В процессе обработки фильтр умножает значение выбранного пикселя и значения его соседей в соответствии с матрицей фильтра. Затем полученные произведения складываются. Получившееся число заменяет исходное значение центрального пикселя.

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

Как выглядит архитектура сверточной нейросети 

Рассмотрим пример архитектуры сверточной нейросети на Python при помощи библиотеки Tensorflow:  

# Создание объекта модели
model = models.Sequential ()

# Первый сверточный слой с 32 фильтрами, размером ядра 3×3, функцией активации ReLU и входной формой 32×32x3
model.add (layers.Conv2D (32, (3, 3), activation='relu', input_shape=(32, 32, 3)))

# Первый слой подвыборки (max pooling) с размером окна 2×2
model.add (layers.MaxPooling2D ((2, 2)))

# Второй сверточный слой с 64 фильтрами и размером ядра 3×3, функцией активации ReLU
model.add (layers.Conv2D (64, (3, 3), activation='relu'))

# Второй слой подвыборки (max pooling) с размером окна 2×2
model.add (layers.MaxPooling2D ((2, 2)))

# Третий сверточный слой с 64 фильтрами и размером ядра 3×3, функцией активации ReLU
model.add (layers.Conv2D (64, (3, 3), activation='relu'))

# Преобразование данных из двухмерного вида в одномерный для использования в полносвязных слоях
model.add (layers.Flatten ())

# Полносвязный слой с 64 нейронами и функцией активации ReLU
model.add (layers.Dense (64, activation='relu'))

# Выходной полносвязный слой с 10 нейронами (по числу классов) и функцией активации softmax для классификации
model.add (layers.Dense (10, activation='softmax'))

Такая архитектура — стандартная. Обычно она состоит из нескольких блоков: сверточный слой + max pooling. В конце данные преобразуются в единый вектор и получаются последние полносвязные слои. 

Как обучают сверточные нейронные сети 

Обучение сверточных моделей концептуально не отличается от обучения обычных нейросетей. Рассмотрим общую схему:  

  1. «Движение вперед», или forward

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

  2. Расчет функции потерь, или loss function 

    Функция потерь — мера различия между полученным предсказанием и истинным значением — таргетом. Для разных типов задач используют разные функции потерь: среднеквадратичное отклонение — измеряет среднее квадратичное различие между предсказанным и истинными значениями в регрессии и перекрестная энтропия — оценивает различие между распределениями вероятностей, предсказанными и истинными, в классификации.

  3. «Движение назад», или backpropagation. 

    Этот шаг включает корректировку весов сети с использованием метода оптимизации, называемого стохастическим градиентным спуском. Это метод поиска минимума функции потерь. Основная задача — вычислить градиенты — направления и величины изменений для минимизации ошибки функции потерь по отношению к весам и обновить весы.

Сверточные нейронные сети разрабатываются исследователями в области искусственного интеллекта, работающими в научных или корпоративных лабораториях. 

Обучением занимаются инженеры по компьютерному зрению, чтобы получать результаты для решения конкретных задач. Часто специалисты используют предобученные модели — это помогает значительно сократить время и ресурсы. Предобученные модели, адаптированные под специфические данные, часто демонстрируют лучшую производительность благодаря передаче знаний (transfer learning). К тому же такие модели показывают более точные результаты. 

Для чего и где используются сверточные нейронные сети 

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

В каких сферах чаще всего применяют свертку:  

  1. Медицина. Сверточные нейронные сети анализируют изображения для обнаружения патологий и постановки точного диагноза. Например, они изучают рентгеновские снимки, результаты МРТ, КТ. 

  2. Приборостроение. В беспилотных системах сверточные нейросети обрабатывают визуальные данные. Обычно это изображение видеопотока с видеорегистратора. Таким образом модели распознают дорожные знаки, полосы движения и другие объекты, чтобы сделать вождение более безопасным. 

  3. Системы распознавания лиц. Сверточные нейронные сети используются для аутентификации в банке, в системах видеонаблюдения и других подобных сферах. 

  4. Распознавание документов. Учреждения активно используют сверточные нейросети, чтобы расшифровывать сканы паспортов, СНИЛС и других документов. 

Как неросеть анализирует результаты медицинского исследования. Источник

Как неросеть анализирует результаты медицинского исследования. Источник

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

Мария Жарова, Data Scientist в Альфа-Банке

Как сверточные нейросети будут развиваться в будущем 

У сверточных нейросетей есть несколько наиболее вероятных направлений для развития:  

  1. Интеграция с другими типами нейросетей. Например, уже сейчас активно применяется комбинация сверточных нейросетей с трансформерами — моделями преимущественно для обработки текстов. Они справляются с переводами, генерацией текстов и отвечают на вопросы. Это помогает обрабатывать многомодальные данные, то есть информацию из разных источников или в виде разных типов данных, например звука, видео, изображений, текста.

  2. Оптимизация вычислений. Будут разрабатываться более технологичные и эффективные архитектуры и алгоритмы. Они помогут ускорить обучение нейросетей и точность их работы. 

  3. Расширение сфер использования. Сверточные нейронные сети показывают хорошие результаты не только при работе с изображениями — они эффективны и для других типов неструктурированных данных. Поэтому областей применения СНС будет становиться больше. 

Как научиться работать со сверточными нейросетями 

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

  1. Машинное обучение. Понимать процесс обучения моделей. Знать архитектуры нейронных сетей, их параметров и проблемных мест, оптимизации и т. д. 

  2. Программирование. Уметь писать код на Python, работать с библиотеками для нейросетей и работы с изображениями — TensorFlow, PyTorch, OpenCV. 

  3. Линейная алгебра и математика. Понимать матрицы, векторы и вычисления свертки. 

Чтобы базово работать со сверточными нейросетями, достаточно знать основы машинного обучения и уметь писать код на Python. Но если хотите развиваться в профессии и выполнять более сложные задачи, не обойтись без глубоких знаний математики.

Мария Жарова, Data Scientist в Альфа-Банке

Какие сверточные нейросети использовать новичку  

  1. AlexNet. Первая глубокая сверточная нейронная сеть и прародитель всех современных сверточных архитектур. Также она стала победителем соревнования ImageNet 2012. У AlexNet есть наборы данных — датасеты, которые помогают новичкам тренироваться. 

  2. ResNet. Сверточная нейросеть, основанная на концепции остаточных соединений — skip connections. Благодаря этому она может обучать очень глубокие сети. 

  3. VGGNet. Модель с маленькими сверточными фильтрами. Входит в топ-5 по точности при тестировании на ImageNet. 

  4. EfficientNet. Тяжеловесная модель, у которой много параметров. Обычно показывает высокие метрики, особенно если взять предобученные веса.

Skillfactory и НИЯУ МИФИ создали магистерскую программу для тех, кто хочет глубоко изучить нейронные сети. Студенты погрузятся в процесс создания интеллектуальных систем: от проектирования и обучения до внедрения в реальные бизнес-процессы. Освоят базу по математике и программированию на Python, а еще смогут получить реальные кейсы по ML-обучению в IT-компаниях — партнерах программы.

Habrahabr.ru прочитано 2018 раз