[인공지능] 케라스 기초 - 콜백
- 인공지능
- 2022. 2. 17. 17:39
참조
콜백
- fit() 함수의 callbacks 매개변수를 사용하여 케라스가 훈련의 시작이나 끝에 호출할 객체 리스트를 지정할 수 있음
- 여러 개 사용 가능
- ModelCheckpoint
- tf.keras.callbacks.ModelCheckpoint
- 정기적으로 모델의 체크포인트를 저장하고, 문제가 발생할 떄 복구하는데 사용
- EarlyStopping
- tf.keras.callbacks.EarlyStopping
- 검증 성능이 한동안 개선되지 않을 경우 학습을 중단할 때 사용
- LearningRateScheduler
- tf.keras.callbacks.LearningRateScheduler
- 최적화를 하는 동안 학습률(learning_rate)를 동적으로 변경할 때 사용
- TensorBoard
- tf.keras.callbacks.TensorBoard
- 모델의 경과를 모니터링할 때 사용
from matplotlib.pyplot import annotate, axis
import tensorflow as tf
from tensorflow.keras.datasets.mnist import load_data
from tensorflow.keras.models import Sequential
from tensorflow.keras import models
from tensorflow.keras.layers import Dense, Input, Flatten
from tensorflow.keras.utils import to_categorical
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pylab as plt
plt.style.use('seaborn-white')
# 데이터셋 로드
(x_train_full, y_train_full), (x_test, y_test) = load_data(path='mnist.npz')
x_train, x_val, y_train, y_val = train_test_split(x_train_full, y_train_full,
test_size = 0.3,
random_state = 111)
# 데이터 확인
print("학습 데이터 : {}\t레이블 : {}".format(x_train_full.shape, y_train_full.shape))
print("학습 데이터 : {}\t레이블 : {}".format(x_train.shape, y_train.shape))
print("검증 데이터 : {}\t레이블 : {}".format(x_val.shape, y_val.shape))
print("테스트 데이터 : {}\t레이블 : {}".format(x_test.shape, y_test.shape))
# 데이터 전처리
x_train = x_train / 255.
x_val = x_val / 255.
x_test = x_test / 255.
y_train = to_categorical(y_train)
y_val = to_categorical(y_val)
y_test = to_categorical(y_test)
# 모델 구성(Sequential)
def build_model():
model = Sequential([Input(shape=(28,28), name='input'),
Flatten(input_shape=[28,28], name='flatten'),
Dense(100, activation='relu', name='dense1'),
Dense(64, activation='relu', name='dense2'),
Dense(32, activation='relu', name='dense3'),
Dense(10, activation='softmax', name='output')])
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
return model
model = build_model()
model.summary()
학습 데이터 : (60000, 28, 28) 레이블 : (60000,)
학습 데이터 : (42000, 28, 28) 레이블 : (42000,)
검증 데이터 : (18000, 28, 28) 레이블 : (18000,)
테스트 데이터 : (10000, 28, 28) 레이블 : (10000,)
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 784) 0
dense1 (Dense) (None, 100) 78500
dense2 (Dense) (None, 64) 6464
dense3 (Dense) (None, 32) 2080
output (Dense) (None, 10) 330
=================================================================
Total params: 87,374
Trainable params: 87,374
Non-trainable params: 0
ModelCheckpoint
- 최상의 모델만을 저장
- save_best_only=True
from tensorflow.keras.models import load_model
from tensorflow.keras.callbacks import ModelCheckPoint, EarlyStopping, LearningRateScheduler, TensorBoard
check_point_cb = ModelCheckPoint('keras_mninst_model.h5')
history = model.fit(x_train, y_train, epochs=10, callbacks=[check_point_cb])
history.history.keys()
loaded_model = load_model('keras_mnist_model.h5')
loaded_model.summary()
cp = ModelCheckpoint('keras_best_model.h5', save_best_only=True)
history = model.fit(x_train, y_train, epochs=10, validation_data=(x_val, y_val), callbacks=[cp])
history.history.keys()
loaded_model2 = load_model('keras_best_model.h5')
loaded_model2.summary()
EarlyStopping
- 일정 에포크(patience) 동안 검증 세트에 대한 점수가 오르지 않으면 학습을 멈춤
- 모델이 향상되지 않으면 학습이 자동으로 중지되므로, 에코드(epochs) 숫자를 크게 해도 무방
- 학습이 끝난 후의 최상의 가중치를 복원하기 때문에 모델을 따로 복원할 필요없음
from tensorflow.keras.models import load_model
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, LearningRateScheduler, TensorBoard
model = build_model()
cp = ModelCheckpoint('keras_best_model2.h5', save_best_only=True)
early_stopping_cb = EarlyStopping(patience=3, monitor='val_loss',
restore_best_weights=True)
history = model.fit(x_train, y_train, epochs=50,
validation_data=(x_val, y_val), callbacks=[cp, early_stopping_cb])
LearningRateScheduler
from tensorflow.keras.models import load_model
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, LearningRateScheduler, TensorBoard
def scheduler(epoch, learning_rate):
if epoch < 10:
return learning_rate
else:
return learning_rate * tf.math.exp(-0.1)
model = build_model()
print(round(model.optimizer.lr.numpy(), 5))
lr_scheduler_cb = LearningRateScheduler(scheduler)
history = model.fit(x_train, y_train, epochs=15,
callbacks=[lr_scheduler_cb], verbose=0)
print(round(model.optimizer.lr.numpy(), 5))
0.01
0.00607
728x90
'인공지능' 카테고리의 다른 글
[인공지능] 케라스 학습 기술 - 가중치 초기화 (0) | 2022.02.17 |
---|---|
[인공지능] 케라스 학습 기술 - 모델의 크기 축소 (0) | 2022.02.17 |
[인공지능] 케라스 기초 - 모델 저장과 복원 (0) | 2022.02.16 |
[인공지능] 케라스 기초 - 모델 컴파일 (0) | 2022.02.15 |
[인공지능] 케라스 기초 - 모델 가중치 확인 (0) | 2022.02.15 |
이 글을 공유하기