import keras, os

# overfitting을 방지하기 위해서 학습 중 early stop을 수행하기 위한 코드입니다.
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1)

조기 종료, 저장

# 모델 검증

es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=4)
# 검증 데이터 손실이 4회 증가하면 학습 조기 종료

mc = ModelCheckpoint('best_model.h5', monitor='val_accuracy', mode='max', verbose=1, save_best_only=True)
# 검증 데이터의 정확도가 이전보다 좋아질 경우에만 모델 저장

# 모델 훈련

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
# categorical_crossentropy는 모델의 예측값과 실제값에 대해서 두 확률 분포 사이의 거리를 최소화하도록 훈련

history = model.fit(X_train, y_train, batch_size=128, epochs=30, callbacks=[es, mc], validation_data=(X_test, y_test))

로드, 평가

# 저장된 모델인 'best_model.h5'를 로드하고, 성능을 평가

loaded_model = load_model('best_model.h5')
print("\\n 테스트 정확도: %.4f" % (loaded_model.evaluate(X_test, y_test)[1]))

# 에포크마다 변화하는 훈련 데이터와 검증 데이터(테스트 데이터)의 손실을 시각화
epochs = range(1, len(history.history['accuracy']) + 1)
plt.plot(epochs, history.history['loss'])
plt.plot(epochs, history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show();

Performance measure

어떤 성능을 monitoring 할것인가

Trigger

언제 Training을 멈출 것인가


monitor

val loss → validation set의 loss를 monitoring 한다는 뜻

min_delta

모니터링 되는 수량의 최소 변경 횟수

mode

auto → default값 : 알아서 min, max 선택

min → performance measure를 최소화 시키는 것 : loss 같은 경우

max → 최대화 시키는 것

verbose