Что такое сверточные нейронные сети? Как мы можем применить нейронные сети для распознавания изображений?

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

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

Это часть 2 вводной серии Интуитивное глубокое обучение. Вот краткое описание того, что произошло на данный момент:

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

Машинное обучение определяет шаблон и находит наилучшие параметры для этого шаблона вместо того, чтобы жестко кодировать параметры самостоятельно. Нейронная сеть - это просто сложный «шаблон», который мы определяем, который, как оказалось, обладает гибкостью для моделирования многих сложных отношений между вводом и выводом. Указание функции потерь и выполнение градиентного спуска помогает найти параметры, которые дают наилучшие прогнозы для нашего обучающего набора.

Затем мы погрузились в некоторые подробности в Части 1b о том, как заставить нейронные сети работать на практике.

В этом посте мы увидим, как нейронные сети могут применяться для распознавания изображений. В частности, мы представим новую архитектуру модели под названием сверточные нейронные сети (которые также называются CNN или ConvNets). Это новый тип архитектуры, которая будет использовать особые свойства данных изображения, так что давайте углубимся!

Во-первых, нам нужно поговорить о свойствах изображений, прежде чем мы сможем обсудить, как использовать их в нашей нейронной сети. В компьютере изображения хранятся в виде 2-мерного массива пикселей, расположенных пространственно, каждый пиксель соответствует одной небольшой части изображения. Фактически, слово «пиксель» происходит от фразы «pi (x) cture el ement», поскольку оно образует один маленький элемент в изображении:

Теперь каждый пиксель хранит цвет; и цвет представлен в компьютере тремя числами, соответствующими количеству красного, зеленого и синего соответственно в этом цвете в диапазоне от 0 до 255 (включительно). Итак, на самом деле, если вы рассматриваете цветовые каналы как другое измерение, изображение можно представить в виде 3-мерного массива (первые два измерения хранят пиксели в том виде, в каком они представлены на изображении, последнее измерение имеет три канала - красный, зеленый и синий).

Что это означает для наших алгоритмов глубокого обучения? Когда мы берем изображение в качестве входных данных, мы действительно берем трехмерный массив чисел. Каждое число - это индивидуальная особенность нашего изображения, которое мы передаем через нашу нейронную сеть. Предположим, что размеры нашего изображения 256 * 256; затем мы вводим в нашу нейронную сеть в качестве входных данных 256 * 256 * 3 = 196 608 функций всего. (Это много возможностей!) И из этих 196 608 функций нам нужно найти какую-то сложную функцию, которая преобразует ее, возможно, в предсказание того, какой объект представляет изображение. Простой пример - есть ли на картинке кошка?

Напомним, что наличие 196 908 функций означает, что нам нужно 196 908 + 1 = 196 909 параметров в одном нейроне. Помните, что наш выход нейрона сначала принимает некоторую линейную комбинацию входных функций перед применением функции активации:

В случае трех входных функций (x1, x2 и x3) у нас есть четыре пробела, которые нам нужно заполнить числами - один, соответствующий каждой функции, и один термин смещения (не привязанный к какой-либо функции). Если у нас есть 196 908 функций, у нас остается 196 909 пробелов, для которых нам нужно найти наилучшие числа. Все это в одном нейроне! Если у нас есть нейронная сеть, нужно изучить множество параметров!

Чтобы усложнить задачу, кот может быть где угодно на картинке. Кошка может быть вверху справа на картинке или внизу слева - они соответствуют совсем другому набору из 196 608 черт, но представляют одно и то же: кошку.

Сводка: изображения представляют собой трехмерный массив функций: каждый пиксель в двумерном пространстве содержит три числа от 0 до 255 (включительно), соответствующих красному, зеленому и синему каналам. Часто данные изображения содержат множество входных функций.

Напомним, что природа изображений такова, что:

  1. Существует множество «входных функций», каждая из которых соответствует значениям R, G и B каждого пикселя, что требует множества параметров.
  2. Кошка в верхнем левом углу или кошка в правом нижнем углу изображения должны дать аналогичные результаты.

