또르르's 개발 Story

[Stage 1 - 04] Focal Loss 본문

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

[Stage 1 - 04] Focal Loss

또르르21 2021. 4. 2. 14:28

 1️⃣ Goal

 

  • [BaseLine 작성] (추가 : 3/29, 기간 : 3/29 ~ 3/29)

  • [Data Processing]

    - Face Recognition (추가 : 3/29, 기간 : 3/30 ~ 3/31)


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

    -데이터 불균형 해소 / imbalanced Sampler, Focal Loss, OverSampling, Weighted loss (추가 : 3/30, 기간 : 4/1 ~ )

    - Data Augumentation (추가 : 3/30)

    -
    Generator의 초당 Batch 처리량 측정 및 향상 (추가 : 3/30, 기간 : 3/31 ~ 3/31)

    - Cutmix 시도 (추가 : 4/1)

    - Repeated Agumentation (추가 : 4/1)

    -
    validation data 사용 (추가 : 4/1, 기간 : 4/1 ~ 4/1)

  • [Model]

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

    - Efficient Net 시도 (추가 : 3/29, 기간 : 4/1 ~ 4/2)

    - YOLO 시도 (추가 : 3/31)

    - Pre-trained 모델에 Fine-tuning 하기 (추가 : 3/29, 기간 : 4/1 ~ 4/1)

    - Model의 초당 Batch 처리량 측정 및 향상 (추가 : 3/30)

    - dm_nfnet 시도 (추가 : 4/1)

  • [Training]

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

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

    - Learning Schedular 사용 (추가 : 3/29, 기간 : 4/1 ~ )

    - Model의 초당 Batch 처리량 측정 (추가 : 3/30)

    - 좋은 위치에서 Checkpoint 만들기 (Adam으로 모든 minimum 찾고, SGD로 극소점 찾기) (추가 : 4/1)

    - Sex 분류 (1번 모델)  -> Age 분류 (2번 모델) -> Mask 분류 (3번 모델) // 모델 나누기 (추가 : 4/1)

    - Crop image (mask 분류)와 일반 image(age, sex 등 분류) 둘 다 사용 (추가 : 4/1)

    - batch size 작게 쓰면서, SGD 사용 (추가 : 4/2)

    - NNI (Auto ML) 사용 (추가 : 4/2)

  • [Deploy]

    - Python 모듈화 (추가 : 3/30)

 

 

 

2️⃣ Learning

 

[Stage 1 - 이론] Ensemble

1️⃣ Ensemble 기법들 1) Model Averaging (Voting) 다양한 Model의 투표를 통해 결과를 내는 방법입니다. 일반적으로 Soft voting 방식의 성능이 Hard voting보다 좋습니다. 2) Stratified K-Fold Cross Valida..

dororo21.tistory.com

 

 

3️⃣ Main Task

1) 데이터 불균형 해소 : Focal Loss

focal loss를 가지고 온 github입니다.

전에 사용했던 imbalanced-dataset-sampler를 테스트했을 떄 사용해을 때와 비슷한 결과가 나와서 다른 방법을 시도했습니다.

 

 

clcarwin/focal_loss_pytorch

A PyTorch Implementation of Focal Loss. Contribute to clcarwin/focal_loss_pytorch development by creating an account on GitHub.

github.com

 

사용해볼 방법은 다음과 같습니다.

 

 

Focal Loss는 다음과 같습니다.

class FocalLoss(nn.Module):

    def __init__(self, weight=None,
    
                 gamma=2., reduction='mean'):
                 
        nn.Module.__init__(self)
        
        self.weight = weight
        
        self.gamma = gamma
        
        self.reduction = reduction
        

    def forward(self, input_tensor, target_tensor):
    
        log_prob = F.log_softmax(input_tensor, dim=-1)
        
        prob = torch.exp(log_prob)
        
        return F.nll_loss(
        
            ((1 - prob) ** self.gamma) * log_prob,
            
            target_tensor,
            
            weight=self.weight,
            
            reduction=self.reduction
            
        )

 

사용은 다른 loss와 똑같이 사용하면 됩니다.

loss = FocalLoss(gamma=2)

 

γ에 따라 class의 imbalance를 조절할 수 있다고 합니다.

가장 좋은 성능은 γ=2일 때 라고 하는데 확인해 보아야 할 것 같습니다.

 

[Tsung-Yi Lin el al. arXiv 2018]

 

4️⃣ Sub Task

1) ImportError: attempted relative import with no known parent package

module을 추가하려고 보니까 import error가 떠서 한참을 헤맸습니다..

jupyter Lab에 package가 있는지도 잘 모르겠고.. 원래는 from . import * 처럼 사용하는데 package가 없다고 떠서 곤란했습니다.

 

일단 jupyter Lab에서 가장 쉬운 방법은 해당 위치의 python 환경변수를 추가해주는 것입니다.

import sys

>>> print(sys.path)

['/opt/ml',
 '/opt/conda/lib/python37.zip',
 '/opt/conda/lib/python3.7',
 '/opt/conda/lib/python3.7/lib-dynload',
 '',
 '/opt/conda/lib/python3.7/site-packages',
 '/opt/ml/code/nni',
 '/opt/conda/lib/python3.7/site-packages/IPython/extensions',
 '/opt/ml/.ipython']

 

module .py가 있는 폴더 path까지 append해서 넣어줍니다.

sys.path.append('/opt/ml/code')		# "PATH"

 

sys.path에 경로가 추가된 것을 알 수 있습니다.

>>> print(sys.path)

['/opt/ml',
 '/opt/conda/lib/python37.zip',
 '/opt/conda/lib/python3.7',
 '/opt/conda/lib/python3.7/lib-dynload',
 '',
 '/opt/conda/lib/python3.7/site-packages',
 '/opt/ml/code/nni',
 '/opt/conda/lib/python3.7/site-packages/IPython/extensions',
 '/opt/ml/.ipython',
 '/opt/ml/code']

 

이후 .py를 불러오면 오류가 나지 않습니다.

from focalloss import *

 

 

5️⃣ Evaluation

 

Data processing Model Training Time Accuracy F1
3/29   -
ResNet-50
-
-
Hyperparmeter
설정
-
7h 32m 61.87% 0.52%
3/31 -
Face Recognition
-
    36m 65.05% 0.56%
4/1   -
(pre-trained)
Efficient-Net-b6
-
-
epoch : 20,
batch size : 128
-
1h 35m 73.67% 0.66%
4/1   -
(pre-trained)
Efficient-Net-b7
-
-
epoch : 20,
batch size : 100
-
1h 31m 73.25% 0.66%
4/1     -
learning scheduler : 
CosineAnnealingLR
-
epoch : 21
-
1h 41m 68.49% 0.60%
4/2 -
 imbalanced-dataset-sampler
-
  -
learning scheduler X
-
epoch : 26
-
1h 39m 72.38% 0.64%
4/2     -
loss :
Focal loss 
(γ = 2)
-
epoch : 16
-
1h 29m 74.43% 0.68%

 

* F1 Score


1) 데이터 불균형 해소 : Focal Loss

Focal loss를 사용하니 imbalanced sampler보다 성능이 약간 올라간 것을 알 수 있습니다.

gamma값에 따라 imbalanced 문제를 더 잘 해결해줄 수도 있다고 생각합니다.

 

 

 

3) 차후 목표

  • NNI (Auto ML 사용)

  • 모듈화 (새로운 baseline code)