畳み込みは、数学を大幅に複雑にする重み共有の原則を採用していますが、雑草を乗り越えようとします。私はこのソースから私の説明のほとんどを引き出しています。
フォワードパス
ご覧のように、畳み込み層のフォワードパスは次のように表現できます。
バツli 、j= ∑m∑nwlm 、nol − 1i + m 、j + n+ bli 、j
ここで、k1とk2はカーネルのサイズであり、k1= k2= 2です。これは、出力のために言うように、バツ0 、0= 0.25あなたが見つけました。mおよびnは、カーネルの次元全体で繰り返されます。
誤差逆伝播法
次のように定義された平均二乗誤差(MSE)を使用していると仮定します。
E= 12∑p(tp− yp)2、
私たちは決定したい
∂E∂wlm′、n′m′n′w10 、0= − 0.13HK
(H− k1+ 1 )(W− k2+ 1 )
44w10 、0= − 0.13バツ10 、0= 0.25
∂E∂wlm′、n′= ∑H− k1i = 0∑W− k2j = 0∂E∂バツli 、j∂バツli 、j∂wlm′、n′
これは、出力スペース全体にわたって繰り返され、出力が寄与しているエラーを決定し、次にその出力に関するカーネルの重みの寄与因子を決定します。
簡単にするため、および逆伝播されたエラーを追跡するために、出力スペースのデルタからエラーへの寄与を呼び出しましょう。
∂E∂バツli 、j= δli 、j
重みからの寄与
畳み込みは次のように定義されます
バツli 、j= ∑m∑nwlm 、nol − 1i + m 、j + n+ bli 、j
したがって、
∂バツli 、j∂wlm′、n′= ∂∂wlm′、n′(Σm∑nwlm 、nol − 1i + m 、j + n+ bli 、j)
m = m′n = n′
∂バツli 、j∂wlm′、n′= ol − 1i + m′、j + n′
その後、エラー用語に戻ります
∂E∂wlm′、n′= ∑H− k1i = 0∑W− k2j = 0δli 、jol − 1i + m′、j + n′
確率的勾配降下
w(t + 1 )= w(t )- η∂E∂wlm′、n′
それらのいくつかを計算しましょう
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]])
∂E∂w
派生にエラーがあるかどうかを教えてください。
更新:修正されたコード