Edited at

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

More than 3 years have 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のシステムで使うことも念頭に置かれているようなので、今後の普及が楽しみ。