содержание
2.0 Краткое введение в сверточные нейронные сети
2.1.1 Операция двумерной кросс-корреляции
2.1.2 Обнаружение границ объекта на изображениях
2.1.3 Анализ обнаружения границ экземпляра VGGNet
2.0 Краткое введение в сверточные нейронные сети
В этой главе будут представлены сверточные нейронные сети. Это краеугольный камень, на котором глубокое обучение может достичь прорывных результатов в компьютерном зрении в последние годы. Он также постепенно широко используется в других областях, таких как обработка естественного языка, рекомендательные системы и распознавание речи. Сначала мы опишем, как сверточные слои и слои объединения работают в сверточных нейронных сетях, и объясним, что означают заполнение, шаг, входные и выходные каналы. После освоения этих основ мы рассмотрим идеи дизайна нескольких репрезентативных глубоких сверточных нейронных сетей. Эти модели включают самые ранние предложенные AlexNet и более поздние сети, использующие повторяющиеся элементы (VGG), сети внутри сетей (NiN), сети с параллельными соединениями (GoogLeNet), остаточные сети (ResNet) и сети с плотной связью (DenseNet). Многие из них участвовали в конкурсе ImageNet (известном конкурсе компьютерного зрения) за последние несколько лет. Хотя глубокие модели кажутся просто многоуровневыми нейронными сетями, получить эффективные глубинные модели непросто. К счастью, пакетная нормализация и остаточные сети, описанные в этой главе, предоставляют две важные идеи для обучения и проектирования глубоких моделей.
2.1 Двумерный сверточный слой
Сверточная нейронная сеть — это нейронная сеть со сверточными слоями. Все сверточные нейронные сети, описанные в этой главе, используют наиболее распространенные двумерные сверточные слои. Он имеет два пространственных измерения, высоту и ширину, и часто используется для обработки данных изображения. В этом разделе мы опишем, как работает простая форма 2D-сверточного слоя.
2.1.1 Операция двумерной кросс-корреляции
Хотя сверточные слои получили свое название от операции свертки, мы обычно используем более интуитивную операцию взаимной корреляции в сверточных слоях. В двумерном сверточном слое двумерный входной массив и двумерный массив ядра взаимно коррелируют для получения двумерного массива на выходе. Мы используем конкретный пример, чтобы объяснить смысл двумерной кросс-корреляционной операции. Как показано на рис. 5.1, входными данными является двумерный массив высотой и шириной 3. Мы отмечаем форму этого массива как 3×33×3 или (3, 3). Высота и ширина массива ядра равны 2 соответственно. Этот массив также называется ядром свертки или фильтром в расчете свертки. Форма окна ядра свертки (она же окно свертки) зависит от высоты и ширины ядра свертки, т.е. 2×22×2. Заштрихованная часть на рис. 5.1 — это первый элемент вывода, а также элементы ввода и массива ядра, используемые для его вычисления: 0×0+1×1+3×2+4×3=190×0+1×1+3× 2 +4×3=19.
Рисунок 2.1 Операция двумерной кросс-корреляции
В операции двумерной кросс-корреляции окно свертки начинается с левого верхнего угла входного массива и скользит по входному массиву в порядке слева направо и сверху вниз. Когда окно свертки перемещается в определенную позицию, входной подмассив в окне и массив ядра умножаются на элемент и суммируются, чтобы получить элемент в соответствующей позиции в выходном массиве. Высота и ширина выходного массива на рис. 5.1 равны 2 соответственно, а 4 элемента получены в результате двумерной операции взаимной корреляции:
0×0+1×1+3×2+4×3=19,
1×0+2×1+4×2+5×3=25,
3×0+4×1+6×2+7×3=37,
4×0+5×1+7×2+8×3=43.
Ниже мы реализуем описанный выше процесс вcorr2d
в функции. он принимает входной массивX
с массивом ядерK
и вывести массивY
.
Код:
import numpy as np
def corr2d(X,K):
h,w = X.shape
h1,w1 = K.shape
Y = np.zeros(shape=(h - h1 + 1, w - w1 +1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
Y[i,j] = np.sum(X[i:i+h1,j:j+w1]*K)
return(Y)
X = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
K = np.array([[0, 1], [2, 3]])
Y = corr2d(X,K)
print(Y)
вывод:
[[19. 25.]
[37. 43.]]
2.1.2 Обнаружение границ объекта на изображениях
Давайте рассмотрим простое применение сверточного слоя: обнаружение краев объектов на изображении, то есть поиск места изменения пикселей. Сначала мы строим изображение 6×86×8 (то есть изображение высотой и шириной 6 пикселей и 8 пикселей соответственно). Его средние 4 столбца черные (0), а остальные белые (1).
In [4]:
import numpy as np
X = np.ones((6, 8))
X[:, 2:6] = 0
X
Out[4]:
[[1. 1. 0. 0. 0. 0. 1. 1.]
[1. 1. 0. 0. 0. 0. 1. 1.]
[1. 1. 0. 0. 0. 0. 1. 1.]
[1. 1. 0. 0. 0. 0. 1. 1.]
[1. 1. 0. 0. 0. 0. 1. 1.]
[1. 1. 0. 0. 0. 0. 1. 1.]]
Затем мы строим ядро свертки с высотой и шириной 1 и 2 соответственно.K
. Когда он кросс-коррелирован с входными данными, если соседние по горизонтали элементы одинаковы, выход равен 0; в противном случае выход не равен 0.
In [5]:
K = np.array([[1, -1]])
Войдет следующееX
и ядро свертки, которое мы разработалиK
Выполните кросс-корреляционные операции. Видно, что мы обнаруживаем 1 и -1 для ребер от белого к черному и ребер от черного к белому соответственно. Остальная часть вывода - все 0s.
In [6]:
Y = corr2d(X, K)
Y
Out[6]:
[[ 0. 1. 0. 0. 0. -1. 0.]
[ 0. 1. 0. 0. 0. -1. 0.]
[ 0. 1. 0. 0. 0. -1. 0.]
[ 0. 1. 0. 0. 0. -1. 0.]
[ 0. 1. 0. 0. 0. -1. 0.]
[ 0. 1. 0. 0. 0. -1. 0.]]
Из этого мы видим, что сверточные слои могут эффективно характеризовать локальное пространство за счет многократного использования сверточных ядер. Используется для извлечения информации о краях изображения. Функция, достигаемая многоуровневой сверткой, заключается в свертывании результатов свертки верхнего уровня для получения более сложной граничной информации для комбинирования. Давайте разберемся с функцией каждого уровня свертки через VGGNet.
2.1.3 Анализ обнаружения границ экземпляра VGGNet
На первом уровне сеть может обучаться простым вещам, таким как диагональные линии. На каждом уровне сеть может комбинировать эти результаты и продолжать изучать более сложные концепции. Все это звучит расплывчато, и Зейлер и Фергус (Zeiler and Fergus, 2013) проделали отличную работу по визуализации того, чему учат CNN. Это CNN, которую они использовали в своей статье. На этом основана модель Vgg16, победившая в конкурсе Imagenet.
CNN от Zeiler & Fergus (2013)
Это изображение выглядит грязным прямо сейчас, не паникуйте! Давайте начнем с того, что мы все видим на этой фотографии. Во-первых, входное изображение квадратное и имеет размер 224x224 пикселя. Фильтр, о котором я говорил ранее, имеет размер 7x7 пикселей. Модель имеет входной слой, 7 скрытых слоев и выходной слой. C в выходном слое относится к количеству классов, предсказанных моделью. Теперь давайте посмотрим на самое интересное: что модель узнает в разных слоях!
Уровень 2 CNN
Левое изображение представляет то, что узнала CNN, а правое изображение представляет собой часть фактического изображения.
На втором слое CNN модель приобрела более интересные формы, чем диагонали.
◆ В шестом квадрате (горизонтальный счет) видно, что модель приобретает круглую форму.
◆ Кроме того, последний квадрат поднимает угол.
Уровень 3 CNN
На уровне 3 мы видим, что модель начинает изучать что-то более конкретное.
◆ Первый блок показывает, что модель теперь может распознавать географические закономерности.
◆ Шестой квадрат обозначает автомобильные шины.
◆ Одиннадцатый квадрат идентифицирует людей.
Уровни 4 и 5 CNN
Наконец, 4-й и 5-й этажи продолжили эту тенденцию. 5-й этаж подбирает рингтон для наших собак и кошек. Он также улавливает глаза одного колеса и птицы/рептилии. Обратите внимание, что на этих изображениях показана лишь небольшая часть каждого слоя.