Изнутри AI

Сверточная нейронная сеть: чем она отличается от других сетей?

Что такого уникального в CNN и что на самом деле делает свертка? Это введение в чудеса CNN без математических расчетов.

Я не исследователь глубокого обучения, но кое-что узнал о нейронных сетях благодаря различным воздействиям. Я всегда слышал, что CNN - это тип нейронной сети, которая особенно хороша для решения проблем, связанных с изображениями. Но что это на самом деле означает? Что за слово "сверточный"? Что такого необычного в проблеме, связанной с изображениями, что требуется другая сеть?

Недавно у меня была возможность поработать над проблемой классификации изображений COVID-19 и я построил классификатор на основе CNN с использованием tensorflow.keras , что позволило достичь уровня точности 85%. Наконец, я думаю, что нашел ответы на эти вопросы. Позвольте мне поделиться с вами этими ответами без использования математики. Если вы уже знакомы с CNN, этот пост должен стать хорошим напоминанием. Если нет, взгляните, вы могли бы получить интуитивное понимание мотивации CNN и уникальных особенностей, которые определяют CNN.

Глубокая нейронная сеть

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

Машинное обучение (ML) - это исследование компьютерных алгоритмов, которые автоматически улучшаются на основе опыта. - Википедия

Если посмотреть на проблемы, которые пытается решить машинное обучение, то его часто можно разделить на следующие категории:

  • Обучение с учителем: прогнозирование метки, например, классификации или непрерывной переменной;
  • Обучение без учителя: распознавание образов немаркированных данных, например, кластеризация;
  • Обучение с подкреплением: алгоритмы изучают лучший способ «вести себя», например, AlphaGo, беспилотные автомобили.

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

Грубо говоря, нейронная сеть состоит из двух важных операций:
1. Прямое распространение
2. Обратное распространение

Прямое распространение

Это этап прогнозирования. Сеть считывает входные данные, вычисляет их значения по сети и выдает окончательное выходное значение.

Но как сеть вычисляет выходное значение? Давайте посмотрим, что происходит в однослойной сети, когда она делает одно предсказание. Он принимает входные данные как вектор чисел. Каждый узел в слое имеет свой вес. Когда входное значение проходит через слой, сеть вычисляет его взвешенную сумму. Обычно за этим следует (обычно нелинейная) функция активации, например, ступенчатая функция, где взвешенная сумма «активируется».

Если вы немного разбираетесь в алгебре, вот что делает операция:

y = f(w  x+ b)

где wx + b - взвешенная сумма, f - функция активации, а y - выход. Теперь, в более глубокой нейронной сети, процедура по сути такая же, то есть процесс ввод - ›взвешенная сумма -› активация повторяется для многих слоев.

Обратное распространение

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

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

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

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

Я замалчиваю многие детали, но надеюсь, что теперь вы знаете, что DNN

  • это мощный метод машинного обучения;
  • может использоваться для решения задач контролируемого, неконтролируемого и обучения с подкреплением;
  • состоит из прямого распространения (от ввода к выводу) и обратного распространения (ошибка при обновлении параметра).

Мы готовы поговорить о CNN!

Сверточная нейронная сеть

Обычные нейронные сети, о которых мы говорили выше, ожидают, что входные данные будут вектором чисел, то есть x = [x1, x2, x3,…]. Что, если мы хотим обучить классификатор изображений, т. Е. Использовать изображение в качестве входных данных? Давайте поговорим об основах цифрового изображения.

  • Изображение - это набор пикселей. Например, изображение размером 32 на 32 имеет 32 * 32 = 1024 пикселя.
  • Каждый пиксель представляет собой интенсивность, представленную числом в диапазоне [0, 255], где 0 - черный, а 255 - белый.
  • Цветные изображения имеют три измерения: [ширина, высота, глубина], где глубина обычно равна 3.
  • Почему глубина 3? Это потому, что он кодирует интенсивность [R ed, G reen, B lue], т. Е. Значений RGB.

Следовательно, это черно-белое изображение Линкольна - просто матрица целых чисел.

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

Однако у этого подхода есть два основных ограничения.

  1. Он плохо масштабируется для изображений большего размера.
  • Хотя с ним все еще можно справиться для ввода с размерами 32 * 32 = 1024, большинство реальных изображений больше, чем это.
  • Например, цветное изображение размером 320x320x3 будет преобразовано во вход с размером 307200!

