Що означає згортання 1x1 у нейронній мережі?


106

Зараз я займаюся навчальним посібником з глибокого навчання Udacity. У уроці 3 вони говорять про згортку 1x1. Цей звіт 1х1 використовується в Inception модулі Google. У мене виникають проблеми з розумінням того, що таке згортка 1x1.

Я також бачив цю посаду Янна Лекуна.

Може хтось люб’язно мені це пояснить?


Також дивіться пов’язане питання
gkcn

1
Ось допис у блозі про ці модулі, який детально розібрався про згортання 1x1: hackathonprojects.wordpress.com/2016/09/25/…
Tommy

1
Простіше кажучи, вся ідея полягає в тому, щоб зменшити кількість каналів у тривимірному обсязі, таким чином прискоривши обчислення.
onerhao

Відповіді:


113

Припустимо, у мене є шар conv, який видає тензор у формі де:(N,F,H,W)

  • N - розмір партії
  • F - кількість згорткових фільтрів
  • H,W - просторові розміри

Припустимо, цей вихід подається в шар conv з фільтрами 1x1, нульовими накладками та кроком 1. Тоді вихід цього шару 1x1 conv матиме форму .F1(N,F1,H,W)

Таким чином, фільтри 1x1 conv можна використовувати для зміни розмірності у просторі фільтра. Якщо то ми збільшуємо розмірність, якщо - зменшуємо розмірність, у розмірі фільтра.F 1 < FF1>FF1<F

Дійсно, у статті Google Inception « Поглиблюючись із згортками» вони зазначають (жирний шрифт - це не мої оригінали)

Одна з великих проблем з вищезазначеними модулями, принаймні в цій наївній формі, полягає в тому, що навіть скромна кількість згортків 5x5 може бути надмірно дорогим поверх згорткового шару з великою кількістю фільтрів.

Це призводить до другої ідеї запропонованої архітектури: обґрунтовано застосовувати зменшення розмірів та проекції там, де обчислювальні вимоги занадто сильно збільшаться в іншому випадку. Це ґрунтується на успішності вбудовування: навіть низькомірні вбудовування можуть містити багато інформації про порівняно великий патч зображення ... 1x1 згортки використовуються для обчислення скорочень перед дорогими 3x3 та 5x5 згортками. Крім того, що вони використовуються як скорочення, вони також включають використання випрямленої лінійної активації, яка робить їх двоцільовим.

Отже, в архітектурі Inception ми використовуємо згорткові фільтри 1x1 для зменшення розмірності в розмірі фільтра. Як я пояснював вище, ці шари конвеєра 1x1 можна використовувати в цілому для зміни розмірності фільтрувального простору (або збільшувати, або зменшувати), і в архітектурі Inception ми бачимо, наскільки ефективними ці фільтри 1x1 можуть бути зменшення розмірності, явно в просторі розмірів фільтра , а не просторовий розмірний простір.

Можливо, є й інші інтерпретації фільтрів 1x1 conv, але я віддаю перевагу цьому поясненню, особливо в контексті архітектури Google Inception.


3
Хіба що конверт 1x1 стискає попередній розмір фільтра до 1, перш ніж реалізувати конв. 5x5?
Леонард Ло

1
@LeonardLoo кожне 1x1 ядро ​​зменшує розмір фільтра до 1, але ви можете мати кілька ядер за один 1x1 згортка, тому кількість "фільтрів" може бути довільною для вашого вибору.
Fazzolini

43

Свитка 1x1 просто відображає вхідний піксель з усіма його каналами на вихідний піксель, не дивлячись ні на що навколо. Його часто використовують для зменшення кількості каналів глибини, оскільки часто дуже повільно примножувати обсяги з надзвичайно великою глибиною.

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

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

Нижня - приблизно на 3.7x повільніше.

Теоретично нейронна мережа може "вибрати", які вводити "кольори", щоб подивитися, використовуючи це, замість того, щоб груба сила множила все.


