[파이토치로 만드는 딥러닝 이론3] 모델 저장하기

2024. 6. 3. 21:57MOOC

1. 모델 저장 및 불러오기

  • 모델 저장: model.save()를 사용하여 모델의 구조와 파라메터를 저장한다. 이렇게 하면 학습 중간 과정을 저장하여 최선의 결과 모델을 선택할 수 있고, 외부 연구자와 공유하여 학습 재연성을 향상시킬 수 있다.
  • 파라메터 저장: torch.save(model.state_dict(), os.path.join(MODEL_PATH, "model.pt"))를 사용하여 모델의 파라메터를 저장하고, new_model.load_state_dict(torch.load(os.path.join(MODEL_PATH, "model.pt")))를 사용하여 같은 모델 구조에서 파라메터만 불러올 수 있다.
  • 모델 구조와 함께 저장: torch.save(model, os.path.join(MODEL_PATH, "model.pt"))를 사용하여 모델의 구조와 파라메터를 함께 저장하고, model = torch.load(os.path.join(MODEL_PATH, "model.pt"))를 사용하여 불러올 수 있다.

2. 체크포인트 저장 및 불러오기

  • 학습 중간 결과 저장: torch.save({'epoch': e, 'model_state_dict': model.state_dict(), 'optimizer_state_dict': optimizer.state_dict(), 'loss': epoch_loss}, f"saved/checkpoint_model_{e}_{epoch_loss/len(dataloader)}_{epoch_acc/len(dataloader)}.pt")를 사용하여 학습 중간 결과를 저장한다.
  • 체크포인트 불러오기: checkpoint = torch.load(PATH)를 통해 저장된 체크포인트를 불러와서, 모델과 옵티마이저의 상태를 복원하고, epoch과 loss를 확인할 수 있다.

3. 전이 학습 (Transfer Learning)

  • 기본 모델 사용: 다른 데이터셋으로 학습된 모델을 현재 데이터셋에 적용하는 방법으로, 대용량 데이터셋으로 만들어진 모델의 성능을 이용할 수 있다.
  • 기본 모델 제공: TorchVision은 다양한 기본 모델을 제공하고, NLP에서는 HuggingFace가 사실상의 표준이다.
  • 모델의 일부분 고정: 전이 학습을 할 때 모델의 일부분을 frozen 시키고, 새로운 데이터셋에 맞추어 일부 레이어만 학습시키는 방법을 사용한다.

VGG16

VGG16은 딥러닝에서 사용되는 대표적인 컨볼루션 신경망(CNN) 모델

 

  • 구조:
    • VGG16은 16개의 가중치 층으로 구성되어 있으며, 이는 13개의 컨볼루션 층과 3개의 완전 연결 층을 포함한다.
    • 모든 컨볼루션 층은 3x3 필터를 사용하고, 스트라이드와 패딩은 1로 설정되어 있다. 이는 필터 크기와 스트라이드/패딩을 일정하게 유지함으로써 모델 구조의 단순함을 유지한다.
    • 풀링 층은 2x2 크기의 최대 풀링(Max Pooling)을 사용하여 입력 이미지의 공간 크기를 줄인다.
  • 학습 및 성능:
    • VGG16은 ImageNet 데이터셋에서 학습되었으며, 다양한 이미지 분류 작업에서 높은 정확도를 달성했다.
    • 네트워크가 깊기 때문에 복잡한 패턴을 잘 학습할 수 있으며, 이는 이미지의 세부 사항을 효과적으로 캡처하는 데 도움을 준다.
  • 활용:
    • VGG16은 이미지 분류, 객체 탐지, 이미지 세그멘테이션 등 다양한 컴퓨터 비전 작업에 널리 사용된다.
    • 사전 학습된 가중치를 이용해 전이 학습(Transfer Learning)을 수행할 수 있어, 특정 작업에 맞게 모델을 빠르게 튜닝할 수 있다.

 

# 모델 파라메터 저장
torch.save(model.state_dict(), os.path.join(MODEL_PATH, "model.pt"))

# 모델 파라메터 불러오기
new_model = TheModelClass()
new_model.load_state_dict(torch.load(os.path.join(MODEL_PATH, "model.pt")))

# 모델 아키텍처와 함께 저장
torch.save(model, os.path.join(MODEL_PATH, "model.pt"))

# 모델 아키텍처와 함께 불러오기
model = torch.load(os.path.join(MODEL_PATH, "model.pt"))

모델 파라메터 저장

  • model.state_dict(): 모델의 모든 학습 가능한 파라메터를 딕셔너리 형태로 반환한다.
  • torch.save(): 파라메터 딕셔너리를 지정된 경로에 저장한다.
  • os.path.join(MODEL_PATH, "model.pt"): 저장할 파일의 경로와 이름을 지정한다. 여기서 MODEL_PATH는 모델이 저장될 디렉토리 경로이다.

