본문 바로가기
데이터 과학 관련 스터디/모두의 딥러닝

[모두의 딥러닝] 14장 베스트 모델 만들기

by inhovation97 2020. 7. 23.

오늘은 14장 '베스트 모델 만들기'가 주제입니다.

데이터셋은 와인의 속성 13개와 레이블이 레드와인 : 0, 화이트와인 : 1 입니다. 이진분류 모델을 만드는 데에 있어서 베스트 모델을 만들어 저장하는 법이 주제입니다!

 

우선 이제까지 했던 것처럼 모델을 적용해보겠습니다. 전처리 과정이 없고, 계속 똑같이 인공신경망으로 모델을 만들기때문에 코드는 동일합니다.

 

from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint, EarlyStopping

import tensorflow as tf
import matplotlib as plt

# seed값 설정
seed=0
np.random.seed(seed)
tf.random.set_seed(3)

# 데이터 입력
df_pre = pd.read_csv('deeplearning/dataset/wine.csv', header=None)
df = df_pre.sample(frac=1)

dataset=df.values
X = dataset[:,0:12]
Y = dataset[:,12]

# 모델 설정
model = Sequential()
model.add(Dense(30, input_dim=12, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 모델 컴파일
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# 모델 실행
model.fit(X,Y, epochs=200, batch_size=200)

# 결과 출력
print('\n Accuracy: %.4f'%(model.evaluate(X,Y)[1]))

 

 

<모델 업데이트하기>

 

 

모델의 에포크(epoch)마다 정확도를 기록하고, 모델의 오차값이 개선되는 모델만을 저장하는 코드를 짜보겠습니다.

# 모델 업데이트하기

from keras.callbacks import ModelCheckpoint

import os
MODEL_DIR = './model/'               # 모델을 저장하는 폴더
if not os.path.exists(MODEL_DIR):    # 만일 위의 폴더가 존재하지 않으면
    os.mkdir(MODEL_DIR)              # 이 이름의 폴더를 만들어줌
    
modelpath='./model/{epoch:02d}-{val_loss:.4f}.hdf5'

checkpointer = ModelCheckpoint(filepath=modelpath, monitor ='val_loss', verbose=1, save_best_only=True) # val_loss는 테스트 데이터 오차, verbose는 해당 함수의 진행사항을 알려주는 파라미터
model.fit(X,Y, validation_split=0.2, epochs=200, batch_size=200, verbose=0, callbacks=[checkpointer])

케라스 콜백 함수로부터 ModelCheckpoint() 함수를 불러옵니다. checkpointer라는 변수로부터 모니터할 값을 지정해줍니다.

테스트 오차는 케라스 내부에서 val_loss로 기록됩니다. (참고로 학습정확도는 acc, 테스트셋 정확도는 val_acc, 학습셋 오차는 loss로 각각 기록됩니다.)

모델의 이름은 epoch와 val_loss로 구분하기 쉽게 지정해주고, save_best_only=True를 넣어 오직 오차가 개선된 모델만 저장하도록 입력합니다.

이제 아까 컴파일까지 해두었던 model을 다시 적용시켜봅시다!

 

 

 

이렇게 모델의 오차가 개선된 모델들만을 지정해준 경로에 저장됨을 알 수 있습니다.

 

 

 

<모델의  학습 정도>

 

모델을 업데이트하는 과정에서 에포크를 얼마나 지정할지를 결정해야합니다. 앞서 13장에서도 다뤘듯이 모델은 반복 횟수가 너무 적어도 안되고, 또 너무 많으면 과적합에 빠집니다. 모델의 학습시간과 정확도에 대한 그래프를 한 번 그려봅시다!

import matplotlib.pyplot as plt
# 모델 실행 및 저장
history = model.fit(X,Y, validation_split=0.33, epochs=3500, batch_size=500)

# y_vloss에 테스트셋으로 실험 결과의 오차 값을 저장
y_vloss=history.history['val_loss']

# y_acc에 학습셋으로 실험 결과의 정확도의 값을 저장
y_acc=history.history['accuracy']

# x값을 지정하고 정확도를 파란색, 오차를 빨간색으로 표시
x_len = np.arange(len(y_acc))
plt.plot(x_len, y_vloss, 'o', c = 'red', markersize=3)
plt.plot(x_len, y_acc, 'o', c = 'blue', markersize=3)
plt.show()

책에서처럼 완전 명확한 그래프는 아니더라도 학습이 늘어날수록 모델이 과적합되는 것을 알 수 있습니다.

 

이렇기 때문에 모델의 테스트셋의 오차가 작아진 적당한 시기에 학습을 멈추게 하는 함수를 이용해보도록 하겠습니다. 

이번에는 from.callbacks import EarlyStopping의 함수를 불러오겠습니다.

에포크 횟수와 배치 크기 등을 설정하고 오차가 개선되기 까지의 에포크 횟수를 설정해야합니다.

from keras.callbacks import EarlyStopping

early_stopping_callback = EarlyStopping(monitor='val_loss', patience=100)
model.fit(X,Y, validation_split=0.33, epochs=2000, batch_size=500, callbacks=[early_stopping_callback])

에포크는 2000이지만, 100번의 학습동안 오차가 좋아지지 않았기 때문에 119번에서 모델이 학습을 종료했습니다. 위에 모델 저장 코드를 이용하여 최종 모델을 저장하면 되겠습니다!

댓글