Что означает свертка 1x1 в нейронной сети?


106

В настоящее время я занимаюсь учебником по углубленному изучению Udacity. В уроке 3 они говорят о свертке 1x1. Эта свертка 1x1 используется в начальном модуле Google. У меня проблемы с пониманием, что такое свертка 1x1.

Я также видел этот пост от Янн Лекун.

Может ли кто-нибудь любезно объяснить это мне?


Также см. Связанный вопрос
gkcn

1
Вот сообщение в блоге об этих модулях, в котором подробно рассказывается о свертках 1x1: hackathonprojects.wordpress.com/2016/09/25/…
Томми

1
Проще говоря, вся идея состоит в том, чтобы уменьшить количество каналов в трехмерном объеме, тем самым ускоряя вычисления.
onerhao

Ответы:


113

Предположим, что у меня есть извилистый слой, который выводит тензор в форме где:(N,F,ЧАС,W)

  • - размер партииN
  • - число сверточных фильтровF
  • - пространственные размерыЧАС,W

Предположим, что этот выходной сигнал подается в сверточный слой с фильтрами 1x1, заполнением нулями и шагом 1. Затем выходной сигнал этого слоя сверток 1x1 будет иметь форму ( N , F 1 , H , W ) .F1(N,F1,ЧАС,W)

Таким образом, фильтры 1x1 могут использоваться для изменения размерности в пространстве фильтров. Если то мы увеличиваем размерность, если F 1 < F, мы уменьшаем размерность в измерении фильтра.F1>FF1<F

В самом деле, в статье Google Inception Going Deeper with Convolutions говорится (жирным шрифтом является мой, а не авторы оригинала):

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

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

Таким образом, в начальной архитектуре мы используем сверточные фильтры 1x1, чтобы уменьшить размерность в измерении фильтра. Как я объяснил выше, эти слои 1x1 conv могут использоваться в общем случае для изменения размерности пространства фильтра (увеличения или уменьшения), и в архитектуре Inception мы видим, насколько эффективными могут быть эти фильтры 1x1 для уменьшения размерности, явно в пространстве измерений фильтра. , а не пространство пространственного измерения.

Возможно, существуют другие интерпретации конв-фильтров 1x1, но я предпочитаю это объяснение, особенно в контексте архитектуры Google Inception.


3
Является ли, что конв 1х1 сжимает предыдущее измерение фильтра до 1, прежде чем реализовать конв 5х5?
Леонард Лоо

1
@LeonardLoo каждое ядро ​​1x1 уменьшает размер фильтра до 1, но вы можете иметь несколько ядер в одной свертке 1x1, поэтому количество «фильтров» может быть произвольным по вашему выбору.
Фаззолини

43

Свертка 1x1 просто отображает входной пиксель со всеми его каналами в выходной пиксель, не смотря ни на что вокруг. Он часто используется для уменьшения количества каналов глубины, так как часто очень медленно умножать объемы с чрезвычайно большой глубиной.

input (256 depth) -> 1x1 convolution (64 depth) -> 4x4 convolution (256 depth)

input (256 depth) -> 4x4 convolution (256 depth)

Нижняя примерно на 3,7 раза медленнее.

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


19
Я бы сказал, что 1x1 отображает не только один пиксель в выходной пиксель, но он объединяет все каналы входных пикселей в один пиксель. В вашем примере в первой строке 256 входных каналов, и каждое из 64 ядер 1x1 объединяет все 256 входных каналов в один «пиксель» (действительное число). В результате у вас теперь 64 канала вместо 256 с одинаковым пространственным измерением, что делает вычислительную свертку 4х4 дешевле в вычислительном отношении, чем в вашем примере со второй линией.
Фаззолини

Хороший вопрос, буду обновлять пост :)
Free Debreuil

3
Откуда вы получили в 3,7 раза медленнее?
CMCDragonkai

@CMCDragonkai Предположим, что стоимость вычислений пропорциональна количеству весов. В последнем случае num_weights = in_depth x out_depth x kernel_size = 256x256x4x4. В первом случае num_weights = 256x64x1x1+64x265x4x4=256x64x17. Возьмите коэффициент, и это даст 256/17 ~ 3,7. Проверьте эту бумажную страницу 9 для визуализации того, как числовые веса связаны с глубиной ввода и глубиной вывода. arxiv.org/pdf/1603.07285.pdf
Нельсон Динь

11

aNY

https://datascience.stackexchange.com/questions/9175/how-do-subsequent-convolution-layers-work

В частности, тип 2.2 является правильным описанием свертки там.

Еще один полезный ответ:

https://ai.stackexchange.com/questions/5769/in-a-cnn-does-each-new-filter-have-different-weights-for-each-input-channel-or

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

Вот видео, которое я нашел, которое помогло мне понять, как работает свертка 1x1.

https://www.coursera.org/lecture/convolutional-neural-networks/networks-in-networks-and-1x1-convolutions-ZTb8x

