畳み込み層の定義

def conv2d(x, W)
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

畳み込み層を作成する関数を定義している。畳み込み層で行う処理は「畳み込み演算」である。 畳み込み演算は、画像処理で言うところの「フィルタ演算」に相当する。畳み込み演算の例をFigure 5.3に示す。

図 5.3: Convolution operation
\includegraphics[scale=0.9]{convolution.eps}

Figure 5.3に示すように、畳み込み演算は入力データに対して、フィルタを適用する。 この例では、入力データは縦・横形状を持つデータで、フィルタも同様に、縦・横方向の次元を持つ。この例では、入力サイズが$4\times 4$、フィルタサイズが$3\times 3$、出力サイズが$2\times 2$となる。 フィルタは、カーネルと呼ばれることもある。

Figure 5.3の畳み込み演算の例において、どのような計算が行われているかをFigure 5.4に示す。 畳み込み演算は、入力データに対して、フィルタのウィンドウを一定の間隔でスライドさせながら適用していく。 ここで言うウィンドウとは、Figure 5.4における灰色の$3\times 3$の部分を指す。 Figure 5.4に示すように、それぞれの場所でフィルタ要素と入力の対応する要素を乗算し、その和を求める(積和演算を呼ぶ場合もある)。 そして、その結果を出力の対応する場所に格納していく。このプロセスをすべての場所で行うことで、畳み込み演算の出力を得ることができる[5]。

図 5.4: Procedure of calculating convolution operation
\includegraphics[scale=0.9]{convolution2.eps}

第1引数は、入力データを示し、[データ数、入力データの高さ、入力データの幅、入力チャンネル数]の4次元で表される。 第2引数は、フィルタである。 第3引数は、ストライド(stride)であり、フィルタを適用する位置の間隔を示し、[1, 縦ストライド, 横ストライド, 1]の形で表す。配列の第0要素と第3要素は、1で固定する。 ここでは、ストライド$1\times 1$となっている。入力サイズが$7\times 7$のデータにストライド$2\times 2$を設定した場合の例をFigure 5.5に示す。 第4引数は、パディング(padding)であり、畳み込み層の処理を行う前に入力データの周囲に固定のデータを埋める処理のことである。入力サイズが$4\times 4$のデータに0パディングを適用した例をFigure 5.6に示す。

図 5.5: Stride 2
\includegraphics[scale=0.8]{stride22.eps}

図 5.6: Padding
\includegraphics[scale=0.8]{padding.eps}



Deguchi Lab. 2017年3月6日