[ ML ] 모두를 위한 TensorFlow (2) 선형 회귀 기본

peter_yun
4 min readFeb 14, 2017

--

본 글은 홍콩과기대 김성훈 교수님의 강의를 바탕으로 함
(참고 : https://hunkim.github.io/ml/ )

Cost function

  • 예측치와 실제치의 차이의 제곱합을 cost라 함
  • 통계학에서는 ‘편차’라는 용어로 배웠었음
    (https://ko.wikipedia.org/wiki/%ED%8E%B8%EC%B0%A8)
  • 결국 회귀의 목표는 minimize cost(W,b)라고 할 수 있다
  • cost를 최소화하는 알고리즘은 여러가지가 있다.

Linear regression 구현하기

(주의) tensorflow module을 imort할 수 없다고 나올 때에는 가상 환경이 tensorflow를 설치한 환경인지 확인해보아야 한다. 필자는 django나 tensorflow를 다른 가상 환경에 세팅해두어서 가끔 실수를 하기도 했다.

import tensorflow as tfx_data = [1,2,3]
y_data = [1,2,3]
# Try to find values for W and b that compute y_data = W*x_data + b
# (We know that W should be 1 and b 0, but tf will
# figure that out for us )
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.random_uniform([1], -1.0, 1.0))

W과 b에 -1 부터 1 까지 랜덤한 값을 주겠다는 이야기입니다. 사실 1과 0임은 알 수 있지만 텐서플로우가 얼마나 잘 찾는지를 확인해보기 위해 랜덤한 값을 주는 것이라고 합니다. ( 미지수의 범위를 -1과 1사이로 제한했다고 보면 되는지 궁금하네요 )

# Our hypothesis (예측치)
hypothesis = W * x_data + b
# Simplified cost function
cost = tf.reduce_mean(tf.square(hypothesis - y_data))

가정과 cost를 수식으로 나타내었습니다.

# Minimize
a = tf.Variable(0.1) # Learning rate, alpha
optimizer = tf.train.GradientDescentOptimizer(a)
train = optimizer.minimize(cost)

이 부분은 블랙박스이며 자세한 알고리즘(Gradient Descent) 에 대한 이해는 생략하고 cost를 최소화할 수 있는 함수가 마련되어있다는 것만 알고 넘어가도록 하겠습니다.

# Before starting, initialize the variables.
# Lets run
init = tf.initialize_all_variables()
# Launch the graph
sess = tf.Session()
sess.run(init)

변수를 선언하고도 초기화시키지 않으면 오류가 납니다. 꼭 변수는 세선을 만든 후 처음으로 초기화를 해주어야 합니다.

# Fit the line
for step in range(2001):
sess.run(train)
if step % 20 == 0:
print (step, sess.run(cost), sess.run(W), sess.run(b))

이제 20번째 스텝마다의 cost, W, b 값들을 출력해보겠습니다. 아래는 소스코드와 콘솔 값입니다.

위 콘솔 결과를 보면 cost는 점차 0에 가까워지고 W는 1, b는 점차 0에 가까워 지는 것을 알 수 있습니다.

Placehoder 지정하기

위는 placeholder를 사용한 코드와 결과값입니다. x=5일 때, 약 10.9999를 x=7일 때, 약 14.999 를 예측했음을 알 수 있습니다.

  • placeholder를 사용하는 이유는 모델들을 재활용할 수 있기 때문에
  • X와 Y의 값이 지정되는 시점은 아래 코드가 실행될 때임
sess.run(train, feed_dict={X:x_data, Y:y_data})

--

--