Как свертки 1x1 совпадают с полностью связным слоем?

55

Я недавно прочитал комментарий Яна ЛеКуна о свертках 1x1 :

В Сверточных Сетях не существует такого понятия, как «полностью связанные слои». Существуют только слои свертки с ядрами свертки 1x1 и полной таблицей соединений.

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

Я хотел бы увидеть простой пример для этого.

пример

Предположим, у вас есть полностью подключенная сеть. Он имеет только входной слой и выходной слой. Входной слой имеет 3 узла, выходной слой имеет 2 узла. Эта сеть имеет параметров. Чтобы сделать его еще более конкретным, допустим, у вас есть функция активации ReLU в выходном слое и матрице весов.32=6

W=(011235)R2×3b=(813)R2

Таким образом, сеть с .f(x)=ReLU(Wx+b)xR3

Как сверточный слой должен выглядеть одинаково? Что означает LeCun с «полной таблицей соединений»?

Я думаю, чтобы получить эквивалентный CNN, он должен иметь точно такое же количество параметров. MLP сверху имеет параметров.23+2=8

Мартин Тома
источник

Ответы:

29

Ваш пример

В вашем примере у нас есть 3 входных и 2 выходных блока. Чтобы применить свертки, подумайте о тех единицах, имеющих форму: [1,1,3]и [1,1,2], соответственно. В терминах CNN у нас есть 3входные и 2выходные карты объектов, каждая из которых имеет пространственные измерения 1 x 1.

Применение n x nсвертки к слою с kкартами объектов требует наличия ядра формы [n,n,k]. Следовательно, ядро ​​ваших 1x1извилин имеет форму [1, 1, 3]. Вам нужны 2эти ядра (или фильтры) для создания 2выходных карт характеристик. Обратите внимание: свертки на самом деле 1 × 1 × количество каналов входных сверток. Последний упоминается редко.1×11×1×number of channels of the input

Действительно, если вы выберете в качестве ядра и смещения:

w1=(011)R3w2=(235)R3b=(813)R2

Затем сверточный слой вычислит с . х R 3f(x)=ReLU((w1xw2x)+(b1b2))xR3

Преобразование в реальный код

Для примера из реальной жизни взгляните также на мою реализацию vgg-fcn . Код, представленный в этом файле, принимает веса VGG, но преобразует каждый полностью связанный слой в сверточные слои. Результирующая сеть дает тот же результат, что и vggпри применении к входному изображению формы [244,244,3]. (При применении обеих сетей без заполнения).

Преобразованные сверточные слои вводятся в функцию _fc_layer(строка 145). У них есть размер ядра 7x7для FC6 (который является максимальным, так как pool5VGG выводит карту объектов формы [7,7, 512]. Слои FC7и FC8реализованы в виде 1x1свертки.

«Таблица полного подключения»

Я не уверен на 100%, но он может ссылаться на фильтр / ядро, которое имеет то же измерение, что и карта входных объектов. В обоих случаях (код и ваш пример) пространственные измерения максимальны в том смысле, что пространственное измерение фильтра совпадает с пространственным измерением в качестве входных данных.

MarvMind
источник
«Следовательно, ядро ​​ваших сверток 1x1 имеет форму [1, 1, 3].». Какая? Кажется, есть большее недопонимание сверток. Я думал, что если ядро ​​свертки имеет форму [1, 1, 3], то можно сказать, что это свертка 1x1x3? То есть свертка 1x1 - это только вывод, а не ядро?
Мартин Тома
2
Для меня kernel = filterты согласен? >> "Так что свертка 1x1 касается только вывода, а не ядра? Совсем нет. 3x3Свертка может иметь произвольную форму вывода." Действительно, если используется заполнение, а stride=1затем - output shape = input shape. >> «Я думал, что если ядро ​​свертки имеет форму [1, 1, 3], то можно сказать, что это свертка 1x1x3?» Нет, я никогда не слышал, чтобы кто-то говорил о 3x3x512свертках. Однако все сверточные фильтры, которые я видел, имеют третье пространственное измерение, равное количеству карт характеристик входного слоя.
MarvMind
Для справки Convolution Demoознакомьтесь с курсом Karpathies CS321n: cs231n.github.io/convolutional-networks/#conv . Или в API-интерфейсе tennsflow: tennsflow.org/versions/r0.9/api_docs/python/nn.html#conv2d Фильтры должны иметь форму [filter_height, filter_width, in_channels, out_channels].
MarvMind
Могу ли я добавить к вашему ответу вещь с "1x1 сверток - это 1 x 1 x количество каналов ввода"? Это было источником моего замешательства, и я продолжаю забывать об этом.
Мартин Тома
Конечно, давай!
MarvMind
4

nnimnnm

nnim

nnim

nnim

( Источник )

Майкл Яхалом
источник
1
n=1
2

Эквивалентное ядро ​​просто имеет любую форму на входе и вычисляет произведение тензорной точки. (Я использую слово «форма», так как кажется, что существует некоторая путаница с «размером», которая часто игнорирует измерение канала / глубины). В этом нет никакого «скольжения ядра по входным данным», поскольку ядро ​​настолько велико, насколько это возможно. Цитировать Stanford CS 231n примечания к курсу :

любой слой FC может быть преобразован в слой CONV. Например, слой FC с K = 4096, который смотрит на некоторый входной объем размером 7 × 7 × 512, может быть эквивалентно выражен как слой CONV с F = 7, P = 0, S = 1, K = 4096, F = 7, p = 0, S = 1, К = 4096. Другими словами, мы устанавливаем размер фильтра равным размеру входного объема, и, следовательно, выходной сигнал будет просто 1 × 1 × 4096, поскольку только один столбец глубины «умещается» на входном объеме, давая такой же результат, как начальный слой ФК.

Я считаю, что «F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096» здесь означает, что каждое ядро ​​конвоя имеет форму 7x7x512, и таких фильтров 4096.

В предыдущем ответе упоминалось, что последний фк AlexNet (который получает входные данные в форме 1x1x4096 и вычисляет 1000 баллов за класс) реализован как "свертка 1x1". Чтобы быть завершенным, каждое такое ядро ​​имеет форму 1x1x4096, и их 1000.

Ле Канн также объясняет это в статье CNN , стр. 8, описание LeNet5:

Слой C5 - это сверточный слой с 120 картами объектов. Каждый блок подключен к району 5х5 на всех 16 картах характеристик S4. Здесь, поскольку размер S4 также составляет 5x5, размер карт функций C5 составляет 1x1; это составляет полную связь между S4 и C5.

Ибо Ян
источник
1

Любому новичку в PyTorch, как я , не путайте «полностью связанный слой» с «линейным слоем».

Линейный слой и свертки 1x1 - это одно и то же. Мне потребовалось некоторое время, чтобы понять, что не существует такого понятия, как «полностью связанный слой» - это просто сглаживание пространственных измерений в одномерный гигантский тензор. Выравнивание приводит к тому, что каждый элемент во всех пространственных местоположениях будет представлен как отдельная карта объектов / канал / измерение (как бы вы это ни называли). Следовательно, когда мы накладываем линейный слой на сплющенный тензор , мы получаем полностью связную операцию, которая, очевидно, не совпадает со сверткой 1x1.

1x1j=01X[j]W0[j]+b[0]j=01X[j]W1[j]+b[1]j=01X[j]W2[j]+b[2]

O=W2×3X3×1+b2×1

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

Ракшит Котари
источник