DeepLeaning講座(第2回)を受けてきたよ
4/20にDeepLearning講座の2回目を受けてきました。
今回のテーマはCNN(Convolutional Neural Network)の基礎。
CNNってなに?で、何ができるの?
CNNは「畳み込みニューラルネットワーク」とも呼ばれる、ニューラルネットワークです。画像認識(下の図を参照)や画像生成(CNNだけではできないけど)によく使われます。
※ 実際にはCNNを発展させた、ResNetが使われます。
- Classification + Localizetion :分類。四角で囲んで「ここに猫がいますよ」と切り出す。
- Semantic Segmentation:場所も正確に切り出す。
- Object Detection:四角で囲む分類を複数できる。
- Instance Segmentation:複数のものを区別してきりだす。(一番難しい)
なぜ、CNNをやるのかというと
- 画像系が多い(DeepLearningの大半は画像系)
- ResNetは他の分野でも使える
- 畳み込みとプーリングを繰り返すアーキテクチャが優れている
- 処理を並列化しやすく、GPUとの相性がいい。(GPUは畳み込みを高速化するためのもの)
- パラメータ拘束ができる(過学習をしにくくする)
といった理由があるそうです。
CNNの構成
CNNは以下のように畳み込みとプーリングを繰り返し、最後に全結合を行って出力します。
- 畳み込み (Convolution)
- プーリング (Pooling)
- 全結合層(Fully Connected Layer ,Dense)
図解したものが以下。畳み込みとプーリングは繰り返して、最後に全結合します。
畳み込み
CNNでは一番重要な処理です。とはいえ、やっていることは「掛け算して、全部足す」という内積の計算だけです。
下の図のようにInputにFilterを重ね合わせます。(緑で囲んだ場所)そして、重なったマス同士を掛け算して足したものを出力します。
FilterとInputが重なり合った場所を計算すると以下の図のようになり、足し合わせると4となります。
1 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 = 4
上の計算をFilterをずらしながら繰り返していきます。ずらす幅を「ストライド」といい、ストライドを大きくすると出力も小さくなります。(普通は1のことが多い)
フィルタによって検出するものも変わります。(下の図参照)つまり、フィルタをどうするかというのがCNNのキモなのです。フィルタはかつて人間が考えていたのですが、現在はバックプロパゲーションが最適なフィルタを作ってくれます。
色を検出する場合、RGBで表現するためR・G・Bそれぞれの入力データがあります。フィルタもR・G・Bそれぞれで作成し、フィルタを重ね合わせて畳み込みを行います。重ね合わせたフィルタの数をチャネル数といい、入力とフィルタのチャネル数は合わせておく必要があります。畳み込みを行うとチャネル数は1になります。
1つのフィルタから出力されるデータのチャネル数は1ですが、フィルタは複数使用するので、結果として「出力されるデータのチャネル数=フィルタ数」となります。
プーリング
出力されたものを半分にする。プーリングにはいろいろな方法がありますが、Max Poolingを使うことが多いです。
下の図のように、同じ色で囲んだ部分の中で最大のものを出力とします。
あとは、畳み込みとプーリングを繰り返していきます。畳み込みを何回やるのか、どこにプーリングを入れるのですが、どうするのかは試行錯誤でした。しかし、VGGNetの登場によって指針ができました。指針は以下の通りです。
- 何度か畳み込みをする
- MaxPoolingをすると同時にフィルタを倍にする
パディング
畳み込みをするとデータが小さくなるので、繰り返し行うと出力サイズが1になってしまい、畳み込みができなくなってしまいます。そこで、畳み込みを行う前に入力データの周りに固定のデータを設定します。
全結合層
畳み込みとプーリングを繰り返したあとはデータをバラバラにして(フラットにする)、ニューラルネットワークの処理をして出力を行います。
出力サイズの計算方法
出力サイズは以下の式で計算できます。
H’ = (H + 2P - F) / S + 1
W’ = (W + 2P - F) / S + 1
H’, W’: 出力サイズ
P: パディング(padding)
F:フィルタサイズ
S:ストライド(stride)