{
  "id": 104493,
  "title": "1st Solution",
  "url": "/competitions/2019-3rd-ml-month-with-kakr/writeups/1st-solution",
  "author_name": "",
  "post_date": "2019-08-17T06:05:26.666911100Z",
  "votes": 16,
  "comment_count": 8,
  "views": 0,
  "content": "<h3>안녕하세요 캐글코리아!</h3>\n\n<p>먼저 좋은 대회 마련해 주신 KaKR 운영진분들께 감사의 인사를 드리고 싶습니다.</p>\n\n<p>저는 학부생이어서 학기중에는 바빠 이전 대회들은 참여하지 못하고 있었습니다. 우연히 이번 competition과 방학이 겹쳐서 이렇게 참여하게 되었습니다. 이 글을 통하여 저의 solution과 score을 얻기 위해서 어떤 방식들을 시도했는지 공유하겠습니다! 다른 순위권 분들도 좋은 solution과 시행착오들을 공유해 주셔서 다같이 배울 수 있는 글들을 남겨주셨으면 좋겠습니다!</p>\n\n<p>Baseline model : Efficientnet-B5</p>\n\n<ul>\n<li><p><em>Preprocessing</em>\nUsing Bounding Box : \n저는 처음에 bounding Box로 crop된 image를 사용했지만 아래의 두 github에서는 crop하지 않은 image를 input으로 주는 것이 성능이 더 좋다고 하였습니다.</p>\n\n<ol><li><a href=\"https://github.com/jianshen92/stanford-car-grab-challenge\">https://github.com/jianshen92/stanford-car-grab-challenge</a></li>\n<li><a href=\"https://github.com/morganmcg1/Projects/tree/master/stanford-cars\">https://github.com/morganmcg1/Projects/tree/master/stanford-cars</a>\n하지만, Public score 0.93정도 이상에서는 그렇게 큰 효과가 없었습니다. 또한, cutout을 적용하면 crop된 image가 성능이 더 높은 모습을 보여주었습니다. 그래서 저는 Bounding box로 crop된 이미지를 input으로 사용했습니다.\n저는 Image를 단순하게 resize하는 방식을 사용했는데 위의 github에서는 squeeze method를 사용하면 더 좋은 성능을 보여준다고 합니다. 하지만, 저는 이것을 구현하지 못해서 적용하지 못했습니다.</li></ol></li>\n<li><p><em>Augmentation</em> : \n(saewon님의 kernel을 참고하였습니다.)\nRandom Resized Crop, Random Horizontal Flip, Random Rotation, AutoAgumentation(CIFAR-10), Normalize, Random Erasing(cutout)을 적용하였습니다. 여기에 mixup을 적용시켰습니다.\nCutmix를 mixup대신 적용시켜 보았지만, 저는 mixup을 사용했을 때 성능이 더 좋게 나타났습니다. \nmixup의 alpha값은 0.2, 0.4, 1.0을 사용해보았는데 1.0에서 성능이 가장 좋게 나왔습니다.\nrotation은 30도를 주었고 resized crop은 (0.8, 1.0) 다른 것들은 default 값으로 적용시켰습니다.</p></li>\n<li><p><em>Sampler :</em>\nClass의 이미지 수들의 불균형이 존재했습니다. 균형을 맞추기 위해서 oversampling 방식을 통하여 한 epoch을 당 주어지는 class의 image 수를 같게 맞추었습니다.</p></li>\n<li><p><em>Loss :</em>\nFocalLoss를 gamma를 0.5, 2, 3을 시도해 보았습니다. gamma가 0.5일 때 성능이 가장 좋았습니다. 하지만, 이것보다 그냥 cross entropy loss가 더 좋은 성능을 보여주었습니다. (제가 구현을 잘못한 것인가요…ㅠㅠ Focal loss가 더 좋을 것으로 예상을 했었는데…) 최종적으로 저는 loss로 cross entropy를 사용했습니다.\nLabel smoothing을 적용해서 실험해 보았지만 그럴듯한 성능 향상을 보여주지 않았습니다. \n(Triplet loss구현을 시도해 보았지만, 시간 부족을 구현을 완료하지 못했습니다. 혹시 해보신 분 있으면 결과를 남겨주시면 좋겠습니다.)</p></li>\n<li><p><em>Model :</em>\n저는 Efficientnet-B7, B6, B5, PNASNet, NASNet을 사용했습니다. 각 model head에 dropout(p=0.4)을 추가해서 사용했습니다. (IIdoo kim님이 discussion에 올렸던 model은 너무 train하기에 무거워서 결국 사용하지 못했습니다.)\nWS-DAN(Weakly Supervised Data Augmentation Network)이라는 아주 흥미로운 구조를 실험해 보았습니다. 이것을 Efficientnet-B7 model에 적용시켰습니다. Training 시간은 3배로 걸리지만 성능은 크게 개선되지 않아서 이 구조를 사용하지 않게 되었습니다.</p></li>\n<li><p><em>Scheduler :</em>\n초반에는 CosineannealingLR, MultistepLR, StepLR을 사용해 보았습니다. 이중에서 적절한 값을 찾아본 결과 MultistepLR이 가장 좋은 성능을 보여주어서 이것을 사용했습니다. 후반기에 최종 model을 train할 때는 SuperConvergence라는 scheduler를 사용하여 train을 하였습니다.</p></li>\n<li><p><em>Optimizer :</em>\n다양한 optimizer를 baseline에 실험해 보았는데 AdamW가 가장 성능이 좋았습니다. PNAS, NAS는SGD + momentum이 성능이 좋은 모습을 보여주어 이것을 사용하였습니다.</p></li>\n<li><p><em>Train Process:</em>\nEfficientnet-B7, B6, B5는 lr=0.00028로 50 epoch train후 max_lr=0.00028로 SuperConvergence + AdamW로 60 epoch train했습니다.\nPNAS, NAS는 lr=0.0042, max_lr=0.0042로 위와 같은 방식으로 optimizer만 바꿔준 후 train했습니다. weight저장은 valid set에서 f1-score가 가장 좋은 weight를 저장했습니다.</p></li>\n<li><p><em>Test-Time-Augmentation :</em>\ntta를 5번 적용하였습니다. 적용한 augmentation은 Random Resized Crop, Random Horizontal Flip, Random Rotation입니다. Rotation은 5를 주었고 나머지는 train때와 같게 주었습니다.</p></li>\n<li><p><em>Ensemble :</em>\n6 fold cross validation을 사용하였습니다. 또한 앞에서 언급한 Efficientnet-B7, B6, B5, PNAS, NAS model을 soft-voting을 하였습니다.\n성능으로는 B7&gt;B6&gt;B5&gt;PNAS&gt;NAS 순이었습니다. (Public score 기준)\n(결론적으로 총 30개의 weight를 사용했네요… 6.5G정도 되네요)</p></li>\n</ul>\n\n<p>최종 score  “ Public : 0.96604,  Private : 0.96058 ”\nPrivat score가 가장 좋은 모델은 Efficientnet-B7 model이네요 0.96132나왔습니다.</p>",
  "messages": [
    {
      "id": "601175",
      "postDate": "08/17/2019 06:05:26",
      "content": "<h3>안녕하세요 캐글코리아!</h3>\n\n<p>먼저 좋은 대회 마련해 주신 KaKR 운영진분들께 감사의 인사를 드리고 싶습니다.</p>\n\n<p>저는 학부생이어서 학기중에는 바빠 이전 대회들은 참여하지 못하고 있었습니다. 우연히 이번 competition과 방학이 겹쳐서 이렇게 참여하게 되었습니다. 이 글을 통하여 저의 solution과 score을 얻기 위해서 어떤 방식들을 시도했는지 공유하겠습니다! 다른 순위권 분들도 좋은 solution과 시행착오들을 공유해 주셔서 다같이 배울 수 있는 글들을 남겨주셨으면 좋겠습니다!</p>\n\n<p>Baseline model : Efficientnet-B5</p>\n\n<ul>\n<li><p><em>Preprocessing</em>\nUsing Bounding Box : \n저는 처음에 bounding Box로 crop된 image를 사용했지만 아래의 두 github에서는 crop하지 않은 image를 input으로 주는 것이 성능이 더 좋다고 하였습니다.</p>\n\n<ol><li><a href=\"https://github.com/jianshen92/stanford-car-grab-challenge\">https://github.com/jianshen92/stanford-car-grab-challenge</a></li>\n<li><a href=\"https://github.com/morganmcg1/Projects/tree/master/stanford-cars\">https://github.com/morganmcg1/Projects/tree/master/stanford-cars</a>\n하지만, Public score 0.93정도 이상에서는 그렇게 큰 효과가 없었습니다. 또한, cutout을 적용하면 crop된 image가 성능이 더 높은 모습을 보여주었습니다. 그래서 저는 Bounding box로 crop된 이미지를 input으로 사용했습니다.\n저는 Image를 단순하게 resize하는 방식을 사용했는데 위의 github에서는 squeeze method를 사용하면 더 좋은 성능을 보여준다고 합니다. 하지만, 저는 이것을 구현하지 못해서 적용하지 못했습니다.</li></ol></li>\n<li><p><em>Augmentation</em> : \n(saewon님의 kernel을 참고하였습니다.)\nRandom Resized Crop, Random Horizontal Flip, Random Rotation, AutoAgumentation(CIFAR-10), Normalize, Random Erasing(cutout)을 적용하였습니다. 여기에 mixup을 적용시켰습니다.\nCutmix를 mixup대신 적용시켜 보았지만, 저는 mixup을 사용했을 때 성능이 더 좋게 나타났습니다. \nmixup의 alpha값은 0.2, 0.4, 1.0을 사용해보았는데 1.0에서 성능이 가장 좋게 나왔습니다.\nrotation은 30도를 주었고 resized crop은 (0.8, 1.0) 다른 것들은 default 값으로 적용시켰습니다.</p></li>\n<li><p><em>Sampler :</em>\nClass의 이미지 수들의 불균형이 존재했습니다. 균형을 맞추기 위해서 oversampling 방식을 통하여 한 epoch을 당 주어지는 class의 image 수를 같게 맞추었습니다.</p></li>\n<li><p><em>Loss :</em>\nFocalLoss를 gamma를 0.5, 2, 3을 시도해 보았습니다. gamma가 0.5일 때 성능이 가장 좋았습니다. 하지만, 이것보다 그냥 cross entropy loss가 더 좋은 성능을 보여주었습니다. (제가 구현을 잘못한 것인가요…ㅠㅠ Focal loss가 더 좋을 것으로 예상을 했었는데…) 최종적으로 저는 loss로 cross entropy를 사용했습니다.\nLabel smoothing을 적용해서 실험해 보았지만 그럴듯한 성능 향상을 보여주지 않았습니다. \n(Triplet loss구현을 시도해 보았지만, 시간 부족을 구현을 완료하지 못했습니다. 혹시 해보신 분 있으면 결과를 남겨주시면 좋겠습니다.)</p></li>\n<li><p><em>Model :</em>\n저는 Efficientnet-B7, B6, B5, PNASNet, NASNet을 사용했습니다. 각 model head에 dropout(p=0.4)을 추가해서 사용했습니다. (IIdoo kim님이 discussion에 올렸던 model은 너무 train하기에 무거워서 결국 사용하지 못했습니다.)\nWS-DAN(Weakly Supervised Data Augmentation Network)이라는 아주 흥미로운 구조를 실험해 보았습니다. 이것을 Efficientnet-B7 model에 적용시켰습니다. Training 시간은 3배로 걸리지만 성능은 크게 개선되지 않아서 이 구조를 사용하지 않게 되었습니다.</p></li>\n<li><p><em>Scheduler :</em>\n초반에는 CosineannealingLR, MultistepLR, StepLR을 사용해 보았습니다. 이중에서 적절한 값을 찾아본 결과 MultistepLR이 가장 좋은 성능을 보여주어서 이것을 사용했습니다. 후반기에 최종 model을 train할 때는 SuperConvergence라는 scheduler를 사용하여 train을 하였습니다.</p></li>\n<li><p><em>Optimizer :</em>\n다양한 optimizer를 baseline에 실험해 보았는데 AdamW가 가장 성능이 좋았습니다. PNAS, NAS는SGD + momentum이 성능이 좋은 모습을 보여주어 이것을 사용하였습니다.</p></li>\n<li><p><em>Train Process:</em>\nEfficientnet-B7, B6, B5는 lr=0.00028로 50 epoch train후 max_lr=0.00028로 SuperConvergence + AdamW로 60 epoch train했습니다.\nPNAS, NAS는 lr=0.0042, max_lr=0.0042로 위와 같은 방식으로 optimizer만 바꿔준 후 train했습니다. weight저장은 valid set에서 f1-score가 가장 좋은 weight를 저장했습니다.</p></li>\n<li><p><em>Test-Time-Augmentation :</em>\ntta를 5번 적용하였습니다. 적용한 augmentation은 Random Resized Crop, Random Horizontal Flip, Random Rotation입니다. Rotation은 5를 주었고 나머지는 train때와 같게 주었습니다.</p></li>\n<li><p><em>Ensemble :</em>\n6 fold cross validation을 사용하였습니다. 또한 앞에서 언급한 Efficientnet-B7, B6, B5, PNAS, NAS model을 soft-voting을 하였습니다.\n성능으로는 B7&gt;B6&gt;B5&gt;PNAS&gt;NAS 순이었습니다. (Public score 기준)\n(결론적으로 총 30개의 weight를 사용했네요… 6.5G정도 되네요)</p></li>\n</ul>\n\n<p>최종 score  “ Public : 0.96604,  Private : 0.96058 ”\nPrivat score가 가장 좋은 모델은 Efficientnet-B7 model이네요 0.96132나왔습니다.</p>",
      "rawMarkdown": "### 안녕하세요 캐글코리아! \n\n먼저 좋은 대회 마련해 주신 KaKR 운영진분들께 감사의 인사를 드리고 싶습니다.\n\n저는 학부생이어서 학기중에는 바빠 이전 대회들은 참여하지 못하고 있었습니다. 우연히 이번 competition과 방학이 겹쳐서 이렇게 참여하게 되었습니다. 이 글을 통하여 저의 solution과 score을 얻기 위해서 어떤 방식들을 시도했는지 공유하겠습니다! 다른 순위권 분들도 좋은 solution과 시행착오들을 공유해 주셔서 다같이 배울 수 있는 글들을 남겨주셨으면 좋겠습니다!\n\n\n\nBaseline model : Efficientnet-B5\n\n\n- *Preprocessing*\nUsing Bounding Box : \n저는 처음에 bounding Box로 crop된 image를 사용했지만 아래의 두 github에서는 crop하지 않은 image를 input으로 주는 것이 성능이 더 좋다고 하였습니다.\n1. https://github.com/jianshen92/stanford-car-grab-challenge\n2. https://github.com/morganmcg1/Projects/tree/master/stanford-cars\n하지만, Public score 0.93정도 이상에서는 그렇게 큰 효과가 없었습니다. 또한, cutout을 적용하면 crop된 image가 성능이 더 높은 모습을 보여주었습니다. 그래서 저는 Bounding box로 crop된 이미지를 input으로 사용했습니다.\n저는 Image를 단순하게 resize하는 방식을 사용했는데 위의 github에서는 squeeze method를 사용하면 더 좋은 성능을 보여준다고 합니다. 하지만, 저는 이것을 구현하지 못해서 적용하지 못했습니다.\n\n\n\n- *Augmentation* : \n(saewon님의 kernel을 참고하였습니다.)\nRandom Resized Crop, Random Horizontal Flip, Random Rotation, AutoAgumentation(CIFAR-10), Normalize, Random Erasing(cutout)을 적용하였습니다. 여기에 mixup을 적용시켰습니다.\nCutmix를 mixup대신 적용시켜 보았지만, 저는 mixup을 사용했을 때 성능이 더 좋게 나타났습니다. \nmixup의 alpha값은 0.2, 0.4, 1.0을 사용해보았는데 1.0에서 성능이 가장 좋게 나왔습니다.\nrotation은 30도를 주었고 resized crop은 (0.8, 1.0) 다른 것들은 default 값으로 적용시켰습니다.\n\n\n\n- *Sampler :*\nClass의 이미지 수들의 불균형이 존재했습니다. 균형을 맞추기 위해서 oversampling 방식을 통하여 한 epoch을 당 주어지는 class의 image 수를 같게 맞추었습니다.\n\n\n\n- *Loss :*\nFocalLoss를 gamma를 0.5, 2, 3을 시도해 보았습니다. gamma가 0.5일 때 성능이 가장 좋았습니다. 하지만, 이것보다 그냥 cross entropy loss가 더 좋은 성능을 보여주었습니다. (제가 구현을 잘못한 것인가요…ㅠㅠ Focal loss가 더 좋을 것으로 예상을 했었는데…) 최종적으로 저는 loss로 cross entropy를 사용했습니다.\nLabel smoothing을 적용해서 실험해 보았지만 그럴듯한 성능 향상을 보여주지 않았습니다. \n(Triplet loss구현을 시도해 보았지만, 시간 부족을 구현을 완료하지 못했습니다. 혹시 해보신 분 있으면 결과를 남겨주시면 좋겠습니다.)\n\n\n\n- *Model :*\n저는 Efficientnet-B7, B6, B5, PNASNet, NASNet을 사용했습니다. 각 model head에 dropout(p=0.4)을 추가해서 사용했습니다. (IIdoo kim님이 discussion에 올렸던 model은 너무 train하기에 무거워서 결국 사용하지 못했습니다.)\nWS-DAN(Weakly Supervised Data Augmentation Network)이라는 아주 흥미로운 구조를 실험해 보았습니다. 이것을 Efficientnet-B7 model에 적용시켰습니다. Training 시간은 3배로 걸리지만 성능은 크게 개선되지 않아서 이 구조를 사용하지 않게 되었습니다.\n\n\n\n- *Scheduler :*\n초반에는 CosineannealingLR, MultistepLR, StepLR을 사용해 보았습니다. 이중에서 적절한 값을 찾아본 결과 MultistepLR이 가장 좋은 성능을 보여주어서 이것을 사용했습니다. 후반기에 최종 model을 train할 때는 SuperConvergence라는 scheduler를 사용하여 train을 하였습니다.\n\n\n\n- *Optimizer :*\n다양한 optimizer를 baseline에 실험해 보았는데 AdamW가 가장 성능이 좋았습니다. PNAS, NAS는SGD + momentum이 성능이 좋은 모습을 보여주어 이것을 사용하였습니다.\n\n\n\n- *Train Process:*\nEfficientnet-B7, B6, B5는 lr=0.00028로 50 epoch train후 max_lr=0.00028로 SuperConvergence + AdamW로 60 epoch train했습니다.\nPNAS, NAS는 lr=0.0042, max_lr=0.0042로 위와 같은 방식으로 optimizer만 바꿔준 후 train했습니다. weight저장은 valid set에서 f1-score가 가장 좋은 weight를 저장했습니다.\n\n\n\n- *Test-Time-Augmentation :*\ntta를 5번 적용하였습니다. 적용한 augmentation은 Random Resized Crop, Random Horizontal Flip, Random Rotation입니다. Rotation은 5를 주었고 나머지는 train때와 같게 주었습니다.\n\n\n\n- *Ensemble :*\n6 fold cross validation을 사용하였습니다. 또한 앞에서 언급한 Efficientnet-B7, B6, B5, PNAS, NAS model을 soft-voting을 하였습니다.\n성능으로는 B7&gt;B6&gt;B5&gt;PNAS&gt;NAS 순이었습니다. (Public score 기준)\n(결론적으로 총 30개의 weight를 사용했네요… 6.5G정도 되네요)\n\n\n\n\n\n\n최종 score  “ Public : 0.96604,  Private : 0.96058 ”\nPrivat score가 가장 좋은 모델은 Efficientnet-B7 model이네요 0.96132나왔습니다.",
      "votes": null
    },
    {
      "id": "601695",
      "postDate": "08/18/2019 04:05:43",
      "content": "<p>와.. 정말 다양한 실험을 많이 하셨네요!\n저도 클래스 불균형 때문에 focal loss를 사용했는데 결과는 cross entropy와 크게 다르지 않았던거 같네요..;\n고생하셨고 1등 하신거 축하드립니다!</p>",
      "rawMarkdown": "와.. 정말 다양한 실험을 많이 하셨네요!\n저도 클래스 불균형 때문에 focal loss를 사용했는데 결과는 cross entropy와 크게 다르지 않았던거 같네요..;\n고생하셨고 1등 하신거 축하드립니다!",
      "votes": null
    },
    {
      "id": "602057",
      "postDate": "08/18/2019 14:03:50",
      "content": "<p>와.... 30개의 weight라니... 모델이 엄청나네요... 정말 고생한 흔적이 모이는 글입니다... 존경스럽네요...! 고생하셧고 축하드립니다!!! fold하실 때 혹시 StratifiedKFold 사용하셨나요-? Focal loss와 같이 썼을 때 성능적인 측면에서 궁금해지네요! 만약 둘을 같이 쓴다면 어느정도 영향력이 약해질 것이라고는 생각이 되는데... 둘의 관계에 대해서 한번 테스트 해보고싶네요-! </p>",
      "rawMarkdown": "와.... 30개의 weight라니... 모델이 엄청나네요... 정말 고생한 흔적이 모이는 글입니다... 존경스럽네요...! 고생하셧고 축하드립니다!!! fold하실 때 혹시 StratifiedKFold 사용하셨나요-? Focal loss와 같이 썼을 때 성능적인 측면에서 궁금해지네요! 만약 둘을 같이 쓴다면 어느정도 영향력이 약해질 것이라고는 생각이 되는데... 둘의 관계에 대해서 한번 테스트 해보고싶네요-!",
      "votes": null
    },
    {
      "id": "602338",
      "postDate": "08/19/2019 00:15:30",
      "content": "<p>고생하셨습니다. 상세한 설명 감사드립니다. 덕분에 많이 배우고 가네요 ㅎㅎ</p>",
      "rawMarkdown": "고생하셨습니다. 상세한 설명 감사드립니다. 덕분에 많이 배우고 가네요 ㅎㅎ",
      "votes": null
    },
    {
      "id": "602386",
      "postDate": "08/19/2019 03:00:55",
      "content": "<p>웨이트 30개 대단하십니다.! 1등축하드려요~</p>",
      "rawMarkdown": "웨이트 30개 대단하십니다.! 1등축하드려요~",
      "votes": null
    },
    {
      "id": "602505",
      "postDate": "08/19/2019 06:21:06",
      "content": "<p>앗 그 설명을 안드렸군요 StratifiedKFold로 Kfold를 나누어서 사용했습니다!! 같이 써서 약해진 것일까요... ㅠㅠㅠ 저도 한번 다음에 기회가 되면 테스트 해봐야겠네요 ㅎㅎ 감사합니다!!ㅎㅎ</p>",
      "rawMarkdown": "앗 그 설명을 안드렸군요 StratifiedKFold로 Kfold를 나누어서 사용했습니다!! 같이 써서 약해진 것일까요... ㅠㅠㅠ 저도 한번 다음에 기회가 되면 테스트 해봐야겠네요 ㅎㅎ 감사합니다!!ㅎㅎ",
      "votes": null
    },
    {
      "id": "602508",
      "postDate": "08/19/2019 06:22:43",
      "content": "<p>이유가 뭐였을까요...ㅠㅠ!! 저는 테스트 하는게 재밌더라고요 ㅎㅎㅎ 캐글에 재미인거 같아요~!! 더 좋은 점수를 찾아가는 게임 같다고 해야할까...!! 감사합니다!!ㅎㅎ</p>",
      "rawMarkdown": "이유가 뭐였을까요...ㅠㅠ!! 저는 테스트 하는게 재밌더라고요 ㅎㅎㅎ 캐글에 재미인거 같아요~!! 더 좋은 점수를 찾아가는 게임 같다고 해야할까...!! 감사합니다!!ㅎㅎ",
      "votes": null
    },
    {
      "id": "602510",
      "postDate": "08/19/2019 06:23:37",
      "content": "<p>색다른 기술 없이 앙상블로만 점수를 높인거 같아서 다른 분들한테 죄송하네요 ㅠㅠㅠ 솔루션 잘봤습니다ㅎㅎ 많이 배워갑니다!!ㅎㅎㅎ 감사해요!!ㅎㅎ</p>",
      "rawMarkdown": "색다른 기술 없이 앙상블로만 점수를 높인거 같아서 다른 분들한테 죄송하네요 ㅠㅠㅠ 솔루션 잘봤습니다ㅎㅎ 많이 배워갑니다!!ㅎㅎㅎ 감사해요!!ㅎㅎ",
      "votes": null
    },
    {
      "id": "602511",
      "postDate": "08/19/2019 06:23:51",
      "content": "<p>많이 배우셨다니 기분이 좋네요 ㅎㅎㅎ 감사합니다!!</p>",
      "rawMarkdown": "많이 배우셨다니 기분이 좋네요 ㅎㅎㅎ 감사합니다!!",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 601695,
      "author_name": "tmheo74",
      "author_url": "",
      "post_date": "08/18/2019 04:05:43",
      "content": "<p>와.. 정말 다양한 실험을 많이 하셨네요!\n저도 클래스 불균형 때문에 focal loss를 사용했는데 결과는 cross entropy와 크게 다르지 않았던거 같네요..;\n고생하셨고 1등 하신거 축하드립니다!</p>",
      "votes": null,
      "replies": [
        {
          "id": 602508,
          "author_name": "gocks8",
          "author_url": "",
          "post_date": "08/19/2019 06:22:43",
          "content": "<p>이유가 뭐였을까요...ㅠㅠ!! 저는 테스트 하는게 재밌더라고요 ㅎㅎㅎ 캐글에 재미인거 같아요~!! 더 좋은 점수를 찾아가는 게임 같다고 해야할까...!! 감사합니다!!ㅎㅎ</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 602057,
      "author_name": "seriousran",
      "author_url": "",
      "post_date": "08/18/2019 14:03:50",
      "content": "<p>와.... 30개의 weight라니... 모델이 엄청나네요... 정말 고생한 흔적이 모이는 글입니다... 존경스럽네요...! 고생하셧고 축하드립니다!!! fold하실 때 혹시 StratifiedKFold 사용하셨나요-? Focal loss와 같이 썼을 때 성능적인 측면에서 궁금해지네요! 만약 둘을 같이 쓴다면 어느정도 영향력이 약해질 것이라고는 생각이 되는데... 둘의 관계에 대해서 한번 테스트 해보고싶네요-! </p>",
      "votes": null,
      "replies": [
        {
          "id": 602505,
          "author_name": "gocks8",
          "author_url": "",
          "post_date": "08/19/2019 06:21:06",
          "content": "<p>앗 그 설명을 안드렸군요 StratifiedKFold로 Kfold를 나누어서 사용했습니다!! 같이 써서 약해진 것일까요... ㅠㅠㅠ 저도 한번 다음에 기회가 되면 테스트 해봐야겠네요 ㅎㅎ 감사합니다!!ㅎㅎ</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 602338,
      "author_name": "plsjlq",
      "author_url": "",
      "post_date": "08/19/2019 00:15:30",
      "content": "<p>고생하셨습니다. 상세한 설명 감사드립니다. 덕분에 많이 배우고 가네요 ㅎㅎ</p>",
      "votes": null,
      "replies": [
        {
          "id": 602511,
          "author_name": "gocks8",
          "author_url": "",
          "post_date": "08/19/2019 06:23:51",
          "content": "<p>많이 배우셨다니 기분이 좋네요 ㅎㅎㅎ 감사합니다!!</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 602386,
      "author_name": "kimtaegwan",
      "author_url": "",
      "post_date": "08/19/2019 03:00:55",
      "content": "<p>웨이트 30개 대단하십니다.! 1등축하드려요~</p>",
      "votes": null,
      "replies": [
        {
          "id": 602510,
          "author_name": "gocks8",
          "author_url": "",
          "post_date": "08/19/2019 06:23:37",
          "content": "<p>색다른 기술 없이 앙상블로만 점수를 높인거 같아서 다른 분들한테 죄송하네요 ㅠㅠㅠ 솔루션 잘봤습니다ㅎㅎ 많이 배워갑니다!!ㅎㅎㅎ 감사해요!!ㅎㅎ</p>",
          "votes": null,
          "replies": []
        }
      ]
    }
  ],
  "raw_markdown_by_id": {
    "601175": "### 안녕하세요 캐글코리아! \n\n먼저 좋은 대회 마련해 주신 KaKR 운영진분들께 감사의 인사를 드리고 싶습니다.\n\n저는 학부생이어서 학기중에는 바빠 이전 대회들은 참여하지 못하고 있었습니다. 우연히 이번 competition과 방학이 겹쳐서 이렇게 참여하게 되었습니다. 이 글을 통하여 저의 solution과 score을 얻기 위해서 어떤 방식들을 시도했는지 공유하겠습니다! 다른 순위권 분들도 좋은 solution과 시행착오들을 공유해 주셔서 다같이 배울 수 있는 글들을 남겨주셨으면 좋겠습니다!\n\n\n\nBaseline model : Efficientnet-B5\n\n\n- *Preprocessing*\nUsing Bounding Box : \n저는 처음에 bounding Box로 crop된 image를 사용했지만 아래의 두 github에서는 crop하지 않은 image를 input으로 주는 것이 성능이 더 좋다고 하였습니다.\n1. https://github.com/jianshen92/stanford-car-grab-challenge\n2. https://github.com/morganmcg1/Projects/tree/master/stanford-cars\n하지만, Public score 0.93정도 이상에서는 그렇게 큰 효과가 없었습니다. 또한, cutout을 적용하면 crop된 image가 성능이 더 높은 모습을 보여주었습니다. 그래서 저는 Bounding box로 crop된 이미지를 input으로 사용했습니다.\n저는 Image를 단순하게 resize하는 방식을 사용했는데 위의 github에서는 squeeze method를 사용하면 더 좋은 성능을 보여준다고 합니다. 하지만, 저는 이것을 구현하지 못해서 적용하지 못했습니다.\n\n\n\n- *Augmentation* : \n(saewon님의 kernel을 참고하였습니다.)\nRandom Resized Crop, Random Horizontal Flip, Random Rotation, AutoAgumentation(CIFAR-10), Normalize, Random Erasing(cutout)을 적용하였습니다. 여기에 mixup을 적용시켰습니다.\nCutmix를 mixup대신 적용시켜 보았지만, 저는 mixup을 사용했을 때 성능이 더 좋게 나타났습니다. \nmixup의 alpha값은 0.2, 0.4, 1.0을 사용해보았는데 1.0에서 성능이 가장 좋게 나왔습니다.\nrotation은 30도를 주었고 resized crop은 (0.8, 1.0) 다른 것들은 default 값으로 적용시켰습니다.\n\n\n\n- *Sampler :*\nClass의 이미지 수들의 불균형이 존재했습니다. 균형을 맞추기 위해서 oversampling 방식을 통하여 한 epoch을 당 주어지는 class의 image 수를 같게 맞추었습니다.\n\n\n\n- *Loss :*\nFocalLoss를 gamma를 0.5, 2, 3을 시도해 보았습니다. gamma가 0.5일 때 성능이 가장 좋았습니다. 하지만, 이것보다 그냥 cross entropy loss가 더 좋은 성능을 보여주었습니다. (제가 구현을 잘못한 것인가요…ㅠㅠ Focal loss가 더 좋을 것으로 예상을 했었는데…) 최종적으로 저는 loss로 cross entropy를 사용했습니다.\nLabel smoothing을 적용해서 실험해 보았지만 그럴듯한 성능 향상을 보여주지 않았습니다. \n(Triplet loss구현을 시도해 보았지만, 시간 부족을 구현을 완료하지 못했습니다. 혹시 해보신 분 있으면 결과를 남겨주시면 좋겠습니다.)\n\n\n\n- *Model :*\n저는 Efficientnet-B7, B6, B5, PNASNet, NASNet을 사용했습니다. 각 model head에 dropout(p=0.4)을 추가해서 사용했습니다. (IIdoo kim님이 discussion에 올렸던 model은 너무 train하기에 무거워서 결국 사용하지 못했습니다.)\nWS-DAN(Weakly Supervised Data Augmentation Network)이라는 아주 흥미로운 구조를 실험해 보았습니다. 이것을 Efficientnet-B7 model에 적용시켰습니다. Training 시간은 3배로 걸리지만 성능은 크게 개선되지 않아서 이 구조를 사용하지 않게 되었습니다.\n\n\n\n- *Scheduler :*\n초반에는 CosineannealingLR, MultistepLR, StepLR을 사용해 보았습니다. 이중에서 적절한 값을 찾아본 결과 MultistepLR이 가장 좋은 성능을 보여주어서 이것을 사용했습니다. 후반기에 최종 model을 train할 때는 SuperConvergence라는 scheduler를 사용하여 train을 하였습니다.\n\n\n\n- *Optimizer :*\n다양한 optimizer를 baseline에 실험해 보았는데 AdamW가 가장 성능이 좋았습니다. PNAS, NAS는SGD + momentum이 성능이 좋은 모습을 보여주어 이것을 사용하였습니다.\n\n\n\n- *Train Process:*\nEfficientnet-B7, B6, B5는 lr=0.00028로 50 epoch train후 max_lr=0.00028로 SuperConvergence + AdamW로 60 epoch train했습니다.\nPNAS, NAS는 lr=0.0042, max_lr=0.0042로 위와 같은 방식으로 optimizer만 바꿔준 후 train했습니다. weight저장은 valid set에서 f1-score가 가장 좋은 weight를 저장했습니다.\n\n\n\n- *Test-Time-Augmentation :*\ntta를 5번 적용하였습니다. 적용한 augmentation은 Random Resized Crop, Random Horizontal Flip, Random Rotation입니다. Rotation은 5를 주었고 나머지는 train때와 같게 주었습니다.\n\n\n\n- *Ensemble :*\n6 fold cross validation을 사용하였습니다. 또한 앞에서 언급한 Efficientnet-B7, B6, B5, PNAS, NAS model을 soft-voting을 하였습니다.\n성능으로는 B7&gt;B6&gt;B5&gt;PNAS&gt;NAS 순이었습니다. (Public score 기준)\n(결론적으로 총 30개의 weight를 사용했네요… 6.5G정도 되네요)\n\n\n\n\n\n\n최종 score  “ Public : 0.96604,  Private : 0.96058 ”\nPrivat score가 가장 좋은 모델은 Efficientnet-B7 model이네요 0.96132나왔습니다.",
    "601695": "와.. 정말 다양한 실험을 많이 하셨네요!\n저도 클래스 불균형 때문에 focal loss를 사용했는데 결과는 cross entropy와 크게 다르지 않았던거 같네요..;\n고생하셨고 1등 하신거 축하드립니다!",
    "602057": "와.... 30개의 weight라니... 모델이 엄청나네요... 정말 고생한 흔적이 모이는 글입니다... 존경스럽네요...! 고생하셧고 축하드립니다!!! fold하실 때 혹시 StratifiedKFold 사용하셨나요-? Focal loss와 같이 썼을 때 성능적인 측면에서 궁금해지네요! 만약 둘을 같이 쓴다면 어느정도 영향력이 약해질 것이라고는 생각이 되는데... 둘의 관계에 대해서 한번 테스트 해보고싶네요-!",
    "602338": "고생하셨습니다. 상세한 설명 감사드립니다. 덕분에 많이 배우고 가네요 ㅎㅎ",
    "602386": "웨이트 30개 대단하십니다.! 1등축하드려요~",
    "602505": "앗 그 설명을 안드렸군요 StratifiedKFold로 Kfold를 나누어서 사용했습니다!! 같이 써서 약해진 것일까요... ㅠㅠㅠ 저도 한번 다음에 기회가 되면 테스트 해봐야겠네요 ㅎㅎ 감사합니다!!ㅎㅎ",
    "602508": "이유가 뭐였을까요...ㅠㅠ!! 저는 테스트 하는게 재밌더라고요 ㅎㅎㅎ 캐글에 재미인거 같아요~!! 더 좋은 점수를 찾아가는 게임 같다고 해야할까...!! 감사합니다!!ㅎㅎ",
    "602510": "색다른 기술 없이 앙상블로만 점수를 높인거 같아서 다른 분들한테 죄송하네요 ㅠㅠㅠ 솔루션 잘봤습니다ㅎㅎ 많이 배워갑니다!!ㅎㅎㅎ 감사해요!!ㅎㅎ",
    "602511": "많이 배우셨다니 기분이 좋네요 ㅎㅎㅎ 감사합니다!!"
  },
  "source": "meta"
}