【DeepLearning】CNN超入門

こんにちは。

DeepLearningの記事に少しずつ挑戦しようと思います。初心者ゆえに勉強しながらアウトプットしていきます。今日はCNNについて記事にします。

CNN概要

CNN(Convolutional Neural Networks)とは畳み込みニューラルネットワークの事ですが、コンピュータビジョンの有力なモデルとして長年使われています。なぜ多く使われているかというと、主に以下2つの利点を持っているからです。

  • 移動不変性
  • 合成性

1つ目の「移動不変性」とは検知対象が入力データのどこにあっても検知することができる事です。回転・拡大縮小にはちょっと弱いみたいですが。2つ目の「合成性」とは低レベルの機能から高レベルの機能を構築できる事です。ピクセルからエッジを作成し、エッジからシェイプを作成し、シェイプから複雑なオブジェクトを作成できます。

どういう事なのかもう少し見ていきます。

CNNは畳み込み層(Convolution)プーリング層(Pooling)全結合層(fully-connected)から構成されており、畳み込み層で「合成性」、プーリング層で「移動不変性」を実現しています。これらの層を組み合わせることによって、画像から特徴マップを抽出する働きを担っています。そして、全結合層にて特徴マップに基づいた分類をしていきます。

では各レイヤーで何をしているか、詳細をみていきます。

CNN構成要素

畳み込み層(Convolution)

CNNの中心的な構成要素が畳み込み層(Convolution)です。畳み込みとは画像上にカーネル(フィルタ)と呼ばれる小領域を使って、これを1つの特徴マップとして圧縮する事です。畳み込みは数学では合成積と言われてます。合成積については後程2次元でお話したいと思います。Width(幅)とHeight(高さ)とDepth(深さ)の3次元を入力して3次元を出力するイメージは以下のような図になります。

出力値のサイズを制御する主要なパラメーターをご紹介します。

  • 深さ(フィルターの数)
  • カーネルサイズ(フィルターのサイズ)
  • ストライド(フィルターをずらしていく際の距離)
  • ゼロパディング(特徴マップの周辺を特定の値で埋めること)

深さとは、畳み込み層のニューロンの数となります。ここでいうニューロンは、特徴マップと考えることができます。例えばフィルター6つで畳み込みを行った場合、 エッジやブロブ、カラーなどの特徴マップを6つ獲得する事が出来ます。

深さ(フィルターの数)=1とすると以下図のように畳み込みされます。

合成積で計算すると、赤枠部分は以下のように計算されます。
$ \hspace{8pt}(0\times1) + (0\times1) + (0\times1) $
$ + (0\times-1) + (1\times-1) + (4\times1) $
$ + (0\times1) + (3\times1) + (2\times0) $
$ =6 $

画像の横×縦のサイズをW1×H1,深さ(チャンネル)をD1とします。例えばグレースケールの画像であればD1=1,カラー画像であればRGBの3枚でD1=3となります。また、フィルターの数:K、カーネルサイズ:F、ストライド:S、ゼロパディング:Pとします。その場合、出力ボリュームは以下で計算できます。
$W2= ((W1-F+2P)/S)+1$
$H2= ((H1-F+2P)/S)+1$
$D2= K$

プーリング層(Pooling)

CNNアーキテクチャでは、畳み込み層の間にプーリング層を入れるのが一般的です。プーリング層は、入力ボリューム(幅と高さ)を徐々に小さくしていきます。これにより、ネットワーク内のパラメータや計算量を減らすことができます。では具体的にどうやって小さくしていくのでしょうか。その仕組みは非常に単純です。正方領域内から1つの画素値を求め、ストライドする数分ずらしていきます。プーリングには平均値プーリング(Average pooling)と最大値プーリング(Max pooling)などがありますが、一般的に最大値プーリングが使用されます。

下の画像の例は正方形領域サイズが2×2、ストライド2のフィルターを使用しました。

全結合層(fully-connected)

全結合層では、コンパクト化された特徴マップが、ニューラルネットワークが認識しようとしているモノを表すニューロンに全て繋がっています。もしもdog、cat、birdを認識しようとしていれば、出力ノードは3つとなります。全結合層の役割は特徴マップに投票することです。ある特徴マップに含まれる特徴が多ければ多いほど、その特徴マップに対する投票数は多くなります。そのため、最終的には、「dog(0.95)」「cat(0.04)」「bird(0.01)」などの確率で表示されます。

ここでCNN超入門を終わります。

mami
自分で記事にするとやはり理解はすごく深まりますね。けど、、この記事大変でした。画像を用意するのが。こちらのサイトにすごく助けられました。CNNアーキテクチャ図を書きたい時におすすめです。
http://alexlenail.me/NN-SVG/index.html

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)