Image Classification. 이미지를 9개의 재활용 품목 카테고리로 분류하는 문제
Model 경량화. 어느 정도의 성능을 유지하며 크기가 작은 모델을 만드는 문제
- MACs(Multiply-accumulate operations)
- 합,곱연산의횟수
- MACs -> 약 0.5FLOPs
Public 2nd, Private 2nd
Top-down, Bottom-up, Additional 3가지 방향으로 분업 전략을 세웠습니다.
맡은 분야가 같은 팀원 간에는 협업하여 실험을 진행했습니다.
대회 초반부터 이러한 전략을 효과적으로 설정하였기에 다른 팀들보다 다양한 실험을 진행할 수 있었고, 10팀 중 2등의 성과를 내었습니다.
Day | LB Score, F1, MACs | 실험 내용 | 실험 내용 | 실험 내용 |
---|---|---|---|---|
01 | baseline 코드 작성 | MACs 공부 | EDA | |
02 | 0.0385 / 0.8205 / 266505 | pretrained Model 탐색 | MACs 공부 | LB score 기준 모델 구하기 |
03 | LB 전체 초기화 | pretrained Model 탐색 | MACs 계산 허점 발견 | 팀원들과 전략 논의 |
04 | pretrained Model 탐색 | 3가지 분업 전략 설정 | ||
05 | 0.4858 / 0.5320 / 1688940 | pretrained Model 탐색 | Input size 탐색 | Inference 분포 확인 |
06 | 0.4501 / 0.5619 / 1688940 | pretrained Model 탐색 | LossFunction 탐색 | Regularization 기법 적용 |
07 | " | pretrained Model 탐색 | LossFunction 탐색 | Regularization 기법 적용 |
08 | 0.4192 / 0.5877 / 1688940 | Augmentation | Over Sampling | Auto Encoder |
09 | 0.4044 / 0.6001 / 1688940 | Augmentation | (AutoML) Hyper Parameter 탐색 | Auto Encoder |
10 | 0.3782 / 0.6220 / 1688940 | Knowledge Distillation | (AutoML) Hyper Parameter 탐색 | |
11 | 0.3665 / 0.6318 / 1688940 | Knowledge Distillation | ArcFace 실험 | |
12 | 0.3584 / 0.6386 / 1688940 | Knowledge Distillation | Residual KD | |
13 | 0.3513 / 0.6211 / 1299789 | Layer Pruning | Feature 분포 확인 | |
14 | 0.3493 / 0.6358 / 1515459 | Layer Pruning | ||
15 | 0.3486 / 0.6318 / 1439700 | Layer Pruning | Validation 방법 개선 | Train All Data |
16 | 0.3476 / 0.6225 / 1272450 | Layer Pruning | Auxiliary Training 실험 | |
17 | 0.3362 / 0.6207 / 1083210 | Layer Pruning | Channel Pruning | |
18 | 0.3366 / 0.6158 / 1007460 | Channel Pruning | Decomposition | |
19 | " | Channel Pruning | Decomposition | |
20 | " | Channel Pruning | Decomposition | |
21 | 0.3362 / 0.6207 / 1083210 | 실험 결과 종합 | 최종 모델 선정 | |
22 | " | 회고 및 팀원들과 피드백 | 발표 준비 | |
23 | " | 발표 준비 |
SOTA, 논문, 라이브러리 등을 참고하여 가벼워 보이는 모델들을 여러가지 구글링 해봤는데, pretrained weight가 존재하는 모델 중에서는 ShuffleNet이 MAC대비 F1 스코어가 가장 좋았습니다.
선택한 ShuffleNet은 스템을 제외하면 stage 3개로, 각 4-8-4개의 유닛 구조로 되어있습니다.
Stage1
Stage2
Stage3
ShuffleNet에 경량화 기법을 적용하기 위해 Weight 분포를 확인해본 결과입니다.
std(표준편차)값이 클수록 0이 아닌 weight 값이 많이 분포되어 있으므로, std가 낮은 레이어부터 제거하였습니다.
-
MACs를 직접적으로 감소시키기 위해 Input size를 80x80으로 매우 낮게 설정 하였습니다.
-
Input size 축소로 인해 추출할 feature 수가 줄어 들었다고 판단하여 Network 사이즈를 축소 하였습니다.
-
Metric 함수 특성을 고려하여 모델을 직접 잘라내는 structured pruning (layer, channel) 및 weight decomposition를 시도 하였습니다.
레이어 조정 후 Knowledge Distillation을 통해 성능 복원에 성공하면 유지, 실패할 경우 이전 단계로 돌아가 다른 레이어를 조정하였습니다.
-
layer pruning : [4-8-4] -> [2-5-2]
-
channel pruning : stage3 [120, 240] -> [120, 210]
-
decomposition : stage3 conv group3 -> group6
- 비슷한 분포를 가지는 모델을 teacher로 사용하는 것이 매우 효과적
- 분포가 조금 달라져도, teacher를 Ensemble하는 방법은 효과적
MACs | F1 | Competition Score | |
---|---|---|---|
Before | 1688940.0 | 0.6206 | 0.4005 |
After | 1083210.0 | 0.6149 | 0.3431 |
#Before
python test_demo.py --customized_model False --eval True
#After
python test_demo.py --customized_model True --eval True
pytorch '1.7.1+cu101'
albumentations
sklearn
ptflops
Model Compression/
├──input/
| └── data/
| ├── train/
| ├── trainImg00001.jpg
| ├── ...
| └── trainImg22640.jpg
| └── val/
| ├── valImg0001.jpg
| ├── ...
| └── valImg8816.jpg
├──pretrained/
│ ├── ShuffleNet_final.pt
│ └── shufflenet_g3_wd4.pth
├──solution/
| ├── dataloader.py
| ├── ...
| └── utils.py
└──test_demo.py