線形回帰

線形な値の教師データから、TensorFlowのw(ウェイト)とb(バイアス)の収束を観察する。

まず、教師データは、(x,y)座標は、y = x * W + bで定義する。

b_train = -1
w_train = 0.7
X_train = np.linspace(0, 1.0, 100)
y_train = x_train * w_train + b_train

この線形な値の教師データを用いて、同様のWとbにTensorFlowで収束する結果を観察する。つまりTensorFlowを用いて、wとbを導き出す。

教師データ

教師データの分布を確認するために、matplotlibでグラフを表示してみる。

Coding

それでは、下記のコードで、収束を確認していく。

変数の定義

TensorFlowの中で扱う変数を定義する。Xにtrain_x, yにtrain_yを代入し、w, bを導き出す。

x = tf.placeholder(tf.float32, name = "input")
y = tf.placeholder(tf.float32, name = "output")
w = tf.Variable(np.random.randn(), name = "weight")
b = tf.Variable(np.random.randn(), name = "bias")

活性化関数

y_pred = X * W + b

y_pred = tf.add(tf.mul(x, w), b)

損失関数

活性化関数で定義したy_predと、y(ここにはy_trainを代入)の差を2乗した(tf.pow(y_pred - y, 2))平均(tf.reduce_mean)を求めている。2乗している理由が、差が+になるか-になるか予想できないため、2乗し、すべて差を+にして、その平均値を出している。この

loss = tf.reduce_mean(tf.pow(y_pred - y, 2))

Optimizer

学習はOptimizerに損失関数をセットする事でおこなう。

learning_rate = 0.5
train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

TensorFlowで利用できるOptimizerは、下記のアルゴリズムが存在している。

Optimizer 日本語名
tf.train.GradientDescentOptimizer 勾配降下アルゴリズム
tf.train.AdadeltaOptimizer Adadeltaアルゴリズム
tf.train.AdagradOptimizer Adagradアルゴリズム
tf.train.AdagradDAOptimizer Adagrad双対平均アルゴリズム
tf.train.MomentumOptimizer Momentum(慣性項)アルゴリズム
tf.train.AdamOptimizer Adamアルゴリズム
tf.train.FtrlOptimizer FTRL(Follow The Reaularized Leader)アルゴリズム
tf.train.ProximalGradientDescentOptimizer 近位勾配降下アルゴリズム
tf.train.ProximalAdagradOptimizer 近位Adagradアルゴリズム
tf.train.RMSPropOptimizer RMSpropアルゴリズム

セッション

# セッション
with tf.Session() as sess:

変数の初期化

# 変数の初期化
    init_op = tf.initialize_all_variables()
    sess.run(init_op)

学習

    # トレーニング回数
    training_step = 1000
    validation_step = 100

    # トレーニング
    for step in range(training_step):
        sess.run(train_op, feed_dict={x:x_train, y:y_train})

        # 途中経過表示
        if step % validation_step == 0:
            loss_output = sess.run(loss, feed_dict={x:x_train, y:y_train})
            w_output = sess.run(w)
            b_output = sess.run(b)
            print "Step %i, cost %f, weight %f, bias %f" % (step, loss_output, w_output, b_output)

結果

Notebook

https://github.com/FaBoPlatform/TensorFlow/blob/master/notebooks/linear_regression.ipynb