はじめに
Auto encoderで知られているように、neural netは入力データから必要な特徴を抽出して、圧縮された(次元の小さな)ベクトルとして表現することができます。
今回はMNISTのclassificationのレイヤーの直前に、2つだけノードを持つレイヤーを入れて、2次元ベクトルとして表現できるか実験してみました。
うまくclassificationできた場合、2次元ベクトルはclassificationに必要な情報をencodeしたものと言えるはずです。
Network
一般的なMNISTのclassificationと同じようにcomvolusionとfully connected layerで作りますが、出力(dense_3)の一つ前にノードが2個のレイヤーを挟みました。
Logitとactivation両方が見たかったので、activation無しのdense_2とReLUの二つのレイヤーが2次元ベクトルを出力します。
Activationの部分にLeaky ReLUやSigmoidを使ったバージョンも作ってます。

ActivationにReLUを使った場合
Trainingは一瞬で終わります。5分くらいでaccuracy 100%になりました。
Training済みのnetworkにtest dataを入力して、得られた2次元のベクトルの座標に入力画像をプロットしてみました。
Activationからの出力
このようになりました。

ReLUの出力なのでマイナスになることはありませんね。
同じ数字が塊になるのではなく、原点から伸びる放射線の、同じ直線の上に集まるようです。
1や2が見づらいですが、原点の近くに固まっています。
2次元の極座標のような解釈をすると、各classは(r,θ)できれいに説明できそうです。
(r,θ)だけ見れば人間でもclassificationできそうです。Classificationに必要な情報が圧縮されたベクトルと言えそうです。
Logitからの出力
Activationをプロットしたものと似てますが、少しマイナスの値が出ています。1と2の違いが分かりやすい。

ActivationにLeaky ReLUを使った場合
こちらはReLUよりさらに早くtrainingが終わりました。
Activationからの出力

マイナスも使ってきれいに数字が分離されてます。ReLUと同じように、同じ数字は放射線状の同じ直線の上にまとまっていますね。
Logitからの出力
ActivationにSigmoidを使った場合
こちらは1時間くらいtrainingしてようやくaccuracy 100%になりました。
Activationからの出力

Sigmoidは0から1の範囲の値を出力しますが、多くのclassがどちらかの軸のリミットに張り付いてます。
スカスカに見えますが今までのプロットと同じサンプル数をプロットしてますので、各classが小さな範囲にまとまっているようです。
Logitからの出力
まとめ
10classのclassificationに必要な情報は2次元ベクトルで表現できることがわかりました。
また、そのベクトルは同じclassが放射線上の同じ直線の上にまとまっていて、簡単にclassが推測できる情報がencodeされていました。
次は1次元で試してみようと思います。

