반응형
1. 데이터 전처리
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras import layers #모듈(변수나 함수를 포함)만 불러오기
# BMI 데이터를 읽어 들이고 정규화하기
csv = pd.read_csv("bmi.csv")
# 몸무게와 키 데이터(정규화)
csv["weight"] /= 100
csv["height"] /= 200
X = csv[["weight", "height"]].as_matrix()
print(csv)
# 레이블
bclass = {"thin":[1,0,0], "normal":[0,1,0], "fat":[0,0,1]}
y = np.empty((20000,3)) # 2000x3 크기의 다차원 벡터 생성
for i, v in enumerate(csv["label"]):
y[i] = bclass[v] #"thin'이면, y[i]=[1,0,0] 와 같이 할당
# 훈련 전용 데이터와 테스트 전용 데이터로 나누기 --- (※2)
X_train, y_train = X[0:15000], y[0:15000]
X_test, y_test = X[15000:20000], y[15000:20000]
2. 모델 구조정의
# 모델 구조 정의하기
model = tf.keras.Sequential() #순차적 계층화 준비
model.add(layers.Dense(8, input_shape=(2,))) #입력 2개로부터 전달받는 8개 노드의 layer 생성
model.add(layers.Activation('relu')) #ReLU 활성화함수 채택
model.add(layers.Dropout(0.1)) #dropout ratio=10% (배치 훈련시 10% arc 무시)
model.add(layers.Dense(4)) #4개 노드의 layer 생성
model.add(layers.Activation('relu'))
model.add(layers.Dropout(0.1))
model.add(layers.Dense(3))
model.add(layers.Activation('softmax')) #분류(classification)을 위해 softmax 함수 사용
# 모델 구축하기
model.compile(
loss='categorical_crossentropy', #다중 교차엔트로피
optimizer="rmsprop", #최적화 기법 중 하나
metrics=['accuracy']) #정확도 측정
3. 모델 구조정의
# 데이터 훈련하기 --- (※5)
hist = model.fit(
X_train, y_train,
batch_size=100, #100개에 한 번씩 업데이터 실행
epochs=800, #훈련 데이터셋을 총 50회 반복 실험. 단, 조기중지될 수 있음
validation_split=0.2,
#validation data 분할 비율. 즉, 15000개 중에서 20%인 3000개를 validation용으로 분할 (데이터에 잘학습되었는지 확인)
callbacks=[tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=50)],
#'val_loss'를 monitor하여 감소하면 한 번 더(1) 참고 조기중지
verbose=1) #전 과정을 화면에 출력(1) 또는 미출력(0) 모드
# 테스트 데이터로 평가하기 --- (※6)
score = model.evaluate(X_test, y_test)
print('test_loss: ', score[0])
print('test_acc: ', score[1])
4. 모델 시각화
import matplotlib.pyplot as plt
fig, loss_ax = plt.subplots()
acc_ax = loss_ax.twinx()
loss_ax.plot(hist.history['loss'], 'y', label='train loss')
loss_ax.plot(hist.history['val_loss'], 'r', label='val loss')
acc_ax.plot(hist.history['accuracy'], 'b', label='train acc')
acc_ax.plot(hist.history['val_accuracy'], 'g', label='val acc')
loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('loss')
acc_ax.set_ylabel('accuray')
loss_ax.legend(loc='upper left')
acc_ax.legend(loc='lower left')
plt.show()
5. 모델 저장
#모델 save
model.save("dnn_BMI.h5")
6. 모델 구조 확인
#load and evaluate the saved model
from numpy import loadtxt
from tensorflow.python.keras.models import load_model
#load model
loaded_model = load_model("dnn_BMI.h5")
loaded_model.summary()
score = loaded_model.evaluate(X_test, y_test)
print('test_loss: ', score[0])
print('test_acc: ', score[1])
7. X_test값들의 확률, class분류 확인.
#X_test의 예측 클래스 확인하기
print("input값")
print(X_test)
print()
print("예측 확률")
y_pred_prob = model.predict_proba(X_test)
print(y_pred_prob)
print()
print("예측 class")
y_pred = model.predict_classes(X_test)
print(y_pred)
8. 임의의 값의 확률, class 분류확인
#임의의 값을 에측
X_new = [175, 75]
X_new[0]/=200
X_new[1]/=100
y_pred = model.predict_classes(np.array([X_new,]))
y_pred_prob = model.predict_proba(np.array([X_new,]))
print(y_pred, y_pred_prob)
9. 평균,최소,최대값들의 class 분류확인
#각종 임의의 값 예측
def predict_bmi(X_new):
y_pred = model.predict_classes(np.array([X_new,]))
y_pred_prob = model.predict_proba(np.array([X_new,]))
print(y_pred, y_pred_prob)
X_mean = [X_train[:,0].mean(), X_train[:,1].mean()] #normal (1)
X_min = [X_train[:,0].min(), X_train[:,1].min()] #normal (1)
X_max = [X_train[:,0].max(), X_train[:,1].max()] #normal (1)
X_min_max = [X_train[:,0].min(), X_train[:,1].max()] #thin (0)
X_max_min = [X_train[:,0].max(), X_train[:,1].min()] #fat (2)
print("새로운값 input값")
print("X_mean : ", X_mean)
print("X_min : ", X_min)
print("X_max : ", X_max)
print("X_min_max : ", X_min_max)
print("X_max_min : ", X_max_min)
print()
print("새로운값 class와 class별 확률")
predict_bmi(X_mean)
predict_bmi(X_min)
predict_bmi(X_max)
predict_bmi(X_min_max)
predict_bmi(X_max_min)
반응형