본 포스팅은 인프런에서 제공되는 "모두를 위한 딥러닝 - 기본적인 머신러닝과 딥러닝 강좌"를 참고하여 만들어졌습니다.
인프런 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로 지정만 해놓고, 프린트할 때 수를 넣는 식이었다.
아무튼, 이번에는 그 기능을 통해 코드를 구현해보자.
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 모델을 만들어 놓고, 그 후에 학습 데이터만 끼워넣을 수 있기 때문이다.
#4. Linear Regression 머신러닝 선형회귀
'Developer > Machine Learning' 카테고리의 다른 글
#7. Tensorflow로 linear regression cost 최소화 구현하기 (124) | 2017.11.26 |
---|---|
#6. Linear Regression의 cost 최소화 알고리즘 (583) | 2017.11.25 |
#4. Linear Regression 머신러닝 선형회귀 (587) | 2017.11.25 |
#3. TensorFlow 기본 구문 (431) | 2017.11.16 |
#2. TensorFlow 설치 - GPU (596) | 2017.11.13 |
댓글