ありまっくすのへっぽこ日記

アラフォーでへっぽこエンジニアをしております。へっぽこなりに頑張っています。

DeepLeaning講座(第2回)を受けてきたよ

 

4/20にDeepLearning講座の2回目を受けてきました。

今回のテーマはCNN(Convolutional Neural Network)の基礎。

 

CNNってなに?で、何ができるの?

CNNは「畳み込みニューラルネットワーク」とも呼ばれる、ニューラルネットワークです。画像認識(下の図を参照)や画像生成(CNNだけではできないけど)によく使われます。

※ 実際にはCNNを発展させた、ResNetが使われます。

 

f:id:ari_max:20180423073332p:plain

 

  • Classification + Localizetion :分類。四角で囲んで「ここに猫がいますよ」と切り出す。
  • Semantic Segmentation:場所も正確に切り出す。
  • Object Detection:四角で囲む分類を複数できる。
  • Instance Segmentation:複数のものを区別してきりだす。(一番難しい)

 

 なぜ、CNNをやるのかというと

  • 画像系が多い(DeepLearningの大半は画像系)
  • ResNetは他の分野でも使える
  • 畳み込みとプーリングを繰り返すアーキテクチャが優れている
  • 処理を並列化しやすく、GPUとの相性がいい。(GPUは畳み込みを高速化するためのもの)
  • パラメータ拘束ができる(過学習をしにくくする)

といった理由があるそうです。 

CNNの構成

CNNは以下のように畳み込みとプーリングを繰り返し、最後に全結合を行って出力します。

  1. 畳み込み (Convolution)
  2. プーリング (Pooling)
  3. 全結合層(Fully Connected Layer ,Dense)

図解したものが以下。畳み込みとプーリングは繰り返して、最後に全結合します。

f:id:ari_max:20180429101815p:plain

http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf

畳み込み

CNNでは一番重要な処理です。とはいえ、やっていることは「掛け算して、全部足す」という内積の計算だけです。

 

下の図のようにInputにFilterを重ね合わせます。(緑で囲んだ場所)そして、重なったマス同士を掛け算して足したものを出力します。

f:id:ari_max:20180428125816p:plain

FilterとInputが重なり合った場所を計算すると以下の図のようになり、足し合わせると4となります。

1 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 = 4

f:id:ari_max:20180428125349p:plain

上の計算をFilterをずらしながら繰り返していきます。ずらす幅を「ストライド」といい、ストライドを大きくすると出力も小さくなります。(普通は1のことが多い)

f:id:ari_max:20180428130116p:plain

フィルタによって検出するものも変わります。(下の図参照)つまり、フィルタをどうするかというのがCNNのキモなのです。フィルタはかつて人間が考えていたのですが、現在はバックプロパゲーションが最適なフィルタを作ってくれます。

f:id:ari_max:20180429015254p:plain

色を検出する場合、RGBで表現するためR・G・Bそれぞれの入力データがあります。フィルタもR・G・Bそれぞれで作成し、フィルタを重ね合わせて畳み込みを行います。重ね合わせたフィルタの数をチャネル数といい、入力とフィルタのチャネル数は合わせておく必要があります。畳み込みを行うとチャネル数は1になります。

f:id:ari_max:20180429084918p:plain


1つのフィルタから出力されるデータのチャネル数は1ですが、フィルタは複数使用するので、結果として「出力されるデータのチャネル数=フィルタ数」となります。

 

プーリング 

出力されたものを半分にする。プーリングにはいろいろな方法がありますが、Max Poolingを使うことが多いです。

下の図のように、同じ色で囲んだ部分の中で最大のものを出力とします。

f:id:ari_max:20180429105842p:plain

 あとは、畳み込みとプーリングを繰り返していきます。畳み込みを何回やるのか、どこにプーリングを入れるのですが、どうするのかは試行錯誤でした。しかし、VGGNetの登場によって指針ができました。指針は以下の通りです。

  • 何度か畳み込みをする
  • MaxPoolingをすると同時にフィルタを倍にする

f:id:ari_max:20180429115707p:plain

 

パディング

 畳み込みをするとデータが小さくなるので、繰り返し行うと出力サイズが1になってしまい、畳み込みができなくなってしまいます。そこで、畳み込みを行う前に入力データの周りに固定のデータを設定します。

f:id:ari_max:20180429121030p:plain

 

全結合層

畳み込みとプーリングを繰り返したあとはデータをバラバラにして(フラットにする)、ニューラルネットワークの処理をして出力を行います。

 

出力サイズの計算方法

出力サイズは以下の式で計算できます。

H’ = (H + 2P - F) / S + 1

W’ = (W + 2P - F) / S + 1

H’, W’: 出力サイズ

P: パディング(padding)

F:フィルタサイズ

S:ストライド(stride)