When will you grow up?

Tensorflow로 Linear Regression 구현하기 본문

02. Study/Tensorflow

Tensorflow로 Linear Regression 구현하기

미카이 2017. 1. 23. 14:12

김성훈 교수님께 감사의 말씀드림니다.


모두를 위한 머신러닝/딥러닝 강의 를 토대로 만들어 졌습니다.


문제가 되거나, 저작권 위반이 된다면 

댓글이나 메일로 문의 주시면 삭제 하겠습니다.


Linear Regression?

->회귀분석이라고 말을 하는데 데이터를 선형적으로 예측하기 위한 모델 이라고 생각하면 편하다.


Hypothesis(가설)

->Linear Regression 모델의 가설을 세운다

H(x) = Wx + b 

(W는 Weight 기울기, b는 bias 절편)




Cost function

가설로 세운 데이터H(x)값과 실제 데이터 y값의 차이를 구해서 더하는 것



값을 가장 작게 하는 W값과 b의 값을 구하는 것이 Linear regression 학습의 목표이다.




구현코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#tensorflow를 임폴트하고 그 이름을 tf로 별명을 붙여준다 tf를 사용하는것은 다 tensorflow 사용이라고 생각하심 된다.
import tensorflow as tf
 
#1행 3열 데이타   2차원으로 표현하면 (1,1) (2,2) (3,3) 이 되고, 우리의 가설의 직선 그래프를 그릴수 있다
x_data = [123]
y_data = [123]
 
#cost 함수에서 궁극적으로 찾고자 하는 기울기(W) 와 y절편(b)의 초기값을 설정한다
#tf.random_uniform 함수는 정규분포 난수를 생성하는 함수 (배열shape,최소,최대) 파라미터로 구성 -1.0~ 1.0  
#[2:2]라고 초깃값을 주어지면
#[1,1]
#[1,1] 이런형식으로 생긴다
= tf.Variable(tf.random_uniform([1], -1.01.0, dtype = tf.float32))#1개의 난수를 만드는데 범위는 -1.0~1.0이다 행렬 형식으로 잡아준다 
= tf.Variable(tf.random_uniform([1], -1.01.0, dtype = tf.float32))
 
 
= tf.placeholder(tf.float32)
= tf.placeholder(tf.float32)
 
 
#가설 H(x) = Wx + b
#placeholder사용시 차후 나중에 값을 넣어서 확인해 볼 필요가 있어서 사용되는데,
#그래서 가설을 W * X +b로 바뀌였다 여기서는 X 가 x_data라고 생각하자.
#[-0.36494708 -0.79782605 -0.42870998] 이런값으로 표현이 되는데,
#W는 1*1 ,x_data는 1*3 이므로 결과는 1*3행 결과가 나온다 +b는 모든 행렬요소에 대해 다 더해진다.
hypothesis = W * X + b
 
 
#cost function
#간단하게 공식은 hypothesis 나온값에 실제데이터(y_data) 를 빼면 거리가 나오게 된다
#이 값들을 tf.square() 제곱을 하고,
#tf.reduce_mean 합계에 대해 평균을 내부적으로 계산하는 함수  
#placeholder사용으로 인하여 hypothesis - y_data 인데 y_data를 나중에 넣어주기 위해 Y를 삽입
cost = tf.reduce_mean(tf.square(hypothesis - Y))
#또는
#cost = tf.reduce_mean(tf.pow(tf.sub(hypothesis , Y),2)) 
 
#cost값 최소화 하기
rate = tf.Variable(0.1)
optimizer = tf.train.GradientDescentOptimizer(rate)
train = optimizer.minimize(cost)
 
#초기화를 시켜주는 구문 ->텐서플로우 구동하기 전에 그래프에 연결된 모든 변수를 초기화 해야한다.
init = tf.initialize_all_variables()
#세션 실행
sess = tf.Session()
sess.run(init)
print('W값은:',sess.run(W),'b값은:',sess.run(b))
 
# 파이썬 3.x버전부터는 xrange 가 range로 통합되므로써 range를 사용
# 0부터 2000까지 2001번 반복되는 반복문 
# 너무 많은 출력을 피하기 위해서 step별로 계속 진행되다가 20번에 한번씩 출력
for step in range(2001):
    sess.run(train,feed_dict={X:x_data,Y:y_data})
    if step % 20 == 0:
        print('진행단계:',step,'cost값은',sess.run(cost,feed_dict={X:x_data,Y:y_data}),'W값은:',sess.run(W),'b값은:',sess.run(b))
 
 
        
#우리가 cost값이 최소화 되서 W 가중치 값와 bias값 b가 제대로 나와서 가설이 잘 예측되서 작동되는지 확인하는 방법
print('x값이 5일때 y값 예측',sess.run(hypothesis,feed_dict={X:5})) 
print('x값이 6일때 y값 예측',sess.run(hypothesis,feed_dict={X:6}))
print('x값이 7,7일때 y값 예측',sess.run(hypothesis,feed_dict={X:[7,7]}))
 
cs


결과


Comments