모델 저장 / 복원
모델 진행 상황은 훈련 중 및 훈련 후에 저장할 수 있다. 즉, 모델이 중단된 위치에서 다시 시작하고 긴 훈련 시간을 피할 수 있다. 저장은 또한 모델을 공유할 수 있고 다른 사람들이 작업을 다시 만들 수 있음을 의미한다. 연구 모델 및 기술을 게시할 때 대부분의 머신러닝 실무자는 다음을 공유한다.
|
이런 데이터를 공유하면 다른 사람들이 모델의 작동 방식을 이해하고 새로운 데이터로 모델을 실험하는데 도움이 된다.
(주의: TensorFlow 모델은 코드이며 신뢰할 수 없는 코드에 주의하는 것이 중요하다. 자세한 내용은 TensorFlow 안전하게 사용하기를 참조)
저장 방식
사용 중인 API에 따라 TensorFlow 모델을 저장하는 다양한 방법이 있다. 여기에서는 TensorFlow에서 모델을 빌드하고 훈련하기 위해 고수준 API인 tf.keras를 사용한다. 다른 접근 방식에 대해서는 TensorFlow 저장 및 복원 가이드 또는 즉시 실행 저장을 참조하면 된다.
설정
필요한 라이브러리를 설치하고 텐서플로를 임포트 (import)한다.
pip install pyyaml h5py # HDF5 포맷으로 모델을 저장하기 위해서 필요합니다
import os
import tensorflow as tf
from tensorflow import keras
print(tf.version.VERSION)
예제 데이터셋 받기
MNIST 데이터셋으로 모델을 훈련하여 가중치를 저장하는 예제를 만든다. 모델 실행 속도를 빠르게 하기 위해 샘플에서 처음 1,000개만 사용한다.
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
train_labels = train_labels[:1000]
test_labels = test_labels[:1000]
train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0
test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.0
모델 정의
# 간단한 Sequential 모델을 정의합니다
def create_model():
model = tf.keras.models.Sequential([
keras.layers.Dense(512, activation='relu', input_shape=(784,)),
keras.layers.Dropout(0.2),
keras.layers.Dense(10)
])
model.compile(optimizer='adam',
loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
return model
# 모델 객체를 만듭니다
model = create_model()
# 모델 구조를 출력합니다
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 512) 401920
_________________________________________________________________
dropout (Dropout) (None, 512) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 5130
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
훈련하는 동안 체크포인트 저장하기
훈련된 모델을 다시 훈련할 필요 없이 사용하거나 훈련 과정이 중단된 경우 중단한 부분에서 훈련을 다시 시작할 수 있다. tf.keras.callbacks.ModelCheckpoint 콜백을 사용하면 훈련 도중 또는 훈련 종료 시 모델을 지속적으로 저장할 수 있다.
체크포인트 콜백 사용하기
훈련하는 동안 가중치를 저장하기 위해 ModelCheckpoint 콜백을 만든다.
checkpoint_path = "training_1/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
# 모델의 가중치를 저장하는 콜백 만들기
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,
save_weights_only=True,
verbose=1)
# 새로운 콜백으로 모델 훈련하기
model.fit(train_images,
train_labels,
epochs=10,
validation_data=(test_images,test_labels),
callbacks=[cp_callback]) # 콜백을 훈련에 전달
# 옵티마이저의 상태를 저장하는 것과 관련되어 경고가 발생할 수 있다.
# 이 경고는 (그리고 이 노트북의 다른 비슷한 경고는) 이전 사용 방식을 권장하지 않기 위함이며 무시해도 좋다.
이 코드는 텐서플로 체크포인트 파일을 만들고 에포크가 종료될 때마다 업데이트한다.
os.listdir(checkpoint_dir)
['cp.ckpt.index', 'cp.ckpt.data-00000-of-00001', 'checkpoint']
두 모델이 동일한 아키텍처를 공유하기만 한다면 두 모델 간에 가중치를 공유할 수 있다. 따라서, 가중치 전용에서 모델을 복원할 때 원래 모델과 동일한 아키텍처로 모델을 만든 다음 가중치를 설정한다.
이제 훈련되지 않은 새로운 모델을 다시 빌드하고 테스트 세트에서 평가한다. 훈련되지 않은 모델은 확률 수준 (~10% 정확도)에서 수행된다.
# 기본 모델 객체 생성
model = create_model()
# 모델을 평가
loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print("훈련되지 않은 모델의 정확도: {:5.2f}%".format(100*acc))
32/32 - 0s - loss: 2.2990 - accuracy: 0.1190
훈련되지 않은 모델의 정확도: 11.90%
체크포인트에서 가중치를 로드하고 다시 평가한다.
# 가중치 로드
model.load_weights(checkpoint_path)
# 모델 재평가
loss,acc = model.evaluate(test_images, test_labels, verbose=2)
print("복원된 모델의 정확도: {:5.2f}%".format(100*acc))
32/32 - 0s - loss: 0.4204 - accuracy: 0.8600
복원된 모델의 정확도: 86.00%
체크포인트 콜백 매개변수
이 콜백 함수는 몇 가지 매개변수를 제공한다. 체크포인트 이름을 고유하게 만들거나 체크포인트 주기를 조정할 수 있다.
새로운 모델을 훈련하고 다섯 번의 에포크마다 고유한 이름으로 체크포인트를 저장한다.
# 파일 이름에 에포크 번호를 포함시 (`str.format` 포맷)
checkpoint_path = "training_2/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
# 다섯 번째 에포크마다 가중치를 저장하기 위한 콜백 생성
cp_callback = tf.keras.callbacks.ModelCheckpoint(
filepath=checkpoint_path,
verbose=1,
save_weights_only=True,
period=5)
# 새로운 모델 객체 생성
model = create_model()
# `checkpoint_path` 포맷을 사용하는 가중치 저장
model.save_weights(checkpoint_path.format(epoch=0))
# 새로운 콜백을 사용하여 모델 훈련
model.fit(train_images,
train_labels,
epochs=50,
callbacks=[cp_callback],
validation_data=(test_images,test_labels),
verbose=0)
만들어진 체크포인트를 확인해 보고 마지막 체크포인트를 선택한다.
os.listdir(checkpoint_dir)
latest = tf.train.latest_checkpoint(checkpoint_dir)
latest
'training_2/cp-0050.ckpt'
(참고: 기본 TensorFlow 형식은 가장 최근의 체크포인트 5개만 저장)
모델을 초기화하고 최근 체크포인트를 로드하여 테스트한다.
# 새로운 모델 객체 생성
model = create_model()
# 이전에 저장한 가중치 로드
model.load_weights(latest)
# 모델 재평가
loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print("복원된 모델의 정확도: {:5.2f}%".format(100*acc))
32/32 - 0s - loss: 0.4838 - accuracy: 0.8770
복원된 모델의 정확도: 87.70%
위의 코드는 이진 형식의 훈련된 가중치만 포함하는 체크포인트 형식의 파일 모음에 가중치를 저장한다. 체크포인트에는 다음이 포함된다.
|
단일 머신에서 모델을 훈련하는 경우 접미사가 .data-00000-of-00001인 하나의 샤드를 갖게 된다.
https://www.tensorflow.org/tutorials/keras/save_and_load?hl=ko
'DNN with Keras > TensorFlow' 카테고리의 다른 글
[TensorFlow] Keras Tuner (0) | 2022.06.15 |
---|---|
[TensorFlow] 모델 저장 / 복원 (2) (0) | 2022.06.15 |
[TensorFlow] 과대적합 / 과소적합 (2) (0) | 2022.06.15 |
[TensorFlow] 과대적합 / 과소적합 (1) (0) | 2022.06.15 |
[TensorFlow] 회귀 (Regression) (2) (0) | 2022.06.15 |