다음 글은 파이토치 코리아 기본 익히기 글을 참고하여 작성하였습니다.

 


모델을 학습하는 과정은 각 반복 단계에서 입력에 대한 출력을 추측하고, 추측과 정답 사이의 오류(loss)를 계산하고, 매개변수에 대한 오류의 도함수를 수집한 뒤(이전 글), 다양한 기법을 사용하여 이 파라미터들을 최적화(Optimize) 하는 과정의 반복입니다.

 

기본 코드

 

모델 매개변수 최적화하기

파이토치(PyTorch) 기본 익히기|| 빠른 시작|| 텐서(Tensor)|| Dataset과 Dataloader|| 변형(Transform)|| 신경망 모델 구성하기|| Autograd|| 최적화(Optimization)|| 모델 저장하고 불러오기 이제 모델과 데이터가 준비

tutorials.pytorch.kr

 

하이퍼파라미터(Hyperparameter)

하이퍼파라미터는 모델 최적화 과정을 제어할 수 있는 조절 가능한 매개변수 입니다.

  • 에폭(epoch) : 데이터셋을 반복하는 횟수
  • 배치 크기(batch size) : 매개변수가 갱신되기 전 신경망을 통해 전파된 데이터 샘플의 수
  • 학습률(learning rate) : 각 배치/에폭에서 모델의 매개변수를 조절하는 비율

 

손실 함수(loss function)

손실 함수는 획득한 결과의 실제 값 사이의 틀린 정도를 다양한 기법을 통해 측정하여 학습 중에 이 값을 최소화 합니다.

  • nn.MSELoss : 평균 제곱 오차, Mean Square Error
  • nn.NLLoss : 음의 로그 우도, Negative Log Likelihood
  • nn.CrossEntropyLoss : nn.LogSoftmax + nn.NLLLoss

 

옵티마이저(Optimizer)

옵티마이저는 각 학습 단계에서 모델의 오류를 줄이기 위해 모델 매개변수를 조정하는 과정입니다.

PyTorch에서는 다양한 옵티마이저를 제공하고 있습니다.

 

다음은 제가 이전에 참여한 대회의 코드입니다.

더보기
train_dataset = CustomDataset(train_x['img_path'].values, train_labels, train_transform)
train_loader = DataLoader(train_dataset, batch_size = CFG['BATCH_SIZE'], shuffle=True, num_workers=CFG['NUM_WORKERS'])

val_dataset = CustomDataset(valid_x['img_path'].values, valid_labels, test_transform)
val_loader = DataLoader(val_dataset, batch_size = CFG['BATCH_SIZE'], shuffle=False, num_workers=CFG['NUM_WORKERS'])

model = Densenet()
model = nn.DataParallel(model)
model.eval()

optimizer = torch.optim.Adam(params=model.parameters(), lr=CFG["LEARNING_RATE"], weight_decay=CFG["WEIGHT_DECAY"])
scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[ int(CFG["EPOCHS"]*0.2), int(CFG["EPOCHS"]*0.4), int(CFG["EPOCHS"]*0.6)], gamma=0.7)

infer_model = train(model, optimizer, train_loader, val_loader, scheduler, device)
def train(model, optimizer, train_loader, val_loader, scheduler, device):
    model.to(device)
    criterion = nn.BCELoss().to(device)

    best_val_loss = 999999
    best_val_f1 = 0
    best_model = None
    
    # Early Stop
    patience_limit = 3
    patience = 0
    
    for epoch in range(1, CFG['EPOCHS']+1):              
        torch.cuda.empty_cache()
        model.train()
        
        train_loss = []        
        for imgs, labels in tqdm(iter(train_loader)):
            imgs = imgs.float().to(device)
            labels = labels.to(device)
            
            optimizer.zero_grad()
            
            output = model(imgs)
            loss = criterion(output, labels)
            
            loss.backward()
            optimizer.step()
            
            train_loss.append(loss.item())
                    
        _val_loss, _val_acc, _val_f1 = validation(model, criterion, val_loader, device)
        _train_loss = np.mean(train_loss)
        print(f'Epoch [{epoch}], Train Loss : [{_train_loss:.5f}] Val Loss : [{_val_loss:.5f}] Val ACC : [{_val_acc:.5f}] Val F1 : [{_val_f1:.5f}]')
        
        if scheduler is not None:
            scheduler.step(_val_acc)
            
        if best_val_f1 < _val_f1:
            best_val_loss = _val_loss
            best_val_f1 = _val_f1
            best_model = model
            patience = 0
        else:
            patience += 1
            if patience >= patience_limit:
                break

    print(f'Best Loss : [{best_val_loss:.5f}] Best ACC : [{best_val_f1:.5f}]')
    return best_modelCopy Icon

Optimizer로 BCELoss를 사용하였고, Optimizer로 Adam를 사용하였습니다.

'ML & DL > PyTorch' 카테고리의 다른 글

[PyTorch] nn.Module  (0) 2023.03.15
[PyTorch] torch.nn  (0) 2023.03.15
[PyTorch] Autograd, 자동 미분  (0) 2023.03.13
[PyTorch] DATASET과 DATALOADER  (0) 2023.03.13
[PyTorch] 텐서(Tensor)  (0) 2023.03.13
욱근욱