ズッキーニのプログラミング実験場

プログラミング + アカデミック + 何か面白いこと。 記載されているものは基本的に私が所属する団体とは関係がありません。

   May 21

Tensorboardを使ってニューラルネットワークと学習の状況を可視化する

by zuqqhi2 at 2017年5月21日
Pocket

はじめに

tensorflowtflearnでモデルを作っていると、ネットワークを図にしたり学習の進み具合をさくっとグラフにしてくれるツールがあると便利だな、と思ったことがあると思います。

Googleで検索をしているとtensorboardなるものを見つけたので、こちらを使って見たいと思います。

ちなみに、この記事の内容は以下のDockerイメージを使うことでさくっと試すことができます。

環境

ニューラルネットワークを簡単に作りたかったので、tflearnを使いました。

  • OS : Ubuntu 16.04
  • python : 3.5.2
  • tensorflow : 1.1.0
  • tfLearn : 0.3
  • tensorboard : 1.0.0a6

tensorboardのインストール

tensorboardはpip installでインストールできるので、非常に簡単です。ただ、私の環境ではvirtualenvではうまく動作しなかったので注意してください。検索すると、既知の問題のようで、githubのissuesやstackoverflowのページがいくつかヒットします。

もしpython環境を整備していなかったらこちらを参考にしてみてください。

pip install tensorboard

サンプルニューラルネットワークの構築

MNISTデータセットを使って手書き数字認識のタスクをニューラルネットワークにやらせて、その様子をtensorboardで見たいと思います。

もしnumpy, tensorflow, tflearnをインストールしていなければ、pip installでインストールしてください。

構築するモデルは、入力層のユニットが784(28 x 28ピクセル)個、隠れ層は2層あって1つ目は128個、2つ目は32個のユニットがあります。そして最後に出力層が0から9の数字を表せられるように10個のユニットになっています。

図で表すと以下のようなネットワークになっています。

これをtflearnを使ってコードにすると以下のようになります。

import numpy as np
import tensorflow as tf
import tflearn
import tflearn.datasets.mnist as mnist

# 1. Load MNIST data
X_train, y_train, X_test, y_test = mnist.load_data(one_hot=True)

# 2. Build a NN Model
tf.reset_default_graph()
net = tflearn.input_data([None, X_train.shape[1]]) # Input Layer
net = tflearn.fully_connected(net, 128, activation='ReLU') # Hidden Layer 1
net = tflearn.fully_connected(net, 32, activation='ReLU') # Hidden Layer 2
net = tflearn.fully_connected(net, 10, activation='softmax') # Output Layer
net = tflearn.regression(net, optimizer='sgd', learning_rate=0.01, loss='categorical_crossentropy')
model = tflearn.DNN(net, tensorboard_verbose=3)

# 3. Traning
model.fit(X_train, y_train, validation_set=0.1, show_metric=True, batch_size=100, n_epoch=20)

# 4. Testing
predictions = np.array(model.predict(X_test)).argmax(axis=1)
actual = y_test.argmax(axis=1)
test_accuracy = np.mean(predictions == actual, axis=0)
print("Test accuracy: ", test_accuracy)

ディープではなくシンプルなニューラルネットワークで、しかもepochを20程度にしかしていません。それでも、私が試したときは約91%の正答率を出していました。

tensorboardでモデルと学習の様子を確認

tflearnを使うと/tmp/tflearn_logsにtensorboardで使えるログが勝手に出力されます。

tensorboardはWebUIで、以下のコマンドで立ち上げることが出来ます。ポート番号はデフォルトが6006なので、オプションで指定する必要はありません。

tensorboard --logdir='/tmp/tflearn_logs' --port=6006

後はhttp://localhost:6006といったURLでアクセスするだけです。

構築したニューラルネットワークはGRAPHSタブで確認できます。慣れるまでは若干見にくそうですが、トポロジ情報だけでなく学習方法など詳細な情報も含まれていて、コードを追うよりは簡単にモデルを把握することが出来ます。

学習の進捗の様子はSCALARSタブで確認出来ます。各層ごとに確認できるので便利ですね。

ちなみに、複数回実行すると、複数の結果を同時に見ることができます。

Jupyter Notebook上で構築したモデルを軽く見たい場合

tensorboardだと別タブでモデルを見ることになります。もしJupyter Notebookで、構築したモデルを見たい場合は、tfgraphvizというライブラリが使えます。

ただ、注意事項として、tfgraphvizの結果は特別見やすいわけではないです。あくまで理解の補助として利用いただければいいと思います。

これもインストールはpip installするだけです。

pip install tfgraphviz

tflearnでは結果が出力されなかったので、tensorflowで簡単なモデルを書いて出力させてみます。以下の例はこの記事の例を利用させていただいています。

import numpy as np
import tensorflow as tf

tf.reset_default_graph()

# Creating input and correct result data
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3

# Build network
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + b
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# Output graph with tfgraphviz
tfg.board(tf.get_default_graph())

これをjupyter notebook上で実行すると、以下のような図が出力されます。

すごく見やすいわけではないですが、雰囲気はつかめるかと思います。

Dockerイメージ

この記事で紹介したことは、以下のDockerイメージですぐ試すことができます。

利用方法は以下のようにdocker pullしてdocker runするだけです。samples.ipynbファイルがあり、その中にこの記事で紹介したコードがすでにあるので、実行してみてください。

この記事がなんらかの参考になれば幸いです。

Related Posts

Pocket

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です