[파이토치로 만드는 딥러닝 이론3] 모델 저장하기
2024. 6. 3. 21:57ㆍMOOC
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: 모델 성능을 평가하기 위한 지표로, 문제 유형에 맞는 적절한 지표를 선정하는 것이 중요하다.
- 체크포인트 저장에포크 번호, 모델의 상태, 옵티마이저의 상태, 손실 값을 포함한 체크포인트를 저장한다.
- 체크포인트 불러오기체크포인트에서 모델과 옵티마이저의 상태를 불러오고, 저장된 에포크와 손실 값을 복원한다.
# 전이 학습 - 기본 모델 사용
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: 선형 레이어의 파라메터에 대해 기울기 계산을 활성화하여 학습 중 업데이트되도록 한다.
'MOOC' 카테고리의 다른 글
[프로젝트로 배우는 데이터사이언스] pima_classification_baseline (1) | 2024.06.27 |
---|---|
PyTorch 프로젝트 구조 이해하기 (0) | 2024.06.06 |
[파이토치로 만드는 딥러닝 이론2] PyTorch Dataset 실습 (2) | 2024.06.03 |
[파이토치로 만드는 딥러닝 이론1] nn.Module & nn.Parameter & Backward (0) | 2024.05.31 |
[딥러닝] 흉부 엑스레이 이미지 폐렴(PNEUMONIA) 분류 실습 (0) | 2024.05.09 |