CNN'de geri yayılım


16

Aşağıdaki CNN var:

ağ düzeni

  1. 5x5 büyüklüğünde bir giriş görüntüsü ile başlıyorum
  2. Sonra 4x2 boyutunda özellik haritası üreten 2x2 çekirdeği ve adım = 1 kullanarak evrişim uyguluyorum.
  3. Sonra özellik haritasını 2x2 boyutuna küçülten stride = 2 ile 2x2 max-pooling uygularım.
  4. Sonra lojistik sigmoid uyguluyorum.
  5. Sonra 2 nöron ile tamamen bağlı bir katman.
  6. Ve bir çıktı katmanı.

Basitlik adına, ileri geçişi zaten tamamladığımı ve δH1 = 0.25 ve δH2 = -0.15 hesapladığımı varsayalım.

Böylece, tam ileri geçiş ve kısmen geri geçişten sonra ağım şöyle görünür:

ileri geçişten sonra ağ

Sonra doğrusal olmayan katman (lojistik sigmoid) için deltaları hesaplıyorum:

δ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

Daha sonra, deltaları 4x4 katmanına yayarım ve maksimum havuzlama ile filtrelenen tüm değerleri 0'a ayarlayın ve degrade haritası şöyle görünür:

resim açıklamasını buraya girin

Oradan çekirdek ağırlıklarını nasıl güncelleyebilirim? Ağımın 5x5'ten önce başka bir evrişim katmanı varsa, çekirdek ağırlıklarını güncellemek için hangi değerleri kullanmalıyım? Genel olarak, hesaplamam doğru mu?


Lütfen sizi neyin karıştırdığını netleştirin. Zaten maksimumun türevini nasıl yapacağınızı biliyorsunuz (değerin maksimum olduğu yerler hariç her şey sıfırdır). Yani, maksimum havuzlamayı unutalım. Sorununuz evrişimde mi? Her evrişim yamasının kendi türevleri olacaktır, bu yavaş bir hesaplama sürecidir.
Ricardo Cruz

En iyi kaynak derin öğrenme kitabı - kuşkusuz kolay bir okuma değil :). İlk evrişim, görüntüyü yamalara bölmek ve daha sonra normal bir sinir ağı uygulamakla aynı şeydir, burada her piksel bir ağırlık kullandığınız "filtre" sayısına bağlanır.
Ricardo Cruz

1
Sorunuz özünde çekirdek ağırlıkları backpagagation kullanılarak nasıl ayarlanıyor?
JahKnows

@JahKnows .. ve söz konusu örnek göz önüne alındığında, gradyanların evrişimsel katman için nasıl hesaplandığı.
koryakinp

Evrişimsel katmanlarınızla ilişkili bir aktivasyon fonksiyonu var mı?
JahKnows

Yanıtlar:


10

Bir evrişim, matematiği önemli ölçüde zorlaştıracak ancak yabani otlardan geçmeye çalışacak bir ağırlık paylaşım prensibi kullanır. Açıklamamın çoğunu bu kaynaktan çekiyorum .


Doğrudan geçiş

Gördüğünüz gibi evrişimsel katın ileri geçişi şu şekilde ifade edilebilir:

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

k1k2k1=k2=2x0,0=0.25mn

Backpropagation

Olarak tanımlanan ortalama kare hatası (MSE) kullandığınızı varsayarsak

E=12p(tpyp)2

belirlemek istiyoruz

Ewm,nlmnw0,01=0.13HK

(Hk1+1)(Wk2+1)

44w0,01=0.13x0,01=0.25

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

Bu, tüm çıktı alanı boyunca yinelenir, çıktının katkıda bulunduğu hatayı belirler ve sonra bu çıktıya göre çekirdek ağırlığının katkı faktörünü belirler.

Basitlik ve geri çoğaltılan hatayı takip etmek için çıktı alanı deltasındaki hataya katkıyı çağıralım,

Exi,jl=δi,jl

Ağırlıkların katkısı

Evrişim şu şekilde tanımlanır:

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

Böylece,

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

m=mn=n

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

Sonra hata terimimize geri dönelim

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

Stokastik eğim inişi

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

Bazılarını hesaplayalım

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

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

Şimdi bunu yerine SGD denklemine koyabilirsiniz.Ew


Türevde hatalar olup olmadığını lütfen bize bildirin.


Güncelleme: Düzeltilmiş kod


Ewm,nl

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

Bu yanıtı gözden geçirmenizi öneririm. Özellikle,
python'da
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.