Вот основные вещи, которые я получил от этого:

  • мNе1(м,N,е1)е1мNе2(м,N,е2)
  • е2<е1е1е2

(м,N,е1)

3

Я постараюсь объяснить более интуитивно и вкратце с иллюстрациями!

Конв 1 * 1 (он же сеть в сети )?

скажем, вы вводите (n_H, n_W, n_c_prev). Вы можете думать о (1 * 1 * n_c_prev) как об одном нейроне (полностью подключенная сеть, т.е. почему N / w в N / w ), который принимает (n_c_prev) числа на входе, умножая их на (1 * 1 * n_c_prev) ), а затем добавление и затем получение ReLu & output (n_H, n_W), и если у вас есть несколько фильтров (n_c), то вывод будет (n_H, n_W, n_C).

Таким образом, вы можете использовать уровень пула для уменьшения пространственных измерений (n_H, n_W) и использовать 1 * 1 conv для уменьшения n_c_prev (то есть количества каналов), что экономит много вычислений. Например

введите описание изображения здесь

Поэтому забрать

  • Вы можете использовать сверточный слой 1x1, чтобы уменьшить n_C, но не n_H, n_W.

  • Вы можете использовать уровень пула для уменьшения n_H, n_W и n_C.

Другими словами, введите описание изображения здесь

  • что вы делаете, используя 1 * 1 фильтр CONV? вы в основном берете весы размера "1 * 1 * num_input_channel_of_featureMap" и сворачиваете (поэлементно * сопровождаемый +) этот том поверх image / featureMap размера "W H num_input_channel_of_featureMap", и в результате получается выход размера "W * H".

  • Теперь вы можете использовать номер "#filters" такого типа "1 * 1 * num_input_channel_of_featureMap" и получить том "W H #filter" в качестве конечного результата!

  • Более точно, вы умножаете «1 * 1» на такие 32 различных веса (1 * 1 объем) на один срез в той же позиции на карте входных объектов, за которым следует ReLu, и получаете одно соответствующее сгенерированное число, которое выглядит как пиксель зеленого цвета !

  • 1 * 1 CONV помогает сократить количество каналов и сэкономить на вычислениях в некоторых сетях (ИСКЛЮЧЕНИЯ).!

  • Но, конечно, если вы хотите, чтобы количество каналов было таким же, как у входной карты объектов, это тоже хорошо, единственное, что делает 1 * 1 CONV, это просто применяет к нему нелинейность ReLU, которая позволяет ему изучать сложные функции в NN .


1

Еще одна идея об уменьшении размерности в контексте фильтров 1x1:

Возьмите, например, слой 4096x8x8 fc7 из FCN. Что произойдет, если следующий слой (назовите его fc8) будет 2048x8x8 с размером фильтра 1? fc7 очень глубоко внутри сети, каждая из 4096 функций семантически богата, но каждый нейрон (например, входное изображение 250x250x3) имеет большое восприимчивое поле. Другими словами, если нейрон очень активен, мы знаем, что где-то в его семантическом поле присутствует соответствующая особенность.

Возьмем, к примеру, левый верхний нейрон в fc8 с фильтром 1x1. Он подключается ко всем 4096 нейронам / объектам только в одном и том же рецептивном поле (верхний левый угол изображения), каждый из которых активируется одной функцией. Некоторые (давайте же 500) из них очень активны. Если полученный нейрон также очень активен, это означает, что он, вероятно, научился идентифицировать 1 или более признаков в этой области восприятия. После того, как вы проделали это 2048 раз для самых верхних левых нейронов в fc8, довольно многие из них (например, 250) будут очень активными, что означает, что они «собирали» элементы из одного и того же рецептивного поля через fc7, и многие из них, вероятно, более один.

Если вы продолжите уменьшать размерность, то уменьшающееся число нейронов будет учить все большее число функций из одной и той же рецептивной области. И поскольку пространственные параметры 8x8 остаются неизменными, мы не меняем «вид» каждого нейрона, таким образом, не уменьшаем пространственную грубость.

Возможно, вы захотите взглянуть на «Полностью сверточные сети» Лонга, Шелхамера и Дарреля.


1
Я думаю, что это еще одна хорошая интуиция механизма, но мне придется вернуться к нему, потому что я считаю, что обозначения для измерений сбивают с толку, и особенно «После того, как вы сделали это 2048 раз для самого левого верхнего» нейроны в ФК8 ".
WillC

Я не очень хорошо понял, что вы пытаетесь сказать, не могли бы вы прояснить это?
Майкл Гейдельберг

0

Математическая операция свертки означает вычисление произведения двух (непрерывных или дискретных) функций по всем возможным положениям сдвига.

v×v

Приложения обработки изображений нейронных сетей, включая сверточные нейронные сети , были рассмотрены в: [M. Эгмонт-Петерсен, Д. де Риддер, Х. Гендельс. Обработка изображений с помощью нейронных сетей - обзор , Pattern Recognition , Vol. 35, No. 10, pp. 2279-2301, 2002].

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.