Насколько я понимаю, сверточный слой сверточной нейронной сети имеет четыре измерения: input_channels, filter_height, filter_width, number_of_filters. Кроме того, я понимаю, что каждый новый фильтр просто замыкается на ВСЕ входные каналы (или карты возможностей / активации из предыдущего слоя).
ОДНАКО, на рисунке ниже из CS231 показан каждый фильтр (красного цвета), применяемый к ОДНОМУ КАНАЛУ, а не один и тот же фильтр, используемый для разных каналов. Кажется, это указывает на то, что для КАЖДОГО канала есть отдельный фильтр (в данном случае я предполагаю, что это три цветовых канала входного изображения, но то же самое применимо ко всем входным каналам).
Это сбивает с толку - есть ли разные уникальные фильтры для каждого входного канала?
Источник: http://cs231n.github.io/convolutional-networks/
Приведенное выше изображение кажется противоречивым отрывку из «Основ глубокого обучения» О'рейли :
«... фильтры работают не только с одной картой объектов. Они работают со всем объемом карт объектов, созданных на определенном слое ... В результате карты объектов должны работать с объемами, не только области "
... Кроме того, я понимаю, что эти изображения , показанные ниже, показывают, что один и тот же фильтр просто свернут по всем трем входным каналам (что противоречит тому, что показано на рисунке CS231 выше):
Ответы:
Первый. Фактически для каждой комбинации входного канала / выходного канала определено отдельное ядро.
Обычно для архитектуры CNN в одном фильтре, как описано в вашем
number_of_filters
параметре, имеется одно двумерное ядро на входной канал. Существуютinput_channels * number_of_filters
наборы весов, каждый из которых описывает ядро свертки. Таким образом, диаграммы, показывающие один набор весов на входной канал для каждого фильтра, верны. Первая диаграмма также ясно показывает, что результаты применения этих ядер объединяются путем суммирования их и добавления смещения для каждого выходного канала.Это также можно рассматривать как использование трехмерной свертки для каждого выходного канала, которая имеет ту же глубину, что и вход. Это то, что показывает ваша вторая диаграмма, а также то, что многие библиотеки будут делать внутри. Математически это тот же результат (при условии, что глубины точно совпадают), хотя тип слоя обычно помечается как «Conv2D» или подобный. Точно так же, если ваш тип ввода по своей сути трехмерный, такой как вокселы или видео, вы можете использовать слой «Conv3D», но внутри он вполне может быть реализован как свертка 4D.
источник
input_channels
версий с разным весом . Есть ли у вас «официальный» источник, подтверждающий это понимание?Следующая картинка, которую вы использовали в своем вопросе, очень точно описывает происходящее. Помните, что каждый элемент трехмерного фильтра (серый куб) состоит из разных значений (
3x3x3=27
значений). Таким образом, три разных 2D-фильтра размера3x3
могут быть объединены, чтобы сформировать этот один 3D-фильтр размера3x3x3
.3x3x3
RGB - фрагмент из картины умножает поэлементно с помощью 3D - фильтра (показано серого цвета). В этом случае фильтр имеет3x3x3=27
весовые коэффициенты. Когда эти веса умножаются по элементам, а затем суммируются, это дает одно значение.Итак, есть ли отдельный фильтр для каждого входного канала?
ДА , количество 2D-фильтров равно количеству входных каналов в изображении. Однако полезно, если вы считаете, что для входных матриц с более чем одним каналом существует только один 3D-фильтр (как показано на рисунке выше).
Тогда почему это называется 2D-сверткой (если фильтр 3D и входная матрица 3D)?
Это двумерная свертка, потому что шаги фильтра идут только по размерам высоты и ширины ( НЕ глубина), и, следовательно, выходные данные, полученные этой сверткой, также являются двумерной матрицей. Количество направлений движения фильтра определяет размеры свертки.
Примечание. Если вы развиваете свое понимание, визуализируя один 3D-фильтр вместо нескольких 2D-фильтров (по одному для каждого слоя), то вам будет легко понять сложные архитектуры CNN, такие как Resnet, InceptionV3 и т. Д.
источник
input_channels
версий с разным весом. Если это также ваше понимание, есть ли «официальный» источник, подтверждающий это?В ответ на приведенные выше ответы приведу конкретный пример в надежде уточнить, как работает свертка в отношении каналов ввода и вывода и весов соответственно:
Пусть пример будет следующим (по отношению к 1 сверточному слою):
input_channels=5
output_channels=56
Мы отмечаем, что:
Этот сверточный слой, таким образом, содержит:
56 трехмерных фильтров размером 4x4x5 (= 80 различных весов каждый) для учета 56 выходных каналов, где каждый имеет значение для 3-го измерения 5, чтобы соответствовать 5 входным каналам. Всего есть
number_of_filters=input_channel*output_channels=5*56=280
2D-фильтры размером 4х4 (т.е. всего 280х16 различных весов).
источник
Есть только ограничение в 2D. Зачем?
Представьте себе полностью связанный слой.
Это было бы ужасно огромно, каждый нейрон был бы подключен к 1000x1000x3 входным нейронам. Но мы знаем, что обработка близлежащего пикселя имеет смысл, поэтому мы ограничиваемся небольшой 2D-окрестностью, поэтому каждый нейрон связан только с 3x3 рядом нейронов в 2D. Мы не знаем ничего о каналах, поэтому подключаемся ко всем каналам.
Тем не менее, было бы слишком много весов. Но из-за неизменности перевода, фильтр, работающий хорошо в одной области, наиболее вероятно полезен в другой области. Поэтому мы используем один и тот же набор весов в 2D. Опять же, нет такой переводной инвариантности между каналами, поэтому там нет такого ограничения.
источник
Обратитесь к разделу «Локальное подключение» в http://cs231n.github.io/convolutional-networks/ и слайд 7-18.
Гиперпараметр «Receptive Field» фильтра определяется только высотой и шириной, поскольку глубина определяется глубиной предыдущего слоя.
Обратите внимание, что «Степень подключения по оси глубины всегда равна ГЛУБИНЕ входного объема» или ГЛУБИНА карты активации (в случае более поздних слоев).
Интуитивно, это должно быть связано с тем, что данные каналов изображения чередуются, а не плоско. Таким образом, применение фильтра может быть достигнуто просто путем умножения векторов столбцов.
ОБРАТИТЕ ВНИМАНИЕ, что Сверточная Сеть изучает все параметры фильтра (включая измерение глубины), и они составляют "h w input_layer_depth + 1 (bias)".
источник
Я рекомендую главу 2.2.1 моей магистерской диссертации в качестве ответа. Чтобы добавить к оставшимся ответам:
Керас твой друг, чтобы понять, что происходит:
дает
Попробуйте сформулировать ваши варианты. Что это будет означать для параметров, если что-то еще будет иметь место?
Подсказка:2400 = 32 ⋅ ( 3 ⋅ 5 ⋅ 5 )
Этот подход также помогает вам с другими типами слоев, а не только со сверточными слоями.
Также обратите внимание, что вы можете свободно внедрять различные решения, которые могут иметь другие параметры.
источник
Просто чтобы сделать две детали абсолютно ясными:
Скажи у тебя естьN 2D входные каналы собираются N 2D выходные каналы. Общее количество 2D3 × 3 Вес фильтра на самом деле N2 , Но как это влияет на трехмерную свертку, т. Е. Если каждый входной канал вносит один 2D-слой в каждый выходной канал, то каждый выходной канал изначально состоит изN 2D слои, как они объединены?
Как правило, это скрыто почти во всех публикациях, которые я видел, но ключевой концепцией являетсяN2 2D выходные каналы чередуются друг с другом, образуя N выходные каналы, такие как перетасованные колоды, перед суммированием. Это все логично, когда вы понимаете, что вдоль размеров канала свертки (что никогда не иллюстрируется) у вас фактически есть полностью связанный слой! Каждый входной 2D канал умножается на уникальный3 × 3 фильтр, дает вклад 2D выходного слоя в один выходной канал. После объединения каждый выходной слой является комбинацией каждого входного слоя× уникальный фильтр. Это все для всего вклада.
Самый простой способ убедить себя в этом - представить, что происходит в других сценариях, и увидеть, что вычисления становятся вырожденными, то есть, если вы не чередуете и не рекомбинируете результаты, тогда разные выходные данные фактически ничего не сделают - они будет иметь такой же эффект, как один выход с комбинированными весами.
источник
Для тех, кто пытается понять, как вычисляются свертки, вот полезный фрагмент кода в Pytorch:
Запуск этого дает следующий вывод:
Обратите внимание на то, как каждый канал свертки суммирует все выходные сигналы предыдущих каналов.
источник