19
Я б сказав, що 1x1 відображає не один піксель на вихідний піксель, але він згортає всі вхідні піксельні канали до одного пікселя. У вашому прикладі в першому рядку є 256 каналів для введення, і кожне з 64 1x1 ядер згортає всі 256 вхідних каналів лише на один "піксель" (реальне число). В результаті ви маєте 64 канали замість 256 з однаковим просторовим розміром, що робить згортку 4x4 обчислювально дешевшою, ніж у прикладі другого рядка.
Fazzolini

Добрий момент, оновимо пост :)
Безкоштовно 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

Основна причина, чому я не розумів 1x1 згортків, полягає в тому, що я не розумів, як реально спрацювали згортки - ключовим фактором є те, як працює обчислення згортки кількох каналів / фільтрів. Щоб зрозуміти це, я знайшов і цю відповідь корисною: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

Ось основні речі, які я з цього вийшов:

  • Вхід до згортки 1x1 - це зазвичай попередні згортки, які мають розмір x . Але якщо в останньому шарі згортків були фільтри , ви отримуєте матрицю . Свитка 1x1 - це фактично вектор розміром який складається по всьому зображенню, створюючи один x вихідний фільтр. Якщо у вас 1x1 згортки, то вихід усіх 1x1 згортків має розмір .mnf1(m,n,f1)f1mnf2(m,n,f2)
  • Таким чином, згортка 1x1, якщо вважати , може розглядатися як повторна подача фільтрів через фільтри . Це дозволяє мережевому тренуватися, як зменшити розмір найбільш ефективно.f2<f1f1f2

(m,n,f1)

3

Спробую пояснити більш інтуїтивно та коротко з ілюстраціями!

Конв 1 * 1 (він же мережа в мережі )?

скажімо, ви ввели значення (n_H, n_W, n_c_prev). Ви можете думати про (1 * 1 * n_c_prev) як єдиний нейрон (Повністю підключена мережа - тобто чому 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 (тобто кількості каналів), що економить багато обчислень. Наприклад

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

Тому забрати

  • Для зменшення n_C, але не n_H, n_W ви можете використовувати згортковий шар 1x1.

  • Ви можете використовувати шар об'єднання для зменшення n_H, n_W та n_C.

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

  • що ви робите за допомогою фільтра 1 * 1 CONV? ви в основному приймаєте вагу розміру "1 * 1 * num_input_channel_of_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 фільтрів:

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

Візьмемо для прикладу найменший лівий нейрон у fc8 з фільтром 1x1. Він з'єднується з усіма 4096 нейронами / ознаками лише в одному і тому ж сприйнятливому полі (лівий верхній кут зображення), кожен з яких активується однією особливістю. Деякі (давайте ж 500) з них дуже активні. Якщо отриманий нейрон також дуже активний, це означає, що він, ймовірно, навчився ідентифікувати 1 або більше ознак у цьому сприйнятливому полі. Після того, як ви зробили це 2048 разів для самих верхніх лівих нейронів у fc8, досить багато з них (наприклад, 250) будуть дуже активними, це означає, що вони "збирали" функції з того самого сприйнятливого поля через fc7, і багато, швидше за все, більше один.

Якщо ви продовжуєте зменшувати розмірність, все менша кількість нейронів буде вивчати все більшу кількість особливостей того самого сприйнятливого поля. Оскільки просторові параметри 8х8 залишаються однаковими, ми не змінюємо «погляд» кожного нейрона, таким чином, не зменшуємо просторову грубість.

Можливо, ви хочете подивитися "Повністю згорнуті мережі" Лонга, Шелгамера та Даррела.


1
Я думаю, що це ще одна гарна інтуїція механізму, але мені доведеться повернутися до нього, тому що я вважаю, що позначення розмірів є заплутаними, і особливо "Після того, як ви зробили це 2048 разів для лівих верхніх нейрони у fc8 ".
WillC

Я не дуже добре зрозумів, що ви намагаєтесь сказати, чи не могли б ви зробити це зрозумілішим?
Майкл Гейдельберг

0

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

v×v

Програми обробки зображень нейронних мереж, включаючи конволюційні нейронні мережі , були розглянуті в: [М. Егмонт-Петерсен, Д. де Райдер, Х. Гендельс. Обробка зображень нейронними мережами - огляд , розпізнавання візерунків , т. 35, № 10, с. 2279-2301, 2002].

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