2024.02.05
실습2
* 지난일차 실습에 이어서 진행됩니다.
지난 일차의 구성은 단순하게 layer도 1번만 사용했다보니 overfit이 발생했습니다.
모델의 layer도 추가로 구성하고 복잡도 컨트롤을 위해 dropout을 layer 사이에 추가하는 방법을 적용해봅니다.
# 수정 및 추가한 부분
model = tf.keras.Sequential(
[
tf.keras.layers.Flatten( input_shape = ( 28, 28) ),
tf.keras.layers.Dropout(0.1),
tf.keras.layers.Dense( units=128, activation="relu"),
tf.keras.layers.Dropout(0.1),
tf.keras.layers.Dense( units=64, activation="relu"),
tf.keras.layers.Dropout(0.1),
tf.keras.layers.Dense( units=32, activation="relu"),
tf.keras.layers.Dense( units = 10, activation="softmax" )
])
#-----------------------------------------------------------------------#
# 이전과 동일하게 적용
model.compile(
optimizer= tf.keras.optimizers.Adam(),
loss = "categorical_crossentropy",
metrics = ["accuracy"]
)
history = model.fit(
train_X,
tf.keras.utils.to_categorical(train_y, num_classes=10),
epochs = 50,
batch_size = 256,
validation_split= 0.25
)
# 결과 그래프로 확인
import matplotlib.pyplot as plt
plt.subplot(1,2,1) # loss
plt.plot(history.history["loss"], "b-", label="train_loss")
plt.plot(history.history["val_loss"], "r-", label="val_loss")
plt.xlabel("Epoch")
plt.legend()
plt.subplot(1,2,2) # metrics : accuracy
plt.plot(history.history["accuracy"], "b-", label="train_accuracy")
plt.plot(history.history["val_accuracy"], "r-", label="val_accuracy")
plt.xlabel("Epoch")
plt.legend()

이전 보다 정확도의 차이가 줄어든 것을 확인할 수 있습니다.
학습 하는 과정에서 모델별로 weight를 저장하려면 callback을 활용하면 된다.
추가적으로 모델 학습 과정에서 어느 선에서 중간에 학습을 중단하는 earlystopping을 적용하는 방법도 적용해본다.
# 모델을 저장하는 기능
import os
# 1) callback
checkpoint_path: "training/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
cp_callback = tf.keras.callbacks.ModelCheckpoint(
checkpoint_path,
verbose = 1,
save_weights_only = True # 모델의 구조까지 저장하기에 무겁다면 가중치만 저장
)
# 2) earlystopping
es_callback = tf.keras.callbacks.EarlyStopping(
monitor = "val_loss",
patience = 5
)
# 나머지 코드는 동일하게 적용하고
# 모델 학습하는 과정에서 callback 부분을 추가해주면 된다.
history = model.fit(
train_X,
tf.keras.utils.to_categorical(train_y, num_classes=10),
epochs = 50,
batch_size = 256,
validation_split= 0.25,
############### callback 내용 추가 ################
callbacks = [cp_callback, es_callback]
)

epoch가 50번을 다 돌지 않고 중간에 설정한 기준이 종료되는 시점에서 학습을 종료한 것을 볼 수 있다.
'ASAC 빅데이터전문가과정 > DL' 카테고리의 다른 글
| ASAC 52일차_딥러닝 7일차 (0) | 2024.09.02 |
|---|---|
| ASAC 51일차_딥러닝 6일차 (0) | 2024.09.02 |
| ASAC 50일차_딥러닝 5일차 (0) | 2024.09.02 |
| ASAC 49일차_딥러닝 4일차 (1) | 2024.09.02 |
| ASAC 45일차_딥러닝 1일차 (0) | 2024.09.01 |