UOMOP
Callback (ModelCheckpoint, ReduceLROnPlateau, EarlyStopping) 본문
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])
'Ai > DL' 카테고리의 다른 글
Data Augmentation(공간 기반) (0) | 2022.02.10 |
---|---|
Data Augmentation(데이터 증강) 기본 (0) | 2022.02.10 |
Overfitting 극복 using 가중치 규제 (0) | 2022.02.10 |
Overfitting 극복 using GAP(GlobalAveragePooling) (0) | 2022.02.09 |
성능 향상 using (# of filters, depth) (0) | 2022.02.09 |
Comments