Path: blob/master/site/ko/tutorials/keras/save_and_load.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
모델 저장과 복원
모델 진행 상황은 훈련 중 및 훈련 후에 저장할 수 있습니다. 즉, 모델이 중단된 위치에서 다시 시작하고 긴 훈련 시간을 피할 수 있습니다. 저장은 또한 모델을 공유할 수 있고 다른 사람들이 작업을 다시 만들 수 있음을 의미합니다. 연구 모델 및 기술을 게시할 때 대부분의 머신러닝 실무자는 다음을 공유합니다.
모델을 만드는 코드
모델의 훈련된 가중치 또는 파라미터
이런 데이터를 공유하면 다른 사람들이 모델의 작동 방식을 이해하고 새로운 데이터로 모델을 실험하는데 도움이 됩니다.
주의: TensorFlow 모델은 코드이며 신뢰할 수 없는 코드에 주의하는 것이 중요합니다. 자세한 내용은 TensorFlow 안전하게 사용하기를 참조하세요.
저장 방식
사용 중인 API에 따라 다양한 방법으로 TensorFlow 모델을 저장할 수 있습니다. 이 가이드에서는 TensorFlow에서 모델을 빌드하고 훈련하는 고급 API인 tf.keras를 사용합니다. 이 튜토리얼에서 사용된 새로운 고수준 .keras
형식은 저수준 또는 레거시 형식보다 디버깅하기 쉬운 강력하고 효율적인 이름 기반 저장을 제공하기 때문에 Keras 객체를 저장하는 데 권장됩니다. 고급 저장 또는 직렬화 워크플로, 특히 사용자 정의 객체와 관련된 워크플로는 Keras 모델 저장 및 로드 가이드를 참조하세요. 다른 접근 방식은 SavedModel 형식 가이드 사용하기를 참조하세요.
설정
설치와 임포트
필요한 라이브러리를 설치하고 텐서플로를 임포트(import)합니다:
예제 데이터셋 받기
MNIST 데이터셋으로 모델을 훈련하여 가중치를 저장하는 예제를 만들어 보겠습니다. 모델 실행 속도를 빠르게 하기 위해 샘플에서 처음 1,000개만 사용겠습니다:
모델 정의
먼저 간단한 모델을 하나 만들어 보죠.
훈련하는 동안 체크포인트 저장하기
훈련된 모델을 다시 훈련할 필요 없이 사용하거나 훈련 과정이 중단된 경우 중단한 부분에서 훈련을 다시 시작할 수 있습니다. tf.keras.callbacks.ModelCheckpoint
콜백을 사용하면 훈련 도중 또는 훈련 종료 시 모델을 지속적으로 저장할 수 있습니다.
체크포인트 콜백 사용하기
훈련하는 동안 가중치를 저장하기 위해 ModelCheckpoint
콜백을 만들어 보죠:
이 코드는 텐서플로 체크포인트 파일을 만들고 에포크가 종료될 때마다 업데이트합니다:
두 모델이 동일한 아키텍처를 공유하기만 한다면 두 모델 간에 가중치를 공유할 수 있습니다. 따라서 가중치 전용에서 모델을 복원할 때 원래 모델과 동일한 아키텍처로 모델을 만든 다음 가중치를 설정합니다.
이제 훈련되지 않은 새로운 모델을 다시 빌드하고 테스트 세트에서 평가합니다. 훈련되지 않은 모델은 확률 수준(~10% 정확도)에서 수행됩니다.
체크포인트에서 가중치를 로드하고 다시 평가해 보죠:
체크포인트 콜백 매개변수
이 콜백 함수는 몇 가지 매개변수를 제공합니다. 체크포인트 이름을 고유하게 만들거나 체크포인트 주기를 조정할 수 있습니다.
새로운 모델을 훈련하고 다섯 번의 에포크마다 고유한 이름으로 체크포인트를 저장해 보겠습니다:
이제 결과로 나온 체크포인트를 검토하고 최신 체크포인트를 선택합니다.
참고: 기본 TensorFlow 형식은 가장 최근의 체크포인트 5개만 저장합니다.
테스트를 위해 모델을 재설정하고 최신 체크포인트를 로드합니다.
이 파일들은 무엇인가요?
위의 코드는 이진 형식의 훈련된 가중치만 포함하는 체크포인트 형식의 파일 모음에 가중치를 저장합니다. 체크포인트에는 다음이 포함됩니다.
모델의 가중치를 포함하는 하나 이상의 샤드
어떤 가중치가 어떤 샤드에 저장되어 있는지 나타내는 인덱스 파일
단일 머신에서 모델을 훈련하는 경우 접미사가 .data-00000-of-00001
인 하나의 샤드를 갖게 됩니다.
수동으로 가중치 저장하기
가중치를 수동으로 저장하려면 tf.keras.Model.save_weights
를 사용합니다. 기본적으로 tf.keras
, 그리고 특히 Model.save_weights
메서드는 .ckpt
확장자가 있는 TensorFlow 체크포인트 형식을 사용합니다. .h5
확장자를 사용하여 HDF5 형식으로 저장하려면 모델 저장 및 로드 가이드를 참조하세요.
전체 모델 저장하기
tf.keras.Model.save
를 호출하여 모델의 아키텍처, 가중치 및 훈련 구성을 단일 model.keras
zip 아카이브에 저장합니다.
전체 모델을 세 가지 다른 파일 형식(새로운 .keras
형식 및 두 가지 레거시 형식: SavedModel
및 HDF5
)으로 저장할 수 있습니다. 모델을 path/to/model.keras
로 저장하면 자동으로 최신 형식으로 저장됩니다.
참고: Keras 객체의 경우 디버깅하기 쉬운 더 풍부한 이름 기반 저장과 재로드를 위해 새로운 고수준 .keras
형식을 사용하는 것이 좋습니다. 기존 코드 형식에는 저수준 SavedModel 형식과 레거시 H5 형식이 계속 지원됩니다.
다음을 통해 SavedModel 형식으로 전환할 수 있습니다.
save()
로save_format='tf'
전달확장자 없이 파일 이름 전달
다음을 통해 H5 형식으로 전환할 수 있습니다.
save()
로save_format='h5'
전달.h5
로 끝나는 파일 이름 전달
Saving a fully-functional model is very useful—you can load them in TensorFlow.js (Saved Model, HDF5) and then train and run them in web browsers, or convert them to run on mobile devices using TensorFlow Lite (Saved Model, HDF5)
*Custom objects (for example, subclassed models or layers) require special attention when saving and loading. Refer to the Saving custom objects section below.
새로운 고수준 .keras
형식
.keras
확장자로 표시되는 새로운 Keras v3 저장 형식은 이름 기반 저장을 구현하는 보다 간단하고 효율적인 형식으로, Python의 관점에서 로드한 내용이 저장한 내용과 정확히 일치하는지 확인합니다. 이렇게 하면 디버깅이 훨씬 쉬워지며, Keras에 권장되는 형식입니다.
아래 섹션에서는 모델을 .keras
형식으로 저장하고 복원하는 방법을 설명합니다.
.keras
zip 아카이브에서 새 Keras 모델을 다시 로드합니다.
로드된 모델로 평가 및 예측을 실행해봅니다.
SavedModel 포맷
SavedModel 형식은 모델을 직렬화하는 또 다른 방법입니다. 이 형식으로 저장된 모델은 tf.keras.models.load_model
을 사용하여 복원할 수 있으며 TensorFlow Serving과 호환됩니다. SavedModel 가이드에 SavedModel을 제공/검사하는 방법이 자세히 설명되어 있습니다. 아래 섹션은 모델을 저장하고 복원하는 단계를 보여줍니다.
SavedModel 형식은 protobuf 바이너리와 TensorFlow 체크포인트를 포함하는 디렉토리입니다. 저장된 모델 디렉토리를 검사합니다.
저장된 모델로부터 새로운 케라스 모델을 로드합니다:
복원된 모델은 원본 모델과 동일한 매개변수로 컴파일되어 있습니다. 이 모델을 평가하고 예측에 사용해 보죠:
HDF5 파일로 저장하기
Keras는 HDF5 표준을 따르는 기본 레거시 고수준 저장 형식을 제공합니다.
이제 이 파일로부터 모델을 다시 만들어 보죠:
정확도를 확인해 보겠습니다:
Keras는 아키텍처를 검사하여 모델을 저장합니다. 이 기술은 모든 내용을 저장합니다.
가중치 값
모델 구조
모델의 훈련 구성(
.compile()
메서드에 전달하는 내용)존재하는 옵티마이저와 그 상태(훈련을 중단한 곳에서 다시 시작할 수 있게 해줌)
체크포인트가 호환되지 않기 때문에 케라스는 v1.x 옵티마이저(tf.compat.v1.train
)를 저장할 수 없습니다. v1.x 옵티마이저를 사용하려면 로드한 후에 모델을 다시 컴파일해야 합니다. 따라서 옵티마이저의 상태를 잃게 됩니다.
사용자 정의 객체
SavedModel 형식을 사용하는 경우 이 섹션을 건너뛸 수 있습니다. 고수준 .keras
/HDF5 형식과 저수준 SavedModel 형식의 주요 차이점은 .keras
/HDF5 형식이 객체 구성을 사용하여 모델 아키텍처를 저장하고 SavedModel은 실행 그래프를 저장한다는 것입니다.따라서 SavedModels는 원본 코드가 없어도 하위 클래스 모델 및 사용자 정의 레이어와 같은 사용자 정의 객체를 저장할 수 있습니다. 단, 결과적으로 저수준의 SavedModels를 디버깅하는 것이 더 어려울 수 있으므로 이름 기반의 Keras 네이티브 특성을 가진 고수준의 .keras
형식을 대신 사용하는 것이 좋습니다.
사용자 정의 개체를 .keras
및 HDF5에 저장하려면 다음을 수행해야 합니다.
이 객체에
get_config
메서드를 정의하고 선택적으로from_config
클래스 메서드를 정의합니다.get_config(self)
는 객체를 다시 생성하기 위해 필요한 JSON 직렬화된 매개변수 딕셔너리를 반환합니다.from_config(cls, config)
는get_config
에서 반환된 설정을 사용해 새로운 객체를 만듭니다. 기본적으로 이 함수는 이 설정을 초기화 메서드의 매개변수로 사용합니다(return cls(**config)
).
다음 세 가지 방법 중 하나를 사용하여 사용자 정의 객체를 모델에 전달합니다.
@tf.keras.utils.register_keras_serializable
데코레이터를 사용하여 사용자 정의 객체를 등록합니다. (권장 사항)모델을 로드할 때
custom_objects
인수에 객체를 직접 전달합니다. 인수는 문자열 클래스 이름을 파이썬 클래스에 매핑하는 사전이어야 합니다. 예:tf.keras.models.load_model(path, custom_objects={'CustomLayer': CustomLayer})
custom_objects
사전 인수에 포함된 객체와 함께tf.keras.utils.custom_object_scope
를 사용하고 범위 안에tf.keras.models.load_model(path)
호출을 배치합니다.
사용자 정의 객체 및 get_config
의 예를 보려면 처음부터 레이어 및 모델 작성하기 튜토리얼을 참조하세요.