ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [08.19] Day13 - 👏 'PyTorch 구조2'
    네이버 부스트캠프 AI Tech 2기 2021. 8. 21. 19:32
    728x90
    반응형

    [PyTorch] 모델 불러오기 + 모니터링 도구

    [수업 내용]

    강사 : 최성철 교수님

    다른 특정 타겟의 모델을 나의 것으로 가져와서 커스텀, Fine Tuning 형태의 알고리즘이 대세이다. 보통 Transfer Tuning하고 Fine Tuning 과정을 거친다고 한다.

    model.save()

    :학습의 결과를 저장하는 함수

    • 모델의 형태를 저장하거나 파라미터를 저장할 수 있다.
    • 중간 중간 저장을 통해 최선의 결과모델 선택할 수 있다.
    • 만들어진 모델을 외부 연구자와 함께 공유해서 학습 재연성 향상할 수 있다.
    torch.save(model.state_dict(),os.path.join(MODEL_PATH, "model.pt"))
    #모델을 저장할 때 OrderedDict 타입으로 저장하기 때문에 쉽게 내용을 불러올 수 있다.
    #모델의 파라미터를 저장한다.
    
    new_model = 모델클래스()
    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.eval() #얘도 모델 로드해서 확인할 수 있다.
    from torchsumnmary import summary
    summary(model, (3,244,244))
    #input 만 잘 맞춰주면 model의 요약을 볼 수 있다.

    CheckPoints

    학습 중간 결과를 저장해 최선의 결과를 선택한다.

    특히, EarlyStopping 기법 사용시 이전 학습의 결과물을 저장한다. loss와 metric 값을 지속적으로 확인 저장한다.

    보통은 epoch, loss, metric 을 함께 저장해서 확인한다.

    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로 중간중간 값을 저장한다. -> epoch 중간중간 save함수를 호출해서 저장한다.
    #dict 파일로 저장한다. epoch 단위로
    
    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']

    Pre-Trained Model

    • Transfer Learning

    다른 데이터셋으로 만든 모델을 현재 데이터에 적용한다.

    일반적으로 대용량 데이터셋으로 만들어진 모델의 성능이 높다.

    현재의 DL 에서는 가장 일반적인 학습 기법

    backbone architecture 가 잘 학습된 모델에서 일부분 변경해서 학습을 수행한다.

    Freezing

    pretrained model을 활용시 모델의 일부분을 frozen 시킨다.

    Layer 전체적으로 학습을 시키는 것이 아니라 Frozen 시킬 레이어를 정하고 파라미터를 수정하는 과정을 거친다. 그러면 부분적으로 파라미터를 학습하게 만들 수 있다.

    vgg = models.vgg16(pretrained=True).to(device)
    #기존 모델 불러오기
    
    class 내모델(nn.Module):
        def __init__(self):
            super(내모델,self).__init__()
            self.vgg19 = models.vgg19(pretranied=True)
            self.linear_layers = nn.Linear(1000,1)
            #나의 모델에 맞게 마지막 레이어를 추가해 준다.
    
        def forward(self,x):
            x = self.vgg19(x)
            return self.linear_layers(x)
    #Pretrained Model을 불러와서 적용한 예시
    
    for par in 내모델.parameters():
        par.required_grad = False
    #파라미터들 frozen
    
    for par in 내모델.linear_layers.parameters():
        par.required_prad = True
    #여기 파라미터는 학습 진행

    Monitoring Tools

    2013,2014년만 되어도 좋은 모니터링 도구가 없었는데 tensor board 같은 것을 지원하면서 모델을 지속적으로 관리할 수 있는 도구를 지원해주었다.

    1. TensorBoard
    2. Weight & biases

    Tensorboard

    : TensorFlow의 프로젝트로 만들어진 시각화 도구.

    학습 그래프, metric, 학습 결과의 시각화 지원한다.

    PyTorch도 연결 가능하다 → DL 시각화 핵심 도구이다.

    • scalar값 : metric 등 상수 값의 연속(epoch)를 표시
    • graph : 모델의 computational graph 표시
    • histogram : weight 등 값의 분포를 표현한다.
    • image : 예측 값과 실제 값을 비교 표시
    • mesh : 3d 형태의 데이터를 표형하는 도구
    import os
    파일 위치변수 = 'logs'
    os.makedirs(log_dir, exist_ok = True)
    
    from torch.utils.tensorboard import SummaryWriter
    import numpy as np
    
    writer = SummaryWriter(파일 위치변수)
    for iter in range(100):
        writer.add_scalar('Loss/train', np.random.random(), iter)
        writer.add_scalar('Loss/test', np.random.random(), iter)
        writer.add_scalar('Accuracy/train', np.random.random(), iter)
        writer.add_scalar('Accuracy/train', np.random.random(), iter)
        #add_scalar 함수는 scalar 값을 기록한다.
        #'Loss/train' 은 loss 카테고리에 train 값을 의미한다.
        #iter는 x축의 값이다.
    
    writer.flush()
    #값을 disk에 쓰기
    ============================================================================
    %load_ext tensorboard
    #tensorboard를 부른다.
    %tensorboard --logdir {파일 위치변수}
    #텐서보드 수행한다. 6006포트로 자동 생성된다.
    ============================================================================

    Weight & Biases

    : 머신러닝 실험을 원활히 지원하기 위한 상용 도구

    협업, code versioning, 실험 결과 기록 등을 제공한다.

    MLOps의 대표적인 툴로 저변 확대 중이다.

    1. 가입해서 Setting에 API Key를 복사한다.
    2. 새로운 프로젝트 생성 필요하다.
    !pip install wandb-q
    config = {"epochs" : EPOCHS, "batch_size" : BATCH_SIZE, "learning_rate" : LEARNING_RATE}
    #하이퍼 파라미터 정보 관리
    wandb.init(project ="my-test-project", config = config)
    wandb.config.batch_size = BATCH_SIZE
    wandb.config.learning_rate = LEARNING_RATE
    # config 설정
    
    for e in range(1, EPOCHS+1):
        epoch_loss = 0
        epoch_acc = 0
        for X_batch, y_batch in train_dataset:
            X_batch, y_batch = X_batch.to(device), y_batch.to(device).type(torch.cuda.FloatTensor)
    
        ..
        optimizer.step()
        wandb.log({'acc' : train_acc, 'loss': train_loss})
        #기록하는 함수 log를 통해서 기록
    

    [수업 회고]

    1. checkpoint를 사용하면서 model의 정보와 파라미터들을 저장하고, 다시 학습을 진행할때 이부분을 불러 들여서 변수에 담고 다시 진행하면 된다는 것을 알았다.
    2. 모니터링 Tool 2가지에 대해서 배웠고, Tensorboard를 더 활용하는 것이 낫겠다.

    [피어세션 정리]

    • 모델 불러오기
      optimizer는 state_dict가 왜 필요한가? ⇒ 훈련을 이어서 시키기 위해서
      pretrained된게 성능이 더 잘나오는 이유? ⇒ 좋은 feature map을 찾도록 이미 큰 데이터셋에서 훈련이 되어 있어서
      Pretrained 모델을 고르는 기준은 어떻게 될까? ⇒ 제한된 시간에서 다 써봐야하지 않을까
    • Why save optimizer state dict?
    • Monitering tools
      아 이런게 있구나 주말에 써봐야겠다.
     

    Why save optimizer state dict?

    Hi everyone 🙂 Probably a simple question but I can’t seem to figure out why exactly we should save the optimizer.state_dict() to resume training? Why isn’t it sufficient to save the model.state_dict()? The optimizer.state_dict() does not have any le

    discuss.pytorch.org

     

    반응형
Designed by Tistory.