텐서플로우 단원에서 설명 드렸던 선형회귀를 케라스로 구현해 보겠습니다. 선형 회귀에 대한 이론적인 설명은 이전 단원을 참고해 주십시요. 여기에서는 그냥 케라스가 이렇게 간단하구나 정도만 확인 하시면 됩니다.
입니다. 그 내용은
먼저 필요한 모듈을 import하고, 데이터도 numpy를 이용해서 그냥 읽습니다.
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import keras
from keras.models import Sequential
from keras.layers.core import Dense
from keras.optimizers import RMSprop
from mpl_toolkits.mplot3d import Axes3D
raw_data = np.genfromtxt('x09.txt', skip_header=36)
xs = np.array(raw_data[:,2], dtype=np.float32)
ys = np.array(raw_data[:,3], dtype=np.float32)
zs = np.array(raw_data[:,4], dtype=np.float32)
#==== 입력 데이터를 보기위한 테스트 코드 =====
fig = plt.figure(figsize=(12,12))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xs, ys, zs)
ax.set_xlabel('Weight')
ax.set_ylabel('Age')
ax.set_zlabel('Blood fat')
ax.view_init(15, 15)
plt.show()
어떤 데이터 인지 궁급하여 한번 그려보았습니다. 다음과 같은 3차 그래프가 만들어 졌습니다.
텐서플로우를 사용하여 알아내고 싶은건 위의 데이터를 하나의 직선으로 표현하려는 것입니다. 일단 읽은 데이터를 변환하고 placeholder로 X, Y도 선언해 둡니다.
전체 코드를 보면 다음과 같습니다.
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import keras
from keras.models import Sequential
from keras.layers.core import Dense
from keras.optimizers import RMSprop
from mpl_toolkits.mplot3d import Axes3D
raw_data = np.genfromtxt('x09.txt', skip_header=36)
xs = np.array(raw_data[:,2], dtype=np.float32)
ys = np.array(raw_data[:,3], dtype=np.float32)
zs = np.array(raw_data[:,4], dtype=np.float32)
x_data = np.array(raw_data[:,2:4], dtype=np.float32)
y_data = np.array(raw_data[:,4], dtype=np.float32)
y_data = y_data.reshape((25,1))
rmsprop = RMSprop(lr=0.01)
model = Sequential()
model.add(Dense(1,input_shape=(2,)))
model.compile(loss='mse',optimizer=rmsprop)
model.summary()
hist = model.fit(x_data, y_data, epochs=1000)
print(hist.history.keys())
print("100Kg 40세 혈중지방함량치=",model.predict(np.array([100,40]).reshape(1,2)))
print("60Kg 25세 혈중지방함량치=",model.predict(np.array([60,25]).reshape(1,2)))
W_, b_ = model.get_weights()
x = np.linspace(20, 100, 50).reshape(50,1)
y = np.linspace(10, 70, 50).reshape(50,1)
X = np.concatenate((x,y), axis=1)
Z = np.matmul(X, W_) + b_
fig = plt.figure(figsize=(12,12))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, Z)
ax.scatter(xs, ys, zs)
ax.set_xlabel('Weight')
ax.set_ylabel('Age')
ax.set_zlabel('Blood fat')
ax.view_init(15, 15)
plt.show()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 1) 3
=================================================================
Total params: 3
Trainable params: 3
Non-trainable params: 0
100Kg 40세 혈중지방함량치= [[350.53384]]
60Kg 25세 혈중지방함량치= [[219.5949]]