TensorFlowとTensorBoardでニューラルネットワークを可視化

  • 204
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

概要

TensorFlowについてくるTensorBoardを使うとニューラルネットワークの学習過程やデータフローが簡単に可視化できてすごいという話。
以下のドキュメントの内容を実際に動かしてみた結果です。

前提知識

学習を実行

TensorFlowの公式GitHubリポジトリをクローンします。チュートリアルで使われるコードもついてきます。

$ git clone https://github.com/tensorflow/tensorflow

今回は以下のディレクトリに含まれるMNISTの学習を取り扱います。

$ cd tensorflow/tensorflow/g3doc/tutorials/mnist

公式のチュートリアル通りにfully_connected_feed.pyを実行しようとすると以下のエラーがでます。

$ python fully_connected_feed.py
Traceback (most recent call last):
  File "fully_connected_feed.py", line 19, in <module>
    from tensorflow.g3doc.tutorials.mnist import input_data
ImportError: No module named g3doc.tutorials.mnist

エラー回避のために以下の修正をしました。

--- a/tensorflow/g3doc/tutorials/mnist/fully_connected_feed.py
+++ b/tensorflow/g3doc/tutorials/mnist/fully_connected_feed.py
@@ -16,8 +16,8 @@ import tensorflow.python.platform
 import numpy
 import tensorflow as tf

-from tensorflow.g3doc.tutorials.mnist import input_data
-from tensorflow.g3doc.tutorials.mnist import mnist
+import input_data
+import mnist

修正した上で実行します。

$ python fully_connected_feed.py
Succesfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting data/train-images-idx3-ubyte.gz
Succesfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting data/train-labels-idx1-ubyte.gz
Succesfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting data/t10k-images-idx3-ubyte.gz
Succesfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data/t10k-labels-idx1-ubyte.gz
can't determine number of CPU cores: assuming 4
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 4
can't determine number of CPU cores: assuming 4
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 4
Step 0: loss = 2.31 (0.015 sec)
Step 100: loss = 2.15 (0.006 sec)
Step 200: loss = 1.91 (0.006 sec)
Step 300: loss = 1.60 (0.005 sec)
Step 400: loss = 1.30 (0.006 sec)
Step 500: loss = 0.91 (0.005 sec)
Step 600: loss = 0.79 (0.005 sec)
Step 700: loss = 0.73 (0.005 sec)
Step 800: loss = 0.60 (0.005 sec)
Step 900: loss = 0.60 (0.005 sec)
Training Data Eval:
  Num examples: 55000  Num correct: 47246  Precision @ 1: 0.8590
Validation Data Eval:
  Num examples: 5000  Num correct: 4321  Precision @ 1: 0.8642
Test Data Eval:
  Num examples: 10000  Num correct: 8721  Precision @ 1: 0.8721
Step 1000: loss = 0.41 (0.016 sec)
Step 1100: loss = 0.50 (0.124 sec)
Step 1200: loss = 0.35 (0.006 sec)
Step 1300: loss = 0.58 (0.005 sec)
Step 1400: loss = 0.56 (0.006 sec)
Step 1500: loss = 0.51 (0.006 sec)
Step 1600: loss = 0.59 (0.006 sec)
Step 1700: loss = 0.25 (0.005 sec)
Step 1800: loss = 0.46 (0.005 sec)
Step 1900: loss = 0.28 (0.005 sec)
Training Data Eval:
  Num examples: 55000  Num correct: 49320  Precision @ 1: 0.8967
Validation Data Eval:
  Num examples: 5000  Num correct: 4512  Precision @ 1: 0.9024
Test Data Eval:
  Num examples: 10000  Num correct: 9038  Precision @ 1: 0.9038

今回は無事実行でき、学習できたようです。

結果を可視化

ここからがTensorBoardの話です。

TensorFlowをPIP経由でインストールしている場合、以下のコマンドを実行するとローカルのHTTPサーバでTensorBoardがホスティングされます。

$ tensorboard --logdir=/<ABSOLUTE_PATH>/tensorflow/tensorflow/g3doc/tutorials/mnist/data
flow/tensorflow/g3doc/tutorials/mnist/data
Starting TensorBoard on port 6006
(You can navigate to http://localhost:6006)

<ABSOLUTE_PATH>にはTensorFlowをクローンした絶対パスを入れてください。

ログ通りブラウザでlocalhost:6006にアクセスすると・・・

tensorBoard1.png

出力したxentropy_meanが表示されています。ここを展開すると・・・

xenttropy.png

横軸が学習回数、縦軸が交差エントロピーの値です。学習が進むに連れて最小化の対象のエントロピーが減少していくことが確認できます。
gnuplotのスクリプト書いて手動でグラフを書いてた時代が懐かしいです。

更に、右上のGRAPHタブをクリックすると・・・

graph.png

ニューラルネットワークのデータフローが可視化されています。これは便利!


(追記1)
GraphのNodeの"+"ボタンを押して展開すると、以下のようにNodeの詳細が見れる機能も便利でした。

expand.png