TensorFlow Y=2Xで分布するデータを学習する

TensorFlowで[じゃんけん](http://qiita.com/sergeant-wizard/items/98ce0993a195475fd7a9)の例を提示している方がいて、コード読んでたら数値をビット化できるんだったら何でも出来ると思いついたので作ってみました。チュートリアルで紹介されていた勾配降下法でy=2xで分布するデータを勾配降下法で学習して解くモデルです。2倍ってビット演算で考えるとシフトしてるだけですね。


# 結果
過剰適合によって精度の収束が観測できました。このグラフでは`tf.train.GradientDescentOptimizer(0.001).minimize(_loss)`です。収束した値が0.434とlog eに近似しています。

■ 学習結果
![スクリーンショット 2015-11-13 22.53.30.png](https://qiita-image-store.s3.amazonaws.com/0/65312/3377fb8b-1eb5-6393-0e94-335d1f630e65.png "スクリーンショット 2015-11-13 22.53.30.png")

■ 最終的に収束した
![スクリーンショット 2015-11-13 22.58.58.png](https://qiita-image-store.s3.amazonaws.com/0/65312/df121c3a-e1be-4180-3b68-218f2b9e8e08.png "スクリーンショット 2015-11-13 22.58.58.png")

# コード
```py
# -*- coding: utf-8 -*-
import tensorflow as tf

_input = []
_result = []
_t_input = []
_t_result = []

for p in range(1, 100):
    point = p
    # Y=2Xをビット化して表している
    _input.append([int(x) for x in format(point, '032b')])
    _result.append([int(x) for x in format(point * 2, '064b')])

for p in range(1, 100):
    _t_input.append([int(x) for x in format(p, '032b')])
    _t_result.append([int(x) for x in format(p * 2, '064b')])


# 重みと閾値を表す変数を用意する (初期値はゼロとする)
W = tf.Variable(tf.zeros([32, 64]))
b = tf.Variable(tf.zeros([64]))

# 訓練時に特徴ベクトルを入れるための変数
x = tf.placeholder("float", [None, 32])

# Softmax 関数を定義
y = tf.nn.softmax(tf.matmul(x, W) + b)

# 訓練時に真のラベルの値を入れるための変数
supervisor_labels_placeholder = tf.placeholder("float", [None, 64])


# 目標値との誤差。最適化したい値
def get_loss(_output, _supervisor_labels_placeholder):
    cross_entropy = -tf.reduce_sum(_supervisor_labels_placeholder * tf.log(_output))
    return cross_entropy


# 最適化のアルゴリズム
def get_training(_loss):
    train_step = tf.train.GradientDescentOptimizer(0.001).minimize(_loss)
    return train_step


# 学習の精度を判定する関数を定義
def get_accuracy(_y, _supervisor_labels_placeholder):
    correct_prediction = tf.equal(tf.argmax(_y, 1), tf.argmax(_supervisor_labels_placeholder, 1))
    return tf.reduce_mean(tf.cast(correct_prediction, "float"))


# セッションを準備
with tf.Session() as sess:
    summary_writer = tf.train.SummaryWriter('data', graph_def=sess.graph_def)

    # 変数の初期化処理
    init = tf.initialize_all_variables()
    sess.run(init)
    loss = get_loss(y, supervisor_labels_placeholder)
    training_op = get_training(loss)

    # 教師データの設定
    feed_dict = {x: _input, supervisor_labels_placeholder: _result}
    t_feed_dict = {x: _t_input, supervisor_labels_placeholder: _t_result}

    # 学習
    for i in range(1000000):
        sess.run(training_op, feed_dict=feed_dict)
        # if i % 100 == 0:
        #     # 目標値との誤差を出力
        #     # print sess.run(loss, feed_dict=feed_dict)
        #     pass
        # if i % 1000 == 0:
        #     print sess.run(get_accuracy(y, supervisor_labels_placeholder), feed_dict=t_feed_dict)
        #     summary_writer = tf.train.SummaryWriter('data', graph_def=sess.graph_def)

        # 1回の学習毎に結果を出力する
        print sess.run(get_accuracy(y, supervisor_labels_placeholder), feed_dict=t_feed_dict)

    # 学習の精度を判定する関数を定義
    accuracy = get_accuracy(y, supervisor_labels_placeholder)

    # 結果出力
    print "~~~~~~~~~~result~~~~~~~~~~"
    print sess.run(accuracy, feed_dict=t_feed_dict)
```

# 参考
[TensorFlowのコード分割の考え方](http://qiita.com/sergeant-wizard/items/98ce0993a195475fd7a9)
[TensorFlow Tutorial MNIST For ML Beginners やった](http://qiita.com/shuhei_f/items/9251084b00ed9319033e)