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
그리드형