관리 메뉴

공부 기록

[WEEK 2] PyTorch 구조 학습하기 2 본문

BOOST CAMP - AI Tech

[WEEK 2] PyTorch 구조 학습하기 2

_JAEJAE_ 2022. 9. 28. 09:48

▶ model.save()

  • 학습의 결과를 저장하기 위한 함수이다.
  • 학습의 결과를 2가지 방법으로 저장할 수 있다.
    • 모델의 형태(architecture)를 저장할 수 있다.
    • 형태 안에 있는 파라미터만 저장할 수 있다.
  • 모델 학습 중간 과정의 저장을 통해 최선의 결과 모델을 선택할 수 있다. → early stopping
  • 만들어진 모델을 외부 연구자와 공유하여 학습 재연성을 향상할 수 있다.
for param_tensor in model.state_dict(): # state_dict : 모델의 파라미터를 표시해주는 함수 -> OrderedDict 타입
    print(param_tensor, "\t", model.state_dict()[param_tensor].size())
    
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"))) # 같은 모델의 형태에서 파라미터만 load

torch.save(model, os.path.join(MODEL_PATH, "model.pt")) # 모델의 architecture와 함께 저장
model = torch.load(os.path.join(MODEL_PATH, "model.pt")) # 모델의 architecture와 함께 load

 

▶ checkpoints

  • 학습의 중간 결과를 저장하여 최선의 결과를 선택할 수 있다.
  • earlystopping 기법 사용시 이전 학습의 결과물을 저장한다.
  • loss와 metric 값을 지속적으로 확인할 수 있도록 저장한다.
  • 일반적으로 epoch, loss, metric을 함께 저장하여 확인할 수 있도록 한다.
  • colab에서 지속적인 학습을 위해서 반드시 필요하다.

 

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']
 

▶ Transfer learning

  • 다른 데이터셋으로 만든 모델(이미 만들어 놓은 모델, pretrained model)을 가지고 현재 데이터에 적용하는 것이다.
  • 일반적으로 대용량 데이터셋으로 만들어진 모델의 성능이 좋다.
  • 현재의 DL에서는 가장 일반적인 학습 기법이다.
  • backbone architecture가 잘 학습된 모델에서 일부분만 변경하여 보통 학습을 수행한다.
  • TorchVison은 다양한 기본 모델을 제공한다.
  • NLP는 HuggigFace가 사실상 표준 모델처럼 사용된다.

 

▶ Freezing

  • pretrained model을 활용 시 모델의 일부분을 frozen 시키는 것이다.
  • frozen : 특정 부분의 파라미터 값을 바뀌지 않게 하는 것
  • back propagation이 일부 layer에만 일어나도록 한다.

 

vgg = models.vgg16(pretrained=True).to(device) # vgg16모델을 vgg에 할당하기

class MyNewNet(nn.Module): # 내 모델 만들기
    def init (self):
        super(MyNewNet,self).__init ()
        self.vgg19 = models.vgg19(pretrained=True) 
        self.linear_layers=nn.Linear(1000,1) # 모델의 마지막 Linear Layer 추가

    #Defining the forward pass 
    def forward(self, x): 
        x = self.vgg19(x)
        return self.linear_layers(x)
        
for param in my_model.parameters(): # 마지막 layer를 제외하고 frozen
    param.requires_grad=False
    
for param in my_model.linear_layers.parameters(): 
    param.requires_grad = True

  • 긴 학습 과정에서 기록은 반드시 필요하다.
  • 기록하는 방법을 생각해보면 print, log, csv 파일 형태 등등이 있다.
  • 딥러닝 공부해보면 알 수 있듯이 기록하기 좋은 도구들이 많다. → Tensorboard, weight & biases(wandb) 

 

▶ Tensorboard

  • TensorFlow의 프로젝트로 만들어진 시각화 도구이다.
  • 학습 그래프, metric, 학습 결과의 시각화를 지원한다.
  • PyTorch도 연결 가능하다. → DL 시각화의 핵심 도구
  • scalar : metric 등 상수값의 연속(epoch)을 표시 → 평가지표(accuracy, loss, precision, recall 등)를 epoch(시간) 단위로 표시
  • graph : 모델의 computational graph 표시
  • histogram : weight 등 값의 분포를 표현
  • Image, Text : 예측 값과 실제 값을 비교 표시
  • mesh : 3d 형태의 데이터를 표현하는 도구
import os

# Tensorboard 기록을 위한 directory 생성
# directory name : "프로젝트 이름/실험 이름"과 같이 생성
logs_base_dir = "logs" 
os.makedirs(logs_base_dir, exist_ok=True)

from torch.utils.tensorboard import SummaryWriter 
import numpy as np

# 기록 생성 객체 SummaryWriter 생성
writer = SummaryWriter(logs_base_dir) 

for n_iter in range(100):
    writer.add_scalar('Loss/train', np.random.random(), n_iter) 
    writer.add_scalar('Loss/test', np.random.random(), n_iter) 
    writer.add_scalar('Accuracy/train', np.random.random(), n_iter) 
    writer.add_scalar('Accuracy/test', np.random.random(), n_iter)
writer.flush() # 값 기록(disk에 쓰기)

# add_scalar 함수 : scalar 값을 기록
# Loss/train : loss category에 train에 넣기
# n_iter : x 축의 값 

# Tensorboard 띄우는 방법
%load_ext tensorboard # jupyter, colab에서 바로 사용 가능
%tensorboard --logdir {logs_base_dir} # 6006포트로 자동 생성
 

▶ weight & biases

  • 머신러닝 실험을 원활히 지원하기 위한 상용도구이다.
  • 협업, code versioning, 실험 결과 기록 등을 제공한다.
  • MLOps의 대표적인 툴로 저변 확대 중이다.
!pip install wandb -q

# config 설정
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

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({'accuracy': train_acc, 'loss': train_loss}) # 기록 add_~~~ 함수와 동일

 

 

※ 모든 시각 자료는 부스트 캠프 AI Tech 교육 자료를 참고했습니다.

'BOOST CAMP - AI Tech' 카테고리의 다른 글

[WEEK 3] 딥러닝 기본  (0) 2022.10.03
[WEEK 2] PyTorch 활용하기  (0) 2022.09.29
[WEEK 2] PyTorch 구조 학습하기  (0) 2022.09.27
[WEEK 2] PyTorch 기본  (0) 2022.09.26
[WEEK 1] AI Math - 딥러닝 학습 방법  (0) 2022.09.25
Comments