InceptionV3ネットワークが学習した物体の概念をlucidを利用して可視化してみた（アブスト編）

![Montage.png](https://qiita-image-store.s3.amazonaws.com/0/156483/2a479079-2ffb-9a0e-8bcf-201cfece3977.png)
美しいは正義

ニューラルネットワークが学習した概念を理解するための手法の１つとして、内部ニューロンの出力を最大化させる画像を生成する方法があります。様々なフレームワークでの実装が見受けられますが、ベースとなる理論は共通しています。それでもなお、最適化の手法（+learning rate）や正則化の種類などの取り入れ方で、生成される画像は全く様相が異なってきます。

近年google brain teamが公開した論文（総説とカテゴライズしてよいのでしょうか）の中で、種々の手法を効果的に組み合わせることでかくも美しい画像を生成することに成功しています。しかしながら、その時点では自分が知る限りソースコードを開示していませんでした。
![スクリーンショット 2018-03-22 18.22.22.png](https://qiita-image-store.s3.amazonaws.com/0/156483/84fe81de-a138-fdbd-0c2d-395112ec94a6.png)
[feature visualization techniques](https://distill.pub/2017/feature-visualization/)

自分でなんとかするしかないのか、、、と思っていたら、最近出された下記の論文と併せてついにgithubにて可視化ライブラリlucidが公開されました。
[The Building Blocks of Interpretability](https://distill.pub/2018/building-blocks/)
[lucid](https://github.com/tensorflow/lucid)

最適化手法を柔軟に設定することができる一方、ネットワークなどはGoogleNetとしてハードコードされています。inceptionモジュールの数だけ遊ぶ余地はたくさんあります。よく理解していないのですが、google上で遊べるcolabという形でも提供していますので、pcリソースがなくても大丈夫そうです。[lucid tutorial](https://colab.research.google.com/github/tensorflow/lucid/blob/master/notebooks/tutorial.ipynb)　ローカルで使いたい人はlucidとtensorflowをpipで入れて使ってみてください。詳細はgithubのチュートリアル参照。（GPUないとしんどいです）。

しかしながら、自分はkerasユーザー。kerasで作成したモデルをtensorflowベースのlucidでなんとか使えないかといじっていました。時間がかかったのですが、最近ようやく動かすことができました。自前のモデルを適用させることが最終目標なのですが、今回は予備実験兼ねて学習済みinceptionv3を使ってみることにしました。

<B>概要</B>
kerasでimagenet学習済InceptionV3モデルを読み込み→protobuf形式としてグラフと重みを保存→lucidのコードと連携するように自前ネットワークを読み込むクラスを作成→各層の可視化

今回はいくつかの層での生成結果の一部を紹介したいと思います（コードの詳細は後日）。protobufを用意できればどのようなネットワークでもlucidに持っていけるのでフレームワーク非依存になってとても良いと思います。

##conv2d_1
![0006.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/298b5ae5-0457-86dc-18f3-02f506d5bd87.jpeg)　![0010.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/712bc797-26fb-8b3b-5f98-1e1788ae4885.jpeg)　![0012.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/a1c50811-d0c3-7fec-8dfa-2286c2177b48.jpeg)
CNNの最初は単純な特徴抽出に始まると言われていますが、確かにそうですね。色情報の抽出が中心として行われていると推測されます。
##conv2d_2 conv2d_3 conv2d_4
省略
##conv2d_5
![0000.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/55ed2ec3-3278-d981-7aad-a3ffd7f9bf02.jpeg)　![0019.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/1916b901-7290-f59f-9174-bbae7681f70e.jpeg)　![0031.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/ed64a746-bb1e-2f4f-cd94-5d281b14fade.jpeg)
パターンの抽出が始まっています。
##mixed0
![0043.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/924abfb3-93fc-b1b3-ed44-9f39f2fb5f7c.jpeg)　![0213.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/d63ab89b-347b-66c5-8fce-8f22928326e6.jpeg)　![0114.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/ba01a070-99a6-75d2-e730-eb9babbd7bf3.jpeg)
複数のパターンの組み合わせが見られます。
##mixed1~mixed4
省略
##mixed5
![0070.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/5d5d94aa-dab8-8ff3-2e5a-f802784ab248.jpeg)　![0359.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/3b70e1dc-0ef6-039d-4ac4-57e45e234a6e.jpeg)　![0077.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/f911090a-d4c2-7baa-bd29-0ede5830e56f.jpeg)

物体のパーツらしきものが見え始めます。左の画像は犬か狐（それともアヒル？）の鼻先で、右は目でしょうか。

##mixed6-mixed9
省略

##mixed10
![0291.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/76069989-b782-40b7-42c4-9f95c817de5a.jpeg)　![0886.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/a0ebbd6e-ef34-534f-ef18-47ec7fb28612.jpeg)　![1057.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/1292f3d0-0778-0758-3cee-2a231c1ce973.jpeg)
ここまで来るとよくわかりません。もとの論文でも、
>You may still identify specific subjects, but will usually need a combination of diversity and dataset examples to do so. Neurons do not seem to correspond to particularly meaningful semantic ideas anymore.
[feature visualization techniques](https://distill.pub/2017/feature-visualization/)

といわれているように、深い層ではニューロンが複雑化しすぎて人間にとってよくわからない状態になると言われています。

さて、上記論文では行われていませんが、最終層の全結合層（imagenetなのでニューロンは1000個）のSoftmax活性化関数前の状態を利用することで特定のラベルっぽくなるような画像も生成することができます。みてみましょう。

###最終層（Relu前）
![0130.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/64db4f2f-c04f-f870-fdff-6cc62d8a5e21.jpeg)　![0113.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/806bc015-843f-5220-87e6-2342b6f1b63b.jpeg)　![0111.jpg](https://qiita-image-store.s3.amazonaws.com/0/156483/ea0d6506-779d-c031-5941-a3ba71fba893.jpeg)
左からフラミンゴ、カタツムリ、線虫

なんて微妙なラベルのチョイスなんだという感じですが、１０００ラベルの生成がまだ終わっていないのと、そもそも生成してもラベルを想起させることのできる画像がなかなか出てこないのです。これはCNNの弱点を反映していて、Pooling層の作用でパーツ間の位置情報が失われているため、と言われています。（ないと位置情報に弱くなるのでどうしようもないのですが、、）福笑い状態の画像でも目と鼻と口があれば人と判断されるということと同義です。（巷で話題のカプセルネットワークにこのような手法を適用できればクリアできるんでしょうかね？)。
ちなみにページ一番上のモンタージュも最終層出力です。左上から右下の順番で（tench, goldfish, great white shark, tiger shark, hammerhead, electric ray, stingray, cock, hen, ostrich, brambling, goldfinch, house finch, junco, indigo bunting, robin）です。わかりますか？自分はgoldfishがかろうじて、、、ぐらいです。

今回うまくいったのはシンプルな物体（カタツムリや線虫を書くのに必要なパーツは動物に加えて少ない）だったからでしょうか？フラミンゴはよくわかりません。他のラベルとの冗長性が少ないか、それとも引きの写真が多くて結果的にパーツが少なかったのでしょうか。だれかここ詳しい人いますかね。。。

全部のニューロンを可視化するには時間がかかります。空いたリソースでちょこちょこやっていきますので、できたらまた紹介します。xceptionやresnetでも試したいです。

元々は自分の研究題材で学習させた場合、どのような特徴が見えてくるのかというところに今回の試みがありますので、そちらの方は本手法を取り入れて形にしたいと考えています。

それでは！