딥러닝 모델 자동 성능개선
모델을 설계하고, 출력값을 확인해보면,
출력할 때마다 결과값이 달라지는 것을
확인할 수 있다.
사람이 컴퓨터 옆에 앉아서 일일이 결과값을
비교해보고 가장 높은 결과값이 나오는 것을
확인하기에는 시간이 많이 소요된다.
많은 결과값 중에 향상된 결과값을 보여주는
모델만 정리해서 저장하는 기능이 있으면
결과값 관리가 더 편리해지겠다.
keras에는 ModelCheckpoint 함수를
제공한다. 테스트오차, 학습 정확도,
테스트셋 정확도, 학습셋 오차등을 기준으로
해서 더 나아진 결과만 저장할 수 있도록
하는 함수다.
또한 성능이 개선되지 않는 지점에 도달하면
자동으로 학습을 멈춰주는 함수도 keras에서
지원한다. 바로 EarlyStopping()함수다.
실전 예제
케라스에서 데이터를 로드하고,
모델을 생성 / 컴파일 / 생성하는 작업은
아래 글을 참고하길 바란다.
아래 코드는 와인 데이터를 불러와서,
모델을 설계하고, 컴파일 하는 과정이다.
은닉층은 3개, 출력층은 1개로 구성된
모델이다.
와인 데이터는 여러가지 변수들을 종합해
레드와인과 화이트와인을 분류하는 이항
분류이기 때문에, 출력층의 활성화 함수는
sigmoid()함수를 사용한다.
또한 모델 컴파일 부분에서 오차 함수는
binary_crossentropy() 함수를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint, EarlyStopping
import pandas as pd
import numpy
import tensorflow as tf
import matplotlib.pyplot as plt
import os
# seed 값 설정
seed = 0
numpy.random.seed(seed)
tf.compat.v1.set_random_seed(seed)
# 데이터 입력
df_pre = pd.read_csv('./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'])
|
cs |
모델을 저장하기 위해서는 먼저 경로
설정이 필요하다. 만약 /model/ 경로가
존재하지 않으면 디렉토리를 새로 만들어서
모델을 저장한다.
모델명은 epoch와 val_loss을 입력받는다.
모델의 개선정도를 나타내는 checkpointer는
ModelCheckpoint() 함수의 반환값을 저장한다.
ModelCheckpoint()에서 모델의 정확도가
개선될 때만 저장하기 위한 파라미터가
save_best_only=True 부분이다.
학습 자동중단
딥러닝의 왕도는 존재하지 않는다.
모델의 학습을 계속 반복한다고 해서 정확도가
올라가는 것은 아니다. 모델 학습수가 반복되면
오히려 학습셋에 대한 과적합이 올라가 테스트
셋에서의 정확도는 떨어지게 된다.
모델의 학습이 반복되면서 일정 구간에 도달하면
더 이상의 학습을 진행해도 정확도가 개선되지
않는 구간이 발생한다.
우리는 모델의 정확도가 더 이상 개선되지 않는
지점에서 모델의 학습을 중지해야 한다. keras에서
이런 로직을 도와주는 함수가 존재한다.
바로 EarlyStopping() 함수다.
테스트 오차를 모니터링해서 모델 정확도의 개선
정도를 모니터링한다. patience 인자는 만약
모델 정확도가 개선되지 않는 것을 감지하면,
향후 N번 더 모델 학습을 진행하는 것을 설정하는
부분이다.
1
|
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=100)
|
cs |
이제 성능이 개선된 모델만 저장하고,
만약 성능이 개선되지 않으면 학습이
조기 종료되는 로직이 완성되었다.
결과값을 대량으로 출력한다음 개선될 때까지
모델을 돌리기만 하면 된다. 굉장히 편해졌다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 모델 저장 폴더 설정
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)
# 학습 자동 중단 설정
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=100)
# 모델 실행
model.fit(X, Y, epochs=350, batch_size=500, validation_split=0.2, verbose=0, callbacks=[checkpointer, early_stopping_callback])
# 결과 출력
print("\n Accuracy : %.4f" %(model.evaluate(X,Y)[1]))
|
cs |
더 읽을거리
'Programming > MachineLearning' 카테고리의 다른 글
딥러닝 CNN 컨볼루션 신경망 10분만에 이해하기 (1) | 2021.12.16 |
---|---|
딥러닝 손글씨 예측 모델 만들어보기 (feat 데이터정규화) (0) | 2021.12.16 |
딥러닝 수치를 예측해보자 (feat 선형 회귀 분석) (0) | 2021.12.16 |
딥러닝 데이터가 부족할 때 해결하는 방법 K겹 교차 검증이란? (feat 광석 돌 구분 예제 사용) (0) | 2021.12.16 |
딥러닝 과적합 문제 해결하기(feat 광석 판별하기) (0) | 2021.12.16 |
딥러닝 다중 분류 모델 Multi Classfication 설계하기 (feat 아이리스 품종 분류하는 모델 설계하기) (0) | 2021.12.16 |
댓글