На этом этапе, возможно, мы можем рассмотреть следующий метод. Предположим, у нас есть изображение, которое мы хотим протестировать:

Вот наш алгоритм:

Шаг 1: Разделите изображение на четыре равных квадранта. Предположим, что размер изображения изначально был 256 * 256 * 3 (каналов). Тогда каждый квадрант изображения будет иметь 128 * 128 * 3 функций.

Шаг 2: Примените нейрон для верхнего левого квадранта, чтобы преобразовать признаки 128 * 128 * 3 в одно число. Ради интуиции (хотя это не совсем точно), скажем, этот нейрон отвечает за распознавание кошки в пределах 128 * 128 * 3 функций:

Шаг 3: примените точно такой же нейрон для верхнего правого квадранта, нижнего левого квадранта и нижнего правого квадранта. Это называется совместным использованием параметров, поскольку мы используем один и тот же нейрон для всех четырех квадрантов.

Шаг 4: После применения этого нейрона ко всем четырем квадрантам у нас есть четыре разных числа (интуитивно говоря, эти числа представляют, есть ли кошка в каждом из квадрантов).

Помните, что мы получаем четыре разных числа, потому что мы вводим разные входные функции, даже если функция (и параметры остаются прежними).

Из приведенной выше формулировки входные характеристики (x1, x2 и x3) изменились, хотя числа, заполняющие пробелы, не изменились; следовательно, эти входные функции приводят к другому выходу.

Шаг 5: Мы хотим, чтобы одно число сообщало нам, есть ли кошка на всей картинке. Поэтому мы просто берем максимум из этих четырех чисел, чтобы получить одно число.

Что делает этот алгоритм с точки зрения решения наших прежних проблем?

  • Первоначально мы беспокоились о том, что было слишком много функций и, следовательно, слишком много параметров. Напомним, что даже если бы у нас был всего один нейрон для всех этих функций, нам потребовалось бы 256 * 256 * 3 + 1 = 196 609 параметров для каждого нейрона. Если мы разделим это на четыре разных квадранта и будем использовать одни и те же параметры для всех четырех квадрантов, нам понадобится всего 128 * 128 * 3 + 1 = 49 153 параметра - сокращение почти в четыре раза!
  • Неважно, где находится кошка на изображении, важно только то, что на изображении есть кошка. Используя один и тот же нейрон для распознавания кошки во всех четырех квадрантах, мы решаем эту проблему, поскольку «нейрон, распознающий кошку», должен сказать нам, в каком квадранте находится кошка!

Поздравляю! Вы видели свою самую первую сверточную нейронную сеть! Это не тот тип CNN, который мы создаем на практике, но эти концепции являются лишь общим расширением того, что мы рассмотрели.

В следующих нескольких разделах мы рассмотрим, из чего состоит типичный CNN.

Первый важный тип слоя, который есть в CNN, называется слоем свертки (Conv), который соответствует шагам с 1 по 4 в приведенном выше алгоритме. Слой Conv - это особый тип слоя нейронной сети, который использует совместное использование параметров и применяет тот же тот же меньший набор параметров в пространстве по всему изображению, как мы это сделали с нашим котом- идентификация нейрона на шагах с 1 по 4. Это не похоже на стандартный уровень нейронной сети, который будет иметь параметры для всего изображения.

