めるぱんブログ

とある医大生の勉強の記録です

PythonとKerasによるディープラーニング 第5章④


第5章の最後はデータの可視化についてです。

 

前回犬と猫の画像を分類するのに学習させたモデルの中間層を可視化していきます。

まずテスト画像を前処理し、表示してみます。

f:id:melpan:20200425113301p:plain

テスト画像

続いてモデルの入力に対して各層の活性化をひとつづつ返していくモデルを作ります。個々の部分は正直よくわからなかったのですが、Modelというクラスを使用すると複数の出力を得られるみたいです。

このモデルを使ってチャネルの活性化を見てみるとこんな風になります。

f:id:melpan:20200425114208p:plain

最初の層の30番目のチャネル

入力された画像がこんな風に処理されているんですねー!

すべての層の各活性化を見ていくとこんな風になります。

f:id:melpan:20200425114551p:plain

1層目

f:id:melpan:20200425114644p:plain

2層目

f:id:melpan:20200425114617p:plain

3層目

f:id:melpan:20200425114726p:plain

4層目

これを見ると最初の層と最後の層では全然違うように見えますね。これはどうやら最初の層は様々なエッジを検出するようになっているのに対して層が深くなるほど抽象的な解釈をするようになるみたいです。またからの部分が出ているのは今回入力された画像がその部分に該当する部分が検出されなかったという意味らしいです。

 

続いて行ったのがVGG16を用いたフィルタの可視化なんですが、これが全くうまくいかなかったのでまた後日勉強しなおしてみます。というのも出力されてくる画像が真っ白になって何も出てこないんですよね…

 

というわけで最後にヒートマップを使って可視化するという方法をやってみます。今回はVGG16の全結合分類器も含めすべてそのまま使っていきます。

f:id:melpan:20200425120855j:plain

アフリカゾウのテスト画像

この画像を前処理し、一度VGG16を通してみると

Predicted [('n02504458', 'African_elephant', 0.90942144), ('n01871265', 'tusker', 0.08618243), ('n02504013', 'Indian_elephant', 0.0043545677)]

と帰ってきます。

これはアフリカゾウの画像である確率が90.9%だということを表しています。

また、

np.argmax(preds[0])

で386と返ってくるのはインデックス386がアフリカゾウに対応しているためです。

この入力に対して最後の畳み込み層を可視化し、ヒートマップを作成すると以下のようになります。

f:id:melpan:20200425121428p:plain

アフリカゾウクラスの活性化ヒートマップ

これをもとの画像に重ねると

f:id:melpan:20200425121548j:plain

元の画像にスーパーインポーズ

こんな感じになります。

このヒートマップを作れるのはすごく便利だなーと感じました。

もう誰かがとっくにやっているかもしれませんが、これを患者に対して適用したら診察の時にどの部分に気を付けるべきかとかもわかってきてりするんではないでしょうか。

夢が広がりますね!!