티스토리 뷰

반응형

딥러닝을 사용할 수 있는 프레임워크 Tensorflow를 통해 선형회귀(Linear Regression)을 구현하겠습니다.


선형회귀란 데이터를 선형적으로 표현할 수 있는 것을 말합니다.


기본적으로 2차원 그래프에서 한 직선을 구한다고 생각하면 됩니다.


tensorflow 소스를 통해 살펴보겠습니다.


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
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
 
x_data = [4.03911.31979.56130.59783.53160.15401.68997.31724.50922.9632]
y_data = [11.421510.011230.29911.062513.1776-3.19766.736723.855014.895111.6137]
 
= tf.placeholder(tf.float32)
= tf.placeholder(tf.float32)
 
= tf.Variable([.3],tf.float32)
= tf.Variable([.3],tf.float32)
 
Hypothesis = X * W + b
 
cost = tf.reduce_mean(tf.square(Y-Hypothesis))
 
train = tf.train.AdamOptimizer(0.01).minimize(cost)
 
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(1001):
    c, _ = sess.run([cost,train], feed_dict={X:x_data,Y:y_data})
    if i%100==0:
        print('cost:',c)
 
print('Finish')
cs


일단 소스는 위와 같습니다. 27줄로 굉장히 짧습니다.


데이터는 무작위로 10개의 점을 구성하였습니다. 


1
2
plt.scatter(x_data,y_data)
plt.show()
cs


이 두줄로 그래프를 살펴보면 아래와 같습니다. 


이 점들을 하나의 직선으로 표현하려면 어떻게 긋는게 가장 이상적일까요?


그러한 직선을 찾는것이 Linear Regression이라고 할 수 있습니다.

cs

X,Y와 W,b 각각을 placeholder와 Variables로 선언해 준 후에


네트워크를 구성합니다.


예측결과 Hypothesis는 X*W+b의 형태일 것이며


간단한 데이터이기 때문에 활성화함수(sigmoid, relu, tanh 등)은 필요하지 않습니다.


예측값과 실제값 사의의 오차값 cost는 (Y-Hypothesis)^2 를 평균낸 값으로 


이 cost값을 줄이기 위한 학습을 합니다.


이때, 훈련 알고리즘으로 AdamOptimizer를 사용하였고 Learning rate는 0.01로 하였습니다.


총 1001번을 훈련하는 동안 cost가 줄어드는 것을 확인 할 수 있고


학습이 잘 완료되면 Finish가 출력됩니다.


1
2
3
4
5
6
= np.arange(0,10,0.1)
predicted_x = sess.run(Hypothesis,feed_dict={X:x})
 
plt.plot(x,predicted_x)
plt.show()
 
cs

학습이 잘 되었는지 확인하기 위해 그래프를 그려봅니다.

x를 0~10의 범위를 0.1단위로 생성하여 학습된 네트워크에 넣어봅니다.

네트워크를 통과한 값들은 predicted_x라는 변수에 넣어주고

plot한 결과 왼쪽 아래와 같습니다.




0~10 범위에서 0~30의 출력을 하는 직선이 만들어졌습니다.


위의 점으로 표현한 그래프에서 점들을 가장 잘 표현하는 직선이 그려졌음을 알 수 있습니다.






반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday