일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- seaborn
- linalg
- 최대가능도 추정법
- dtype
- 카테고리분포 MLE
- 부스트캠프 AI테크
- Array operations
- groupby
- python 문법
- Comparisons
- Python 특징
- 표집분포
- namedtuple
- Python
- Python 유래
- 딥러닝
- unstack
- pivot table
- subplot
- Numpy
- 가능도
- 정규분포 MLE
- boolean & fancy index
- scatter
- type hints
- Numpy data I/O
- Operation function
- BOXPLOT
- ndarray
- VSCode
- Today
- Total
또르르's 개발 Story
[Stage 1 - 04] Focal Loss 본문
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
gamma 값을 바꿔가면서 사용 - Over Sampling
소수 class의 data를 복사하는 방법으로 사용 - Focal Loss & Over Sampling
둘을 섞으면 성능이 더 나아지지 않을까... - Weighted loss
loss에 weight을 주는 방법
ref) discuss.pytorch.org/t/weights-in-weighted-loss-nn-crossentropyloss/69514
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일 때 라고 하는데 확인해 보아야 할 것 같습니다.

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)
'[P Stage 1] Image Classification > 프로젝트' 카테고리의 다른 글
[Stage 1 - 06] 최적의 Hyperparameter 찾기 (0) | 2021.04.05 |
---|---|
[Stage 1 - 05] Remote Server에서 NNI (Auto ML) 사용하기 (0) | 2021.04.04 |
[Stage 1 - 03] Model & Optimizer (0) | 2021.04.01 |
[Stage 1 - 02] Data Processing (0) | 2021.03.30 |
[Stage 1 - 01] BaseLine 작성 (0) | 2021.03.30 |