畳み込み層について その1

ディープラーニングを用いた画像認識の記事で「畳み込みネットワーク(CNN)」という単語をよく見かける。最近CNNを勉強してたのでメモ。
CNNでは「畳み込み層(Conv)」「プーリング層(Pool)」の2つの層がニューラルネットワークに登場する。

全結合のニューラルネットワークでは、データの形状を無視してしまう問題が実はある。形状に意味のあるデータに関してはそれを生かすことができない学習モデルを作成することになってしまう。
例えば入力データが画像の場合を考える。画像は基本、縦・横・チャンネル の3次元の形状を持っている。これを全結合層に渡すとき、3次元の形状を1次元の形状に直して渡す必要がある。(平らに直すとも考えられる)
入力画像が「チャンネル・縦・横」の順番で(1,28,28)の形状の時、一列に並べた 1x28x28 = 784個のデータに直して渡す。

tensorflowの公式ページにあるMNISTのチュートリアル(Beginner)の方でも、入力層が 1x28x28のx = tf.placeholder(tf.float32, [None, 784])と定義されている。

画像の形状には、大切な空間的情報が含まれていることが大半。例えば空間的に近いピクセルの値は似ていたり、RGBの各チャンネルの間には密接な関係性があったりなど。全結合層では形状を無視してしまう(一列に直してしまう)のでこれらの情報を生かすことができない。

畳み込み層は形状を維持する(入力データを3次元のデータとして受け取る)ニューラルネットワークの構築が可能となる。形状の情報を生かした画像認識などの学習モデルの作成ができる。

畳み込み層では「畳み込み演算」という処理を行う。画像処理では「フィルター演算」として有名らしい。全くわからん。。
f:id:Owatank:20170703181706p:plain
画像が荒っぽいが、フィルターの行列をカラフルな色で囲った入力の枠の行列と演算を行う。フィルターの行列を一定の間隔でスライドさせながら演算(適用)していく感じ。フィルターの各要素と入力の対応する要素の値同士を乗算し、和を求める。和の値を出力の対応する場所へ当てはめる。

CNNでは、フィルターのパラメータ、すなわち行列の値ニューラルネットワークでいう重みに相当する。

もちろんバイアスも存在して、 f:id:Owatank:20170703182556p:plain
フィルター適用後の行列の各要素に対してバイアスの値を加算する。

とりあえずここまで。