본문 바로가기
Tensorflow

Simple Linear Regression with Tensorflow 2.0 (3)

by 청양호박이 2020. 1. 28.

이번에는 Simple Linear Regression에 대해서 Keras로 구성해 보겠습니다. 도데체 이렇게 간단한 Linear Regression (선형회귀) 구현하는데 이렇게 많은 방법으로 구현하는지 궁금하실수도 있을 것 같습니다. 자신이 보유한 Data를 가지고 원하는 결과를 얻기위해서 Modeling을 하는데 여러가지 방법이 있으며, 단계 별 고도화 되는 방법을 사용해서 구현이 가능하는 것을 보여드리고 싶었기 때문입니다.

 

Numpy Modeling -> Only Tensorflow Modeling -> High level API Modeling in Tensorflow (Keras)

 

이 모든것을 한번 보려면 가장 기초적인 문제에 대해서 적용해 보는게 이해가 가장 빠를 것이라 판단하였고, 가장 마지막 단계인 Keras를 사용해서 적용해 보겠습니다.

 

 

1. Keras 란??


사실 Keras는 Tensorflow 1.x 시절에도 별도로 Neural Network를 사용해 ML을 할 수 있는 High level API로써 많이 사용되는 패키지 였습니다. 단독으로 명성을 떨쳤던 과거를 뒤로하고, Tensorflow 2.0의 시대가 도래하며 TF 2.0의 High level API는 Keras로 단독 통일 되었습니다. 

 

Keras의 개발자도 Google에 속해져 있는 것을 보면, 점점 갈수록 Tensorflow와 Keras의 조합은 더욱 견고해 질 것 입니다.  사실 Keras는 DNN (Deep Neural Network)을 Modeling할 때 사용되며, 공식 사이트를 방문해 보아도 Keras를 통해 구현할 것을 권고하고 있습니다.

 

더 자세한 내용은 ....  https://keras.io/

 

Home - Keras Documentation

Keras: The Python Deep Learning library You have just found Keras. Keras is a high-level neural networks API, written in Python and capable of running on top of TensorFlow, CNTK, or Theano. It was developed with a focus on enabling fast experimentation. Be

keras.io

나중에 DNN에서 Layer개념을 더 자세히 다루어 보겠습니다. 인공신경망, 퍼셉트론, 역전파 알고리즘 등을 알아야 Keras코드에 대한 이해가 더 쉬울 것 입니다.

 

 

2. SLRA 구현


  • Dataset 준비 (training, test 용)
  • Keras Model 구성
  • fit( ), predict( ), evaluate( ) 메서드 구현

[Dataset 준비]

다른 방법과 동일하게 sci-kit learn에서 제공하는 make_regression을 통해 100개의 데이터를 준비합니다.

from sklearn.datasets import make_regression
import numpy as np
import matplotlib.pyplot as plt

X, y = make_regression(n_samples=100, n_features=1, bias=10.0, noise=10.0, random_state=2)
y = np.expand_dims(y, axis=1)

print(X.shape)
print(y.shape)

plt.scatter(X, y)
plt.show()

그 동안 봤던 분포를 가지는 데이터 100개가 준비되었습니다.

[Dataset 분할]

준비가 되었다면, 각 용도에 맞게 Training : Test = 80 : 20으로 분리합니다.

train_x = X[:80]
test_x = X[80:]

train_y = y[:80]
test_y = y[80:]

[Keras Model 구성]

사실 Layer로 따지면 Linear Regression의 Hypothesis는 1차 직선이기 때문에, 단일 Layer에 W(weight)와 b(bias)만 있으면 됩니다. 선형으로 node가 1개인 Layer를 딱 한개만 쌓으면 되겠네요. 사실 이 부분은 나중에 DNN할때 자세히 알아보고 지금은 그냥 그렇구나... Layer에는 node라는게 있고 그게 w랑 b를 관리하고 학습하는구나... 정도로만 알고 넘어가도 충분할 것 같습니다.

    def buildModel(self):
        self.model = tf.keras.Sequential()
        self.model.add(tf.keras.layers.Dense(1, activation='linear'))

        optimizer = tf.keras.optimizers.SGD(self.learning_rate)

        self.model.compile(loss='mse', optimizer=optimizer, metrics=['mse'])

