개발자로 후회없는 삶 살기
[22.09.24] 딥러닝 PART.교과목(콜백, 모델 저장, tfds) 본문
서론
교재에 등장하는 tf의 유용한 기능을 정리합니다.
본론
- 콜백
=> 정의 : 훈련 중에 동작을 확장하거나 수정하고자 모델로 전달하는 객체
1. model checkpoint : 정기적으로 모델의 체크 포인트를 저장하고 문제가 발생할 때 복구하는 데 사용
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
model_checkpoint = ModelCheckpoint(filepath="./{epoch}-{val_loss:.2f}-{val_accuracy:.2f}.h5", monitor="val_loss", save_best_only=True, verbose=1)
# 데이터 전처리, 모델링, compile 생략
model.fit(X_train, Y_train,
batch_size=BATCH_SIZE, epochs=EPOCHS,
verbose=VERBOSE, validation_split=VALIDATION_SPLIT,
callbacks=[model_checkpoint]) # callback 파라미터
객체 생성 시 인자 : 모든 epoch마다 모델을 저장하는 것은 비효율적이니 검증 세트 손실이 기존의 최고 성능 모델에 비해 낮아질 때만 저장되도록 하는 것입니다.
1) monitor : val_loss로 하여 모델의 개선 여부 판단
2) save_best_only : True로 하여 모델이 이전에 비해 개선되었을 때만 저장
> 결과 : 아래 사진처럼 {epoch}-{val_loss:.2f}-{val_accuracy:.2f}의 h5 파일이 생깁니다.
2. Early stopping : 학습이 더 이상 되지 않을 때 epoch 종료 전에 학습을 미리 종료합니다.
# ③earlystopping 예제
import tensorflow as tf
import numpy as np
from tensorflow import keras
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.models import Sequential
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.callbacks import EarlyStopping
# network and training
EPOCHS = 200
BATCH_SIZE = 128
VERBOSE = 1
NB_CLASSES = 10 # number of outputs = number of digits
N_HIDDEN = 128 # 은닉층 개수?
VALIDATION_SPLIT=0.2
mnist = keras.datasets.mnist
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
RESHAPED = 784
X_train = X_train.reshape(60000, RESHAPE)
X_test = X_test.reshape(10000, RESHAPE)
X_train = X_train.astype('float32') # 32비트 정밀도를 갖도록 float32로 변환, 0 ~ 1사이로 정규화 -> 이렇게 하면 소수점 20자리가 4자리로 안정화된다
X_test = X_test.astype('float32')
# normalize in [0, 1]
X_train /= 255
X_test /= 255
Y_train = tf.keras.utils.to_categorical(Y_train, NB_CLASSES)
Y_test = tf.keras.utils.to_categorical(Y_test, NB_CLASSES)
#build the model
DROPOUT = 0.3
model = tf.keras.models.Sequential()
model.add(keras.layers.Dense(N_HIDDEN,
input_shape=(RESHAPED,),
name='dense_layer', activation='relu'))
model.add(keras.layers.Dropout(DROPOUT))
model.add(keras.layers.Dense(N_HIDDEN,
name='dense_layer_2', activation='relu'))
model.add(keras.layers.Dropout(DROPOUT))
model.add(keras.layers.Dense(NB_CLASSES,
name='dense_layer_3', activation='softmax'))
model.summary()
# compiling the model
model.compile(optimizer='SGD',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 모니터링할 지표와 몇 번의 에포크를 기다리고 조기 종률할지를 각각 monitor와 patience를 통해 지정
# val_loss가 최소값을 찍고 5번의 에폭동안 더 개선되지 않는다면 조기 종료한다. -> 179부터 개선되지 않아서 184에서 끝남
early_stopping = EarlyStopping(monitor="val_loss", patience=5)
#training the model
model.fit(X_train, Y_train,
batch_size=BATCH_SIZE, epochs=EPOCHS,
verbose=VERBOSE, validation_split=VALIDATION_SPLIT,
callbacks=[early_stopping]) # 검증하고자 남겨두었다!! 60000개에서 80인 48000개로 훈련, 12000개로 검증
#evaluate the model
test_loss, test_acc = model.evaluate(X_test, Y_test)
print('Test accuracy:', test_acc)
# making prediction
predictions = model.predict(X_test)
> 객체 생성 시 인자 : 모니터링할 지표와 몇 번의 epoch를 기다리고 조기 종료를할지를 각각 monitor와 patience를 통해 지정
1) monitor : 지표
2) patience : 몇 번 더 봐줄지를 5로 잡으면 val_loss가 최솟값을 찍고 5번의 에폭 동안 더 개선되지 않는다면 조기 종료합니다.
> 결과 : 179부터 개선되지 않아서 184에서 끝납니다.
- 모델과 가중치 저장
1. 가중치 저장
file_path = "my_model"
model.save_weights(file_path) # 가중치 저장
model.load_weights(file_path) # 모델 상태 복원
-> 가중치 제외하고 모델 구조만 저장
json_string = model.to_json()
model = tf.keras.models.model_from_json(json_string)
2. 가중치와 최적화 매개변수 함께 저장
model.save("my_model.h5")
model = tf.keras.models.load_model("my_model.h5")
- tfds
-> 느낀점
1. tfds가 주는 데이터를 X_train, y_Train, X_test, y_test로 바로 쓸 수는 없습니다. -> 내가 원하는 모양으로 바꿔줘야 합니다.
2. 엄청나게 다양하고 많은 데이터를 제공합니다.
3. 데이터 셋 형에 대해 다양하고 유용한 함수를 제공합니다.
참고
'[AI] > [교과목 | 학습기록]' 카테고리의 다른 글
[22.10.11] 딥러닝 PART.교과목 CNN, 고급 신경망 활용 (0) | 2022.12.27 |
---|---|
[22.09.14] 딥러닝 PART.교과목(퍼셉트론, 과적합 해소) (0) | 2022.12.27 |
딥러닝 PART.교과목 오토인코더(Ae) (0) | 2022.11.16 |
딥러닝 PART.교과목 단어 임베딩 (0) | 2022.11.08 |
딥러닝 PART.교과목 RNN (0) | 2022.11.08 |
Comments