Що таке деконволюційні шари?


188

Нещодавно я прочитав « Цілком конволюційні мережі для семантичної сегментації » Джонатана Лонга, Евана Шелгамера, Тревора Даррелла. Я не розумію, що роблять "деконволюційні шари" / як вони працюють.

Відповідна частина -

3.3. Підвищення розміру - це згорнута назад реакція

Інший спосіб підключення грубих виходів до щільних пікселів - інтерполяція. Наприклад, проста білінеарна інтерполяція обчислює кожен вихід з найближчих чотирьох входів лінійною картою, яка залежить лише від відносних позицій вхідних і вихідних комірок. У певному сенсі збільшити вибір з коефіцієнтом - це згортання з дробовим вхідним кроком 1 / f. Поки є цілісним, природним способом підняти вибірку є тому зворотне згортання (іноді його називають деконволюцією) із вихідним кроком . Така операція є тривіальною для здійснення, оскільки вона просто обертає передні та зворотні проходи згортки. f f fyij
fff
Таким чином, надмірне моделювання виконується в мережі для повного вивчення шляхом зворотного розповсюдження від піксельної втрати.
Зауважте, що фільтр деконволюції в такому шарі не потрібно фіксувати (наприклад, для білінеарного перебору), але його можна вивчити. Склад шарів деконволюції та функцій активації навіть може навчитися нелінійному перебору.
У наших експериментах ми виявляємо, що оптимізація в мережі є швидкою та ефективною для вивчення щільного прогнозування. Наша найкраща архітектура сегментації використовує ці шари, щоб навчитися робити вибірку для уточненого прогнозування в Розділі 4.2.

Я не думаю, що я насправді зрозумів, як тренуються звивисті шари.

Я думаю, що я зрозумів, що конволюційні шари з розміром ядра вивчають фільтри розміром . Вихід згорткового шару з розміром ядра , stride та фільтрів має розмірність . Однак я не знаю, як працює навчання звивистих шарів. (Я розумію, як прості MLP навчаються з градієнтом, якщо це допомагає).k × k k s N n Вхідний димkk×kksNnInput dims2n

Тож якщо моє розуміння згорткових шарів правильне, я не маю поняття, як це можна змінити.

Чи не може хто-небудь допомогти мені зрозуміти деконволюційні шари?


3
Ця відео-лекція пояснює деконволюцію / upsampling: youtu.be/ByjaPdWXKJ4?t=16m59s
user199309

6
Сподіваючись, що це може бути корисним для кого-небудь, я створив зошит, щоб дослідити, як згортання та транспоновану згортання можна використовувати в TensorFlow (0,11). Можливо, наявність практичних прикладів та цифр може допомогти трохи зрозуміти, як вони працюють.
AkiRoss

1
Для мене ця сторінка дала мені краще пояснення також пояснює різницю між деконволюції і транспонувати згортку towardsdatascience.com / ...
T.Antoni

Хіба розгортання більше не схоже на зворотне об'єднання, ніж на крок назад, тому що воно не має параметрів?
Кен Фелінг

Примітка. Назва "деконволюційний шар" вводить в оману, оскільки цей шар не виконує деконволюцію .
користувач76284

Відповіді:


210

Деконволюційний шар - це дуже невдала назва, і його слід назвати перенесеним згортковим шаром .

Візуально для транспонованої згортки з першим кроком і без прокладки ми просто прокладаємо початковий вхід (сині записи) нулями (білі записи) (мал. 1).

Фігура 1

У випадку другого кроку та накладки, транспоноване згортання виглядатиме так (мал. 2):

Малюнок 2

Більше (чудових) візуалізацій згорткової арифметики ви можете знайти тут .


16
Просто для того, щоб переконатися, що я це зрозумів: "Деконволюція" - це приблизно те саме, що і згортка, але ви додаєте трохи прокладки? (Навколо зображення / коли s> 1 також навколо кожного пікселя)?
Мартін Тома

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

11
Чому на рисунку 1 ви кажете "без прокладки", якщо фактично введення є нульовим?
Stas S

