はじめに
こちらは「ゼロつく3DeepLearning_cp5」の記事の続きです。
「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」についてのまとめを数回に分けて行いたいと思います。
YOUTUBEでのおすすめチャンネルは以下の通り
何をまとめるのか
さて、このまとめではpythonのコードを動かしたり、何か実装するということは行いません。
ちなみに、書籍のソースコードはこちらにまとめられています。
なので1章はとばし、2章からのスタートになります。
そして6章も学習実装時のテクニックなので飛ばします。
今回は7章をまとめます。
引き続き個人的に重要だと思うポイントを記載したいと思います。
7章 畳み込みニューラルネットワーク
畳み込みニューラルネットワークはConvolutional neural network、通称CNNと呼ばれ、画像や音声認識などでよく使われます。
CNNのメカニズムについて詳しく説明します。
CNNは、畳み込み層とプーリング層で構成されます。

畳み込み層
畳み込み層で行う処理は、「畳み込み演算」です。畳み込み演算の例を見てみましょう。

掛け算を⊛で表します。
パディング
入力データの周囲に固定のデータ(例えば0など)を埋めることがあります。これをパディングと言って、畳み込み演算ではよく用いられます。
例えば幅1のパディングとは、周囲を幅1ピクセルの0で埋めることを言います。

なぜパディングを行うかというと、畳み込み演算を何度も繰り返して行うと、最終的に出力が1になってしまい、それ以上の畳み込み演算を適応できなくなる可能性があります。
それを回避するには、パディングを利用します。先の例では、パディングの幅を1に設定すれば、入力サイズの(4,4)に対して、出力のサイズも(4,4)のままのサイズが保たれて次の層に渡すことができます。
ストライド
フィルターを適用する位置の間隔をストライドと言います。
今までの例はストライド1でした。つまり、1個ずつフィルターをずらすというやり方です。
例えばストライドを2に設定すると、2個ずつフィルターをずらして計算します。
3次元の畳み込み演算
これまで見てきた畳み込み演算の例は、縦方向と横方向の2次元の形状を対象としました。しかし、画像の場合は奥行きの方向も考える必要があります。奥行きの方向をチャンネル方向と呼びます。
チャンネル方向に複数の特徴マップがある場合、チャンネルごとに入力データとフィルターの畳み込み演算を行い、それらの結果を加算してひとつの出力を得ます。

バッチ処理
ニューラルネットワークの処理では、バッチ処理を行いました。畳み込みニューラルネットワークでも同じようにバッチ処理に対応したいと思います。
そのために各層を流れるデータは4次元のデータとして格納します。具体的には、(batch_num, channel, height, width)という順にデータを格納するものとします。

プーリング層
プーリングは、畳み込みが終わった層に対して、縦・横方向の空間を小さくする演算です。

上記の図は最大(max)プーリングといい、対象となる領域「2×2」に対して最大となる要素を取り出します。
プーリング層の特徴として、位置がある程度変化しても値が変化しないということが挙げられます。
そのため、学習データに対してより特徴量が大きいものはそのまま出力され、画像の特徴を少ない空間で表現することができます。