Слой свертки имеет эти несколько гиперпараметров, которые мы можем указать:

  • Размер фильтра. Он соответствует тому, сколько входных характеристик по ширине и высоте принимает один нейрон. В нашем предыдущем примере размер фильтра был 128 * 128, потому что каждый нейрон смотрел 128 * 128 пикселей пространственно (ширина и высота). Мы всегда предполагаем, что разделяем изображение не по глубине (или каналам), а только по ширине и высоте. Итак, если мы укажем размер фильтра, количество параметров в нашем нейроне будет filter_width * filter_height * input_depth + 1. В нашем примере количество параметров составляет 128 * 128 * 3 + 1 = 49 153. Однако, как правило, разумный размер фильтра может быть больше порядка 3 * 3 или 5 * 5.
  • Шаг. Иногда кошка не очень хорошо выглядит в квадрантах, но может появиться где-то посередине двух (или более) квадрантов. В этом случае, возможно, нам следует применить наш нейрон не только исключительно в четырех квадрантах, но мы также хотим применить нейрон в перекрывающихся областях. Шаг - это просто, на сколько пикселей мы хотим переместиться (в направлении вправо / вниз), когда мы снова применяем нейрон. В нашем предыдущем примере мы двигались с шагом 128, поэтому мы сразу перешли к следующему квадранту, не посещая какой-либо перекрывающийся регион. Чаще мы двигаемся с шагом 1 или 2.

  • Глубина. В нашем предыдущем примере мы применили только один нейрон, чтобы определить, была ли кошка или нет, и поделиться параметрами, применив один и тот же нейрон в каждом квадранте. Предположим, мы хотим, чтобы другой нейрон также определил, есть ли собака или нет. Этот нейрон будет применяться так же, как нейрон, идентифицирующий кошку, но будет иметь разные параметры и, следовательно, разные выходные данные для каждого квадранта. Как это изменит наш параметр и размер вывода? Что ж, если бы у нас было два таких нейрона, у нас было бы (128 * 128 * 3 + 1) * 2 = 98 306 параметров. И в конце шага 4 у нас будет 2 * 2 * 2 = 8 выходных чисел. Первые два члена, 2 * 2, относятся к высоте и ширине (наших четырех квадрантных областей), а последний термин, 2, относится к тому факту, что у нас было два разных нейрона, примененных к каждому квадранту. Последний термин мы называем глубиной.

Я не хочу сразу вводить слишком много концепций, поэтому давайте проведем небольшую викторину, чтобы объединить эти концепции.

Предположим, у нас есть изображение входного размера 256 * 256 * 3. Я применяю сверточный слой с размером фильтра 3 * 3, шагом 1 и глубиной 64.

  • Сколько параметров у нас в сверточном слое?
  • Каковы выходные размеры этого сверточного слоя?

Я призываю вас решить это самостоятельно и не прокручивайте страницу вниз, чтобы увидеть ответы!

— —

Хорошо, вот и ответы! (Надеюсь, ты не обманул, но я все равно не узнаю):

  • Количество параметров: мы рассматриваем случай, когда глубина = 1, поскольку это всего лишь один нейрон, применяемый повсюду. Этот нейрон принимает 3 * 3 * 3 (размер фильтра * входные каналы) функций, поэтому количество параметров для этого нейрона составляет 3 * 3 * 3 + 1 = 28. Мы знаем, что глубина = 64, что означает 64 такие нейроны. Это дает нам в общей сложности 28 * 64 = 1792 параметра.
  • Выходные размеры. Давайте сначала подумаем о ширине. У нас есть строка из 256 пикселей в нашем исходном входном изображении. Вначале центр нашего фильтра (то, что нейрон принимает на вход) будет в пикселе 2, поскольку у нас есть фильтр 3 * 3. Таким образом, поскольку крайняя левая сторона фильтра будет в пикселе 1, центр фильтра будет в пикселе 2. Этот фильтр перемещается вправо на 1 пиксель каждый раз, чтобы применить нейрон (ы). В конце всех наших шагов центр нашего фильтра будет в пикселе 255, опять же, потому что у нас есть фильтр 3 * 3 (поэтому пиксель 256 будет занят самой правой стороной фильтра). Итак, учитывая, что центр нашего фильтра начинается с пикселя 2 и заканчивается на 255 при перемещении на 1 пиксель за каждый шаг, математика предполагает, что мы применили нейрон 254 раза по ширине. Точно так же мы применили нейрон 254 раза по высоте. И поскольку у нас есть 64 нейрона, выполняющих это (глубина = 64), наши выходные размеры составляют 254 * 254 * 64.

