다음 글은 파이토치 코리아의 기본 익히기 글을 참고하여 작성하였습니다.
모델을 학습하는 과정은 각 반복 단계에서 입력에 대한 출력을 추측하고, 추측과 정답 사이의 오류(loss)를 계산하고, 매개변수에 대한 오류의 도함수를 수집한 뒤(이전 글), 다양한 기법을 사용하여 이 파라미터들을 최적화(Optimize) 하는 과정의 반복입니다.
하이퍼파라미터(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_model
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 |