모델 파라메터 불러오기

  • new_model = TheModelClass(): 모델의 새로운 인스턴스를 생성한다. TheModelClass는 모델의 클래스 이름이다.
  • torch.load(): 저장된 파라메터 딕셔너리를 불러온다.
  • new_model.load_state_dict(): 불러온 파라메터 딕셔너리를 새로운 모델 인스턴스에 로드한다. 이로써 저장된 파라메터를 새로운 모델에 적용할 수 있다.

모델 아키텍처와 함께 저장

  • torch.save(model, ...): 모델 자체를 파일에 저장한다. 이 방법은 모델의 아키텍처와 파라메터를 모두 포함한다.
  • os.path.join(MODEL_PATH, "model.pt"): 저장할 파일의 경로와 이름을 지정한다.

모델 아키텍처와 함께 불러오기

  • torch.load(): 저장된 모델을 파일에서 불러온다. 이로써 모델의 아키텍처와 파라메터를 모두 복원할 수 있다.
  • model: 복원된 모델 객체가 할당된다.
# 체크포인트 저장
torch.save({
    'epoch': e,
    'model_state_dict': model.state_dict(),
    'optimizer_state_dict': optimizer.state_dict(),
    'loss': epoch_loss,
}, f"saved/checkpoint_model_{e}_{epoch_loss/len(dataloader)}_{epoch_acc/len(dataloader)}.pt")

# 체크포인트 불러오기
checkpoint = torch.load(PATH)
model.load_state_dict(checkpoint['model_state_dict'])
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
epoch = checkpoint['epoch']
loss = checkpoint['loss']

체크포인트 저장 및 불러오기

 

  • Checkpoint: 모델 학습 중간중간에 상태를 저장하여 최적의 모델을 찾고, 학습 중단 시 이어서 학습할 수 있게 한다.
  • EarlyStopping: 학습 중 모델의 성능이 더 이상 개선되지 않으면 조기에 학습을 종료하여 과적합을 방지한다.
  • Metric: 모델 성능을 평가하기 위한 지표로, 문제 유형에 맞는 적절한 지표를 선정하는 것이 중요하다.

 

  1. 체크포인트 저장에포크 번호, 모델의 상태, 옵티마이저의 상태, 손실 값을 포함한 체크포인트를 저장한다.
  2. 체크포인트 불러오기체크포인트에서 모델과 옵티마이저의 상태를 불러오고, 저장된 에포크와 손실 값을 복원한다.

 

 

# 전이 학습 - 기본 모델 사용
vgg = models.vgg16(pretrained=True).to(device)

# 전이 학습 - 새 모델 정의
class MyNewNet(nn.Module):
    def __init__(self):
        super(MyNewNet, self).__init__()
        self.vgg19 = models.vgg19(pretrained=True)
        self.linear_layers = nn.Linear(1000, 1)

    def forward(self, x):
        x = self.vgg19(x)
        return self.linear_layers(x)

 

 

 

  • VGG16 모델 로드: models.vgg16(pretrained=True)는 사전 학습된 VGG16 모델을 불러온다.
  • GPU로 이동: .to(device)는 모델을 GPU 장치로 이동시킨다.

초기화 메소드: __init__ 메소드에서 사전 학습된 VGG19 모델을 불러오고, 새로운 선형 레이어를 추가한다.

  • self.vgg19 = models.vgg19(pretrained=True): 사전 학습된 VGG19 모델을 불러온다.
  • self.linear_layers = nn.Linear(1000, 1): 새로운 선형 레이어를 정의한다. 이 레이어는 VGG19의 출력(1000차원)을 받아 1차원으로 변환한다.

순전파 메소드: forward 메소드에서 입력을 VGG19 모델에 통과시킨 후, 새로운 선형 레이어를 통해 출력한다.

  • x = self.vgg19(x): 입력 이미지를 VGG19 모델을 통해 피쳐를 추출한다.
  • return self.linear_layers(x): 추출된 피쳐를 새로운 선형 레이어를 통해 최종 출력으로 변환한다.
for param in my_model.parameters():
     param.requires_grad = False
for param in my_model.linear_layers.parameters():
     param.requires_grad = True

 

  • 파라메터 고정: for 루프를 통해 모델의 모든 파라메터를 고정시킨다. 즉, 학습 중에 이 파라메터들은 업데이트되지 않는다.
    • param.requires_grad = False: 모델의 모든 파라메터에 대해 기울기 계산을 중지하여 학습 중 업데이트되지 않도록 한다.
  • 새로운 선형 레이어의 파라메터 업데이트: 두 번째 for 루프를 통해 새로운 선형 레이어의 파라메터만 학습 중 업데이트되도록 설정한다.
    • param.requires_grad = True: 선형 레이어의 파라메터에 대해 기울기 계산을 활성화하여 학습 중 업데이트되도록 한다.