또르르's 개발 Story

[Stage 1 - 01] BaseLine 작성 본문

[P Stage 1] Image Classification/프로젝트

[Stage 1 - 01] BaseLine 작성

또르르21 2021. 3. 30. 02:56

1️⃣ Goal

 

  • [BaseLine 작성] (추가 : 3/29, 기간 : 3/29 ~ 3/29)
  • [데이터 전처리]

    - Face Recognition (추가 : 3/29)


    - Cross-validation 사용 (추가 : 3/29)

  • [모델]

    - ResNet 152층 시도 (추가 : 3/29)

    - Efficient Net 시도 (추가 : 3/29)

    - Pre-trained 모델에 Fine-tuning 하기 (추가 : 3/29)

  • [Training]

    - 앙상블 시도 (추가 : 3/29)

    - Hyperparameter 변경 (추가 : 3/29, 기간 : 3/29 ~)

    - Learning Schedular 사용 (추가 : 3/29)

 

2️⃣ Learning

없음.

 

3️⃣ Main Task

1) BaseLine 작성

 

1-1) Dataset 구성

class TrainDataset(Dataset):

    def __init__(self, img_paths, transform):
    
        self.img_paths = img_paths
        
        self.transform = transform
        

    def __getitem__(self, index):
    
        image = Image.open(self.img_paths[index])
        

        if self.transform:
        
            image = self.transform(image)
            
            
        label = make_label(self.img_paths[index])
        
        return image, label
        

    def __len__(self):
    
        return len(self.img_paths)

 

1-2) DataLoader

train_dst = TrainDataset(train_data_list, transform)

test_dst = TestDataset(test_image_paths, transform)

train_iter = torch.utils.data.DataLoader(train_dst, batch_size=BATCH_SIZE, shuffle=True)

test_iter = torch.utils.data.DataLoader(test_dst, batch_size=BATCH_SIZE, shuffle=False)

 

 

1-3) ResNet-50

 

아래 코드를 참조했습니다.

 

[ResNet] 논문 리뷰 & 구현 (Pytorch)

안녕하세요, 소신입니다. 이미지 인식에서 엄청난 반향을 일으켰던 ResNet 입니다. Residual (잔차)를 학습한다해서 ResNet이라는 이름이 붙었습니다. # 기존 접근 방식의 문제점을 해결하기 위해 등장

wolfy.tistory.com

여기서 주의할 점은 마지막 classifier에서 input_dim과 output_dim (class 개수)를 맞춰주어야 합니다.

 

 

1-4) Make CSV function

 

Submission.csv를 만들어서 출력합니다.

from pandas import Series, DataFrame


def make_csv(model,data_iter,device, epoch):

    with torch.no_grad():
    
        
        model.eval()
        
        
        all_predictions = []
        
        
        for batch_in in data_iter:
        
            model_pred = model.forward(batch_in.view(-1, 3, 512, 384).to(device))
            
            _,y_pred = torch.max(model_pred.data,1)
            
            all_predictions.extend(y_pred.cpu().numpy())
            
        
        submission['ans'] = all_predictions
        
        submission.to_csv(os.path.join(test_dir, 'submission'+str(epoch)+'.csv'), index=False)
        
        print("submission.csv is generated")
        

        model.train() # back to train mode 
        
        
print ("Done")

 

2) Hyperparameter 설정

  • Batch size : 80
  • Loss : cross entropy
  • Optimizer : Adam
  • Learning Rate : 0.01 (epoch 10 단위 당 1/10씩 감소)
  • Epoch : 30

 

4️⃣ Sub Task

1) Jupyter notebook에서 GPU 사용량 확인

Jupyter noteook에서는 google colab과 다르게 GPU 사용량을 확인하기 어려웠습니다.

따라서 GPUtil 모듈과 thread를 사용해서 2분에 한 번 check가 가능하게 만들었습니다.

ref) github.com/anderskm/gputil

import GPUtil

from threading import Thread

import time


class Monitor(Thread):

    def __init__(self, delay):
    
        super(Monitor, self).__init__()
        
        self.stopped = False
        
        self.delay = delay # Time between calls to GPUtil
        
        self.start()
        

    def run(self):
    
        while not self.stopped:
        
            print('\r')
            
            GPUtil.showUtilization(useOldCode=True)
            
            time.sleep(self.delay)
            

    def stop(self):
    
        self.stopped = True
        
        
monitor = Monitor(120)

하지만 모델을 train하는 부분에 같이 겹쳐서 나와서 쓸모가 없...

 

 

2) glob 기능

glob는 조건에 만족하는 모든 파일의 path를 가지고 올 때 많이 사용합니다.

train_data_list = [filepath for filepath in glob.iglob(f'input/data/train/images/*/*.jpg', recursive=True)]

 

 

4️⃣ Evaluation

1) BaseLine 작성

BaseLine 작성은 기본 CNN 구조 DataLoader와 ResNet 모델을 사용해서 만들었습니다.

추가적인 hyperparameter 수정이 필요합니다.

 

2) Hyperparameter 설정

Batch size는 더 늘리고 싶었지만, GPU 용량 초과로 80 정도로만 사용했습니다.

Accur와 f1 score는 다음날 확인합니다.

 

3) 차후 목표

ResNet 151층 시도, 데이터 전처리로 정확도 높이기

 

Comments