8
До речі: це називається перенесеною згорткою зараз у TensorFlow: tensorflow.org/versions/r0.10/api_docs/python/…
Мартін Тома

9
Дякую за цю дуже інтуїтивну відповідь, але мене бентежить питання, чому другий - це «крок двох», він поводиться точно так, як перший, коли ядро ​​рухається.
Демонеж

49

Я думаю, що один із способів отримати інтуїцію дійсно базового рівня за згорткою - це те, що ви переміщуєте K-фільтри, які можна вважати трафаретами K, над вхідним зображенням і виробляти активації K - кожен із них представляє ступінь відповідності певному трафарету . Зворотною дією цього було б прийняти активацію K і розгорнути їх у преймінг операції згортання. Інтуїтивне пояснення зворотної операції, таким чином, приблизно, реконструкція зображення з урахуванням трафаретів (фільтрів) та активацій (ступінь відповідності для кожного трафарету), і тому на базовому інтуїтивному рівні ми хочемо підірвати кожну активацію маскою трафарету. і додайте їх.

Іншим способом підходу до розуміння deconv було б вивчити реалізацію рівня деконволюції в Caffe, див. Такі відповідні біти коду:

DeconvolutionLayer<Dtype>::Forward_gpu
ConvolutionLayer<Dtype>::Backward_gpu
CuDNNConvolutionLayer<Dtype>::Backward_gpu
BaseConvolutionLayer<Dtype>::backward_cpu_gemm

Ви можете бачити, що він реалізований в Caffe саме як backprop для звичайного прямого згорткового шару (для мене це було більш очевидним після того, як я порівняв реалізацію backprop в шарі conD cuDNN з ConvolutionLayer :: Backward_gpu, реалізований за допомогою GEMM). Отже, якщо ви працюєте над тим, як робиться зворотне розповсюдження для регулярного згортання, ви зрозумієте, що відбувається на рівні механічних обчислень. Те, як працює цей обчислення, відповідає інтуїції, описаній у першому пункті цього розмиття.

Однак я не знаю, як працює навчання звивистих шарів. (Я розумію, як прості MLP навчаються з градієнтом, якщо це допомагає).

Щоб відповісти на ваше інше запитання всередині вашого першого питання, існують дві основні відмінності між зворотним розповсюдженням MLP (повністю пов'язаний шар) та згортковими сітками:

1) вплив ваг локалізовано, тому спочатку з’ясуйте, як зробити задню частину, скажімо, фільтр 3x3, який складається з невеликої області 3x3 вхідного зображення, відображаючи в одній точці результативного зображення.

2) ваги згорткових фільтрів поділяються для просторової інваріантності. На практиці це означає, що при передачі вперед той же фільтр 3х3 з однаковими вагами перетягується через усе зображення з однаковими вагами для обчислення вперед, щоб отримати вихідне зображення (для цього конкретного фільтра). Що означає це для backprop, це те, що градієнти backprop для кожної точки вихідного зображення підсумовуються протягом усього діапазону, який ми перетягували цей фільтр під час прямого проходу. Зауважте, що також існують різні градієнти втрат wrt x, w та зміщення, оскільки dLoss / dx потрібно повторно розповсюджувати, а dLoss / dw - як ми оновлюємо ваги. w і зміщення є незалежними входами в обчислювальній DAG (немає попередніх входів), тому немає необхідності робити зворотні розмноження на них.

(my notation here assumes that convolution is y = x*w+b where '*' is the convolution operation)

7
Я думаю, що це найкраща відповідь на це питання.
kli_nlpr

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

1
Погодьтеся, прийнята відповідь нічого не пояснила. Це набагато краще.
BjornW

Дякую за велике пояснення. На даний момент я не можу зрозуміти, як правильно робити задню версію. Чи не могли б ви мені підказати про це?
Бастіан

33

Покрокова математика пояснює, як перенесення згортки робить 2-х кращих перемог із 3x3 фільтром та кроком 2:

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

Найпростіший фрагмент TensorFlow для перевірки математики:

import tensorflow as tf
import numpy as np

