Neural Networkをちょっとかじった人のための、はじめてのTensorFlow

  • 106
    Like
  • 0
    Comment
More than 1 year has passed since last update.

概要

ニューラルネットワークをかじったことがある人がサクっとTensorFlowに親しめるように本家チュートリアルを圧縮

前提知識

  • ニューラルネットワーク
  • 最急降下法
  • MNIST
  • Python

準備

TensorFlowをインストールしてインポートします

import tensorflow as tf

入力

MNISTの784ピクセルのグレースケール値。
本家Tutorialで公開されているinput_data.pyでインポートすると楽。

import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

入力$x$を格納するplaceholderとして以下の定義をしておきます。

x = tf.placeholder("float", [None, 784])

ここでNoneは「大きさを指定しない」ことを意味します。

重み・バイアス

W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
  • tf.zerosにより、ゼロで初期化
  • tf.Varibleにより、計算途中でmodifiableな変数として定義

出力: 0-9のClass

入力$x$に対して、0-9のClassのどれに分類されるのが尤もらしいかを表す。

\mathrm{softmax}(x) = \frac{\exp{x}}{\sum_j  \exp{x_j}}
y = \mathrm{softmax} \left( Wx + b \right)

TensorFlowでは以下を定義すれば十分。微分も勝手にしてくれて便利。

y = tf.nn.softmax(tf.matmul(x,W) + b)

誤差関数

$y'$を真のClass Distribution(正しいClassに対応する成分が1、他の成分は0)とし、以下のクロスエントロピーを考える。

H(y) = - \sum_i y'_i \ln y_i

この式を各画像に対してSUMする。

y_ = tf.placeholder("float", [None,10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))

y == 0のときlog(y)をうまく取り扱ってくれているようなで、ありがたい。

最小化問題とそのアルゴリズム

以下のように指定する

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

ここで0.01は学習係数。最急降下法を使うことと、それによって最小化する値を指定。

変数の初期化

init = tf.initialize_all_variables()

学習の実行

  • 1000回の反復
  • バッチサイズ100
sess = tf.Session()
sess.run(init)
for i in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

学習結果の評価

「尤もらしいClass、すなわち$\mathrm{argmax}(y)$が教師のラベルと等しいか」を以下のように記述

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

この値を各サンプル毎に評価して平均を計算する

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

最後に、入力と教師を以下のように与えてaccuracyを計算します。

>>> print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
0.9151

92%の正答率となりました。

触ってみた感想

TheanoみたいにLow-Levelなアルゴリズムを書かないといけないことがほとんどなく、しかも読みやすい形で書けてとてもとっつきやすい。
大きなProductionのシステムで使うことも念頭に置かれているようなので、今後の普及が楽しみ。