TensorFlow Python
(모두를 위한 딥러닝) Gradient descent
kjun.kr
2017. 10. 31. 21:38
728x90
728x170
import tensorflow as tf
X(데이터), Y(결과) 를 정의한다.
x_data = [1, 2, 3]
y_data = [1, 2, 3]
W 에 랜덤값을 준다.
W = tf.Variable(tf.random_normal([1]), name='weight')
X,Y 노드를 만든다.
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
가설을 세우고
hypothesis = X * W
cost 를 계산한다.(square 제곱)
cost = tf.reduce_mean(tf.square(hypothesis - Y))
==========
0.1 만큼 움직이도록 최소화알고리즘에 사용한다.
learning_rate = 0.1
줄어든 값을 계산하고
gradient = tf.reduce_mean((W * X - Y) * X)
W 값에서 계산한 값을 빼고
descent = W - learning_rate * gradient
뺀값을 W값에 대입하도록 한다. -> 이런식으로 계속 반복하여 cost 를 최소화 한다.
update = W.assign(descent)
==========
위 ========== 사이의 내용은 아래의 두줄 코드로 바꿀 수 있다.
cost 를 최소화하도록 훈련시키도록 한다.
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)
루프 내부도 변경되어야한다.
for step in range(100):
print(step, sess.run(W))
sess.run(train)
세션을 정의하고 변수를 초기화한다.
sess = tf.Session()
sess.run(tf.global_variables_initializer())
21번 만큼 루프를 돌면서 비교값을 계속 최소화 시켜나간다.
for step in range(21):
sess.run(update, feed_dict={X: x_data, Y: y_data})
print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run(W))
결과
(0, 0.94110894, array([ 0.5509274], dtype=float32)) (1, 0.26769316, array([ 0.76049465], dtype=float32)) (2, 0.076143883, array([ 0.87226379], dtype=float32)) (3, 0.021658683, array([ 0.93187404], dtype=float32)) (4, 0.0061607012, array([ 0.96366614], dtype=float32)) (5, 0.0017523728, array([ 0.98062193], dtype=float32)) (6, 0.00049845403, array([ 0.98966503], dtype=float32)) (7, 0.0001417833, array([ 0.994488], dtype=float32)) (8, 4.0330586e-05, array([ 0.99706024], dtype=float32)) (9, 1.1471246e-05, array([ 0.99843216], dtype=float32)) (10, 3.2631249e-06, array([ 0.99916381], dtype=float32)) (11, 9.2822262e-07, array([ 0.99955404], dtype=float32)) (12, 2.638879e-07, array([ 0.99976218], dtype=float32)) (13, 7.5077573e-08, array([ 0.99987316], dtype=float32)) (14, 2.1349843e-08, array([ 0.99993235], dtype=float32)) (15, 6.0727494e-09, array([ 0.99996394], dtype=float32)) (16, 1.7274111e-09, array([ 0.99998075], dtype=float32)) (17, 4.9048293e-10, array([ 0.99998975], dtype=float32)) (18, 1.4032746e-10, array([ 0.99999452], dtype=float32)) (19, 4.0156323e-11, array([ 0.99999708], dtype=float32)) (20, 1.1581847e-11, array([ 0.99999845], dtype=float32))
결과의 순서는
루프 / COST / W
[1,2,3] 의 결과가 [1,2,3] 이 나오려면 어떤 수를 곱해야하는지를 알아내는 것이라고 보면된다.
결과를 보면 알겠지만 0.55091274 부터 시작해서 점점 1에 가깝게 변하고 있다.
즉 결과는 W 는 1 이어야한다.
마지막에 W 가 1에 가까운 것을 알수 있다.
COST 는 낮을수록 좋은것이다.
만약에
x_data = [1, 2, 3]
y_data = [2, 4, 6]
이렇게 값을 주게되면 W 는 2 이어야한다.
실제 돌리면 아래와 같이 2에 가까운 W 값이 나온다.
0, 0.91811532, array([ 1.55644727], dtype=float32)) (1, 0.26115283, array([ 1.76343858], dtype=float32)) (2, 0.074283406, array([ 1.87383389], dtype=float32)) (3, 0.02112958, array([ 1.93271136], dtype=float32)) (4, 0.0060101724, array([ 1.96411276], dtype=float32)) (5, 0.0017095689, array([ 1.98086011], dtype=float32)) (6, 0.00048626671, array([ 1.98979211], dtype=float32)) (7, 0.00013831869, array([ 1.99455571], dtype=float32)) (8, 3.9345487e-05, array([ 1.9970963], dtype=float32)) (9, 1.1191744e-05, array([ 1.99845135], dtype=float32)) (10, 3.1841603e-06, array([ 1.999174], dtype=float32)) (11, 9.0532711e-07, array([ 1.99955952], dtype=float32)) (12, 2.5757623e-07, array([ 1.99976504], dtype=float32)) (13, 7.3224314e-08, array([ 1.99987471], dtype=float32)) (14, 2.0887404e-08, array([ 1.99993312], dtype=float32)) (15, 5.9203416e-09, array([ 1.99996436], dtype=float32)) (16, 1.6977234e-09, array([ 1.99998093], dtype=float32)) (17, 4.8156323e-10, array([ 1.99998987], dtype=float32)) (18, 1.3557629e-10, array([ 1.99999464], dtype=float32)) (19, 3.8198777e-11, array([ 1.99999714], dtype=float32)) (20, 1.1581847e-11, array([ 1.99999845], dtype=float32))
728x90
그리드형