def test_conv2d_transpose():
    # input batch shape = (1, 2, 2, 1) -> (batch_size, height, width, channels) - 2x2x1 image in batch of 1
    x = tf.constant(np.array([[
        [[1], [2]], 
        [[3], [4]]
    ]]), tf.float32)

    # shape = (3, 3, 1, 1) -> (height, width, input_channels, output_channels) - 3x3x1 filter
    f = tf.constant(np.array([
        [[[1]], [[1]], [[1]]], 
        [[[1]], [[1]], [[1]]], 
        [[[1]], [[1]], [[1]]]
    ]), tf.float32)

    conv = tf.nn.conv2d_transpose(x, f, output_shape=(1, 4, 4, 1), strides=[1, 2, 2, 1], padding='SAME')

    with tf.Session() as session:
        result = session.run(conv)

    assert (np.array([[
        [[1.0], [1.0],  [3.0], [2.0]],
        [[1.0], [1.0],  [3.0], [2.0]],
        [[4.0], [4.0], [10.0], [6.0]],
        [[3.0], [3.0],  [7.0], [4.0]]]]) == result).all()

Я думаю, що ваш розрахунок тут неправильний. Проміжний вихід повинен бути 3+ 2 * 2 = 7, тоді для ядра 3x3 кінцевий вихід повинен бути 7-3 + 1 = 5x5
Алекс

Вибачте, @ Алекс, але я не розумію, чому проміжний вихід становить 7. Чи можете ви, будь ласка, детальніше розглянути?
Андрій

2
@andriys На зображенні, яке ви показали, чому обрізається кінцевий результат?
Джеймс Бонд

28

В примітки , які супроводжують Stanford CS класу CS231n : згорткові нейронні мережі для візуального розпізнавання, Андрій Karpathy , робить відмінну роботу по поясненню згортальних нейронних мереж.

Читання цього документу повинно дати вам грубі уявлення про:

  • Деконволюційні мережі Меттью Д. Зейлера, Діліпа Кришнана, Грехама Тейлора та Роб Фергюса, кафедри комп'ютерних наук, Інституту Куранта, Нью-Йоркського університету

Ці слайди чудово підходять для Деконволюційних мереж.


29
Чи можливо узагальнити зміст будь-якого з цих посилань у короткому абзаці? Посилання можуть бути корисними для подальших досліджень, але в ідеалі відповідь на обмін стеками повинна мати достатньо тексту для вирішення основного питання, не потрібно виходити з сайту.
Ніл Слейтер

Мені дуже шкода, але вміст цих сторінок занадто великий, щоб узагальнити його в короткому абзаці.
Азраель

12
Повне резюме не потрібно, лише заголовок - наприклад, "Деконволюційна нейронна мережа схожа на CNN, але підготовлена ​​таким чином, що функції будь-якого прихованого шару можна використовувати для реконструкції попереднього шару (і шляхом повторення через шари, зрештою, Вхід може бути реконструйований з виводу) Це дозволяє йому навчатись без нагляду, щоб вивчити загальні функції високого рівня в проблемній області - зазвичай обробка зображень "(зауважте, я навіть не впевнений, що це правильно, тому не пишу мою власна відповідь).
Ніл Слейтер

6
Хоча посилання хороші, короткий підсумок моделі вашими власними словами був би кращим.
SmallChess

11

Щойно знайшов чудову статтю з веб-сайту Theaon на цю тему [1]:

Необхідність транспонованих згортків, як правило, виникає з прагнення використовувати перетворення, що йде в зворотному напрямку звичайної згортки, [...] для проектування мап карти на простор більш високого розміру. [...], тобто, відображати від 4-мірного простору до 16-мірного простору, зберігаючи при цьому схему сполученості згортки.

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

Транспоновану операцію згортання можна розглядати як градієнт деякої згортки по відношенню до її вкладу, який, як правило, реалізує транспоновані згортки на практиці.

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

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

Image ---> convolution ---> Result

Result ---> transposed convolution ---> "originalish Image"

Іноді ви зберігаєте деякі значення на шляху згортання і повторно використовуєте цю інформацію під час "повернення":

Result ---> transposed convolution ---> Image

Це, мабуть, причина, чому його неправильно називають "деконволюцією". Однак це має щось спільне з матрицею, що переносить згортку (C ^ T), отже, більш відповідна назва "транспонована згортка".

Тож це має багато сенсу при розгляді витрат на обчислення. Ви б заплатили набагато більше за amazon gpus, якби не використали транспоновану згортку.

Тут уважно читайте та переглядайте анімації: http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html#no-zero-padding-unit-strides-transposed

Деякі інші відповідні читання:

Транспонування фільтра (або, загалом, гермітів або кон'югат транспозиції) фільтра - це просто відповідний фільтр [3]. Це з’ясовується шляхом обертання часом ядра та взяттям сполучених значень [2].

Я також новачок у цьому і буду вдячний за будь-які відгуки чи виправлення.

[1] http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html

[2] http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html#transposed-convolution-arithmetic

[3] https://en.wikipedia.org/wiki/Matched_filter


1
Ніт вибір, але посилання має бути: deeplearning.net/software/theano_versions/dev/tutorial/…
Герберт

1
Я думаю, що це найкраща відповідь !!!
kli_nlpr

10

Ми могли б використовувати PCA для аналогії.

При використанні conv прямий прохід повинен витягувати коефіцієнти основних компонентів із вхідного зображення, а зворотний прохід (який оновлює вхід) повинен використовувати (градієнт) коефіцієнти для відновлення нового вхідного зображення, щоб нове вхідне зображення має коефіцієнти ПК, які краще відповідають бажаним коефіцієнтам.

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

Пропуск вперед deconv робить саме обчислення градієнта conv, наведені в цій публікації: http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/

Ось чому в caffe реалізації deconv (див. Відповідь Андрія Покровського), передача передачі deconv вперед передає виклики backward_cpu_gemm (), а зворотний прохід викликає forward_cpu_gemm ().


6

Окрім відповіді Девіда Дао: Також можна думати навпаки. Замість того, щоб зосередитись на тому, які пікселі входу (низької роздільної здатності) використовуються для отримання єдиного вихідного пікселя, ви також можете зосередитись на тому, які окремі вхідні пікселі вносять до якої області вихідних пікселів.

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


5

Звити з точки зору DSP

Я трохи запізнююся на це, але все ж хотів би поділитися моєю точкою зору та своїми ідеями. Мій досвід - теоретична фізика та обробка цифрових сигналів. Зокрема, я вивчав вейвлет, і згортки майже в моєму хребті;)

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

Відмова від відповідальності

Мої пояснення будуть трохи хвилеподібними, а не математичними, щоб отримати основні моменти.


Визначення

xn={xn}n=={,x1,x0,x1,}

ynxn

(yx)n=k=ynkxk

q=(q0,q1,q2)x=(x0,x1,x2,x3)T

qx=(q1q000q2q1q000q2q1q000q2q1)(x0x1x2x3)

kN

kxn=xnk

kk1

