Что такое глубина сверточной нейронной сети?
Я смотрел на свернутую нейронную сеть из CS231n сверточных нейронных сетей для визуального распознавания. В сверточной нейронной сети нейроны расположены в трех измерениях (height
, width
, depth
). У меня возникают проблемы с depth
CNN. Я не могу представить, что это такое.
В ссылке они сказали The CONV layer parameters consist of a set of learnable filters. Every filter is small spatially (along width and height), but extends through the full depth of the input volume
.
Например, посмотрите на это изображение. Извините, если изображение слишком дрянное. ![crappy picture]()
Я могу понять, что мы берем небольшую область с изображения, а затем сравниваем ее с "Фильтрами". Таким образом, фильтры будут собирать небольшие изображения? Также они сказали We will connect each neuron to only a local region of the input volume. The spatial extent of this connectivity is a hyperparameter called the receptive field of the neuron.
Итак, восприимчивое поле имеет тот же размер, что и фильтры? И какая будет глубина здесь? И что мы обозначим, используя глубину CNN?
Итак, мой вопрос в основном состоит в том, что если я возьму изображение, имеющее размерность [32*32*3]
(скажем, у меня есть 50000 этих изображений, создавая набор данных [50000*32*32*3]
), что я буду выбирать как его глубину и что бы это сделал означают глубину. Каким будет размерность фильтров?
Также будет полезно, если кто-нибудь сможет предоставить некоторую ссылку, которая дает некоторую интуицию на этом.
EDIT:
Итак, в одной части учебника (часть примера реального мира) говорится: The Krizhevsky et al. architecture that won the ImageNet challenge in 2012 accepted images of size [227x227x3]. On the first Convolutional Layer, it used neurons with receptive field size F=11, stride S=4 and no zero padding P=0. Since (227 - 11)/4 + 1 = 55, and since the Conv layer had a depth of K=96, the Conv layer output volume had size [55x55x96].
Здесь мы видим, что глубина 96. То есть глубина, которую я выбираю произвольно? или что-то, что я вычислил? Также в приведенном выше примере (Крижевский и др.) Они имели 96 глубин. Итак, что это значит по 96 глубинам? Также в учебнике указано Every filter is small spatially (along width and height), but extends through the full depth of the input volume
.
Значит, глубина будет такой? Если да, то могу ли я принять Depth = Number of Filters
?
![введите описание изображения здесь]()
Ответы
Ответ 1
В глубоких нейронных сетях глубина относится к тому, насколько глубока сеть, но в этом контексте глубина используется для визуального распознавания и преобразуется в измерение 3rd изображения.
В этом случае у вас есть изображение, а размер этого ввода 32x32x3, который (width, height, depth)
. Нейронная сеть должна уметь учиться на основе этих параметров, поскольку глубина переводится в разные каналы обучающих образов.
UPDATE:
В каждом слое вашего CNN он изучает закономерности обучения образов. В самых первых слоях закономерности - это кривые и ребра, тогда, когда вы идете глубже по слоям, вы начинаете изучать более высокие уровни закономерностей, таких как цвета, формы, объекты и т.д. Это основная идея, но там много технических деталей. Прежде чем продолжить, сделайте снимок: http://www.datarobot.com/blog/a-primer-on-deep-learning/
ОБНОВЛЕНИЕ 2:
Посмотрите на первую цифру в приведенной ссылке. Он говорит . В этом примере красный слой ввода удерживает изображение, поэтому его ширина и высота будут размером изображения, а глубина будет 3 (красный, зеленый, синий). Это означает, что нейрон ConvNet преобразует входное изображение путем организации его нейронов в трех режимах.
В качестве ответа на ваш вопрос глубина соответствует различным цветовым каналам изображения.
Кроме того, о глубине фильтра. В руководстве указано это.
Каждый фильтр мал в пространстве (по ширине и высоте), но проходит через всю глубину входного объема.
Что в основном означает, что фильтр является меньшей частью изображения, которое перемещается по глубине изображения, чтобы узнать закономерности изображения.
ОБНОВЛЕНИЕ 3:
Для примера в реальном мире я просто просмотрел оригинальную бумагу, и он говорит следующее: Первый сверточный слой фильтрует входное изображение 224 × 224 × 3 с 96 ядрами размером 11 × 11 × 3 с шагом 4 пикселей.
В учебнике это относится к глубине как к каналу, но в реальном мире вы можете создать любое измерение, которое вам нравится. В конце концов, дизайн
Учебное пособие нацелено на то, чтобы дать вам представление о том, как ConvNets работает в теории, но если я создаю ConvNet, никто из не сможет помешать мне предложить другую глубину.
Это имеет смысл?
Ответ 2
Я не уверен, почему это так сильно обрезается. Мне также было трудно понять это сначала, и очень немногие за пределами Андрея Карпати (спасибо d00d) объяснили это. Хотя в его записи (http://cs231n.github.io/convolutional-networks/) он вычисляет глубину выходного тома, используя другой пример, чем в анимации.
Начните с чтения раздела " Примеры" Numpy ""
Здесь мы проходим итеративно.
В этом случае мы имеем 11x11x4. (почему мы начинаем с 4, является своеобразным, так как было бы легче понять глубину 3)
Действительно обратите внимание на эту строку:
Столбец глубины (или волокно) в положении (x, y) будет активацией Х [х, у,:].
Глубинный срез или, что то же самое, карта активации на глубине d были бы активациями X [:,:, d].
V[0,0,0] = np.sum(X[:5,:5,:] * W0) + b0
V - ваш выходной том. Нулевой индекс v [0] - ваш столбец - в этом случае V[0] = 0
это первый столбец в вашем томе вывода.
V[1] = 0
Это первая строка в вашем томе вывода. V[3]= 0
- глубина. Это первый выходной уровень.
Теперь, когда люди путаются (по крайней мере, я это сделал). Глубина ввода не имеет абсолютно никакого отношения к вашей выходной глубине. Глубина входного сигнала регулирует только глубину фильтра. W
в примере Андрея.
Кроме того: многие люди задаются вопросом, почему 3 является стандартной глубиной ввода. Для цветных входных изображений это всегда будет 3 для простых изображений ole.
np.sum(X[:5,:5,:] * W0) + b0
(свертка 1)
Здесь мы вычисляем поэлементно между весовым вектором W0, который равен 5x5x4. 5x5 - произвольный выбор. 4 - это глубина, так как нам нужно соответствовать глубине ввода. Весовой вектор - это ваш фильтр, ядро, восприимчивое поле или любое другое обфусканное имя, которое люди решают назвать по дороге.
если вы пришли к этому из фона, отличного от python, возможно, потому, что есть больше путаницы, поскольку нотация нотации массива не интуитивно понятна. Расчет - это точечный продукт вашего первого размера свертки (5x5x4) вашего изображения с вектором веса. Вывод представляет собой одно скалярное значение, которое занимает позицию вашей первой выходной матрицы фильтра. Представьте себе матрицу 4 × 4, представляющую суммарный продукт каждой из этих операций свертки по всему входу. Теперь уложите их для каждого фильтра. Это даст вам ваш объем вывода. В записи Андрея он начинает двигаться по оси х. Ось y остается неизменной.
Вот пример того, что V[:,:,0]
будет выглядеть как свертки. Помните, что третье значение нашего индекса - это глубина вашего выходного слоя
[result of convolution 1, result of convolution 2, ..., ...]
[..., ..., ..., ..., ...]
[..., ..., ..., ..., ...]
[..., ..., ..., result of convolution n]
Анимация лучше всего это понимает, но Андрей решил поменять ее на пример, который не соответствует приведенным выше вычислениям.
Это заняло у меня некоторое время. Отчасти потому, что numpy не индексирует способ, которым Андрей делает в своем примере, по крайней мере, я не играл с ним. Кроме того, есть некоторые предположения, что операция сумма продукта ясна. Это ключ, чтобы понять, как создается ваш выходной уровень, что представляет каждое значение и какова глубина.
Надеюсь, это поможет!
Ответ 3
Поскольку входной объем, когда мы выполняем задачу классификации изображений, N x N x 3
. Вначале нетрудно представить, что будет означать глубина - просто количество каналов - Red, Green, Blue
. Итак, смысл для первого слоя ясен. Но как насчет следующих? Вот как я пытаюсь представить себе идею.
-
На каждом слое мы применяем набор фильтров, которые свертываются вокруг ввода. Предположим, что в настоящее время мы находимся на первом уровне, и мы свернуты вокруг объема V
размера N x N x 3
. Как сказал @Semih Yagcioglu в самом начале, мы ищем некоторые грубые черты: кривые, ребра и т.д. Допустим, мы применяем N фильтров равного размера (3x3) с шагом 1. Затем каждый из этих фильтров ищет другую кривая или край, свернувшись вокруг V
. Конечно, фильтр имеет одинаковую глубину, мы хотим предоставить всю информацию не только в виде оттенков серого.
-
Теперь, если фильтры M
будут искать M разных кривых или ребер. И каждый из этих фильтров будет создавать карту объектов, состоящую из скаляров (смысл скаляра - это фильтр: "Вероятность наличия этой кривой здесь равна X%). Когда мы свернуты с тем же фильтром вокруг Тома, мы получаем эту карту скаляров, сообщающую нам, где именно мы видели кривую.
-
Затем идет сборка карт функций. Представьте, что укладывание выполняется следующим образом. У нас есть информация о том, где каждый фильтр обнаружил определенную кривую. Хорошо, тогда, когда мы складываем их, мы получаем информацию о том, какие кривые/ребра доступны в каждой малой части нашего объема ввода. И это результат нашего первого сверточного слоя.
-
Легко понять идею нелинейности при учете 3
. Когда мы применяем функцию ReLU на некоторой карте функций, мы говорим: Удалите все отрицательные вероятности для кривых или ребер в этом месте. И это, безусловно, имеет смысл.
-
Тогда вход для следующего слоя будет томом $V_1 $, несущим информацию о разных кривых и ребрах в разных пространственных местоположениях (Помните: каждый слой передает информацию об одной кривой или краю).
- Это означает, что следующий слой сможет извлечь информацию об более сложных фигурах, объединив эти кривые и края. Чтобы объединить их, фильтры должны иметь ту же глубину, что и входной объем.
- Время от времени мы применяем Pooling. Смысл заключается в том, чтобы точно уменьшить объем. Поскольку, когда мы используем strides = 1, мы обычно смотрим на пиксель (нейрон) слишком много раз для одной и той же функции.
Надеюсь, это имеет смысл. Посмотрите на удивительные графики, предоставленные знаменитым курсом CS231, чтобы проверить, как именно вычисляется вероятность для каждой функции в определенном месте.
Ответ 4
Глубина сети - это количество слоев в сети. В Крижевский, глубина 9 слоев (по модулю проблема забора с учетом того, как подсчитываются слои?).
![Архитектор Крижевского и др. CNN]()
Ответ 5
Глубина - это количество фильтров, которые смотрят на изображение. Скажем, ваш вход - изображение RGB. Таким образом, у него есть 3 канала, а глубина - 3. Затем вы должны применить 5 фильтров. Теперь помните, что каждый фильтр смотрит на все 3 канала изображения. Затем каждый фильтр будет создавать одну карту объектов. Таким образом, в целом 5 карт функций.
Ответ 6
Глубина слоя CONV - это количество используемых фильтров.
Глубина фильтра равна глубине изображения, которую он использует в качестве входного сигнала.
Например: скажем, вы используете изображение 227 * 227 * 3.
Предположим теперь, что вы используете фильтр размером 11 * 11 (пространственный размер).
Этот квадрат 11 * 11 будет скользить вдоль всего изображения, чтобы получить один 2-мерный массив в качестве ответа. Но для этого он должен охватывать все аспекты внутри области 11 * 11. Поэтому глубина фильтра будет равна глубине изображения = 3.
Теперь предположим, что у нас есть 96 таких фильтров, каждый из которых производит различный отклик. Это будет глубина сверточного слоя. Это просто количество используемых фильтров.
Ответ 7
Первое, что вам нужно отметить, это
receptive field of a neuron is 3D
т.е. если восприимчивое поле 5x5, нейрон будет подключен к 5x5x (входной глубине) количеству точек. Итак, какова бы ни была ваша глубина ввода, один слой нейронов будет развивать только один уровень вывода.
![Каждый нейрон подключен ко всей глубине в восприимчивом поле]()
Теперь, следующее, что нужно отметить:
depth of output layer = depth of conv. layer
т.е. выходной том не зависит от входного объема, и он зависит только от числовых фильтров (глубина). Это должно быть довольно очевидно из предыдущего пункта.
Обратите внимание, что количество фильтров (глубина слоя cnn) является гиперпараметром. Вы можете использовать его независимо от глубины изображения.