Эта статья охватывает содержание, обсуждаемое в модуле Визуализация CNN Курса глубокого обучения, и все изображения взяты из одного и того же модуля.

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

Рецептивное поле нейрона:

Давайте рассмотрим сценарий, в котором у нас есть трехслойная CNN, и мы используем ядро ​​размером «3». Мы начинаем со слоя 1, наш интересующий пиксель желтый на изображении ниже, а синие пиксели в дополнение к желтому пикселю представляют положение ядра.

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

Теперь желтый пиксель в слое 2 вычисляется из средневзвешенного значения окрестности «3 X 3» желтого пикселя в слое 1, как показано на изображении ниже.

Теперь мы делаем то же самое снова, мы берем область соседства '3 X 3' вокруг желтого пикселя в Слое 2, берем взвешенную сумму этого соседства '3 X 3' и получаем значение желтого пикселя в слое 3, как видно из изображения ниже.

Теперь вопрос в том, что такое восприимчивое поле (сколько пикселей исходного изображения используется для вычисления/влияния на этот пиксель) этого желтого пикселя в слое 3, как и в исходном входном изображении (на слое 1).

Понятно, что этот нейрон (зеленый пиксель в слое 3) зависит от соседства «3 X 3» (или 9 пикселей) в предыдущем слое (слое 2).

Теперь нам нужно проверить, от каких пикселей исходного ввода зависят эти 9 пикселей. Пиксель, выделенный желтым цветом, в слое 2 на изображении ниже получается путем размещения ядра «3 X 3» поверх зеленой ограниченной области в слое 1, как показано на изображении ниже:

Второй пиксель (окрестности '3 X 3' в слое 2, который влияет на центральный пиксель в слое 3), выделенный оранжевым цветом на изображении ниже, получается путем размещения '3 Ядро X 3 над оранжевой рамкой в ​​слое 1, как показано на рисунке ниже:

Аналогично, для третьего пикселя имеем:

Если мы продолжим в том же духе, мы поймем, что все 9 интересующих пикселей в слое 2, которые влияют на центральный пиксель в слое 3, получаются из отмеченных ниже ограничивающих рамок в слое 1, как показано на изображении ниже:

Итак, исходя из этого, мы можем сказать, что на пиксель '1 X 1' в слое 3 влияет область '3 X 3' в слое 2, которая соответствует область «5 X 5» в предыдущем слое (Слой 1 в приведенном выше случае).

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

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

Определение изображений, которые вызывают возбуждение определенных нейронов

Нам интересно знать, срабатывают ли разные нейроны (срабатывание означает, что выходной сигнал близок к 1 в случае сигмовидной и тангенсной, и мы говорим, что нейрон срабатывает при использовании активации ReLU, если он имеет какое-то большое значение или больше некоторого порогового значения) для разных видов входов/изображений. Может случиться так, что некоторые нейроны в выходном объеме срабатывают для собачьего входа, тогда как некоторые другие нейроны в том же объеме срабатывают, скажем, для человеческого лица.

Мы хотим знать, какие нейроны срабатывают для различных видов входных данных. Кто-то провел этот эксперимент, они взяли определенный слой в нейронной сети, скажем, 3-й слой, а затем выбрали 6 нейронов в этом слое, проследили рецептивное поле этих нейронов на исходном изображении, которое влияет на эти нейроны, они взяли 1000 изображений из набора данных. и передали его через сеть, а затем для каждого из изображений они отметили состояние всех 6 нейронов, независимо от того, активировались они или нет. Затем для каждого из нейронов, скажем, нейрона 1, собрали все наборы изображений, для которых он сработал, аналогично собрали и для всех остальных 5 нейронов. Мы также знаем область влияния на изображении для всех нейронов. Скажем, первая строка на изображении ниже — это набор всех изображений, которые вызвали срабатывание нейрона 1, а выделенная область (белая ограничивающая рамка) — это область влияния на входном изображении.

Отсюда мы можем сказать, что нейрон 1 срабатывает всякий раз, когда на изображении появляется человеческое лицо. Точно так же, скажем, строка 2 на изображении выше представляет собой набор всех изображений, которые вызвали срабатывание нейрона 2, и, как видно из изображения выше, нейрон 2 срабатывает всякий раз, когда на входном изображении есть морда собаки. 3-й нейрон срабатывает для цветов, в основном красных цветов, следующий нейрон срабатывает для чисел на изображении, 5-й нейрон срабатывает для домов на изображении, а 6-й нейрон срабатывает для блестящих поверхностей на изображении.

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

