CNNの逆伝播


14

次のCNNがあります。

ネットワークレイアー

  1. サイズ5x5の入力画像から始めます
  2. 次に、2x2カーネルとストライド= 1を使用して畳み込みを適用し、サイズ4x4の機能マップを作成します。
  3. 次に、ストライド= 2の2x2最大プーリングを適用します。これにより、機能マップがサイズ2x2に縮小されます。
  4. 次に、ロジスティックシグモイドを適用します。
  5. 次に、2つのニューロンを持つ1つの完全に接続されたレイヤー。
  6. そして出力層。

簡単にするために、フォワードパスを既に完了し、δH1= 0.25δH2= -0.15を計算したと 仮定します。

したがって、完全なフォワードパスと部分的に完了したバックワードパスの後、ネットワークは次のようになります。

フォワードパス後のネットワーク

次に、非線形層(ロジスティックシグモイド)のデルタを計算します。

δ11=0.250.61+0.150.020.5810.58=0.0364182δ12=0.250.82+0.150.500.5710.57=0.068628δ21=0.250.96+0.150.230.6510.65=0.04675125δ22=0.251.00+0.150.170.5510.55=0.06818625

次に、デルタを4x4レイヤーに伝播し、max-poolingによってフィルター処理されたすべての値を0に設定します。勾配マップは次のようになります。

ここに画像の説明を入力してください

そこからカーネルの重みを更新するにはどうすればよいですか?また、ネットワークに5x5より前の別の畳み込み層がある場合、カーネルの重みを更新するためにどの値を使用する必要がありますか?そして全体的に、私の計算は正しいですか?


混乱の原因を明確にしてください。最大値の微分を行う方法は既に知っています(値が最大値の場合を除き、すべてゼロです)。したがって、最大プーリングを忘れましょう。畳み込みに問題がありますか?各コンボリューションパッチには独自の導関数があり、計算プロセスが遅くなります。
リカルドクルーズ

最良の情報源は深層学習の本です -確かに読みやすいものではありません:)。最初の畳み込みは、画像をパッチに分割し、通常のニューラルネットワークを適用するのと同じです。各ピクセルは、重みを使用して「フィルター」の数に接続されます。
リカルドクルス

1
本質的には、バックプロパゲーションを使用してカーネルの重みをどのように調整するのですか?
-JahKnows

@JahKnows ..および問題の例を考えて、畳み込み層の勾配の計算方法。
コリアキンプ

畳み込み層に関連付けられたアクティベーション関数はありますか?
-JahKnows

回答:


8

畳み込みは、数学を大幅に複雑にする重み共有の原則を採用していますが、雑草を乗り越えようとします。私はこのソースから私の説明のほとんどを引き出しています


フォワードパス

ご覧のように、畳み込み層のフォワードパスは次のように表現できます。

バツjl=mnwmnlo+mj+nl1+bjl

ここで、k1k2はカーネルのサイズであり、k1=k2=2です。これは、出力のために言うように、バツ00=0.25あなたが見つけました。mおよびnは、カーネルの次元全体で繰り返されます。

誤差逆伝播法

次のように定義された平均二乗誤差(MSE)を使用していると仮定します。

E=12ptpyp2

私たちは決定したい

Ewmnlmnw001=0.13HK

Hk1+1Wk2+1

44w001=0.13バツ001=0.25

Ewmnl==0Hk1j=0Wk2Eバツjlバツjlwmnl

これは、出力スペース全体にわたって繰り返され、出力が寄与しているエラーを決定し、次にその出力に関するカーネルの重みの寄与因子を決定します。

簡単にするため、および逆伝播されたエラーを追跡するために、出力スペースのデルタからエラーへの寄与を呼び出しましょう。

Eバツjl=δjl

重みからの寄与

畳み込みは次のように定義されます

バツjl=mnwmnlo+mj+nl1+bjl

したがって、

バツjlwmnl=wmnlmnwmnlo+mj+nl1+bjl

m=mn=n

バツjlwmnl=o+mj+nl1

その後、エラー用語に戻ります

Ewmnl==0Hk1j=0Wk2δjlo+mj+nl1

確率的勾配降下

wt+1=wtηEwmnl

それらのいくつかを計算しましょう

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


派生にエラーがあるかどうかを教えてください。


更新:修正されたコード


Ewmnl

1
gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')
日ビー

この回答を確認することをお勧めします。具体的には、Pythonで提供されるコードは、チェックされてもよい
Duloren
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.