Авторы: Purit Punyawiwat и Natchuta Wattanapenpaiboon

Почему мы не можем использовать нейронные сети ?!

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

1. Недостаточно вычислительной мощности. Компьютеры не воспринимают изображения так, как мы, люди. Они видят изображение как матрицу чисел, где каждое число соответствует значению пикселя. Изображение размером 256 x 256 x 3 представляет собой матрицу с 3 слоями (RGB), где каждый слой содержит 256 x 256 значений.

Теперь, в обычной нейронной сети, мы должны были бы сгладить эти значения в вектор и передать их в качестве входных данных. Сделаем простые вычисления. Цветное изображение размером 256 x 256 будет иметь входные значения 256 x 256 x 3, что равно 196 608 входам. Если, например, у нас есть 1000 скрытых единиц в нашем первом скрытом слое, нам потребуется примерно 196 миллионов параметров или весов для обучения, что невозможно.

2. Утрата местных особенностей. Что касается изображений, вы обычно хотите сохранить местные особенности. Под этим мы подразумеваем, что если вы хотите классифицировать кошку, мы хотели бы сохранить ключевые черты, такие как морда или уши кошки. Однако, сглаживая матрицу, мы удалили все эти локальные особенности, что не является хорошим подходом. Даже несмотря на эти препятствия, люди изобрели новый способ решения этих проблем с помощью техники, известной как свертка.

Свертка изображений

Для цветных изображений матрица изображения имеет глубину 3, по одному для каждого из трех цветовых каналов: (R) ed, G (reen), B (lue).

Свертка - это математическая операция, которая принимает два входа:

  1. Матрица (объем) изображения размером (в x ш x г)
  2. Фильтр (f_h x f_w x d)

и выводит объем размером (h - f_h + 1) x (w - f_w + 1) x 1.

В упрощенном случае, когда d = 1, h = w = n и f_h = f_w = f (это означает, что входное изображение и фильтр возведены в квадрат, изображения в оттенках серого), размер выходного объема упрощается до (n - f + 1) x (п - ж + 1).

Мы вычисляем результат свертки следующим образом:

Начнем с верхнего левого пикселя вывода:

  1. «Поместите» фильтр в левый верхний угол входного изображения.
  2. Вычислить поэлементное произведение каждого соответствующего значения пикселя
  3. Суммируйте продукты, чтобы получить значение верхнего левого пикселя выходного изображения.

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

Обратите внимание, что глубина входного объема и фильтра должны совпадать.

Примечание. Возможно, размер фильтра не полностью «умещается» во входном изображении. Оказывается, есть несколько способов преодолеть это. Заполнение, обсуждаемое в следующем разделе, является одним из них.

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

Слой свертки

Сверточный слой состоит из фильтров n_f одинакового размера и глубины. Для каждого фильтра мы сворачиваем его с входным объемом, чтобы получить n_f выходов. Далее выходы передаются некоторой функции активации, например, ReLU. Наконец, эти выходы n_f складываются вместе в объем (h - f_h + 1) x (w - f_w + 1) x n_f.

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

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

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

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

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

Заполнение

Что делать, если фильтр не идеально подходит для входного изображения? Что ж, у нас есть два варианта:

  1. Дополните изображение нулями (заполнение нулями), чтобы оно подходило, или
  2. Отбросьте часть изображения, где фильтр не поместился. Это называется valid-padding, при котором сохраняется только действительная часть изображения.

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

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

Шаги

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

Теперь вас может беспокоить, почему мы хотели бы изменить шаг. Это потому, что это может помочь уменьшить изображение. С шагом 1 наш вывод сверху приведет к изображению 5x5. Однако с шагом 2 вместо этого мы получим изображение 3x3. Для некоторых изображений, где близкие значения пикселей очень похожи, нам не нужно отбирать каждый пиксель, поскольку мы можем получить ту же информацию с меньшим изображением.

Уровень объединения

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

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

Полностью связанный слой

После слоя объединения мы слили наши данные в вектор и передали его в полностью связанный слой, как в обычной нейронной сети. У нас есть этот слой, чтобы добавить нелинейности нашим данным. Если привести пример человеческого лица, сверточный слой мог бы идентифицировать такие черты, как лица, нос, уши и т. Д. Однако они не знают положение или где эти черты должны быть. С полностью связанными слоями мы объединили эти функции вместе, чтобы создать более сложную модель, которая могла бы дать сети больше возможностей прогнозирования того, где эти функции должны быть расположены, чтобы классифицировать ее как человека. Наконец, у нас есть функция активации, такая как softmax или sigmoid, которая выводит наш результат. Возможно, это еще не очевидно для вас, но позже мы сможем удалить эти полностью связанные слои и вместо этого получить полностью сверточный слой. Однако оставим это на потом.

CNN Резюме

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

  1. Загрузите наше входное изображение в сверточный слой.
  2. Сверточный слой. Выберите параметры свертки, включая шаг, отступы и размер фильтра. Выполните свертку на изображении. Выполните активацию ReLU на всей матрице. Выполните объединение выходных данных, чтобы уменьшить размер. Добавьте столько сверточных слоев, пока не получите желаемый результат.
  3. Выровняйте результат и загрузите его в полностью связанный слой.
  4. Выведите класс с помощью функции активации, такой как softmax или сигмовидная функция.

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