TensorFlow 1次関数の係数を求める
今回はTensorFlowを使って1次関数の係数を求めてみます。サンプル
1次関数 y = W * x + b のWとbを求めてみます
import numpy as np
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
# 1次関数 y = W * x + b のWとbを求めるサンプル
# yとxにサンプル値を入れて計算させてWとbを予想させる
# 1次関数の係数(W、b)となる変数を定義。初期値は両方5.0
W = tf.Variable([5.0], dtype=tf.float32)
b = tf.Variable([5.0], dtype=tf.float32)
# 1次関数のx,yの入れ物を定義
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
# 1次関数を定義
keisan = W * x + b
# サンプルの計算値とyの差を2乗(tf.square)したものを
# すべて足し合わせる処理(tf.reduce_sum)の定義
loss = tf.reduce_sum(tf.square(keisan - y))
# ↑で定義した差の2乗の合計値がより小さくなるように操作する処理を定義
# 2乗させないと差はマイナス値になり、どこまでも小さくなる。
# 2乗させることでマイナス値はなくなる(-1 * -1 = 1)
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
# x,yにセットされるサンプルデータ
# y = 2 * x + 1 となるようなデータを用意
x_sample = [1, 2, 3, 4, 5]
y_sample = [3, 5, 7, 9, 11]
# 定義してきたもの処理を開始する
sess = tf.Session()
# 変数を使用するため以下で初期化
sess.run(tf.global_variables_initializer())
# 処理のメイン
for i in range(1000):
# Wとbの変数の変わり具合を表示
print("W(2が正解):" + str(sess.run(W)) + "\tb(1が正解):" + str(sess.run(b)))
# 変数の調整
sess.run(train, {x: x_sample, y: y_sample})
イメージ
W、bに初期値として5をセットして処理を開始したので、最初に5で計算して、だんだんW→2、b→1に近くなります。
最終的にはW→1.99999905、b→1.00000334で落ち着きました。
もっと単純なサンプル
Wが5からスタートして100になるまでの変化を見てみます
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
# W = 100 を求めるサンプル
# 変数を定義。初期値は5.0
W = tf.Variable([5.0], dtype=tf.float32)
# 変数Wと100の差を2乗(tf.square)したものを定義
loss = tf.square(W - 100)
# ↑で定義した差の2乗の合計値がより小さくなるように操作する処理を定義
# 2乗させないと差はマイナス値になり、どこまでも小さくなる。
# 2乗させることでマイナス値はなくなる(-1 * -1 = 1)
optimizer = tf.train.GradientDescentOptimizer(0.3)
train = optimizer.minimize(loss)
# 定義してきたもの処理を開始する
sess = tf.Session()
# 変数を使用するため以下で初期化
sess.run(tf.global_variables_initializer())
# 処理のメイン
for i in range(21):
# Wとbの変数の変わり具合を表示
print("W(100が正解):" + str(sess.run(W)))
# 変数の調整
sess.run(train)
イメージ
tf.train.GradientDescentOptimizerに渡す値を0.3→0.4にすると、もっと早く100に辿り着きます
イメージ
ページのトップへ戻る