12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

TensorFlowを使ってみる 〜その3〜 TensorBoard

Last updated at Posted at 2017-03-22

前回作成した畳み込みニューラルネットワークを TensorBoard を使って視覚化します。

TensorBoard

TensorBoard は、プログラムの理解、デバッグ、および最適化を容易にするための視覚化ツールになります。
https://www.tensorflow.org/get_started/summaries_and_tensorboard
https://www.tensorflow.org/get_started/graph_viz

準備

前回のエントリーで作成したソースコードを用意します。
このコードに TensorBoard 用のコードを追記してきます。

実装コード全体

実装コードの全体は、下記となります。

deep_mnist_softmax.py

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import sys

from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf

# 重み変数
def weight_variable(shape):
  initial = tf.truncated_normal(shape, stddev=0.1)
  return tf.Variable(initial)

# バイアス変数
def bias_variable(shape):
  initial = tf.constant(0.1, shape=shape)
  return tf.Variable(initial)

# 畳み込み
def conv2d(x, W):
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

# プーリング
def max_pool_2x2(x):
  return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1], padding='SAME')

def main(_):
  # データ取得
  mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

  # placeholder作成
  with tf.name_scope('input'):
    x = tf.placeholder(tf.float32, [None, 784], name="x")
    y_ = tf.placeholder(tf.float32, [None, 10], name="y_")

  # 畳み込み1層目
  with tf.name_scope('layer_1'):
    W_conv1 = weight_variable([5, 5, 1, 32])
    b_conv1 = bias_variable([32])
    x_image = tf.reshape(x, [-1,28,28,1])
    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
    h_pool1 = max_pool_2x2(h_conv1)

  # 畳み込み2層目
  with tf.name_scope('layer_2'):
    W_conv2 = weight_variable([5, 5, 32, 64])
    b_conv2 = bias_variable([64])
    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
    h_pool2 = max_pool_2x2(h_conv2)

  # 全結合層
  with tf.name_scope('full_connect'):
    W_fc1 = weight_variable([7 * 7 * 64, 1024])
    b_fc1 = bias_variable([1024])
    h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

  # ドロップアウト層
  with tf.name_scope('drop_out'):
    keep_prob = tf.placeholder(tf.float32, name="keep_prob")
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

  # 出力層
  with tf.name_scope('output'):
    W_fc2 = weight_variable([1024, 10])
    b_fc2 = bias_variable([10])
    y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2

  # optimizer
  with tf.name_scope('optimizer'):
    # 損失関数(交差エントロピー誤差)
    cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_conv, y_))
    # 勾配
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

  # evaluator
  with tf.name_scope('evaluator'):
    # 精度
    correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

  # セッション
  sess = tf.InteractiveSession()
  sess.run(tf.global_variables_initializer())

  # サマリー
  tf.summary.scalar('cross_entropy', cross_entropy)
  tf.summary.scalar('accuracy', accuracy)

  tf.summary.histogram("weights_conv1", W_conv1)
  tf.summary.histogram("weights_conv2", W_conv2)
  tf.summary.histogram("weights_fc1", W_fc1)
  tf.summary.histogram("weights_fc2", W_fc2)
  tf.summary.histogram("biases_conv1", b_conv1)
  tf.summary.histogram("biases_conv2", b_conv2)
  tf.summary.histogram("biases_fc1", b_fc1)
  tf.summary.histogram("biases_fc2", b_fc2)

  merged = tf.summary.merge_all()
  writer = tf.summary.FileWriter("/tmp/deep_mnist_sl_logs", sess.graph)

  # トレーニング
  for i in range(5000):
    batch = mnist.train.next_batch(50)

    if i % 500 == 0:
      # 途中経過(500件ごと)
      # train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})
      # print("step %d, training accuracy %f" % (i, train_accuracy))
      summary, loss_val, acc_val = sess.run([merged, cross_entropy, accuracy], feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})
      print('Step: %d, Loss: %f, Accuracy: %f' % (i, loss_val, acc_val))
      writer.add_summary(summary, i)

    # トレーニング実行
    train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

  # 評価
  print("test accuracy %f" % accuracy.eval(feed_dict={
    x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('--data_dir', type=str, default='/tmp/tensorflow/mnist/input_data',
                      help='Directory for storing input data')
  FLAGS, unparsed = parser.parse_known_args()
  tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)

実装コード詳細

実装コードの詳細を以下に記載します。

  • ネームスペース
with tf.name_scope('input'):
  x = tf.placeholder(tf.float32, [None, 784], name="x")
  y_ = tf.placeholder(tf.float32, [None, 10], name="y_")

with構文を使って、同じ構成要素をグループ化します。
ここでは入力に関する要素をグループ化しています。
同様に、畳み込み層、全結合層、ドロップ層、出力層についてもグループ化します。

  • サマリー(scalar)
# サマリー
tf.summary.scalar('cross_entropy', cross_entropy)
tf.summary.scalar('accuracy', accuracy)

scalarとして、損失関数(交差エントロピー誤差)と精度を設定します。
※第一引数の文字列が、TensorBoardでの表示名になります。

  • サマリー(histogram)
tf.summary.histogram("weights_conv1", W_conv1)
tf.summary.histogram("weights_conv2", W_conv2)
tf.summary.histogram("weights_fc1", W_fc1)
tf.summary.histogram("weights_fc2", W_fc2)
tf.summary.histogram("biases_conv1", b_conv1)
tf.summary.histogram("biases_conv2", b_conv2)
tf.summary.histogram("biases_fc1", b_fc1)
tf.summary.histogram("biases_fc2", b_fc2)

histogramとして、重みとバイアスを設定します。
※第一引数の文字列が、TensorBoardでの表示名になります。

  • Merge
merged = tf.summary.merge_all()

すべての集計をマージします。

  • FileWriter
writer = tf.summary.FileWriter("/tmp/deep_mnist_sl_logs", sess.graph)

ログファイルの書き出し先フォルダを指定します。

  • サマリー追加
if i % 500 == 0:
  # 途中経過(500件ごと)
  # train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})
  # print("step %d, training accuracy %f" % (i, train_accuracy))
  summary, loss_val, acc_val = sess.run([merged, cross_entropy, accuracy], feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})
  print('Step: %d, Loss: %f, Accuracy: %f' % (i, loss_val, acc_val))
  writer.add_summary(summary, i)

500件ごとに計測した損失と精度のサマリーをログに追加します。

実行

コードを実行します。

python deep_mnist_softmax.py

実行後、ログファイルが指定の書き出し先フォルダへ格納されます。
※前回のエントリーでの作成した環境で実行する場合は、仮想環境を起動後に実行します。

TensorBoard 起動

ターミナルにてフォルダを指定し tensorboardコマンドを実行します。

tensorboard --logdir=/tmp/deep_mnist_sl_logs/

すると、以下のように表示されるので、
このアドレスをWebブラウザへ入力する事で TensorBoard が開きます。

Starting TensorBoard b'39' on port 6006
(You can navigate to http://xxx.xxx.xxx.xxx:6006)

TensorBoard

開いた TensorBoard の各タブを見てみます。

  • SCALAR

精度と交差エントロピー誤差が表示されています。
回数を重ねるにつれ精度が向上しているのがわかります。

SC_001.png

  • GRAPHS

各グループの繋がりが視覚化されます。

SC_002.png

+マークをクリックすると詳細が表示されます。

SC_003.png

  • DISTRIBUTIONS

SC_004.png

  • HISTOGRAMS

重みとバイアスがヒストグラム表示されています。

SC_005.png

TensorBoard 終了

ターミナルで Ctrl + Cを押し、終了します。


以上、今回は TensorBoard を使って視覚化を行いました。

12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?