UOMOP

Callback (ModelCheckpoint, ReduceLROnPlateau, EarlyStopping) 본문

Ai/DL

Callback (ModelCheckpoint, ReduceLROnPlateau, EarlyStopping)

Happy PinGu 2022. 2. 10. 03:15

ModelCheckpoint

  • 특정 조건을 만족했을 경우, 그 때의 모델을 저장
  • filepath : 특정 조건을 만족했을 때, 모델이 저장되는 위치
  • monitor : 확인해볼 성능 지표
  • save_best_only : 가장 성능이 좋은 모델만을 저장할 것인지
  • save_weights_only : weight(가중치)만을 저장할 것인지
  • verbose : 상황 설명
  • period : 상황 설명에 대한 주기
  • mode : [min, max, auto]중 하나를 지정(min의 경우 loss와 같이 감소할수록 좋을때, max의 경우 accuracy와 같이                                                                                                                                                                                                            증가할수록 좋을때)

 

ReduceLROnPlateau

  • 지정한 epoch (patience)동안 성능이 개선되지 않는다면, Learning Rate를 감소시킨다.
  • monitor : 확인해볼 성능 지표
  • factor : Learning Rate를 얼마나 감소시킬지 (new = old × factor)
  • patience : patience 동안 성능이 개선되지 않는다면 Learning Rate을 factor만큼 감소시킨다.
  • verbose : 상황 설명
  • period : 상황 설명에 대한 주기
  • cooldown : Learning Rate가 감소한 후 다시 재작동까지의 epoch 수
  • mode : [min, max, auto]중 하나를 지정(min의 경우 loss와 같이 감소할수록 좋을때, max의 경우 accuracy와 같이                                                                                                                                                                                                     증가할수록 좋을때)

 

EarlyStopping

  • 지정한 epoch (patience)동안 성능이 개선되지 않는다면, 학습을 조기 중단
  • monitor : 확인해볼 성능 지표
  • min_delta : 개선되고 있다고 판단하기 위한 최소 변화량                                                                                                                                                                    ex)  min_delta을 0.2로 두었다면 0.17의 변화량은 개선이 없다고 판단
  • patience : patience 동안 성능이 개선되지 않는다면 Learning Rate을 factor만큼 감소시킨다.
  • verbose : 상황 설명
  • period : 상황 설명에 대한 주기

1. 각종 모듈 호출, 각종 함수 정의, 데이터 전처리

import numpy as np
from sklearn.model_selection import train_test_split
from tensorflow.keras.datasets import fashion_mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Conv2D, BatchNormalization, Activation, MaxPooling2D, \
                                                                     Flatten, Dropout, Dense
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping


def make_zero_to_one(images, labels) :
    
    images = np.array(images/255., dtype = np.float32)
    labels = np.array(labels, dtype = np.float32)
    
    return images, labels


def ohe(labels) :
    
    labels = to_categorical(labels)
    
    return labels


def tr_val_test(train_images, train_labels, test_images, test_labels, val_rate) :
    
    tr_images, val_images, tr_labels, val_labels = \
                          train_test_split(train_images, train_labels, test_size = val_rate)
    
    return (tr_images, tr_labels), (val_images, val_labels), (test_images, test_labels)


def create_model(images) :
    
    input_size = (images.shape)[1]
    input_tensor = Input(shape = (input_size, input_size))
    
    x = Flatten()(input_tensor)
    x = Dense(100, activation = "relu")(x)
    x = Dense(30, activation = "relu")(x)
    output = Dense(10, activation = "softmax")(x)
    
    model = Model(inputs = input_tensor, outputs = output)
    
    return model
    
    
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

train_images, train_labels = make_zero_to_one(train_images, train_labels)
test_images, test_labels   = make_zero_to_one(test_images, test_labels)

train_labels = ohe(train_labels)
test_labels  = ohe(test_labels)

(tr_images, tr_labels), (val_images, val_labels), (test_images, test_labels) = \
         tr_val_test(train_images, train_labels, test_images, test_labels, val_rate = 0.15)

2. ModelCheckpoint 사용

model = create_model(tr_images)
!pwd
​
model.compile(optimizer = Adam(), loss = "categorical_crossentropy", metrics = ["accuracy"])
​
mcp = ModelCheckpoint(filepath = "/kaggle/working/weights.{epoch:02d}-{val_loss:.2f}.hdf5",
                      monitor  = "val_loss",
                      save_best_only    = True,
                      save_weights_only = True,
                      mode    = "min",
                      period  = 3,
                      verbose = True)
​
result = model.fit(tr_images, tr_labels, batch_size = 128, epochs = 30, validation_data = \
                                                   (val_images, val_labels), callbacks = [mcp])
!ls -lia            # 생성된 파일 확인
# !rm -rf weight*   # 파일들 제거

3. ReduceLROnPlateau 사용

model = create_model(tr_images)
!pwd

model.compile(optimizer = Adam(), loss = "categorical_crossentropy", metrics = ["accuracy"])

rlr = ReduceLROnPlateau(monitors = "val_loss", factor  = 0.3, patience = 3, mode = "min", verbose = 1)

result = model.fit(tr_images, tr_labels, batch_size = 128, epochs = 30, \
                                    validation_data = (val_images, val_labels), callbacks = [rlr])
epoch가 12일 때 이후로 val_loss가 0.3015 이하로 내려가지 않았다. 3번 참고 learning rate를 바꿔준 상황.

4. EarlyStopping 사용

model = create_model(tr_images)

!pwd

model.compile(optimizer = Adam(), loss = "categorical_crossentropy", metrics = ["accuracy"])

ely = EarlyStopping(monitor = "val_loss", patience = 3, mode = "min", verbose = 1)

result = model.fit(tr_images, tr_labels, batch_size = 128, epochs = 30, \
                                 validation_data = (val_images, val_labels), callbacks = [ely])
3 epoch동안 val_loss의 개선이 없자, 학습이 조기에 종료된 것을 확인할 수 있었다.

5. 다 같이 사용

model = create_model(tr_images)

!pwd

model.compile(optimizer = Adam(), loss = "categorical_crossentropy", metrics = ["accuracy"])

mcp = ModelCheckpoint(filepath = "/kaggle/working/weights.{epoch:02d}-{val_loss:.2f}.hdf5",
                      monitor  = "val_loss",
                      save_best_only    = True,
                      save_weights_only = True,
                      mode    = "min",
                      period  = 3,
                      verbose = True)
rlr = ReduceLROnPlateau(monitors = "val_loss", factor  = 0.3, patience = 3, mode = "min", verbose = 1)
ely = EarlyStopping(monitor = "val_loss", patience = 3, mode = "min", verbose = 1)

result = model.fit(tr_images, tr_labels, batch_size = 128, epochs = 30, \
                         validation_data = (val_images, val_labels), callbacks = [mcp, rlr, ely])

 

 

 

 

 

Comments