propagasi kembali di CNN

15

Saya memiliki CNN berikut:

tata letak jaringan

  1. Saya mulai dengan gambar input berukuran 5x5
  2. Kemudian saya menerapkan konvolusi menggunakan kernel 2x2 dan melangkah = 1, yang menghasilkan fitur peta ukuran 4x4.
  3. Lalu saya menerapkan 2x2 max-pooling dengan stride = 2, yang mengurangi fitur map menjadi ukuran 2x2.
  4. Kemudian saya menerapkan sigmoid logistik.
  5. Kemudian satu lapisan yang terhubung sepenuhnya dengan 2 neuron.
  6. Dan lapisan output.

Demi kesederhanaan, mari kita asumsikan saya telah menyelesaikan umpan maju dan dihitung δH1 = 0,25 dan δH2 = -0,15

Jadi setelah lulus maju penuh dan mundur sebagian selesai jaringan saya terlihat seperti ini:

jaringan setelah lulus maju

Kemudian saya menghitung delta untuk lapisan non-linear (logistic sigmoid):

δ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

Kemudian, saya menyebarkan delta ke layer 4x4 dan mengatur semua nilai yang disaring oleh max-pooling ke 0 dan gradient map terlihat seperti ini:

masukkan deskripsi gambar di sini

Bagaimana cara memperbarui bobot kernel dari sana? Dan jika jaringan saya memiliki lapisan konvolusional lain sebelum 5x5, nilai apa yang harus saya gunakan untuk memperbaruinya bobot kernel? Dan secara keseluruhan, apakah perhitungan saya benar?

koryakinp
sumber
Tolong jelaskan apa yang membingungkan Anda. Anda sudah tahu cara melakukan turunan maksimum (semuanya nol kecuali di mana nilainya maksimum). Jadi, mari kita lupakan max-pooling. Apakah masalah Anda berbelit-belit? Setiap patch konvolusi akan memiliki turunannya sendiri, ini adalah proses komputasi yang lambat.
Ricardo Cruz
Sumber terbaik adalah buku belajar yang dalam - diakui tidak mudah dibaca :). Konvolusi pertama adalah hal yang sama seperti membagi gambar dalam tambalan dan kemudian menerapkan jaringan saraf normal, di mana setiap piksel terhubung ke jumlah "filter" yang Anda miliki menggunakan bobot.
Ricardo Cruz
1
Apakah pertanyaan Anda pada dasarnya bagaimana bobot kernel disesuaikan dengan menggunakan backpropagation?
JahKnows
@ JonKnows ..dan bagaimana gradien dihitung untuk lapisan convolutional, diberikan contoh yang dimaksud.
koryakinp
Apakah ada fungsi aktivasi yang terkait dengan lapisan konvolusional Anda?
JahKnows

Jawaban:

9

Konvolusi menggunakan prinsip pembagian berat yang akan menyulitkan matematika secara signifikan tetapi mari kita coba untuk melewati gulma. Saya menarik sebagian besar penjelasan saya dari sumber ini .


Maju terus

Ketika Anda mengamati lintasan ke depan dari lapisan konvolusional dapat dinyatakan sebagai

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

di mana dalam kasus kami k1 dan k2 adalah ukuran kernel, dalam kasus kami k1=k2=2 . Jadi ini mengatakan untuk output x0,0=0.25 seperti yang Anda temukan. m dan n iterate melintasi dimensi kernel.

Backpropagation

Dengan asumsi Anda menggunakan mean squared error (MSE) yang didefinisikan sebagai

E=12p(tpyp)2,

kami ingin menentukan

Ewm,nl untuk memperbarui bobot. mdannadalah indeks dalam matriks kernel yang tidak dapat dikacaukan dengan iteratornya. Misalnyaw0,01=0.13 dalam contoh kita. Kita juga dapat melihat bahwa untuk gambar inputH xK dimensi output setelah lapisan konvolusional

(Hk1+1) x (Wk2+1) .

44w0,01=0.13x0,01=0.25

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

Ini mengulangi seluruh ruang output, menentukan kesalahan bahwa output berkontribusi dan kemudian menentukan faktor kontribusi bobot kernel sehubungan dengan output itu.

Mari kita sebut kontribusi kesalahan dari delta ruang output untuk kesederhanaan dan untuk melacak kesalahan backpropagated,

Exi,jl=δi,jl

Kontribusi dari bobot

Konvolusi didefinisikan sebagai

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

jadi,

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

m=mn=n

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

Then back in our error term

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

Stochastic gradient descent

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

Let's calculate some of them

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')

array([[ 0.044606, 0.094061], [ 0.011262, 0.068288]])

Now you can put that into the SGD equation in place of Ew.


Please let me know if theres errors in the derivation.


Update: Corrected code

JahKnows
sumber
How Ewm,nl will look like in case my filter has multiple channels ?
koryakinp
1
gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')
Sun Bee
I would like suggest to review this answer. In particular, the provided code in python might be checked
Duloren