[RuntimeError] size miss

강하예진(Erica)·2023년 5월 9일
0

I Nailed It!

목록 보기
4/4

학습을 끝낸 모델을 가지고 최종 예측을 추출하는 부분에서 '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()

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())

advance

너무나도 당연한 이야기지만, 파라미터와 하이퍼 파라미터는 다르다. 같은 맥락으로 모델 파라미터에는 모델 구조와 가중치만 포함되어 있다. 하이퍼파라미터는 따로 저장되지 않으므로, 다시 사용할 때는 하이퍼파라미터를 직접 설정해야 한다.

profile
Recommend System & BackEnd Engineering

0개의 댓글