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:
xli,j=∑m∑nwlm,nol−1i+m,j+n+bli,j
k1k2k1=k2=2x0,0=0.25mn
Backpropagation
Olarak tanımlanan ortalama kare hatası (MSE) kullandığınızı varsayarsak
E=12∑p(tp−yp)2
belirlemek istiyoruz
∂E∂wlm′,n′m′n′w10,0=−0.13HK
(H−k1+1)(W−k2+1)
44w10,0=−0.13x10,0=0.25
∂E∂wlm′,n′=∑H−k1i=0∑W−k2j=0∂E∂xli,j∂xli,j∂wlm′,n′
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,
∂E∂xli,j=δli,j
Ağırlıkların katkısı
Evrişim şu şekilde tanımlanır:
xli,j=∑m∑nwlm,nol−1i+m,j+n+bli,j
Böylece,
∂xli,j∂wlm′,n′=∂∂wlm′,n′(∑m∑nwlm,nol−1i+m,j+n+bli,j)
m=m′n=n′
∂xli,j∂wlm′,n′=ol−1i+m′,j+n′
Sonra hata terimimize geri dönelim
∂E∂wlm′,n′=∑H−k1i=0∑W−k2j=0δli,jol−1i+m′,j+n′
Stokastik eğim inişi
w(t+1)=w(t)−η∂E∂wlm′,n′
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.∂E∂w
Türevde hatalar olup olmadığını lütfen bize bildirin.
Güncelleme: Düzeltilmiş kod