2. Он не учитывает свойства изображения.

  • Местоположение: соседние пиксели обычно сильно коррелированы (например, смотрите контур лица Линкольна). Растягивание нарушает узор.
  • Неизменность перевода. Значимые элементы могут встречаться в любом месте изображения, например, вы можете увидеть летающую птицу.

Сила свертки

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

  1. Распределение веса: все локальные части изображения обрабатываются с одинаковыми весами, поэтому идентичные узоры могут быть обнаружены во многих местах, например на горизонтальных краях, кривых и т. д.
  2. Иерархия элементов: узоры нижнего уровня, изученные вначале, составляются для формирования узоров более высокого уровня по слоям, например, от кромок к контурам к контуру грани.

Это делается с помощью операции свертки:

  1. Определите фильтр: двумерную весовую матрицу определенного размера, например Фильтр 3х3.
  2. Сверните все изображение с помощью фильтра: умножьте каждый пиксель под фильтром на вес.
  3. Результат свертки формирует новое изображение: карту функций.
  4. Используя несколько фильтров (каждый с разной матрицей весов), можно захватывать разные характеристики.

Пример свертки: средний фильтр

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

Original image pixel values: 
 [[0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 1. 1. 0. 0.]
 [0. 0. 1. 1. 1. 0. 0.]
 [0. 0. 1. 1. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0.]]

А вот как выглядит изображение:

Напомним, что фильтр - это двумерная весовая матрица. Давайте создадим пример фильтра и назовем его «средний фильтр»:

[[0.11 0.11 0.11]
 [0.11 0.11 0.11]
 [0.11 0.11 0.11]]

В свертке этот «средний фильтр» фактически скользит по изображению, принимает значения 9 связанных пикселей, умножает каждый на вес (0,11) и возвращает сумму, то есть средневзвешенное значение исходных 9 значений, следовательно, назовите «средний фильтр»:

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

Filtered image pixel values: 
 [[0.11 0.22 0.33 0.22 0.11]
 [0.22 0.44 0.67 0.44 0.22]
 [0.33 0.67 1.   0.67 0.33]
 [0.22 0.44 0.67 0.44 0.22]
 [0.11 0.22 0.33 0.22 0.11]]

Что это делать со сверточной нейронной сетью?

Что ж, CNN, по сути, применяет ту же процедуру свертки, но ключевое отличие состоит в том, что она изучает веса фильтра посредством обратного распространения ошибки (обучения).

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

  • Ранние фильтры захватывают края и текстуры. (Общие)
  • Последние фильтры образуют детали и объекты. (Конкретный)

Ключевые особенности CNN

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

  • Сверточный слой (CONV): изображение подвергается свертке с помощью фильтров.
  • Уровень RELU (RELU): функция поэлементной нелинейной активации (такая же, как в DNN ранее).
  • Слой объединения (POOL): изображение подвергается свертке со средним (или максимальным) фильтром, поэтому его выборка уменьшается.
  • Полносвязный уровень (FC): обычно используется в качестве последнего слоя для вывода предсказания вероятности класса.

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

  1. Тип сверточного слоя
  • Глубина: количество фильтров, используемых для каждого слоя.
  • Шаг: насколько большой шаг нужно сделать при перемещении фильтра по изображению, обычно 1 (см. сверточный GIF-файл выше) или 2.
  • Размер: размер каждого фильтра свертки, например средний фильтр 3 на 3.
  • Отступ: следует ли использовать отступы вокруг изображений при свертке. Это определяет размер выходного изображения.
  • И другие.

2. Как соединить каждый слой?

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

INPUT --> [ [CONV --> RELU]^N --> POOL]^M --> [FC --> RELU]^K --> FC

Степени (N, M, K) означают, что операция повторяется указанное количество раз.

Что дальше?

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

В следующей статье мы исследуем, как CNN можно использовать для создания классификатора изображений компьютерной томографии COVID-19. Неудивительно, что предварительно обученная CNN может достичь хороших базовых показателей (точность 85%). Однако для получения надежных и убедительных результатов потребуется нечто большее, чем нейронная сеть. Вот статья:



Дополнительные ресурсы

Если вам интересно узнать больше о CNN, посмотрите 👉:

и как их реализовать 👉:

Наслаждаться! 👏👏👏

Первоначально опубликовано на https://yangxiaozhou.github.io.