목표 : 사람의 정면 사진으로 1. 마스크 착용 여부 2. 성별 3. 나이를 아래와 같이 18개 class로 예측
#ViT32 #ViT16 #ModelSoups #Relabeling #Oversampling #ContrastiveLearnig #WeightedAverageEnsemble #HardVoting #SoftVoting #Optuna #Wandb
conda env create -f environment.yml
conda activate model_soups
- wandb, albumentations 등 추가 설치
- Model soups에서 제공한 ViT-B/32 모델 다운
- 총 72개, 본 프로젝트에서는 최대 40개를 사용했습니다.
python main.py --download-models --model-location <where models will be stored>
python finetune.py --name {모델명} --i {모델 number} --random-seed {시드 설정}
- Model soups에서 제공한 pretrained 모델을 18개의 class vector를 output으로 하는 1개의 linear layer를 추가하여 학습합니다.
- ViT-B/16 의 경우 Model soups pretrained weight 가 없으므로 clip 라이브러리에서 제공하는 ImageNet pretrained weight 을 사용합니다.
--model {ViT-B/32 | ViT-B/16}
: base 모델 설정--name
: 저장할 모델 이름--i
: pretrained model의 index--random-seed
: random seed--lr
,--batch-size
,--epochs
,--data-location
,--model-location
: learning rate, batch size, epoch, 데이터 경로, 저장할 모델 경로
- Tip : 쉘 스크립트를 사용하여 학습 자동화하기. training.sh 파일 작성 후 다음 명령어 실행
bash training.sh
- Age 속성의 Old class의 적은 train dataset으로 저하된 학습 성능을 개선하기 위해 Old class data만을 추가로 Over sampling하였습니다.
--old-aug True
: Old class 1회 추가 over sampling
- Interclass의 거리를 넓히고, Intraclass의 거리를 좁히는 Contrastive Learning을 사용하였습니다.
--loss-fn
: ContrastiveLoss or CrossEntropyLoss, default는 CrossEntropyLoss
- Model soups는 여러 개의 동일한 구조를 가진 pretrained 학습 모델들을 조합하여 하나의 학습 모델을 만드는 앙상블 기법입니다.
- 수행 과정을 아래와 같습니다.
- 여러개의 pretrained model을 Test 하여 Accuracy를 얻는다.
- Accuracy 값으로 내림차순으로 정렬한다.
- 순차적으로 다음 모델과의 weight값을 average하여 하나의 모델을 생성한다.
- 생성된 모델의 성능을 측정을 하였을 때 현재까지 가장 좋은 Accuracy보다 성능이 좋으면 저장하고, 3, 4번을 반복한다. 그렇지 않으면 average하지 않고 3, 4번을 반복한다.
- 가장 Accuracy가 높은 모델을 최종 모델로 선정한다.
- Model soups에서 제공한 pretrained model은 ViT-B/32 모델입니다.
- 1번과 동일하게 Fine tuning을 진행합니다.
python main.py --eval-individual-models --name {모델명} --model-num {모델 개수} --random-seed {랜덤 시드}
- finetune을 통해 만든 모델들의 accuracy를 측정하여 기록합니다.
--name
: 저장된 모델명--model-num
: Evaludation할 모델의 개수--random-seed
: 랜덤 시드--val-ratio
,--epoch
,--data-location
,--model-locatoin
: validation dataset 비율, epoch, 데이터셋 경로, 저장할 모델 경로
- 실행이 완료되면 logs 폴더 안에 각 모델의 accuracy가 적힌 jsonl 파일이 생성됩니다.
python main.py --greedy-soup --name {모델명} --model-num {모델 개수} --random-seed {랜덤 시드}
- individual Evaluation에서 저장한 여러 모델의 accuracy정보를 내림차순으로 정렬합니다. 정렬 기준으로 좋은 성능을 내는 모델들을 순서대로 불러와 greedy하게 조합하여(averaging) 더 좋은 성능을 내도록 하는 최종 모델을 생성합니다.
--name
: 저장된 모델명--model-num
: Evaludation할 모델의 개수--random-seed
: 랜덤 시드--val-ratio
,--epoch
,--data-location
,--model-locatoin
: validation dataset 비율, epoch, 데이터셋 경로, 저장할 모델 경로- 실행 결과 model 폴더 안에 최종 모델이 저장됩니다.
- log 폴더 안에 변수 GREEDY_SOUP_LOG_FILE가 이름임 로그를 저장합니다. 해당 로그에는 averaging된 모델 정보가 저장됩니다.
python validation.py --model-name {모델명.pt 파일}
- Validation set에서 class별로 잘못 예측한 비율을 출력합니다.
- 해당 모델을 학습했을 때, 사용했던 random seed 값을 동일하게 유지해 주어야 정확한 확률과 예측값이 나옵니다.
--model-name
: evaluation할 모델명,--i
: pretrained model의 index--random-seed
: 랜덤 시드
- Age class의 분류 성능을 높이고자 Age 속성만을 분류하는 모델을 학습하여, 이를 전체 class(18개) 분류 모델의 예측값과 weighted sum을 하였습니다.
--weighted-ensemble
: Age class를 학습한 모델명, Default는 None
python finetune_age.py --name {모델명} --i {모델 number} --random-seed {시드 설정}
- finetune_age.py는 Age class만을 학습합니다.
--name
,--i
,--random-seed
는 finetune.py와 동일하게 설정
- 2개의 학습 모델의 각 class의 확률값을 minmax scaling 후 더하는 방법입니다.
--soft-voting
: soft voting할 모델명, Default는 None
- 최종 예측 결과 csv 파일의 여러개를 최종적으로 Hard voting을 수행하여 Ensemble을 진행하였습니다.
- hard_voting.ipynb 을 실행하여, 앙상블을 원하는 csv를 가지고 hard voting을 수행할 수 있습니다.
아래 그림은 출력 예시입니다.
python inference.py --model-name {모델명.pt 파일}
- 생성한 모델 파일(.pt)를 이용하여 Test data를 예측하는 부분입니다.
--model-name
: inference할 모델명--weighted-ensemble
,--soft-voting
: Weighted average ensemble 시 모델명, Soft Voting 시 모델명
- 최종 결과 csv 파일이 output 폴더에 저장됩니다.
- 잘못 라벨링된 데이터 id 목록을 담은 relabel_dict 딕셔너리를 사용하여 Relabeling을 진행하였습니다.
python optuna_script.py
- Optuna를 이용하여 Hyper paramter tuning을 진행합니다.
- optuna_script.py 파일에서 hyper parameter tuning을 위한 설정을 아래 사진과 같이 넣어주고 실행합니다.
- Private score 3rd / F1 score - 0.7613 / Accuracy - 81.3175
- Public score 6th / F1 score - 0.7653 / Accuracy - 81.3968
신현준 | 한현민 | 정현석 | 김지범 | 오유림 |
---|---|---|---|---|
|
|
|
|
|
Model soups : Model soups: averaging weights of multiple fine-tuned models improves accuracy without increasing inference time.
ViT : https://github.com/google-research/vision_transformer
ContrastiveLoss : https://github.com/KevinMusgrave/pytorch-metric-learning
Optuna : https://optuna.org/
albumentations : https://albumentations.ai/
PyTorch : https://pytorch.org/
Wandb : https://wandb.ai/site