Platinum Data Blog by BrainPad

株式会社ブレインパッドのデータ活用に関する取り組みや製品・サービス開発の裏側、社員の日常などをご紹介します。

TensorFlowを遊び倒す! 3-1. TensorFlow Mechanics 101

※TensorFlowとは2015年11月9日にオープンソース化されたGoogleの機械学習ライブラリです。
 本ブログでは、実際のTensorFlowの使い方を連載方式でご紹介しています。



皆様こんにちは。

テクノロジー&ソフトウェア開発本部の佐藤貴海です。今回のブログは、「TensorFlow Mechanics 101」をご紹介します。

https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

ソースコードが以下のURLに掲載されています。
https://tensorflow.googlesource.com/tensorflow/+/master/tensorflow/examples/tutorials/mnist/

その中で、今回は以下の2つのファイルを見ていきます。

  • fully_connected_feed.py
  • mnist.py

内容としては、これまでと同じMNISTの手書き文字の認識なので、重複する解説は省略し、今回はいままで出てこなかった以下の2つの機能について紹介します。

  • グラフ表示機能
  • 学習結果表示機能

Webアプリによる表示

pipでTensorFlowをインストールした場合、tensorboardコマンドがパスに追加されるので、SummaryWrite(後述)に渡したログディレクトリを指定して実行すると、6006番ポートにWebアプリが起動します。

$ tensorboard --logdir=/path/to/log-directory

グラフ表示機能

TensorFlowは、計算の実行計画をグラフと呼んでおり、これをまさにグラフとして出力することができます。Webアプリのナビゲートバーの「GRAPH」にアクセスすると、以下のような画面を見ることができます。

f:id:bp-writer:20160101171624p:plain

しかし、何もせずにグラフを表示すると非常に見にくいので、tf.name_scopeで名前をつけて見やすい状態にします。
ここでは、各層ごとに'hidden1', 'hidden2', 'softmax_linear'と名付けています。

# Hidden 1
with tf.name_scope('hidden1'):
  weights = tf.Variable(
      tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
                          stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))),
      name='weights')
  biases = tf.Variable(tf.zeros([hidden1_units]),
                       name='biases')
  hidden1 = tf.nn.relu(tf.matmul(images, weights) + biases)
# Hidden 2
with tf.name_scope('hidden2'):
  weights = tf.Variable(
      tf.truncated_normal([hidden1_units, hidden2_units],
                          stddev=1.0 / math.sqrt(float(hidden1_units))),
      name='weights')
  biases = tf.Variable(tf.zeros([hidden2_units]),
                       name='biases')
  hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases)
# Linear
with tf.name_scope('softmax_linear'):
  weights = tf.Variable(
      tf.truncated_normal([hidden2_units, NUM_CLASSES],
                          stddev=1.0 / math.sqrt(float(hidden2_units))),
      name='weights')
  biases = tf.Variable(tf.zeros([NUM_CLASSES]),
                       name='biases')
  logits = tf.matmul(hidden2, weights) + biases

'hidden1', 'hidden2', 'softmax_linear'の単位で表示がまとまるので、非常に見通しがよくなります。

各ノードの詳細を見たい場合は、ノードの右上のアイコンを押すと展開することができます。

学習結果表示機能

ニューラルネットワークでは学習誤差がどの程度落ちているか、収束しているかを判断するため、各反復において、学習(予測)誤差がどうなっているかを、把握したいことが多々あります。

TensorFlowではtensorboardで簡単に学習(予測)誤差を確認する機能がついています。

一番簡単な使用方法は、tf.merge_all_summaries()でサマリ用のオペレーションと、tf.train.SummaryWriterを用意し、

summary_op = tf.merge_all_summaries()
summary_writer = tf.train.SummaryWriter(FLAGS.train_dir,
                                        graph_def=sess.graph_def)

記録したいステップごとに、tf.train.SummaryWriter.add_summaryで結果を追加していけばOKです。

for step in xrange(FLAGS.max_steps):
  if step % 100 == 0:
    summary_str = sess.run(summary_op, feed_dict=feed_dict)
    summary_writer.add_summary(summary_str, step)

この後、Webアプリのナビゲートバーの「EVENTS」にアクセスすると、以下のような画面を見ることができます。

f:id:bp-writer:20160101173821p:plain

この場合、誤差が最後上昇しているので、早めに打ち切るか、学習率を落としてみると良いかと思われます。

今回も前回同様に、簡単な機能紹介とさせていただきました。次回からCNN(Convolutional Neural Networks)に入るので、より実践的な内容の紹介に移っていきます。お楽しみに。



こうした先進的な取り組みをぜひ自分でもやってみたいという方を、ブレインパッドでは募集しています。
興味・関心のある方は、ぜひご応募ください!
www.brainpad.co.jp