수동으로 가중치 저장하기
Model.save_weights 메서드를 사용하여 수동으로 가중치를 저장한다. 기본적으로 tf.keras, 특히 save_weights는 .ckpt 확장자가 있는 TensorFlow 체크포인트 형식을 사용한다 (.h5 확장자를 사용하여 HDF5에 저장하는 내용은 모델 저장 및 직렬화 가이드에서 다룸).
# 가중치 저장
model.save_weights('./checkpoints/my_checkpoint')
# 새로운 모델 객체 생성
model = create_model()
# 가중치 복원
model.load_weights('./checkpoints/my_checkpoint')
# 모델 평가
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%
전체 모델 저장하기
model.save 메서드를 호출하여 모델의 구조, 가중치, 훈련 설정을 하나의 파일 / 폴더에 저장한다. 모델을 저장하기 때문에 원본 파이썬 코드*가 없어도 사용할 수 있다. 옵티마이저 상태가 복원되므로 정확히 중지한 시점에서 다시 훈련을 시작할 수 있다.
전체 모델은 두 가지 다른 파일 형식 (SavedModel 및 HDF5)으로 저장할 수 있다. TensorFlow SavedModel 형식은 TF2.x의 기본 파일 형식이다. 그러나 모델을 HDF5 형식으로 저장할 수 있다.
전체 모델을 저장하는 기능은 매우 유용하다. TensorFlow.js로 모델을 로드한 다음 웹 브라우저에서 모델을 훈련하고 실행할 수 있다 (Saved Model, HDF5). 또는 모바일 장치에 맞도록 변환한 다음 TensorFlow Lite를 사용하여 실행할 수 있다 (Saved Model, HDF5).
SavedModel 포맷
SavedModel 형식은 모델을 직렬화하는 또 다른 방법이다. 이 형식으로 저장된 모델은 tf.keras.models.load_model을 사용하여 복원할 수 있으며 TensorFlow Serving과 호환된다. SavedModel 가이드에 SavedModel을 제공 / 검사하는 방법이 자세히 설명되어 있다. 아래 섹션은 모델을 저장하고 복원하는 단계를 보여준다.
# 새로운 모델 객체를 만들고 훈련
model = create_model()
model.fit(train_images, train_labels, epochs=5)
# SavedModel로 전체 모델 저장
!mkdir -p saved_model
model.save('saved_model/my_model')
SavedModel 형식은 protobuf 바이너리와 TensorFlow 체크포인트를 포함하는 디렉토리이다. 저장된 모델 디렉토리를 검사한다.
# my_model 디렉토리
ls saved_model
# assests 폴더, saved_model.pb, variables 폴더
ls saved_model/my_model
my_model
assets keras_metadata.pb saved_model.pb variables
저장된 모델로부터 새로운 케라스 모델을 로드한다.
new_model = tf.keras.models.load_model('saved_model/my_model')
# 모델 구조 확인
new_model.summary()
Model: "sequential_5"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_10 (Dense) (None, 512) 401920
_________________________________________________________________
dropout_5 (Dropout) (None, 512) 0
_________________________________________________________________
dense_11 (Dense) (None, 10) 5130
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
_________________________________________________________________
복원된 모델은 원본 모델과 동일한 매개변수로 컴파일되어 있다. 이 모델을 평가하고 예측에 사용한다.
# 복원된 모델 평가
loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)
print('복원된 모델의 정확도: {:5.2f}%'.format(100*acc))
print(new_model.predict(test_images).shape)
32/32 - 0s - loss: 0.4343 - accuracy: 0.8660
복원된 모델의 정확도: 86.60%
(1000, 10)
HDF5 파일로 저장하기
케라스는 HDF5 표준을 따르는 기본 저장 포맷을 제공한다.
# 새로운 모델 객체를 만들고 훈련
model = create_model()
model.fit(train_images, train_labels, epochs=5)
# 전체 모델을 HDF5 파일로 저장
# '.h5' 확장자는 이 모델이 HDF5로 저장되었다는 것을 나타냄
model.save('my_model.h5')
이제 이 파일로부터 모델을 다시 만든다.
# 가중치와 옵티마이저를 포함하여 정확히 동일한 모델 다시 생성
new_model = tf.keras.models.load_model('my_model.h5')
# 모델 구조 출력
new_model.summary()
Model: "sequential_6"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_12 (Dense) (None, 512) 401920
_________________________________________________________________
dropout_6 (Dropout) (None, 512) 0
_________________________________________________________________
dense_13 (Dense) (None, 10) 5130
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
_________________________________________________________________
정확도를 확인한다.
loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)
print('복원된 모델의 정확도: {:5.2f}%'.format(100*acc))
32/32 - 0s - loss: 0.4581 - accuracy: 0.8580
복원된 모델의 정확도: 85.80%
Keras는 아키텍처를 검사하여 모델을 저장한다. 이 기술은 모든 내용을 저장한다.
|
체크포인트가 호환되지 않기 때문에 케라스는 v1.x 옵티마이저 (tf.compat.v1.train)를 저장할 수 없다. v1.x 옵티마이저를 사용하려면 로드한 후에 모델을 다시 컴파일해야 한다. 따라서, 옵티마이저의 상태를 잃게 된다.
사용자 정의 객체
SavedModel 형식을 사용하는 경우, 이 섹션을 건너뛸 수 있다. HDF5와 SavedModel의 주요 차이점은 HDF5는 객체 구성을 사용하여 모델 아키텍처를 저장하는 반면, SavedModel은 실행 그래프를 저장한다는 것이다. 따라서, SavedModel은 원본 코드 없이도 서브클래싱된 모델 및 사용자 지정 레이어와 같은 사용자 지정 객체를 저장할 수 있다.
사용자 정의 객체를 HDF5로 저장하려면 다음 과정을 따르면 된다.
|
사용자 정의 객체와 get_config에 관한 예제를 보려면 Writing layers and models from scratch 튜토리얼을 참고하면 된다.
https://www.tensorflow.org/tutorials/keras/save_and_load?hl=ko
'DNN with Keras > TensorFlow' 카테고리의 다른 글
[TensorFlow] 이미지 전처리 (1) (0) | 2022.06.15 |
---|---|
[TensorFlow] Keras Tuner (0) | 2022.06.15 |
[TensorFlow] 모델 저장 / 복원 (1) (0) | 2022.06.15 |
[TensorFlow] 과대적합 / 과소적합 (2) (0) | 2022.06.15 |
[TensorFlow] 과대적합 / 과소적합 (1) (0) | 2022.06.15 |