텐서플로를 이용한 선형 모형 :: Python 빅데이터 처리와 시각화 - mindscale
Skip to content

텐서플로를 이용한 선형 모형

선형 모형

  • 선형 모형(linear model): $y = wx + b$ 형태의 모형
    • $x$로 $y$를 예측
    • $w$: 직선의 기울기
    • $b$: $y$ 절편($x = 0$일 때 $y$의 값)

아주 간단한 데이터

import numpy as np
x = np.array([0, 1, 2], dtype='float32')
y = np.array([2, 3, 4], dtype='float32')

그림으로 그려보기

import matplotlib.pyplot as plt
plt.plot(x, y, 'ro')
plt.plot(x, y, '--', color='grey')
[<matplotlib.lines.Line2D at 0x233b171f390>]

텐서플로를 이용해 선형 모형에 적합시키기

모형 적합(model fitting): 데이터 x, y를 이용해 모형의 파라미터 w, b를 찾는 것

colab을 사용할 경우 아래 코드를 사용해 텐서플로 버전을 2.0으로 설정한다.

try:
    %tensorflow_version 2.x
except:
    pass

텐서플로를 임포트한다.

import tensorflow as tf

모형을 만든다.

model = tf.keras.models.Sequential()

레이어(layer)를 만든다. 자세한 내용은 나중에.

layer = tf.keras.layers.Dense(1, input_shape=(1,))

모형에 레이어를 추가한다.

model.add(layer)

모형을 설정한다. optimizer는 모형을 적합시키는 알고리즘이다. 일단 sgd로 설정한다.

loss는 모형의 정확성을 측정하는 방법이다. 여기서는 mse를 사용한다.

mse는 평균오차제곱(Mean Squared Error)이라는 뜻으로 예측 오차의 제곱을 평균 낸 값이다.

model.compile(optimizer='sgd', loss='mse')

x와 y로 모형을 적합시킨다. 모형 적합은 (1) 데이터를 입력하고 (2) 오차를 구해서 (3) 파라미터를 수정하는 순서로 이뤄진다. 이를 많이 반복하면 할 수록 파라미터가 점점 더 정확해진다. epochs는 이 과정을 몇 번 반복할지 지정한다. 여기서는 50번 반복하게 했다.

history = model.fit(x, y, epochs=100, verbose=0)

적합된 파라미터를 확인한다. 첫번째 파라미터가 $w$에 해당하는 값이다. 1에 가까워야한다. 두번째 파라미터는 $b$에 해당하는 값으로 2에 가까워야 한다.

model.weights
[<tf.Variable 'dense_9/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[1.0576546]], dtype=float32)>,
 <tf.Variable 'dense_9/bias:0' shape=(1,) dtype=float32, numpy=array([1.880203], dtype=float32)>]

에포크마다 loss가 얼마나 감소했는지를 확인한다.

plt.plot(history.history['loss'])
[<matplotlib.lines.Line2D at 0x233b34ec358>]

텐서보드

텐서플로의 실행 상태를 관찰할 수 있는 도구

아래와 같이 실행

%load_ext tensorboard
%tensorboard --logdir logs

만약 실행이 안될 경우 현재 폴더에서 명령창을 열고 tensorboard --logdir logs라고 입력한 후, http://localhost:6006 에 접속한다.

모형 적합 과정을 위와 똑같이 진행한다.

model = tf.keras.models.Sequential([tf.keras.layers.Dense(1, input_shape=(1,))])
model.compile(optimizer='sgd', loss='mse')

모형을 적합시킬 때 텐서플로에 연동되도록 설정해준다.

history = model.fit(x, y, epochs=100, verbose=0, callbacks=[tf.keras.callbacks.TensorBoard('logs')])