На этом этапе вы можете спросить: а что, если бы мне понадобились выходные размеры 256 * 256 * 64, чтобы высота и ширина нашего вывода оставались такими же, как входные? Здесь я представлю новую концепцию для решения этой проблемы:

  • Заполнение. Напомним, что центр фильтра 3x3 начинается с пикселя 2 (вместо пикселя 1) и заканчивается пикселем 255 (вместо пикселя 256). Чтобы центр фильтра начинался с пикселя 1, мы можем дополнить изображение рамкой «0», например:

На этом мы подробно рассмотрели, что такое сверточный слой, используемый во многих передовых системах! Мы представим еще один слой, а затем объединим все слои в одну большую архитектуру и обсудим интуицию, лежащую в основе этого!

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

Следующий уровень, который мы пройдем, называется уровнем объединения, что примерно соответствует шагам 4 и 5 в алгоритме, изложенном в начале. Если вы помните, у нас было четыре числа в нашем базовом алгоритме после применения сверточного слоя, и мы хотели уменьшить его до одного числа. Мы просто взяли четыре входных числа и вывели максимум в качестве выходного числа. Это пример max-pooling, который, как следует из названия, берет максимум из просматриваемых чисел.

В более общем смысле, объединяющий слой имеет размер фильтра и шаг, аналогичный сверточному слою. Давайте возьмем простой пример ввода с глубиной 1 (т. Е. У него только 1 глубина среза). Если мы применим max-pool с размером фильтра 2x2 и шагом 2, чтобы не было перекрывающейся области, мы получим:

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

Слой объединения применяется к каждому отдельному каналу глубины отдельно. То есть операция max-pooling не берет максимум на разных глубинах; он берет максимум только в одном глубинном канале. Это не похоже на сверточный слой, который объединяет входные данные со всех каналов глубины. Это также означает, что размер глубины нашего выходного слоя не меняется и не может изменяться, в отличие от сверточного слоя, где выходная глубина может отличаться от входной.

Цель объединяющего слоя, в конечном счете, состоит в том, чтобы уменьшить пространственный размер (ширину и высоту) слоев, и он вообще не затрагивает глубину. Это уменьшает количество параметров (и, следовательно, вычислений), необходимых для будущих уровней после этого уровня объединения.

Чтобы дать быстрый пример, предположим, что после нашего первого слоя свертки (с пулом) у нас есть размер вывода 256 * 256 * 64. Теперь мы применим к нему операцию максимального пула (с размером фильтра 2x2 и шагом 2), каковы выходные размеры после максимального уровня объединения?

— —

Ответ: 128 * 128 * 64, поскольку оператор max-pool уменьшает размеры по ширине и высоте вдвое, оставляя неизменным размер глубины.

Резюме. Еще один общий уровень в CNN - это уровень максимального объединения, определяемый размером фильтра и шагом, который уменьшает пространственный размер, принимая максимум чисел в его фильтре.

Последний слой, который обычно появляется в CNN, - это тот, который мы видели ранее в предыдущих частях, и это слой с полным подключением (FC). Слой FC такой же, как наша стандартная нейронная сеть - каждый нейрон следующего слоя принимает в качестве входных данных каждый нейрон в выходных данных предыдущего слоя. Отсюда и название «Полностью подключены», поскольку все нейроны следующего слоя всегда связаны со всеми нейронами предыдущего слоя. Чтобы показать знакомую диаграмму, которую мы видели в Части 1а:

Обычно мы используем уровни FC в самом конце наших CNN. Итак, когда мы дойдем до этой стадии, мы сможем сгладить нейроны в одномерный массив функций. Если результат предыдущего слоя был 7 * 7 * 5, мы можем сгладить их в строку из 7 * 7 * 5 = 245 объектов в качестве входного слоя на приведенной выше диаграмме. Затем, как обычно, применяем скрытые слои.

Резюме: мы также обычно используем наши традиционные полностью подключенные уровни в конце наших CNN.

А теперь давайте соберем их все вместе. Одним из важных критериев, который обычно используется исследователями компьютерного зрения, является задача под названием ImageNet Large Scale Visual Recognition Challenge (ILSVRC). ImageNet относится к огромной базе данных изображений, и задача ILSVRC состоит в том, чтобы точно классифицировать входное изображение на 1000 отдельных категорий объектов.

