인프런 커뮤니티 질문&답변

Jun-yeol Choi님의 프로필 이미지
Jun-yeol Choi

작성한 질문수

딥러닝 CNN 완벽 가이드 - Fundamental 편

Keras Callback 실습 - ModelCheckpoint, ReduceLROnPlateau, EarlyStopping

저장된 모델에는 무엇이 들어 있나요? 그리고 weight만 저장했을 경우 어떻게 사용하나요?

작성

·

493

0

매개변수를 하나하나 알기 쉽게 설명해주셔서 감사합니다.

 

[질문 1] fit 중에 콜백함수를 이용해 모델을 저장할 수 있다고 하셨는데요, 모델 안에 무엇이 저장되는지 궁금합니다. loss, accuracy, weights 는 저장되어 있을 것 같은데요, 그 외에 무엇이 저장되어 있나요? 혹시 학습 데이터도 저장되나요? 저장 목록을 알려면 어떤 명령어를 써야 하나요?

 

[질문 2] fit 중에 오류가 발생해 다운되었을 때, 저장된 모델을 불러 fit을 이어서 할 수 있나요?

 

[질문 3] save_weights_only 했을 경우 어떻게 사용해야 하나요? 저장된 모델을 불러 바로 predict 하면 되나요?

 

모델을 저장하고 불러 와 사용한 적이 없다보니 질문 범위가 너무 넓은 것 같아 죄송합니다. 혹시 참고할 만한 사이트를 알려주시면 공부해보겠습니다.

답변 1

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

  1. fit() 을 수행하면서 모델에 저장되는 것은 주로 weight(가중치)입니다. 학습 데이터는 저장되지 않으며, Metric(예를들어 accuracy), loss도 저장은 됩니다.

    보통 하나의 모델이 학습을 하게 되면 해당 모델이 가지는 주요 저장 정보는 모델이 만들어진 layer기반 아키텍처와 학습된 weight, 그리고 optimizer, metric, loss 정도의 정보입니다.

    근데, 이게 Keras 방식과 Tensorflow 방식이 좀 다릅니다. 원래 Tensorflow는 weight는 별도의 파일로 만들고, layer기반 아키텍처와 optimizer, metric, loss정보는 또 다른 파일에 저장합니다.

    원래 keras는 weight와 layer기반 아키텍처, optimizer 정보만을 하나의 파일로 저장합니다. 그리고 metric과 loss는 저장하지 않습니다.

     

  2. 네, 다시 모델을 불러 올수가 있습니다. 일반적으로 model.fit() 수행시 파이썬 프로세스 자체가 완전히 죽은게 아니라, 예를 들어 20회 epoch 수행을 수행하던 중 10회만 수행하고 종료한 뒤 다시 fit()을 수행하면 10회 수행했을 때에 학습된 가중치를 기반으로 다시 학습을 수행합니다. 그러니까 처음 가중치가 아니라 종료된 시점의 가중치를 기반으로 학습을 수행하기 때문에 좀 더 성능이 좋을 수 있습니다. 하지만 이는 model이 여전히 memory에 살아있을 경우에 한합니다. model이 memory에서 완전히 날라간 상태라면 epoch시 마다 checkpoint로 저장된 파일을 로드하여 다시 fit()을 수행하면 됩니다.

     

  3. 앞에서 모델의 저장 정보는 모델의 layer기반 아키텍처와 weight라고 말씀드렸는데, save_weights_only는 weight만 저장합니다. 때문에 모델의 layer기반 아키텍처는 저장되지 않아서 모델 layer는 다시 만들어 줘야 합니다. 즉 Conv, Dense Layer등으로 다시 모델을 만들고 이 모델에서 save_weights_only로 저장된 weight 정보를 다시 로딩해 줘야 합니다.

     

    save_weights_only로 checkpoint형태로 저장된 파일은 model.load_weight(파일명)으로 weight를 로딩할 수 있습니다. (예를 들어 아래와 같이)

     

    sequential_model = keras.Sequential(  

    [         keras.Input(shape=(784,), name="digits"),        

    keras.layers.Dense(64, activation="relu", name="dense_1"),        

    keras.layers.Dense(64, activation="relu", name="dense_2"),        

    keras.layers.Dense(10, name="predictions"),     ] )

     

    sequential_model.save_weights("ckpt")

    load_status = sequential_model.load_weights("ckpt")

     

    보다 자세한 모델의 저장 및 로드는 아래 문서를 참조 부탁드립니다.

    https://www.tensorflow.org/guide/keras/save_and_serialize?hl=ko

     

    감사합니다.

     

Jun-yeol Choi님의 프로필 이미지
Jun-yeol Choi
질문자

자세하게 알려주셔서 감사합니다.

교수님의 깊은 지식에 또다시 감탄했습니다.

Jun-yeol Choi님의 프로필 이미지
Jun-yeol Choi

작성한 질문수

질문하기