LoginSignup
11
11

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-13

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

結果

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

■ 学習結果
スクリーンショット 2015-11-13 22.53.30.png

■ 最終的に収束した
スクリーンショット 2015-11-13 22.58.58.png

コード

# -*- 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のコード分割の考え方
TensorFlow Tutorial MNIST For ML Beginners やった

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11