はじめに
多層パーセプトロンのニューラルネットワークを学習させた後、何らかの方法で可視化してみないと、ブラックボックスになってしまい、どうなっているのかよく分からない、と感じていました。
入力データが画像の場合は、割と可視化しやすいのですが、単なるデータの場合は、どうしたもんかと調べていたところ、この記事を見つけ、早速試してみました。
Deep LearningをKerasで可視化したい
http://recruit.gmo.jp/engineer/jisedai/blog/deep-learning-keras/
以前書いたこちらの記事
暗号化された通信内の実際のプロトコルを、ニューラルネットワークで識別してみる
http://qiita.com/kznx/items/2eec63ed55740262c9ab
のニューラルネットワークをベースに、上記の記事の手法を使わせていただき、重みを可視化してみました。
重みを可視化
入力データ(22次元)から最初のレイヤー(50ユニット)へのすべての重みを 22 x 50 の色で可視化します。また、折れ線グラフは、入力層から次の層への重みの平均を表しており、どの入力データが、次の層に影響力があるかがわかります。この例だと、18, 19の入力データの影響が大きくなっています。
for i in [0, 3, 6, 8, 11, 13, 15]:
# weights 結果をplot
w1 = model.layers[i].get_weights()[0]
plt.imshow(w1, cmap='coolwarm', interpolation='nearest')
plt.colorbar()
plt.figure()
plt.plot((w1**2).mean(axis=1), 'o-')
plt.show()
ちなみに18は Total packets in the forward direction、19はTotal bytes in the forward directionということで、一セッションあたりのパケット数やバイト数がプロトコルの識別に重要という、ちょっと意外な結果となりました。