우선 model을 생성합니다. 해당 model은 선형으로 쌓는 방법을 사용하겠다고 정의하면 생성됩니다. tf.keras.Sequential

그 다음에서 add 메서드를 통해서 layer를 차곡차곡 쌓아줍니다. SLRA에서는 node 1개를 가진 layer 1개를 생성할 것 입니다. 

 

이쯤되면... 기존에 Hypothesis를 설정하고, Loss계산하고, Gradient도 계산하고 막 그랬었는데... 뭔가 많이 빠졌네요?

  • Hypothesis : tf.keras.layers.Dense(1, activation='linear') 에서 activation='linear'가 대신하고
  • Loss : model.compile(loss='mse')에서 Mean Square Error가 대신하고
  • Gradient : tf.keras.optimizers.SGD 가 Stochastic Gradient Descent를 대신합니다.

이렇게 model 구성이 끝났습니다.

 

[fit 메서드]

    def fitModel(self, train_x, train_y):
        self.model.fit(train_x, train_y, batch_size=10, epochs=self.epochs, shuffle=True)

model에 대한 학습 메서드 입니다. 학습용 독립변수, 종속변수를 입력하고... mini-batch size, 반복횟수 등을 설정하고 실행하면 자동으로 학습을 진행합니다.

Train on 80 samples
Epoch 1/100
80/80 [==============================] - 0s 2ms/sample - loss: 3222.6884 - mse: 3222.6882
Epoch 2/100
80/80 [==============================] - 0s 202us/sample - loss: 2355.1889 - mse: 2355.1890
Epoch 3/100
80/80 [==============================] - 0s 176us/sample - loss: 1728.1482 - mse: 1728.1482
Epoch 4/100
80/80 [==============================] - 0s 192us/sample - loss: 1280.2561 - mse: 1280.2561
Epoch 5/100
80/80 [==============================] - 0s 158us/sample - loss: 951.1601 - mse: 951.1600
Epoch 6/100
80/80 [==============================] - 0s 172us/sample - loss: 719.9712 - mse: 719.9712
Epoch 7/100
80/80 [==============================] - 0s 164us/sample - loss: 545.5367 - mse: 545.5367
Epoch 8/100
80/80 [==============================] - 0s 193us/sample - loss: 421.5635 - mse: 421.5635
Epoch 9/100
80/80 [==============================] - 0s 196us/sample - loss: 329.8446 - mse: 329.8447
Epoch 10/100
80/80 [==============================] - 0s 204us/sample - loss: 263.5569 - mse: 263.5569

학습에 대한 Loss 및 MSE 개선 수치가 표시됩니다.

 

[predict 메서드]

    def predictModel(self, train_x):
        return self.model.predict(train_x)

해당 메서드는 학습된 model에 원하는 독립변수 군을 입력하면 그에 맞는 결과를 제공합니다. 이를 기준으로 학습된 model을 plot으로 그려보면 아래와 같습니다.

학습이 잘 되었음을 확인 할 수 있습니다.

 

[evaluate 메서드]

    def evalModel(self, test_x, test_y):
        return self.model.evaluate(test_x, test_y)

test용 데이터로 해당 모델에 적용하여, 나온 값에 대해서 결과를 도출하는 메서드 입니다. 이를 위해 입력으로 test용 독립변수군, 종속변수군을 넣어줍니다.

20/20 [==============================] - 0s 3ms/sample - loss: 101.6200 - mse: 101.6200
[101.62004089355469, 101.62004]

mse가 101.6200이기 때문에, 기존에 봤었던 RMSE기준으로 10 ~ 11 사이에 존재합니다. 이를 통해서 정상적으로 model이 구성되었음을 알 수 있습니다.

 

다음에 Keras를 통해서 modeling을 한다면 좀 더 많은 기능을 사용해보도록 하겠습니다.

 

-Ayotera Lab-

댓글