зворотне розповсюдження в CNN


16

У мене є наступні CNN:

мережевий простір

  1. Почну з вхідного зображення розміром 5х5
  2. Тоді я застосовую згортку за допомогою ядра 2x2 і stride = 1, що створює карту характеристик розміром 4x4.
  3. Тоді я застосовую 2х2 макс-пулінг з кроком = 2, що зменшує мапу функції до розміру 2х2.
  4. Тоді я застосовую логістичну сигмоїду.
  5. Потім один повністю з’єднаний шар з 2 нейронами.
  6. І вихідний шар.

Для простоти, припустимо, що я вже завершив пропуск вперед і обчислив δH1 = 0,25 і δH2 = -0,15

Тож після повного переходу вперед і частково завершеного проходу назад моя мережа виглядає так:

мережа після прямого проходу

Тоді я обчислюю дельти для нелінійного шару (логістичної сигмоїди):

δ11=(0.250.61+0.150.02)0.58(10.58)=0.0364182δ12=(0.250.82+0.150.50)0.57(10.57)=0.068628δ21=(0.250.96+0.150.23)0.65(10.65)=0.04675125δ22=(0.251.00+0.150.17)0.55(10.55)=0.06818625

Потім я розповсюджую дельти на шар 4x4 і встановлюю всі значення, відфільтровані за допомогою максимального об'єднання до 0, а карта градієнта виглядає так:

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

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


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

Найкраще джерело - це книга з глибокого навчання - правда, не просто читати :). Перше згортання - це те саме, що розділити зображення в патчах, а потім застосувати звичайну нейронну мережу, де кожен піксель підключений до кількості "фільтрів", які мають вагу.
Рікардо Крус

1
По суті, ваше питання, як регулюється вага ядра за допомогою зворотного розповсюдження?
JahKnows

@JahKnows ..і як обчислюються градієнти для згорткового шару, враховуючи приклад, про який йдеться.
koryakinp

Чи є функція активації, пов’язана з вашими згортковими шарами?
JahKnows

Відповіді:


10

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


Вперед пропуск

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

xi,jl=mnwm,nloi+m,j+nl1+bi,jl

k1k2k1=k2=2x0,0=0.25mn

Зворотне поширення

Припустимо, що ви використовуєте середню квадратичну помилку (MSE), визначену як

E=12p(tpyp)2

ми хочемо визначити

Ewm,nlmnw0,01=0.13HK

(Hk1+1)(Wk2+1)

44w0,01=0.13x0,01=0.25

Ewm,nl=i=0Hk1j=0Wk2Exi,jlxi,jlwm,nl

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

Назвемо внесок у помилку з дельти вихідного простору для простоти та відслідковуємо помилку, що розповсюджується,

Exi,jl=δi,jl

Внесок від ваг

Згодження визначається як

xi,jl=mnwm,nloi+m,j+nl1+bi,jl

таким чином,

xi,jlwm,nl=wm,nl(mnwm,nloi+m,j+nl1+bi,jl)

m=mn=n

xi,jlwm,nl=oi+m,j+nl1

Потім повернемося до нашого помилки

Ewm,nl=i=0Hk1j=0Wk2δi,jloi+m,j+nl1

Стохастичний градієнтний спуск

w(t+1)=w(t)ηEwm,nl

Порахуємо деякі з них

import numpy as np
from scipy import signal
o = np.array([(0.51, 0.9, 0.88, 0.84, 0.05), 
              (0.4, 0.62, 0.22, 0.59, 0.1), 
              (0.11, 0.2, 0.74, 0.33, 0.14), 
              (0.47, 0.01, 0.85, 0.7, 0.09),
              (0.76, 0.19, 0.72, 0.17, 0.57)])
d = np.array([(0, 0, 0.0686, 0), 
              (0, 0.0364, 0, 0), 
              (0, 0.0467, 0, 0), 
              (0, 0, 0, -0.0681)])

gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')

масив ([[0,044606, 0,094061], [0,011262, 0,068288]])

Ew


Будь ласка, дайте мені знати, чи є помилки у виведенні.


Оновлення: виправлений код


Ewm,nl

1
gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')
Sun Bee

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