본문 바로가기
Developer/Machine Learning

#5. Tensorflow로 간단한 linear regression 구현하기

by Doony 2017. 11. 25.

본 포스팅은 인프런에서 제공되는 "모두를 위한 딥러닝 - 기본적인 머신러닝과 딥러닝 강좌"를 참고하여 만들어졌습니다. 

인프런 URL: https://www.inflearn.com/

이번에는 텐서플로우를 통해 선형회귀 식을 구현하는 방법에 대해서 알아본다.


  Tensorflow로 간단한 Linear Regression 구현하기

기본적으로 선형회귀에 대한 것은 아래 포스팅에서 참고할 수 있고, 이번 포스팅은 선형 회귀식을 찾는 방법에 대해 알아본다.

#4. Linear Regression 머신러닝 선형회귀

cost는 W, b의 함수이다. 학습을 한다는 것은, W와 b를 조절해서 cost를 minimize하는 것을 말한다.

파이썬을 통해 아래 코드를 입력해보자.

import tensorflow as tf

x_train = [1, 2, 3]

y_train = [1, 2, 3]     # 실제 X, Y 데이터들.

W = tf.Variable(tf.random_normal([1]), name = 'weight')  

b = tf.Variable(tf.random_normal([1]), name = 'bias')

#여기서의 variable은 흔히 코딩에서 나오는 변수는 아니고, 텐서플로우가 자체적으로 변경시키고, trainable한 수라고 보면 된다.

#random_normal는 값을 모르니, 일단 랜덤으로 주자는 뜻. 1은 값이 1개라서.

hypothesis = x_train * W + b


cost = tf.reduce_mean(tf.square(hypothesis - y_train))     #식을 그대로 코딩으로 옮긴 것.

#reduce_mean - 평균 내주는 것. 행렬 크기에 맞게 다 계산해서 평균을 내준다.


optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)

train = optimizer.minimize(cost)


sess = tf.Session()

sess.run(tf.global_variables_initializer())        #variable이 있으므로, 이걸 꼭 넣어줘야됨. 위 세션처럼)


for step in range(2001):

sess.run(train)        # train에 미니마이징하는 걸 선언했음.

if step % 20 == 0:        #20번에 한번씩 프린팅할 수 있도록.

print(step, sess.run(cost), sess.run(W), sess.run(b))        #run을 하면, 그 값을 가져온다.

그 결과값은 다음과 같다. 보다시피, W는 1에 근접해지고, b는 0에 가까워지는 것을 볼 수 있다. (데이터셋이 y=x 위의 점들이었으니)

step  ||  cost  ||  W  ||  b

0 6.99608 [-0.31363818] [ 0.20949754]

20 0.119569 [ 0.62598193] [ 0.58583456]

40 0.0520691 [ 0.72715092] [ 0.59507459]

60 0.0467775 [ 0.74793327] [ 0.57060969]

80 0.0424795 [ 0.76053733] [ 0.54412651]

100 0.0385805 [ 0.77186346] [ 0.51858634]

120 0.0350394 [ 0.78259182] [ 0.49421772]

140 0.0318233 [ 0.79280996] [ 0.47099158]

160 0.0289024 [ 0.80254716] [ 0.44885671]

180 0.0262497 [ 0.81182671] [ 0.42776212]

Placeholders라는 개념을 다시 떠올려보자.

지난 포스팅을 보면 코드가 있는데, 일단 값을 따로 지정하지 않고 placeholder로 지정만 해놓고, 프린트할 때 수를 넣는 식이었다.

#3. TensorFlow 기본 구문


아무튼, 이번에는 그 기능을 통해 코드를 구현해보자.

import tensorflow as tf

x_train = tf.placeholder(tf.float32)

y_train = tf.placeholder(tf.float32) 

W = tf.Variable(tf.random_normal([1]), name = 'weight')  

b = tf.Variable(tf.random_normal([1]), name = 'bias')

hypothesis = x_train * W + b

cost = tf.reduce_mean(tf.square(hypothesis - y_train))   

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)

train = optimizer.minimize(cost)

sess = tf.Session()

sess.run(tf.global_variables_initializer())    


for step in range(2001):

    cost_val, W_val, b_val, _ = sess.run([cost, W, b, train],

        feed_dict = {x_train:[1,2,3], y_train:[1,2,3]})

    if step % 20 == 0:

        print(step, cost_val, W_val, b_val)      


결과값은 마찬가지로 유사하게 나온다. 이제 예측을 해보자.

위 코드에, 아래 코드를 추가한다.

print(sess.run(hypothesis, feed_dict={x_train: [5.5]}))

print(sess.run(hypothesis, feed_dict={x_train: [235.3]}))

print(sess.run(hypothesis, feed_dict={x_train: [43.3,  3.1]}))

기대되는 결과치는, x값과 유사한 y값이 도출되는 것. 실제로 그렇게 나온다.


왜 Placeholder 기능을 사용하는가?

그 이유는, 먼저 linear regression 모델을 만들어 놓고, 그 후에 학습 데이터만 끼워넣을 수 있기 때문이다. 


#2. TensorFlow 설치 - GPU

#4. Linear Regression 머신러닝 선형회귀

공감은 큰 힘이 됩니다.

두니월드로 놀러오세요.




댓글