학습을 끝낸 모델을 가지고 최종 예측을 추출하는 부분에서 'size miss' Runtime 에러가 발생한다면, 모델 구조와 파라미터의 저장 및 로드가 제대로 되었는지 점검해봐야 한다.
모델 구조를 저장한다는 것, 모델 가중치를 저장한다는 것, 모델 파라미터를 저장한다는 것은 각각 무엇일까. 엄밀히 따지자면, 모델 파라미터가 다른 두 개를 아우르는 개념 단어이다.
# 하이퍼 파라미터 로드
with open('model_params.json', 'r') as f:
loaded_model_params = json.load(f)
# 하이퍼 파라미터로 모델 초기화. Gpu로 옮기는 옵션이 붙었다.
model = GraphSAGERegressor(**loaded_model_params).to(device)
# 모델 가중치 로드 및 적용
model.load_state_dict(torch.load('model_weights.pth'))
위 코드는 Pytorch에서 저장된 모델 파라미터를 불러와 새로 초기화한 모델에 적용하는 예제 코드이다.
state_dict()는 모델의 가중치와 관련된 정보를 포함하는 Pytorch 모델의 Python dictionary다. load란 저장된 모델 파라미터를 현재 모델에 적용하는 것을 의미한다. (학습된 모델을 다른 머신이나 환경에서 사용하고자 할 때, 원본 모델과 동일한 구조를 가진 새로운 모델을 생성하고 가중치를 적용하는 것이 일반적이다.)
따라서 일반적으로 이전에 학습한 모델을 사용하려면, 모델 구조와 학습된 가중치를 불러와야 한다. 이를 통해 새로운 데이터셋에 대한 예측을 수행할 수 있으며, 보통 모델 파라미터를 저장하고 불러오면 이 과정이 포함된다.
그리고 이때 모델 구조와 모델 파라미터가 일치해야만 load가 정상적으로 진행된다.
모델 구조란 일반적으로 class로 정의해둔 네트워크 아키텍처를 의미하며, 그럼 현재 모델 구조는 어떻게 확인할 수 있을까? 놀랄 만큼 간단하다.
print(model)
모델 구조와 학습된 가중치의 형태가 일치한지 좀 더 상세히 알아보고 싶다면, 아래와 같은 코드도 도움이 된다.
# 가중치 불러오기
loaded_weights = torch.load('best_model_weights.pth')
# best_model의 state_dict 출력
print("best_model's state_dict:")
for param_tensor in best_model.state_dict():
print(param_tensor, "\t", best_model.state_dict()[param_tensor].size())
print("\nLoaded weights:")
for param_tensor in loaded_weights:
print(param_tensor, "\t", loaded_weights[param_tensor].size())
너무나도 당연한 이야기지만, 파라미터와 하이퍼 파라미터는 다르다. 같은 맥락으로 모델 파라미터에는 모델 구조와 가중치만 포함되어 있다. 하이퍼파라미터는 따로 저장되지 않으므로, 다시 사용할 때는 하이퍼파라미터를 직접 설정해야 한다.