はじめに
画像等を用いたDeepLearning で使われるConvolutional Neural Netwoek(=畳み込みNN=CNN)についてまとめておきます.
Linearでもいいので簡単なモデルを作ったことがある人なら実装部分は詰まらないと思います.ので,知識のお話をできればと思います.
DNNで出てこなかった部分としては,ConvolutionとPoolingです.
また,Convolution層で使えるGradCAMという便利な技術についても紹介します.
目次
1 畳み込み
CNNのメイン処理です.
今回は2次元の画像に対して考えていきます.
畳み込み処理には”フィルタ”を使います.下図の赤の部分が処理される画像,青の部分がフィルタです.
まずはこのフィルタを左上3*3の領域に対して掛け合わせた値をとります.
次に,一つ右にずらして同様の処理を行います.
次に,一つ右.その次は一段下…というように繰り返していきます.
で,これで何ができるの?ってことですが,特定の色,エッジ,などなどの画像のどこにどんな特徴があるのかを抽出するような役割を持っています.
例えば,”2”と書かれた画像に対して,どこに右肩上がりの情報があるのかをフィルタでやってみます.0,1で表現されているGrayScale画像とします.この時,右肩上がりのフィルタを用意して,これらに畳み込み処理を行うと,右の行列が出力されます.
画像の中で右肩上がりの線がある部分の値が大きくなって,その特徴がない部分の値は小さくなっています.
こういったフィルタをたくさん用意して,いろんな特徴をとってやるぜ!というのが畳み込み処理になります.
2 プーリング
プーリング処理とは,近傍ピクセルから代表や平均をとることによって,解像度を下げる処理です.これには以下のような効果があります.
3 GradCAM
GradCAMとは,AIがどこを見て判断しているのかを可視化する手法です.基本的にDeepLeaningはブラックボックスであり,何の特徴を見て機械が判断しているかは分かりません.
ですが,出力層からモデル中の最後のConv層までを誤差逆伝搬して勾配を計算することで,画像中のどの部分を注目しているのかを確認できます.
なんか学習上手くいかんな~って時にAIがどこを見てくれているのか確認したりできるのはありがたいですね.
Pytorchでの実装はGithub等に上がっているので,すぐ実行できます.
さいごに
随時追記予定です.
最近Kaggeleを始めたので,データ分析なども勉強してまとめたいな~と思っています