Переходя от автоэнкодеров, пора взглянуть на наиболее широко используемые приложения глубокого обучения. Если вы пропустили предыдущую статью об автоэнкодерах, вы можете найти ее здесь: https://bit.ly/3c2nxNv

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

Операция свертки:

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

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

Сумма всех взвешенных значений x называется сверткой.

Массив весов w известен как фильтр или ядро ​​. На практике мы суммируем по небольшому окну (фильтру), перемещаем фильтр по входу и вычисляем значение s на основе окна около x.

Здесь и вход, и ядро ​​одномерны. Как это выглядит в двух измерениях?

В оставшейся части нашего обсуждения мы будем считать, что ядро ​​центрировано в интересующем пикселе.

Таким образом, по сути, ядро ​​будет перекрываться с предыдущими и последующими соседними пикселями.

Вот некоторые примеры применения двумерной свертки к изображениям:

Так как же двумерная свертка работает с изображениями?

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

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

А как насчет трехмерных сверток?

  • Фильтр для трехмерной свертки будет трехмерным и будет называться объемом.
  • Мы перемещаем объем по трехмерной входной матрице и вычисляем свертку за шаг.
  • Фактически, мы выполняем операцию двумерной свертки на трехмерном входе, поскольку фильтр скользит по длине и ширине, но не по глубине.
  • В результате результат операции свертки будет двухмерным.
    (только ширина и высота, без глубины).
  • Как и в случае с двумерной сверткой, мы можем применить несколько фильтров, чтобы получить несколько карт функций с входными трехмерными изображениями.

Прежде чем перейти к сверточным нейронным сетям, необходимо определить следующие величины:

  • «W1» - ширина входного изображения.
  • «H1» - высота входного изображения.
  • «D1» - это глубина изображения (для монохромного изображения это 1, а для цветного изображения - 3, с каналами RGB).
  • «S» означает шаг, то есть количество пикселей, на которое вы смещаете фильтр, перемещая его по изображению.
  • «K» обозначает количество используемых фильтров.
  • «F» - это пространственная протяженность каждого фильтра (глубина фильтра равна глубине входа).
  • Вывод: W2 x H2 x D2, где D2 - количество фильтров (K).

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

Сверточные нейронные сети

Рассмотрим задачу простой классификации изображений (распознавание содержимого изображения и присвоение ему определенного ярлыка: например, изображение Тадж-Махала можно классифицировать / присвоить ярлык «памятник»).

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

Можем ли мы позволить модели выбрать лучшие ядра для заданного входного изображения вместо использования ядер, созданных вручную? Можем ли мы позволить модели обучаться нескольким ядрам самостоятельно в дополнение к изучению весов классификатора?

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

Но чем это отличается от обычной нейронной сети с прямой связью?

Рассмотрим пример в сети, показанной выше. Изображение (4px * 4px) может быть сведено в линейный массив из 16 входных узлов для нейронной сети.

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

Сравните это со случаем свертки.

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

Более того, свертка приводит к разреженным связям, что уменьшает количество параметров в модели.

Но действительно ли плохая связь - это хорошо? Разве мы не теряем информацию из-за потери взаимодействия между соседними входными пикселями?

  • Ну не совсем. Во всяком случае, потеря взаимодействия может оказаться выгодной по мере развития модели.
  • Рассмотрим случай нейронов x1 и x5. Они не взаимодействуют друг с другом непосредственно на слое 1.
  • Однако случается, что они взаимодействуют на уровне 2, где их соответствующие характеристики более глубоки.

Распределение веса - еще одно преимущество сверточных нейронных сетей. По сути, мы можем применять разные ядра во всех местах изображения, и ядра будут общими для всех мест. Таким образом, работа по изучению параметров (ядер) становится более распределенной и простой (вместо того, чтобы снова и снова пытаться изучать одни и те же веса / ядра в разных местах).

Вот как выглядит законченная сверточная нейронная сеть:

Что делает слой объединения?

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

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

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

CNN можно обучить как обычную нейронную сеть с прямой связью, в которой активны только несколько весов (в цвете).
Остальные веса (серым цветом) равны нулю, а конечный результат - нейронная сеть, состоящая из редкие связи.

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

Визуализация пятен, максимально активирующих нейрон

  • Рассмотрим несколько нейронов в данном слое CNN.
  • Мы можем передавать изображения в эту CNN и идентифицировать изображения, которые вызывают срабатывание этих нейронов.
  • Затем мы можем вернуться к участку на изображении, который вызывает срабатывание этих нейронов.
  • В эксперименте, проведенном в 2014 году, ученые рассмотрели нейроны в слое pool5 и обнаружили участки, которые заставляли нейроны срабатывать.
  • Один нейрон выстрелил в лица людей
  • Один нейрон выстрелил в собачьи морды
  • Другой стрелял в цветы, а другой стрелял в цветы.

Итак, как нам вообще визуализировать фильтры?

Напомним, что мы делали нечто подобное с автоэнкодерами. Мы заинтересованы в поиске входа, который максимально возбудит нейрон.

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

Как упоминалось ранее, мы думаем о CNN как о нейронных сетях с прямой связью с разреженными связями и распределением веса. Следовательно, решение здесь такое же, поскольку веса параметров - это не что иное, как фильтры.

Таким образом, фильтры можно рассматривать как детекторы образов.

  • Обычно нас интересует понимание того, какие части изображения отвечают за максимизацию вероятности определенного класса.
  • Мы могли скрыть (закрасить серым) различные участки изображения и увидеть, как они влияют на прогнозируемую вероятность правильного класса.
  • Например, эти тепловые карты показывают, что скрытие основных характеристик изображений приводит к огромному снижению вероятности прогноза.

Итак, как мы можем измерить влияние входных пикселей?

  • Мы можем представить изображения как сетку размером (m x n) пикселей.
  • Нас интересует влияние каждого из этих входов (xi) на данный нейрон (hj).
  • Другими словами, мы обращаемся к градиентам, чтобы понять степень зависимости от определенных входных пикселей.
  • Мы могли бы просто вычислить частные производные функций активации на среднем уровне относительно. вход и визуализировать матрицу градиента как само изображение.

Отсюда можно сделать вывод:

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

Компьютерное зрение - это отрасль, которая активно использует сверточные нейронные сети. Есть еще много концепций, таких как управляемое обратное распространение, Deep Art, Deep fake и Deep Dream среди многих других, ради которых стоит поискать в Интернете.

Этот выпуск знаменует окончание месяца глубокого обучения от FACE. На следующей неделе мы вернемся с новой проблемой в новом домене. Быть в курсе!