본문 바로가기
Kaggle 대회

[2019 3rd ML month with KaKR] 대회 참가 후기(삽질의 기록)

by 사자처럼 우아하게 2019. 12. 19.

 

이번 포스팅은 몇달전에 참가했던 캐글코리아에서 주최한 자동차 분류대회 후기입니다.

당시에 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 하기 전이 더 잘 나옴

댓글