Guided Grad-CAM
Deep Learningをしていると、CNNのモデルがどこを見ているのかが気になる。
それをヒートマップで可視化する技術がGrad-CAM。
(Gradは勾配、CAMはClass Activation Mapping)
それとは別にGuided Backpropなる似たような目的の手法がある。
それらのいいとこ取りをしてがっちゃんこしたのがGuided Grad-CAM。
以下に例示。
Grad-CAM
クラス単位の可視化
Guided Backprop
ピクセル単位の可視化
Guided Grad-CAM
クラス単位かつピクセル単位の可視化
1. デモンストレーションリンク
とりあえずGrad-CAMがどんなもんかは、以下のデモページで確認できる。
2. 医師と看護師の分類モデルにおける活用例
論文: https://arxiv.org/abs/1610.02391に載っていた例を示す。
医師と看護師を分類するモデルを作成し、Grad-CAMを用いてモデルがどこに着目しているのかを確認する。
以下は医師を看護師と間違えて判断したときのGrad-CAM画像。
医師を看護師と間違えてる | 看護師 |
---|---|
![]() |
![]() |
顔や髪型で判断しようとしている。一般的に看護師に女性の比率が高いので、女医を看護師と間違えたのだろう。
学習データの男女比などの隔たりをなくし、再度学習を行う。
医師 | 看護師 |
---|---|
![]() |
![]() |
判断する場所が先ほどと代わり、正しく判定できるようになった。
3. 実際に動かしてみる
Torchによるソースコードが公式にある。
https://github.com/ramprs/grad-cam/
が、PyTorchならまだしもTorchじゃさっぱりなので、Chainerに移植してくださった以下のソースを利用させてもらって解説する。
ChainerによるGrad-CAMの実装: https://github.com/tsurumeso/chainer-grad-cam/
1 |
|
3.1. サンプル実行
前提条件としてChainerはすでにインストール済みであること。
chainer-grad-camディレクトリに移動し、サンプルスクリプト(run.py)を実行する。
1 2 |
|
オプション | 説明 |
---|---|
--label | ImageNet1000のラベル値 (242はBoxer) |
--layer | Convolution層の指定 |
実行すると画像が出力される。
次にラベルに282(Tiger Cat)を指定して実行してみる。
1 |
|
すると以下の画像になる。
さっきは犬だったが、今度は猫に注目している。
4. AlexNetでGrad-CAM画像生成
デフォルトでVGG16になっている。が、AlexNetでも動かしてみる。
4.1. AlexNet用にサンプルコードを改造
1 2 |
|
↓
1 2 3 4 |
|
4.2. 実行
1 |
|
???
ゼロ除算が発生する!
以下を参考に修正。
chainer での Grad-CAM についてメモ: http://www.geocities.jp/kandou_quester/Knowledge/Programming/Python/_chainer_grad_cam.html
1 2 3 4 5 6 7 8 9 10 |
|
以上!