Одна из моделей, которая стала поворотным моментом в использовании глубокого обучения, - это AlexNet, которая выиграла ILSVRC в 2012 году. В статье под названием История, начатая с AlexNet: комплексное исследование подходов к глубокому обучению я цитирую:

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

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

Архитектуру AlexNet можно резюмировать следующим образом:

Как видите, AlexNet просто состоит из строительных блоков:

  • Слои Conv (с активизацией ReLU)
  • Максимальное количество слоев пула
  • Слои FC
  • Слои Softmax

Это слои, которые мы все так или иначе видели до сих пор! Как видите, мы уже рассмотрели строительные блоки для мощных моделей глубокого обучения, и все, что нам нужно сделать, это сложить многие из этих слоев вместе. Почему складывается так много слоев вместе и что на самом деле делает каждый слой?

Мы можем визуализировать некоторые промежуточные слои. Это визуализация первого сверточного слоя AlexNet:

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

Почему нейронная сеть выбрала именно эти особенности в первом слое? Просто выяснилось, что это лучшие параметры для характеристики первых нескольких слоев; они просто принесли минимальные потери.

Резюме: AlexNet была CNN, которая произвела революцию в области глубокого обучения, и была построена из слоев свертки, уровней максимального объединения и слоев FC. Когда много слоев собраны вместе, более ранние слои изучают низкоуровневые функции и объединяют их в более поздних слоях для более сложных представлений.

Сводная сводка: изображения представляют собой трехмерный массив функций: каждый пиксель в двумерном пространстве содержит три числа от 0 до 255 (включительно), соответствующих красному, зеленому и синему каналам. Часто данные изображения содержат множество входных функций. Слой, общий для CNN в слое Conv, который определяется размером фильтра, stride, depth и padding . Слой Conv использует одни и те же параметры и применяет одни и те же нейроны к разным областям изображения, тем самым уменьшая количество необходимых параметров. Другой общий уровень в CNN - это уровень максимального объединения, определяемый размером фильтра и шагом, который уменьшает пространственный размер, принимая максимальное из чисел в своем фильтре. Мы также обычно используем наши традиционные полностью подключенные уровни в конце наших CNN. AlexNet была CNN, которая произвела революцию в области глубокого обучения, и была построена из сверточных слоев, слоев максимального объединения и уровней FC. Когда много слоев собраны вместе, более ранние слои изучают низкоуровневые функции и объединяют их в более поздних слоях для более сложных представлений.

Что дальше?. Глубокое обучение не только изменило наши представления о распознавании изображений, но и произвело революцию в способах обработки речи. Но работа с языком сопряжена со своим набором проблем. Как мы представляем слова в виде чисел? Кроме того, предложения имеют разную длину. Как мы могли бы использовать нейронные сети, чтобы приблизиться к последовательностям, в которых входные данные могут иметь разную длину? Если вам интересно, Интуитивное глубокое обучение, часть 3 применяет нейронные сети к естественному языку, решая проблему обучения тому, как переводить английское предложение во французское.

Этот пост поставляется с напарником по кодированию, если вы заинтересованы в написании кода для своей первой модели распознавания изображений:



Изначально этот пост появился как третий пост во вводной серии Intuitive Deep Learning. Моя миссия - объяснять концепции глубокого обучения чисто интуитивно! Если вы новичок в нетехнической области, я хочу предоставить вам интуицию, лежащую в основе внутренней работы Deep Learning, и позволить вам общаться с техническими инженерами, используя тот же язык и жаргон, даже если вы не знаете математику или код. Это. Если вы изучаете глубокое обучение, я считаю, что получение прочной основы интуиции поможет вам лучше понять всю математику и код на курсах, которые вы изучаете, и предоставит вам менее болезненный способ изучить эти концепции.

Об авторе:

Привет, я Джозеф! Недавно я окончил Стэнфордский университет, где работал с Эндрю Нг в Стэнфордской группе машинного обучения. Я хочу сделать концепции глубокого обучения как можно более интуитивными и понятными для всех, что послужило мотивом для моей публикации: Интуитивное глубокое обучение.