kxn={xn/kn/kZ0otherwise

k=3

3{,x0,x1,x2,x3,x4,x5,x6,}={,x0,x3,x6,}
3{,x0,x1,x2,}={x0,0,0,x1,0,0,x2,0,0,}

k=2

2x=(x0x2)=(10000010)(x0x1x2x3)

і

2x=(x00x10)=(10000100)(x0x1)

k=kT


Поглиблені згортання за деталями

qx

  • kk(qx)
  • k(kq)x
  • kq(kx)

q(kx)=q(kTx)=(k(q)T)Tx

(q)q

q(kx)=(q1q000q2q1q000q2q1q000q2q1)(10000100)(x0x1)=(q1q200q0q1q200q0q1q200q0q1)T(10000010)T(x0x1)=((10000010)(q1q200q0q1q200q0q1q200q0q1))T(x0x1)=(k(q)T)Tx

Як бачимо, це перенесена операція, таким чином, назва.

Підключення до найближчого сусідського підсилювача

2(11)xq2(11)qxq=(q0q1q2)

(11)q=(q0q0+q1q1+q2q2),

тобто ми можемо замінити повторний підбірник з коефіцієнтом 2 і згортку з ядром розміром 3 на транспоновану згортку з розміром ядра 4. Ця транспонована згортання має ту саму "інтерполяційну здатність", але змогла б навчитися краще співставляти інтерполяції.


Висновки та заключні зауваження

Я сподіваюся, що я міг би трохи прояснити деякі звичаї, виявлені в глибокому навчанні, розділивши їх на основні операції.

Я тут не займався басейном. Але це лише нелінійний пробовідбірник, і його можна розглядати і в рамках цієї позначення.


Відмінна відповідь. Прийняття математичної / символічної точки зору часто прояснює речі. Чи правильно я вважаю, що термін "деконволюція" в цьому контексті суперечить існуючій термінології ?
користувач76284

Це насправді не сутичка, це просто не має сенсу. Деконволюція - це лише згортання з оператором вибірки. Термін деконволюція звучить так, ніби це була б якась форма зворотної операції. Говорити про зворотне тут має сенс лише в контексті матричних операцій. Помноження на обернену матрицю не на зворотну операцію згортання (подібно поділу на множення).
Андре Бергнер

zθx=zzθz=x

θz=xz=(θ)+x

Коротше кажучи, так званий "деконволюційний шар" ОП насправді не проводить деконволюцію. Це щось інше (те, що ви описали у своїй відповіді).
користувач76284

4

У мене було багато проблем з розумінням того, що саме сталося в роботі, поки я не натрапив на цю публікацію в блозі: http://warmspringwinds.github.io/tensorflow/tf-slim/2016/11/22/upsampling-and-image-segmentation -з-тензорфлоу-і-тф-тонкий /

Ось короткий підсумок того, як я розумію, що відбувається в 2 рази під час перегляду:

Інформація з паперу

  • Що таке побіжна вибірка?
    • "переборка з коефіцієнтом f - це згортання з дробовим вхідним кроком 1 / f"
    • → частково згорнуті згортки також відомі як перенесена згортка відповідно до, наприклад, http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html
  • Які параметри цієї згортки?
  • Чи ваги є фіксованими чи тренованими?
    • У статті зазначено, що "ми ініціалізуємо 2x перебіг у білінеарну інтерполяцію, але дозволяємо дізнатися параметри [...]".
    • Однак на відповідній сторінці github зазначено: "У наших оригінальних експериментах шари інтерполяції були ініціалізовані до білінеарних ядер, а потім вивчені. У подальших експериментах та в цій посилальній реалізації реалізація білінеарних ядер виправлена".
    • → нерухомі ваги

Простий приклад

  1. уявіть собі таке вхідне зображення:

Вхідне зображення

  1. Дробові згорнуті згортки працюють, вставляючи між цими значеннями коефіцієнт-1 = 2-1 = 1, а потім припускаючи крок = 1 згодом. Таким чином, ви отримуєте наступне 6х6 вкладене зображення

вкладене зображення

  1. Білінарний фільтр 4x4 виглядає приблизно так. Його значення вибираються такими, що використані ваги (= всі ваги не множуються із вставленим нулем) дорівнюють до 1. Його три унікальні значення - 0,56, 0,19 та 0,06. Більше того, центр фільтра за угодою відповідає пікселю в третьому ряду та третьому стовпці.

фільтр

  1. Застосування фільтра 4x4 на вкладеному зображенні (використовуючи padding = "той же самий" та stride = 1) дає наступне 6x6 збільшене зображення:

Невелике зображення

  1. Цей вид поглинання виконується для кожного каналу окремо (див. Рядок 59 на https://github.com/shelhamer/fcn.berkeleyvision.org/blob/master/surgery.py ). Врешті-решт, розгортання 2x є справді дуже простим розміром із використанням білінеарної інтерполяції та конвенцій про те, як поводитися з кордонами. Я вважаю, що 16-ти або 32-кратний показник працює приблизно так само.

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