[Kaggle] Petfinder 대회 진행상황
Petfinder 대회를 진행하면서 중간점검 식으로 지금까지 시도한 모델들과 결과를 정리해보려고 한다.
대회에 참여한지 한 달 정도 지났는데 인기도 많은 대회고, 등수도 아직까진 높아서 현재 sartorius 보다 열심히 하는 중이다.
모델
* vit_large_patch32_384
* swin_large_patch4_window12_384
* swin_large_patch4_window7_224
* Hybrid-swin
* SVR
기본적으로 timm library를 통해 pretrained 된 모델을 불러와 학습시켰다.
아무 api도 사용하지 않고 파이토치만을 이용하여 vit와 swin 모델을 학습하였다. Vit와 swin모두 이미지 사이즈가 가장 큰 384를 이용했고, 각각 18.3과 18.0 정도의 lb score 를 기록했다. 10fold를 이용했는데 vit weight가 swin 보다 큰 관계로 swin은 10fold, vit는 그 중 cv score가 높은 5개를 따로 추리고, 다시 5fold로 학습하여 제출하면서 단일모델의 결과값을 비교하였다. 추가적으로 google landmark 대회의 솔루션인 hybrid-swin model을 구현하여 테스트해봤는데 코드가 공개되어있지 않다보니 20.0정도로 성능이 좋지는 않았다.
K-Fold
* 5fold
* 10fold
* StratifiedKfold - sturges rule
학습 이미지가 10,000여장 정도로 많지 않기 때문에, overfitting을 잘 방지해야 하며 cross validation을 통해 cv score를 기록하는 것이 중요하다. 5폴드보다는 10폴드가 더 좋을 것이라 보았는데, 막상 inference하려니 상대적으로 모델 사이즈가 큰 모델을 사용하다보니, 앙상블 할때 모든 모델이import가 안되는 문제가 발생하였다. 이는 캐글이 제공하는 자체적인 개인 서버의 ram과 gpu 할당량이 존재하기 때문이다. 또한 class가 없는 regression task지만 binary classification 문제로 접근하기 때문에 pawpularity를 구간별로 할당하여 class로 보아 sklearn의 StratifiedKfold 을 썼더니 성능이 좋다는 아이디어가 있었고, 이를 적용하였지만 큰 향상은 없었다.
API
- Pytorch
- FastAI
- tez
개인적으로는 한 가지 툴도 아직 자유자재로 쓸 줄 모르기에 새로운 툴을 익히는 것도 그렇고, 점수 향상을 위해 끌려다니는 느낌이라서 공식 파이토치만을 이용해서 끝까지 가자라고 하는 주의였지만 public notebook이 높은 점수를 내는 것을 보고 결국 fastai 를 써보게 되었다. 웃긴건 Inference 만이 아닌 training process 를 포함한 노트북이 공개되어있고 다들 그것도 모른채 copy&paste를 하면서 6시간의 제출과정을 겪는다는 것. 나도 처음엔 몰랐다가 공식 documnetation을 보면서 따로 Inference 코드를 만들었다. 이해가 안되는 점은 training 을 포함하지 않는 똑같은 코드인데 notebook timeout error가 난다는 것. 이것때문에 일주일정도를 해맨 것 같은데, 10fold가 아닌 한개의 폴드로만 inference할 때는 제대로 되는 것을 보아 메모리(ram) 문제가 아닐까 라고 보고 있다. 아무튼 여기에 앙상블 까지 35등(2%) 정도를 기록하고 있는데, 안되면 pytorch로만 해야지 어쩔 수 없다.
어찌됐든 사용해본 결과 FastAI 자체적으로 내부에서 모델을 최적화하는 기능이 있는 것 같다. 코드는 굉장히 짧지만 저장했을 때의 모델사이즈가 크며 성능이 좋다.
Score
단일모델
index | Model | Type | fold | feat | cv | lb | |
1 | Swin_large_patch4_window12_384 | pytorch-base | 10 | 17.6319 | 18.09 | ||
2 | Swin_large_patch4_window12_384 | pytorch-base | 10 | no dense feat | 17.633 | 18.15 | |
3 | Vit_large_patch32_384 | pytorch-base | 5 | 18.2 | 18.31 | ||
4 | Vit_large_patch32_384 | pytorch-base | 5 | light aug | 18.17 | 18.34 | |
5 | Swin_large_patch4_window12_384 + SVR | tez,rapids | 10 | copy | 18.02 | ||
6 | Swin_large_patch4_window7_224 | fastai | 10 | tta=5 | 17.4 | 17.88 | |
7 | Swin_large_patch4_window7_384 | fastai | 10 | bin=44 | 16.56 | 17.93 | |
8 | Vit_large_patch32_384 | fastai | 5 | bin =44 | 17.9 | 18.3 | |
9 | Vit_large_patch32_384 | fastai | 5 | bin =44, tta=5 | 17.9 | 18.22 | |
10 | Swin_large_patch4_window7_224 | fastai | 10 | 기준 | 17.93 | ||
11 | Swin_large_patch4_window7_224 | fastai | 10 | seed123 변경 | 17.57 |
17.89
|
|
12 | Swin_large_patch4_window7_224 | fastai | 10 | gradientclipping | 17.57 | 17.90 | |
13 | Swin_large_patch4_window7_224 | fastai | 10 | mixup + light aug | 17.26 | 18.02 | |
Ensemble voting
Index | Model | ratio | feat | cv | lb |
5 , 3 | swin, svr , vit | 2 : 5: 3 | 17.960 | ||
6, 3 | f_swin224 , vit | 8 : 2 | 17.864 | ||
6, 3 | f_swin224 , vit | 7 : 3 | tta=5 | 17.849 | |
7, 3 | f_swin384, vit | 7 : 3 | 17.875 | ||
7, 3 | f_swin384, vit | 7 : 3 | tta=5 | 17.870 |
최종결과
public 80, private 530th 로 13%로 마무리, 수상에는 실패했다.
반년 전의 Cassava 대회와 거의 비슷한 양상으로 leaderboard fitting, 비슷하게 cv 관리에 실패해 최종 모델 선택에 실수가 있었다. 이미지 분류 대회의 특성상인지 test set이 많이 다르고 shakeup이 심하다. public 2등이 300등 떨어지는 것도 봤으니 다양한 ensemble이 필수적인 것 같다. best cv와 best lb 은 기본적이고.
아무튼 fast.ai를 익혀 써볼 수 있어서 좋았고 데이터도, 여러 테크닉들도 흥미로웠던 대회 마무리.
대신 같이 진행했던 satorius cell segmentation 에서는 동메달 수상.
이로써 동메달 3개로 Expert 달성이다.