네이버 부스트캠프/LEVEL-1

[부스트캠프][P-stage][WK04 / Day5] Image Classification 5

1. 금일 목표

  • k-fold cross validation 구현
  • Test Time Augmentation을 구현
  • Tensorboard, wandb 이용

2. 진행사항

1) k-fold cross validation 구현

k-fold cross validation은 데이터를 k개로 나눠서 각 덩어리를 한 번씩 validation set으로 설정하여 총 k번 모델을 학습, 검증하는 방법입니다. 각 fold의 모델을 앙상블하는데 사용되기도 합니다.

def crossvalid(model=None,criterion=None,optimizer=None,dataset=None,k_fold=5):

    train_score = pd.Series()
    val_score = pd.Series()

    total_size = len(dataset)
    fraction = 1/k_fold
    seg = int(total_size * fraction)

    for i in range(k_fold):
        trll = 0
        trlr = i * seg
        vall = trlr
        valr = i * seg + seg
        trrl = valr
        trrr = total_size


        train_left_indices = list(range(trll,trlr))
        train_right_indices = list(range(trrl,trrr))

        train_indices = train_left_indices + train_right_indices
        val_indices = list(range(vall,valr))

        train_set = torch.utils.data.dataset.Subset(dataset,train_indices)
        val_set = torch.utils.data.dataset.Subset(dataset,val_indices)



        train_loader = torch.utils.data.DataLoader(train_set, batch_size=50,
                                          shuffle=True, num_workers=4)
        val_loader = torch.utils.data.DataLoader(val_set, batch_size=50,
                                          shuffle=True, num_workers=4)
        train_acc = train(res_model,criterion,optimizer,train_loader,epoch=1)
        train_score.at[i] = train_acc
        val_acc = valid(res_model,criterion,optimizer,val_loader)
        val_score.at[i] = val_acc

    return train_score,val_score

위의 k-fold crossvalidation을 현재 모델에 구현하였습니다.

2) Test Time Augmentation을 구현

Inference(Test) 과정에서 Augmentation 을 적용한 뒤 예측의 확률을 평균(또는 다른 방법)을 통해 도출하는 기법입니다. 모델 학습간에 다양한 Augmentation 을 적용하여 학습하였을 시, Inference 과정에서도 유사한 Augmentation 을 적용하여 정확도를 높일 수 있습니다. 또는 이미지에 객체가 너무 작게 위치한 경우 원본 이미지, Crop 이미지를 넣는 등 다양하게 활용이 가능합니다.

def My_TTA(model, TTA=3, batch_size=128, threshold = 0.1):

    model.eval()
    avg_predictions = {}
    ans_dict = {}
    models_num = len(os.listdir("../input/your_models_folder"))

    for time in range(TTA):

        test_transformed_dataset = ...
        test_loader = DataLoader(...)

        with torch.no_grad():

            for i in range(models_num):
                model.load_state_dict(torch.load("..."))

                for batch_idx, sample in enumerate(test_loader):
                    image = sample["image"].to(device, dtype=torch.float)
                    img_ids = sample["img_id"]
                    predictions = model(image).cpu().numpy()

                    for row, img_id in enumerate(img_ids):
                        if time == 0 and i == 0:
                            avg_predictions[img_id] = predictions[row]/(TTA*models_num)
                        else:
                            avg_predictions[img_id] += predictions[row]/(TTA*models_num)

                        if time == TTA - 1 and i == models_num -1:
                            all_class = np.nonzero(avg_predictions[img_id] > threshold)[0].tolist()
                            all_class = [str(x) for x in all_class]
                            ans_dict[img_id] = " ".join(all_class)

    return ans_dict

3) Tensorboard, wandb 이용

실험에 적용한 내용은 업데이트할 예정입니다.

4) 성능 비교

  • EfficientNet-b3 + centercrop + 잡다한처리 쳐냄

    여전히 성능을 회복하지 못하고 있습니다.

3. 피어세션 정리

https://hackmd.io/45OwzSbOSNOy0C3vCIfVfA?view


4. 학습 회고

정신없이 달려온 한 주 였습니다. 오피스아워 멘토님의 베이스라인 코드와 설명은 정말 도움이 많이 되었습니다. 이 코드를 기반삼아 앞으로 프로젝트를 진행할 때 구조화를 더 수월하게 할 수 있을것 같습니다.

 

컴피티션 부분에서는 팀을 합치기 전에 제출횟수를 충분히 활용하지 못한 점이 아쉬움이 남습니다. 아직 성능을 올리는 방식에 대해 감을 잡지 못하고 있지만 실험을 통해 알아갈 예정입니다. 주말동안에도 제출횟수를 최대한 활용하며 팀원들과 역할분담해 다양한 실험을 할 예정입니다.