Визуализация фильтров:

Следующий вопрос в этой серии: «Что фиксирует фильтр?». Давайте рассмотрим этот вопрос в ситуации, когда у нас есть вход «4 X 4», и мы применяем к нему фильтр «2 X 2», этот фильтр скользнул по всему изображению, и мы смотрим на одну из позиций, где в конечном итоге будет фильтр (красные пиксели на входном изображении ниже)

Допустим, мы назовем эти 4 точки/пикселя как [x1, x2, x3, x4] и аналогичным образом мы можем думать о весе как [w1, w2, w3, w4. >]. И когда мы сворачиваем фильтр с этим вводом здесь, мы получаем вывод, который мы называем h14 в этом случае. Давайте точно посмотрим, что такое h14:

h14 — это скалярное произведение двух векторов (вектор весов и входные пиксели, если рассматривать их как вектор). Таким образом, где бы мы ни размещали наш фильтр над областью входных данных '2 X 2', мы можем сказать, что выходные данные вычисляются с использованием скалярного произведения входного вектора (пиксели => ' >2 X 2' область) и весовой вектор.

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

Если мы поместим фильтр в определенные области (скажем, определенные входы), давайте посмотрим, для каких входов фильтр даст нам высокое значение или, перефразируя, посмотрим, когда h14 будет высоким:

h14 будет высоким, когда косинус угла между двумя векторами, который помогает вычислить h14, высок, значение косинуса будет лежать между -1 и 1, максимально возможное значение косинуса угла будет 1, и это было бы возможно, если бы угол между двумя векторами (ввод 'x' и вес 'w' в данном случае) на самом деле равен 0, т.е. 'w' и 'x' оба находятся в одном направлении.

Таким образом, когда и входной сигнал, и весовой вектор имеют одинаковое направление, нейрон сработает максимально. Другим способом этого может быть то, что нейрон сработает, когда входной вектор (x) является единичным вектором в направлении весового вектора (w) или кратным единичный вектор в направлении 'w'

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

У нас есть фильтр 'w', и мы будем перемещать его по изображению всякий раз, когда мы сталкиваемся с областью изображения, которая выглядит точно так же, как (значения в пикселях примерно кратны 'w' values) 'w', то есть когда выход будет максимальным. Другими словами, можно сказать, что фильтр пытается обнаружить на изображении точно такие же области, как он. Для всех других областей на входе, которые не совпадают с фильтром, выход будет низким. Таким образом, ядро отфильтровывает все регионы, которые ему не нравятся, и дает высокое значение, когда регион на входном изображении точно соответствует фильтру/ядру.

Теперь, если мы хотим знать, какие шаблоны изучает фильтр, мы можем просто нарисовать фильтр как есть, например, у AlexNet есть фильтры 96 '11 X 11'. в первом слое каждый из квадратов на изображении ниже представляет фильтр «11 X 11» (всего 80 показано на изображении ниже из 96 фильтров, и каждый квадрат на изображении ниже изображение представляет собой один фильтр «11 X 11»)

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

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

Эксперименты по окклюзии:

Этот эксперимент должен определить, какой патч в изображении вносит максимальный вклад в вывод. Итак, давайте разберемся, что происходит в этом:

У нас есть изображение в качестве входных данных, мы выполняем серию сверток, а затем в конце у нас есть выходной слой, который представляет собой слой softmax, который дает нам распределение вероятностей, и у нас также есть истинный результат, который мы можем представить как распределение вероятностей в виде вектора с горячим кодированием

Допустим, входное изображение приведено ниже, и модель предсказала, что это будет «шпиц» с вероятностью, скажем, 0,7 (скажем, мы назовем его как «y_hat_1» ). Теперь мы создаем патчи окклюзии (красная рамка на изображении ниже).

и замените выделенную желтым цветом часть на изображении ниже этим патчем окклюзии (т. Е. Этими серыми пикселями), чтобы этой области изображения больше не было.

Теперь изображение немного отличается от исходного изображения, это изображение собаки (лицо четко видно), только одна часть выделена серым цветом.

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

Теперь мы можем отобразить разницу между 'y_hat_1' и 'y_hat_2', а также представить ее в виде тепловой карты (мы отображаем изменение вероятности/прогнозируемого распределения, когда мы затенили определенную часть изображения).

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

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

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

Точно так же у нас есть следующие случаи: