이번 포스팅은 몇달전에 참가했던 캐글코리아에서 주최한 자동차 분류대회 후기입니다.
당시에 2주정도 퇴근 후 시간을 할애하여 참가했었는데 그때 했던 삽질(?)들을 기록해두었다가
정리하여 공유합니다. 깃헙 바로가기
ㅁ Model Summary
- Resnext101 8 Folds로 최종 제출했고 대회 종료 이틀전에 큰 오류가 있음을 깨닫고 급하게 수정하고
학습시키다보니 다른 모델을 제대로 앙상블 시킬 시간은 없었습니다.
① 전처리 : Cropping , Histogram Equalization
② Augmentation : cutout , rotation 30, horizonal=True, zoom:0.3, rescale :1/255
③ Loss Function : categorical_crossentropy
④ optimizer : Adam optimizer
⑤ Basic Model : Resnext101(imagenet pretrained), 8 folds (평균 5.5hr/1fold 소요)
⑥ Inference 시 TTA(5) 적용
ㅁ 삽질의 기록
1. Resnet50 + cropping + sigle fold** (public score 0.8345)
2. Resnet50 + cropping + 5folds** (public score 0.91439)
- 학습이 제대로 되지 않고 있는 것으로 판단하고 뜯어보기 시작
. learning rate : 0.001 → 0.0001
. Dropout(0.25) 추가
3. Resnet50 + cropping + 5folds** (public score 0.92061)
- 깊은 모델(resnet50 → resnext101)로 변경하기로 결정
- resnet101,resnext101 모델은 keras.applications가 아닌 keras_applications 모듈에서
가져와야함. keras가 처음이라 이걸 몰라서 삽질을 오래함.
- keras_applications 에서 resnext101를 부르면 아래 에러가 생기는데,
모델을 부를 때 arguments를 넣어 줘야함(backend, layers, models, utils)
"AttributeError: 'NoneType' object has no attribute 'image_data_format'"
→해결책 : http://donghao.org/2019/02/22/using-resnext-in-keras-2-2-4/
- 다음에 마주하게 되는 에러가 scaling과 관련된 에러인데 이는 preprocess_input을 활용하기
때문에 발생하는 것으로 Data Augmentation을 할 때 scale : 1/255로 변경하면 해결됨.
4. Resnext101 + cropping + 5folds** (public score 0.93591)
- early stopping을 f1 score에 걸어두어서인지 val_loss가 충분히 떨어지지 않았는데
학습이 종료되는 현상이 발생함(underfitting)
. patience = 5 → 10 변경
. ReduceLROnPlateau(factor 0.5) 적용
→ 뒤에 설명하겠지만 막판에 여기에 오류가 있다는 것을 알게되어 학습을 다시함.
- 학습 시간이 3배로 늘어나면서 Training / Inference kernel을 분리하기 시작.
5. Resnext101 + cropping + 5folds+ReduceLR** (public score 0.94787)
- train Loss가 0에 가깝고 acc도 100에 가까운 반면, Val acc는 98% 수준으로
Overfitting 되고 있다고 판단 (실제 Private score 0.943으로 Drop)
. Mixup 적용(0.2)했으나 오히려 Public score 0.01이상 drop
. overfitting 된 model 5개(+ Xception, resnet101, resnet50, Efficient_v3)의 결과물로
Voting을 수행하여 Public score 0.95074를 만들었으나 private score는 저조(0.946)
→ Voting 보다 softmax 결과물들의 평균내어 argmax를 취하는게 더 성능이 좋음
- ** 5일간 여러 삽질을 하는 도중 두가지 큰 오류가 있음을 확인 **
. ReduceLROnPlateau 오류 : f1 score를 바라보게 해두고 mode를 default(min)으로 설정되어
(patience 10) f1 score와 관계 없이 계속 절반씩 줄고 있었음.
. Earlystopping 오류 : monitoring을 val_f1_score가 아닌 f1_score로 설정해두어
validation set이 아닌 train set의 f1 score가 더이상 개선이 없을때 끝나도록 되어 있었음
사실상 Earlystopping 기능을 수행하지 못하고 Overfitting되고 있음
6. (오류수정) Resnext101 + cropping + 8folds+ReduceLR** (public score 0.95217)
- 위 오류를 모두 수정하여 학습하기 시작, 대회 종료까지 하루밖에 남지 않은 상황이라
한번에 학습 기회가 있을 듯하여 folds 수도 늘려서 조금이라도 overfitting을 줄여보고자함.
- 학습이 종료된 이후에 voting을 수행하여 score를 조금더 올렸으나 private score로 보면
voting 하기 전이 더 잘 나옴
'Kaggle 대회' 카테고리의 다른 글
[Santander Product Recommendation] 데이터 탐색하기 ② : Y (0) | 2019.12.22 |
---|---|
[Santander Product Recommendation] 데이터 탐색하기 ① : X (0) | 2019.12.19 |
[2019 3rd ML month with KaKR] 대회 소개 (1) | 2019.12.18 |
[ASHRAE - Great Energy Predictor III] Best Weight 찾기 (0) | 2019.12.15 |
[ASHRAE - Great Energy Predictor III] Hyperparameter Optimaization (0) | 2019.12.14 |
댓글