[ディープラーニング] CNN

畳み込みとニューラルネットワークの関係

画像に対してフィルタを適用し、特徴マップを計算する式をもう一度見てみましょう。

\[{u_{ij}} = \sum\limits_{p = 0}^{{H_f} – 1} {\sum\limits_{q = 0}^{{W_f} – 1} {{x_{i + p,j + q}}\;{w_{pq}}} } \]

フィルタが覆っている部分の画像の値 \(x_{i + p, j + q}\) を前の層のニューロンから受け取る入力、フィルタの各マス目の重み \({w_{pq}}\) をニューロン間の結合の重みと解釈します。
すると、フィルタの処理はニューラルネットワークにおいて、あるニューロンが受け取る入力を計算する式と見なすことができます。



なので、特徴マップ全体を生成するには、以下のニューラルネットワークで表せるでしょう。



このような処理を行う層を畳み込み層 (convolution layer) といいます。
畳み込み層が受け取るのは入力画像だけでなく、畳み込み層によって生成された特徴マップを入力として、さらに畳み込みを行うこともあります。以下で畳み込み層の入力といった場合は画像または特徴マップを指すものとします。

多チャンネルのフィルタ

今まで1チャンネルの入力に対する畳み込みを考えてきましたが、多チャンネルの入力である場合にも拡張できます。

入力がサイズ \(H_x \times W_x \times C_x\) の \(C_x\) チャンネルの場合、フィルタのサイズは \(H_f \times W_f \times C_f\) で \(C_f = C_x\) とした、チャンネル数と同じチャンネル数を持ったフィルタになります。

特徴マップの計算は、\(H_f * W_f * C_f\) のフィルタの重みと対応する入力の値を乗算して足し合わせて行うため、特徴マップは1チャンネルになります。

\[{u_{ij}} = \sum\limits_{p = 0}^{{H_f} – 1} {\sum\limits_{q = 0}^{{W_f} – 1} {\sum\limits_{r = 0}^{{C_f} – 1} {{x_{i + p,j + q,r}}\;{w_{pqr}}} } } \]



複数のフィルタ

フィルタを構成する重みによって、得られる特徴マップが異なります。
そのため、フィルタの個数を増やせば、1つの入力からいろいろな特徴が得られるようになります。

入力のチャンネル数にかかわらず、1枚のフィルタによる畳み込みの結果は1チャンネルの特徴マップになるので、\(M\) 個のフィルタをそれぞれ適用すれば、\(M\) 個の異なる特徴マップが得られます。
フィルタ数を \(M\) とした場合、\(m\) 個目の特徴マップの値は次のように計算できます。

\[{u_{ijm}} = \sum\limits_{p = 0}^{{H_f} – 1} {\sum\limits_{q = 0}^{{W_f} – 1} {\sum\limits_{r = 0}^{{C_f} – 1} {{x_{i + p,j + q,r}}\;{w_{pqrm}}} } } \]

畳み込み層の出力

入力にフィルタごとに異なるバイアスを加えます。

\[{u_{ijm}} = \sum\limits_{p = 0}^{{H_f} – 1} {\sum\limits_{q = 0}^{{W_f} – 1} {\sum\limits_{r = 0}^{{C_f} – 1} {{x_{i + p,j + q,r}}\;{w_{pqrm}} + {b_{ijm}}} } } \]

さらにその層の活性化関数を適用した値を畳み込み層の出力とします。

\[{z_{ijm}} = f({u_{ijm}})\]

畳み込み層の数式表現

第 \(l-1\) 層の出力を形状が \(H_z^{(l – 1)} \times W_z^{(l – 1)} \times C_z^{(l – 1)}\) である \({Z^{(l – 1)}}\) とします。この各要素は \(z_{ijk}^{(l – 1)}\) と参照します。



第 \(l\) 層の畳み込み層は、形状が \(H_f^{(l)} \times W_f^{(l)} \times C_f^{(l)}\) である \(M\) 個のフィルタを持つとします。



\(m\) 個目のフィルタの重みを \(W_m^{(l)}\) とし、各要素は \({w_{ijkm}}\) と参照します。
\(m\) 個目のフィルタのバイアスを \(b_m^{(l)}\) とし、各要素は \({{b_{ijm}}}\) と参照します。
以上より、畳み込み層に対する入力を次のように計算できます。

\[{u_{ijm}} = \sum\limits_{p = 0}^{{H_f} – 1} {\sum\limits_{q = 0}^{{W_f} – 1} {\sum\limits_{r = 0}^{{C_f} – 1} {{x_{i + p,j + q,r}}\;{w_{pqrm}} + {b_{ijm}}} } } \]

入力に対して、第 \(l\) 層の活性化関数 \({f^{(l)}}\) を適用します。

\(z_{ijm}^{(l)} = {f^{(l)}}(u_{ijm}^{(l)})\)

こうして、形状が \(H_z^{(l)} \times W_z^{(l)} \times C_z^{(l)}\) である出力 \({Z^{(l)}}\) が得られます。チャンネル数はフィルタの個数なので \(C_z^{(l)}=M\) となります。



処理全体は次のようになります。



全結合ニューラルネットワークとの違い

全結合のニューラルネットワークではある層のニューロンは前の層のすべてのニューロンと結合していました。
今回のニューラルネットワークは、前の層のニューロンの一部とのみ結合しています。
全結合に対して、これを疎結合という場合があります。

重み共有

全結合のニューラルネットワークではある層と前の層のニューロン同士の結合はすべて独立した重みを持っていました。
今回のネットワークでは、あるフィルタが計算する過程ですべて同じ重みが使用されます。



コメントを残す

メールアドレスが公開されることはありません。