CapsNetで遊んでみた♬～特徴把握に重要な要素だが～

今回は、CapsNetの本体、CapsuleLayerについて検証します。
つまり、ほんとうに、CapsuleLayerは収束や鮮明化に寄与しているのか？？

コードは以下に置きました
[MuAuan/capsNet](https://github.com/MuAuan/capsNet) 

説明は論文提出された初期、つまり昨年11月ごろからいろいろ書かれていたが、
英文の同一の解説の翻訳ぽくて、なかなか本質が見えずらい。。。

その中で以下は、ある意味（ほんとのところはわからないという意味で）分かりやすいと思う。
[Dynamic Routing Between Capsules](https://www.slideshare.net/MasayaKaneko/dynamic-routing-betweencapsules)は、ほぼ以下の元論文を説明しています。
[DynamicRoutingBetweenCapsules](https://arxiv.org/pdf/1710.09829.pdf)

特に以下ののモデルアーキテクチャをよく眺めると
![capsFig1-2.png](https://qiita-image-store.s3.amazonaws.com/0/233744/61f8b6a9-fc27-7e1e-ceef-ed5236f6a391.png)

一つの疑問が沸き起こります。それは、capsuleLayerの次元がなぜ１６次元なのかです。
これ別に何かMNISTデータの特徴からきているわけではなさそうです。
しかし、大切なことはこの次元パラメータは本来の画像の持つ広域的な関連を持たせるという局所的に抽出された画像の特徴を表現するうえで大切なパラーメータということです。
※ちなみに大切なパラメータは、これとrouting parameterだと見えますが、後者の寄与は論文で見えているのでここでは取り上げません
※ちなみに、プログラム的にはCifar100などを取り扱おうとすると、この次元が１６だとパラメータが大きすぎて計算量が膨大になり使えません

と、いうことで今回はCapsuleLayerの寄与を見るために、この次元パラメータを動かしてその影響を調べるともに、CapsulLayerの本来の意味を見ることとしました。

一応、話として今回GANと言っている人もいるが、Discriminatorが存在せず、このCapsLayerからの直接の簡単な結合層３個のみで画像生成しているので、当然このCapsLayerが画像生成に重要な寄与をしているのは明白です。
どちらかと言えば簡単なAutoEncoderであり、MNISTのAutoEncoderは以下のようなものである。
[Kerasで学ぶAutoencoder](https://elix-tech.github.io/ja/2016/07/17/autoencoder.html) Jul 17, 2016 by Shinya Yuki
ちなみに簡単な一層でもかなり綺麗な画像が得られている

今回やったこと
①MNISTデータで次元を変化させて出力画像を見る
②Cifar10データで次元を変化させて出力画像を見る

#結果
###①MNISTデータで次元を変化させて出力画像を見る
Caps1D　やはり画像出てこない
![caps1Mnist.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/91c2bb7a-0269-0a3a-fa99-4b41b99e0158.gif)
Caps4D 綺麗な画像出現
![Caps4Mnist.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/7b98f73c-8f4c-2749-af8c-39a9a1e53636.gif)
Caps8D　う～ん
![Caps8Mnist.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/524d9931-96f0-e301-7227-690368331ecf.gif)
Caps16D オリジナル論文の次元だけど、。。。
![Caps16Mnist.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/d8576d7c-8c41-95e2-702f-c0ba45d13a1b.gif)
Caps32D ２倍にしてみた
![Caps32Mnist.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/b8a0d939-5ce2-c277-fc18-243755f26da4.gif)
Caps64D ４倍にしてみた（ここだけ８枚）
![Caps64Mnist.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/6d5c008c-f78e-0b11-60a1-03d59037e1fe.gif)
まず、はっきり言えることはCapsuleLayerがベクトルであるということは空間的な情報として非常に重要で、１次元では画像は構成できなかった。そしてわずか４次元でも十分画像が構成できる。そして、８次元は少し薄くなったりしている。
###②Cifar10データで次元を変化させて出力画像を見る
結果は、きれいな画像が得られないということはあるが、傾向はMNISTと同様で以下のとおりです。
Caps1D まったく画像が得られません
![caps1d.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/a7582118-03f8-87f4-3e04-239f06e34d03.gif)
Caps8D 一応、得られますがMNISTと比較すると綺麗にはなりません
![caps8d.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/6fb24b70-343e-12f1-5208-4a1c0e833d73.gif)
Caps16D オリジナル論文の通りですが、やはり綺麗にはなりません
![caps16d.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/c893b95a-b93b-7cf9-41c0-fc926cec9f82.gif)
Caps32D そもそも画像が複雑なので次元を増やせばいけるかもと思い２倍にしてみましたが、やはりだめでしたが、少し綺麗になったような気がします。
![caps32d.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/aa274509-8fe2-3973-3424-1d38a1d4d85d.gif)
Caps64D かなり計算時間がかかりましたが、得られた画像はそれほど綺麗になりませんでした。ただ、少しましになったような気もするので継続すればもう少しいけそうです
![caps64d.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/79db849f-1b31-2ca9-af06-e9e1a0344df0.gif)
#まとめ
CapsNetの次元を変更して得られる生成画像の変化を見た。
その結果、１次元ではほとんど画像は生成できないが、MNISTでは４次元で綺麗な画像が得られた。
このことから、CapsNetの構造が特徴を把握し画像生成に寄与していることが理解できる。
逆に、この特徴を把握するCapsNetの次元は必ずしも１６次元である必要はなく、MNISTでは８次元程度で十分綺麗な画像が得られる。
一方、画像の複雑なCifar10では、８次元程度では特徴を把握するのは難しく、１６次元以上で一定の画像が得られる。しかし、綺麗な画像生成というところまでには至らず、さらなる改善が必要である。
#課題
実は生成画像のシャープさと一致率の相関は小さいようだ。
一方、上記のFig.1, Fig.2を見ていると、どう見てもこれはAutoencoderなので、次回はAutoencoderとの比較を中間層等に対しても実施しようと思う。