Як 1x1 згортки збігаються з повністю пов'язаним шаром?


55

Нещодавно я читав коментар Ян Лекунса про 1x1 згортки :

У конволюційних мережах немає такого поняття, як "повністю пов'язані шари". Існують лише шари згортки з 1x1 ядрами згортки та повною таблицею з'єднань.

Це надто рідко зрозумілий факт, що ConvNets не потребує введення фіксованого розміру. Ви можете навчити їх на входах, які можуть створювати один вихідний вектор (без просторової міри), а потім застосувати їх до більших зображень. Замість одного вихідного вектора ви отримуєте просторову карту вихідних векторів. Кожен вектор бачить вікна введення в різних місцях на вході. У цьому сценарії "повністю пов'язані шари" дійсно виступають як 1x1 згортки.

Я хотів би побачити простий приклад для цього.

Приклад

Припустимо, у вас повністю підключена мережа. Він має лише вхідний і вихідний шар. Вхідний шар має 3 вузли, вихідний шар - 2 вузли. Ця мережа має 32=6 параметрів. Щоб зробити це ще більш конкретним, скажімо, у вас є функція активації ReLU у вихідному шарі та ваговій матриці

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

f(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%, але він може посилатися на фільтр / ядро, яке має той же розмір, що і карта функції введення. В обох випадках (Код та Ваш Приклад) просторові розміри є максимальними в тому сенсі, що просторовий розмір фільтра такий же, як і вхідний.


"Отже, ядро ​​вас 1х1 згортків має форму [1, 1, 3].". " Що? Здається, є більше нерозуміння згортків. Я думав, що якщо ядро ​​згортки має форму [1, 1, 3], то можна сказати, що це згортання 1x1x3? Отже, згортання 1x1 стосується лише виводу, а не ядра?
Мартін Тома

2
Для мене kernel = filter, ти згоден? >> "Отже, згортання 1x1 - це лише про вихід, а не про ядро? Зовсім не. 3x3Згорта може мати довільну форму виводу. Дійсно, якщо використовується padding, stride=1то і output shape = input shape. >> "Я думав, що якщо ядро ​​згортки має форму [1, 1, 3], то можна сказати, що це згортання 1x1x3?" Ні, я ніколи не чула, щоб хтось говорив про 3x3x512згортки. Однак усі фільтри згортки, які я бачив, мають третій просторовий вимір, що дорівнює кількості карт-характеристик вхідного шару.
MarvMind

Для ознайомлення Convolution Demoознайомтеся з курсом Карпат CS321n: cs231n.github.io/convolutional-networks/#conv . Або в API tensorflow: tensorflow.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


2

Еквівалентне ядро ​​просто має будь-яку форму введення і обчислює добуток тензорних точок. (Я використовую слово "форма", оскільки, здається, є певна плутанина щодо "розміру", який часто ігнорує розмір каналу / глибини). Ніякого "ковзання ядра по вводу" не бере участь, оскільки ядро ​​настільки велике. Цитуючи примітки курсу Stanford CS 231n :

будь-який шар FC може бути перетворений у шар CONV. Наприклад, шар FC з K = 4096, який дивиться на деякий вхідний об'єм розміром 7 × 7 × 512, може бути еквівалентно виражений у вигляді шару CONV з F = 7, P = 0, S = 1, K = 4096, F = 7, Р = 0, S = 1, K = 4096. Іншими словами, ми встановлюємо розмір фільтра точно таким чином, як розмір вхідного об'єму, а значить, вихід буде просто 1 × 1 × 4096, оскільки лише один стовпчик глибини «підходить» по вхідному об'єму, даючи однаковий результат, як початковий шар ФК.

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

У попередній відповіді зазначалося, що останній fc AlexNet (який отримує вхід з формою 1x1x4096 і обчислює 1000 балів класу) реалізований як "згортання 1x1". Для завершення кожне таке ядро ​​conv має форму 1х1х4096, і їх 1000.

Le Cunn також пояснює це у статті CNN , сторінка 8, опис LeNet5:

Шар C5 - це звивистий шар із 120 карт. Кожен блок підключений до мікрорайону 5x5 на всіх 16 картах функцій S4. Оскільки розмір S4 також 5x5, розмір функціональних карт C5 становить 1х1; це означає повний зв'язок між S4 та C5.


1

Будь-якому новому користувачеві PyTorch, як я, - не плутати "повністю пов'язаний шар" з "лінійним шаром".

Лінійний шар і 1х1 згортки - це одне і те ж. Мені знадобилося деякий час, щоб зрозуміти, що не існує такого поняття, як "повністю пов'язаний шар" - це просто вирівнювання просторових розмірів в 1D-гігантський тензор. Вирівнювання змушує кожен елемент у всіх просторових місцях представлятись окремою картою / каналом / виміром функції (як би ви цього не хотіли назвати). Отже, коли ми наносимо лінійний шар на сплющений тензор , ми отримуємо повністю пов'язану операцію, яка, очевидно, не є збігом 1x1 згортки.

1x1j=01Х[j]W0[j]+б[0]j=01Х[j]W1[j]+б[1]j=01Х[j]W2[j]+б[2]

О=W2×3Х3×1+б2×1

Інші відповіді, які стверджують, що повністю пов'язаний шар - це просто дійсний nxn рівень згортки для введення розміру, nxnє заплутаним (хоча і правильним).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.