본문 바로가기
DNN with Keras/TensorFlow

[TensorFlow] 모델 저장 / 복원 (2)

by goatlab 2022. 6. 15.
728x90
반응형
SMALL

수동으로 가중치 저장하기

 

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는 아키텍처를 검사하여 모델을 저장한다. 이 기술은 모든 내용을 저장한다.

 

  • 가중치 값

  • 모델 구조

  • 모델의 훈련 구성 (.compile() 메서드에 전달하는 내용)

  • 존재하는 옵티마이저와 그 상태 (훈련을 중단한 곳에서 다시 시작할 수 있게 해줌)

 

체크포인트가 호환되지 않기 때문에 케라스는 v1.x 옵티마이저 (tf.compat.v1.train)를 저장할 수 없다. v1.x 옵티마이저를 사용하려면 로드한 후에 모델을 다시 컴파일해야 한다. 따라서, 옵티마이저의 상태를 잃게 된다.

 

사용자 정의 객체

 

SavedModel 형식을 사용하는 경우, 이 섹션을 건너뛸 수 있다. HDF5와 SavedModel의 주요 차이점은 HDF5는 객체 구성을 사용하여 모델 아키텍처를 저장하는 반면, SavedModel은 실행 그래프를 저장한다는 것이다. 따라서, SavedModel은 원본 코드 없이도 서브클래싱된 모델 및 사용자 지정 레이어와 같은 사용자 지정 객체를 저장할 수 있다.

 

사용자 정의 객체를 HDF5로 저장하려면 다음 과정을 따르면 된다.

 

  1. 이 객체에 get_config 메서드를 정의하고 선택적으로 from_config 클래스 메서드를 정의한다.
    • get_config(self)는 객체를 다시 생성하기 위해 필요한 JSON 직렬화된 매개변수 딕셔너리를 반환한다.
    • from_config(cls, config)는 get_config에서 반환된 설정을 사용해 새로운 객체를 만든다. 기본적으로 이 함수는 이 설정을 초기화 메서드의 매개변수로 사용한다 (return cls(**config)).
  2. 모델을 로드할 때 이 객체를 custom_objects 매개변수로 전달한다. 문자열 클래스 이름과 파이썬 클래스를 매핑한 딕서너리를 매개변수로 제공해야 한다. 예를 들면, tf.keras.models.load_model(path, custom_objects={'CustomLayer': CustomLayer})

 

사용자 정의 객체와 get_config에 관한 예제를 보려면 Writing layers and models from scratch 튜토리얼을 참고하면 된다.

 

https://www.tensorflow.org/tutorials/keras/save_and_load?hl=ko 

 

모델 저장과 복원  |  TensorFlow Core

Google I/O는 끝입니다! TensorFlow 세션 확인하기 세션 보기 모델 저장과 복원 모델 진행 상황은 훈련 중 및 훈련 후에 저장할 수 있습니다. 즉, 모델이 중단된 위치에서 다시 시작하고 긴 훈련 시간을

www.tensorflow.org

 

728x90
반응형
LIST