TensorFlowつかってみた

Python3.5で書いてみた。

TensorFlow

TensorFlowは Googleが作った機械学習ライブラリのこと。 深層学習以外にも使える。 書いたコードからニューラルネットワークの可視化できるも便利。

コード

from helper import *

INPUT_SIZE = 2
CATEGORY_NUM = 1 # 出力ユニット数
LEARNING_RATE = 0.02
TRAINING_LOOP = 10000 # 学習回数
SUMMARY_DIR = 'test' # ログデータを保存するディレクトリ
SUMMARY_INTERVAL = 1000 # 途中経過の出力

# データセットの準備
X = np.array([[1.,3.],[3., 1.],[5.,7.]])
Y = np.array([190., 330., 660.]).reshape(3,1)
with tf.Graph().as_default():

    # 入力
    with tf.name_scope('input'):
        # 入力ベクトル
        x = tf.placeholder(tf.float32, [None, INPUT_SIZE], name='input_x')
        # 正解ラベル
        y_ = tf.placeholder(tf.float32, [None, CATEGORY_NUM], name='labels')

    # 出力
    with tf.name_scope('readout'):
        # 重みベクトル
        W = weight_variable([INPUT_SIZE, CATEGORY_NUM], name='weight')
        # バイアスベクトル
        b = bias_variable([CATEGORY_NUM], name='bias')
        # 出力ベクトル
        y = tf.matmul(x, W) + b

    # 誤差関数と更新するアルゴリズムの定義
    with tf.name_scope('optimize'):
        # 二乗誤差
        loss = tf.reduce_mean(tf.square(y_ - y))
        # パラメータ更新のためのアルゴリズム
        train_step = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(loss)
        loss_summary = tf.scalar_summary('loss', loss)

    # 学習
    with tf.Session() as sess:
        # ログデータを入れるファイルを開く
        train_writer = tf.train.SummaryWriter(SUMMARY_DIR + '/train', sess.graph)
        test_writer = tf.train.SummaryWriter(SUMMARY_DIR + '/test', sess.graph)

        # 正解率の計算
        correct_prediction = tf.equal(tf.sign(y), tf.sign(y_))
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
        train_accuracy_summary = tf.scalar_summary('accuracy', accuracy)
        test_accuracy_summary = tf.scalar_summary('accuracy', accuracy)

        # パラメータの更新
        sess.run(tf.initialize_all_variables())
        for i in range(TRAINING_LOOP + 1):
            sess.run([train_step], {x: X, y_: Y})

            # 途中経過の出力
            if i % SUMMARY_INTERVAL == 0:
                print('step %d' % i)
                summary = sess.run(tf.merge_summary([loss_summary, train_accuracy_summary]), {x: X, y_: Y})
                train_writer.add_summary(summary, i)
                summary = sess.run(tf.merge_summary([test_accuracy_summary]), {x: X, y_: Y})
                test_writer.add_summary(summary, i)

        # テストデータを入れてみる
        new_x = np.array([2., 4.]).reshape(1,2)
        new_y = sess.run(y, {x: new_x})
        print(new_y)

可視化

可視化するためのコマンドでtensorboardっていうものがあるんですが、引数にログデータの絶対パスを入れる必要がある。 いちいち打つのめんどくさいから、greadlink を使って絶対パスを取得した。

$ tensorboard --logdir=`greadlink -f test`
Starting TensorBoard b'16' on port 6006
(You can navigate to http://0.0.0.0:6006)

って出てくる。

そして、http://localhost:6006 にアクセスすると f:id:carumisu:20160601145120p:plain

と、出てくる。

今回は回帰問題を扱ってみた。

参考URL

TensorFlowでDeep Neural Networks (1) ロジスティック回帰 - Qiita