{
  "id": 226664,
  "title": "71st Place Solution & Code",
  "url": "/competitions/ranzcr-clip-catheter-line-classification/discussion/226664",
  "author_name": "Nikita Kozodoi",
  "post_date": "2021-03-17T08:33:28.562000",
  "votes": 32,
  "comment_count": 10,
  "views": 0,
  "content": "<h2>Summary</h2>\n<p>Congrats to the winners and thanks to organizers for hosting this competition! I was only able to join three weeks ago and did not have time to test all ideas (not using external data and annotations). Still, I am glad to reach top-5% and happy to share my solution. Although there are many Grandmasters among the winners, I hope my summary will provide some value for some of you :)</p>\n<p>My solution is an ensemble of 5+2 CNN models; see the diagram below. All models are implemented in PyTorch and trained using Google Colab or a local machine with Quadro RTX 6000.<br>\n<img src=\"https://i.postimg.cc/c4cPcXng/ranzcr.png\" alt=\"ensemble\"><br>\nFrom my experience, the most important things in this competition were:</p>\n<ul>\n<li>large image size, which required gradient accumulation to have a decent batch size</li>\n<li>careful augmentations, as heavy rotation/crop were harming CNN performance</li>\n<li>ensembling with power mean to maximize AUC, which is a ranking indicator</li>\n</ul>\n<h2>Code</h2>\n<ul>\n<li><a href=\"https://www.kaggle.com/kozodoi/71st-place-ensembling-pipeline\" target=\"_blank\">Kaggle notebook</a> reproducing my submission and detailing the ensembling pipeline</li>\n<li><a href=\"https://github.com/kozodoi/Kaggle_RANZCR_Challenge\" target=\"_blank\">GitHub repo</a> with the complete training codes and notebooks</li>\n</ul>\n<h2>Data</h2>\n<ul>\n<li><a href=\"https://www.kaggle.com/underwearfitting/how-to-properly-split-folds\" target=\"_blank\">Group stratified 5-fold CV</a> proposed by <a href=\"https://www.kaggle.com/underwearfitting\" target=\"_blank\">@underwearfitting</a> </li>\n<li>Augmenting training folds with up to 1% of pseudo-labeled public test data</li>\n</ul>\n<h2>Augmentations</h2>\n<ul>\n<li>Training augmentations:</li>\n</ul>\n<pre><code>- RandomResizedCrop(scale = (0.8, 1))\n- ShiftScaleRotate(0.05, 0.05, 0.05)\n- HorizontalFlip\n- HueSaturationValue\n- RandomBrightnessContrast\n- Blur and Distortion\n- Cutout\n</code></pre>\n<ul>\n<li>TTA: averaging over 2 images with <code>HorizontalFlip</code></li>\n<li>Image size: between 600 and 886</li>\n</ul>\n<h2>Base models</h2>\n<p>The table below from Neptune.ai provides the main parameters of the 5 base models:<br>\n<img src=\"https://i.postimg.cc/sgcZRfD2/Screen-2021-03-16-at-17-51-00.jpg\" alt=\"models\"></p>\n<ul>\n<li>ResNet models were initialized from the <a href=\"https://www.kaggle.com/underwearfitting/resnet200d-baseline-benchmark-public\" target=\"_blank\">public pretrained weights</a></li>\n<li>Scheduler: 1-epoch warmup + cosine annealing afterwards</li>\n</ul>\n<h2>Ensembling</h2>\n<p>Although all CNNs have a full 11-label head, I was considering each label separately on the ensembling stage. For each of the labels, I compared two options to mix model predictions:</p>\n<ul>\n<li>simple blends (arithmetic, geometric, power or rank mean)</li>\n<li>stacking with LightGBM (including predictions for all labels as features)</li>\n</ul>\n<p>Using OOF predictions, I found power mean with <code>p = 1/11</code> to perform best for 6 labels. The intuition behind such a low <code>p</code> is the desire to assign higher scores to images where at least one model suspects a positive class. For 5 other labels, stacking performed slightly better.</p>\n<p>Combining stacking and power mean allowed me to reach the local CV of <strong>0.9660</strong>. As usual, it was tempting to choose another sub with a better public LB score, but trusting CV paid off: selecting a higher-scoring sub on public LB would have kicked me out of the medal zone.</p>\n<p>Finally, I blended my best CV ensemble (<code>w = 75%</code>) with the 2 public models (<code>w = 25%</code>):</p>\n<ul>\n<li><a href=\"https://www.kaggle.com/ammarali32/seresnet152d-cv9615\" target=\"_blank\">SeResNet152D</a> by <a href=\"https://www.kaggle.com/ammarali32\" target=\"_blank\">@ammarali32</a></li>\n<li><a href=\"https://www.kaggle.com/ammarali32/resnet200d-public\" target=\"_blank\">ResNet200D</a> by <a href=\"https://www.kaggle.com/ammarali32\" target=\"_blank\">@ammarali32</a></li>\n</ul>\n<p>The final solution achieves <strong>0.97156</strong> on the private LB (71st place). Happy to answer any questions in the comments and see you in the next competitions! 😊</p>",
  "messages": [
    {
      "id": 1241843,
      "postDate": "2021-03-17T08:33:28.563Z",
      "content": "<h2>Summary</h2>\n<p>Congrats to the winners and thanks to organizers for hosting this competition! I was only able to join three weeks ago and did not have time to test all ideas (not using external data and annotations). Still, I am glad to reach top-5% and happy to share my solution. Although there are many Grandmasters among the winners, I hope my summary will provide some value for some of you :)</p>\n<p>My solution is an ensemble of 5+2 CNN models; see the diagram below. All models are implemented in PyTorch and trained using Google Colab or a local machine with Quadro RTX 6000.<br>\n<img src=\"https://i.postimg.cc/c4cPcXng/ranzcr.png\" alt=\"ensemble\"><br>\nFrom my experience, the most important things in this competition were:</p>\n<ul>\n<li>large image size, which required gradient accumulation to have a decent batch size</li>\n<li>careful augmentations, as heavy rotation/crop were harming CNN performance</li>\n<li>ensembling with power mean to maximize AUC, which is a ranking indicator</li>\n</ul>\n<h2>Code</h2>\n<ul>\n<li><a href=\"https://www.kaggle.com/kozodoi/71st-place-ensembling-pipeline\" target=\"_blank\">Kaggle notebook</a> reproducing my submission and detailing the ensembling pipeline</li>\n<li><a href=\"https://github.com/kozodoi/Kaggle_RANZCR_Challenge\" target=\"_blank\">GitHub repo</a> with the complete training codes and notebooks</li>\n</ul>\n<h2>Data</h2>\n<ul>\n<li><a href=\"https://www.kaggle.com/underwearfitting/how-to-properly-split-folds\" target=\"_blank\">Group stratified 5-fold CV</a> proposed by <a href=\"https://www.kaggle.com/underwearfitting\" target=\"_blank\">@underwearfitting</a> </li>\n<li>Augmenting training folds with up to 1% of pseudo-labeled public test data</li>\n</ul>\n<h2>Augmentations</h2>\n<ul>\n<li>Training augmentations:</li>\n</ul>\n<pre><code>- RandomResizedCrop(scale = (0.8, 1))\n- ShiftScaleRotate(0.05, 0.05, 0.05)\n- HorizontalFlip\n- HueSaturationValue\n- RandomBrightnessContrast\n- Blur and Distortion\n- Cutout\n</code></pre>\n<ul>\n<li>TTA: averaging over 2 images with <code>HorizontalFlip</code></li>\n<li>Image size: between 600 and 886</li>\n</ul>\n<h2>Base models</h2>\n<p>The table below from Neptune.ai provides the main parameters of the 5 base models:<br>\n<img src=\"https://i.postimg.cc/sgcZRfD2/Screen-2021-03-16-at-17-51-00.jpg\" alt=\"models\"></p>\n<ul>\n<li>ResNet models were initialized from the <a href=\"https://www.kaggle.com/underwearfitting/resnet200d-baseline-benchmark-public\" target=\"_blank\">public pretrained weights</a></li>\n<li>Scheduler: 1-epoch warmup + cosine annealing afterwards</li>\n</ul>\n<h2>Ensembling</h2>\n<p>Although all CNNs have a full 11-label head, I was considering each label separately on the ensembling stage. For each of the labels, I compared two options to mix model predictions:</p>\n<ul>\n<li>simple blends (arithmetic, geometric, power or rank mean)</li>\n<li>stacking with LightGBM (including predictions for all labels as features)</li>\n</ul>\n<p>Using OOF predictions, I found power mean with <code>p = 1/11</code> to perform best for 6 labels. The intuition behind such a low <code>p</code> is the desire to assign higher scores to images where at least one model suspects a positive class. For 5 other labels, stacking performed slightly better.</p>\n<p>Combining stacking and power mean allowed me to reach the local CV of <strong>0.9660</strong>. As usual, it was tempting to choose another sub with a better public LB score, but trusting CV paid off: selecting a higher-scoring sub on public LB would have kicked me out of the medal zone.</p>\n<p>Finally, I blended my best CV ensemble (<code>w = 75%</code>) with the 2 public models (<code>w = 25%</code>):</p>\n<ul>\n<li><a href=\"https://www.kaggle.com/ammarali32/seresnet152d-cv9615\" target=\"_blank\">SeResNet152D</a> by <a href=\"https://www.kaggle.com/ammarali32\" target=\"_blank\">@ammarali32</a></li>\n<li><a href=\"https://www.kaggle.com/ammarali32/resnet200d-public\" target=\"_blank\">ResNet200D</a> by <a href=\"https://www.kaggle.com/ammarali32\" target=\"_blank\">@ammarali32</a></li>\n</ul>\n<p>The final solution achieves <strong>0.97156</strong> on the private LB (71st place). Happy to answer any questions in the comments and see you in the next competitions! 😊</p>",
      "rawMarkdown": "## Summary\n\nCongrats to the winners and thanks to organizers for hosting this competition! I was only able to join three weeks ago and did not have time to test all ideas (not using external data and annotations). Still, I am glad to reach top-5% and happy to share my solution. Although there are many Grandmasters among the winners, I hope my summary will provide some value for some of you :)\n\nMy solution is an ensemble of 5+2 CNN models; see the diagram below. All models are implemented in PyTorch and trained using Google Colab or a local machine with Quadro RTX 6000.\n![ensemble](https://i.postimg.cc/c4cPcXng/ranzcr.png)\nFrom my experience, the most important things in this competition were:\n- large image size, which required gradient accumulation to have a decent batch size\n- careful augmentations, as heavy rotation/crop were harming CNN performance\n- ensembling with power mean to maximize AUC, which is a ranking indicator\n\n## Code\n- [Kaggle notebook](https://www.kaggle.com/kozodoi/71st-place-ensembling-pipeline) reproducing my submission and detailing the ensembling pipeline\n- [GitHub repo](https://github.com/kozodoi/Kaggle_RANZCR_Challenge) with the complete training codes and notebooks\n\n## Data\n- [Group stratified 5-fold CV](https://www.kaggle.com/underwearfitting/how-to-properly-split-folds) proposed by @underwearfitting \n- Augmenting training folds with up to 1% of pseudo-labeled public test data\n\n## Augmentations\n- Training augmentations:\n```\n- RandomResizedCrop(scale = (0.8, 1))\n- ShiftScaleRotate(0.05, 0.05, 0.05)\n- HorizontalFlip\n- HueSaturationValue\n- RandomBrightnessContrast\n- Blur and Distortion\n- Cutout\n```\n- TTA: averaging over 2 images with `HorizontalFlip `\n- Image size: between 600 and 886\n\n## Base models\nThe table below from Neptune.ai provides the main parameters of the 5 base models:\n![models](https://i.postimg.cc/sgcZRfD2/Screen-2021-03-16-at-17-51-00.jpg)\n- ResNet models were initialized from the [public pretrained weights](https://www.kaggle.com/underwearfitting/resnet200d-baseline-benchmark-public)\n- Scheduler: 1-epoch warmup + cosine annealing afterwards\n\n## Ensembling\n\nAlthough all CNNs have a full 11-label head, I was considering each label separately on the ensembling stage. For each of the labels, I compared two options to mix model predictions:\n- simple blends (arithmetic, geometric, power or rank mean)\n- stacking with LightGBM (including predictions for all labels as features)\n\nUsing OOF predictions, I found power mean with `p = 1/11` to perform best for 6 labels. The intuition behind such a low `p` is the desire to assign higher scores to images where at least one model suspects a positive class. For 5 other labels, stacking performed slightly better.\n\nCombining stacking and power mean allowed me to reach the local CV of **0.9660**. As usual, it was tempting to choose another sub with a better public LB score, but trusting CV paid off: selecting a higher-scoring sub on public LB would have kicked me out of the medal zone.\n\nFinally, I blended my best CV ensemble (`w = 75%`) with the 2 public models (`w = 25%`):\n- [SeResNet152D](https://www.kaggle.com/ammarali32/seresnet152d-cv9615) by @ammarali32\n- [ResNet200D](https://www.kaggle.com/ammarali32/resnet200d-public) by @ammarali32\n\nThe final solution achieves **0.97156** on the private LB (71st place). Happy to answer any questions in the comments and see you in the next competitions! 😊",
      "votes": 32
    },
    {
      "id": 1242068,
      "postDate": "2021-03-17T11:34:47.387Z",
      "content": "<p>Thank you for sharing <a href=\"https://www.kaggle.com/kozodoi\" target=\"_blank\">@kozodoi</a>. Very informative and congratulations.keep rocking 👍</p>",
      "rawMarkdown": "Thank you for sharing @kozodoi. Very informative and congratulations.keep rocking 👍",
      "votes": 1
    },
    {
      "id": 1242014,
      "postDate": "2021-03-17T10:48:05.400Z",
      "content": "<p><a href=\"https://www.kaggle.com/kozodoi\" target=\"_blank\">@kozodoi</a> Congratulations on Silver Finish . Great writeup .</p>",
      "rawMarkdown": "@kozodoi Congratulations on Silver Finish . Great writeup .",
      "votes": 1,
      "replies": [
        {
          "id": 1242111,
          "postDate": "2021-03-17T12:03:23.950Z",
          "content": "<p>Thanks <a href=\"https://www.kaggle.com/usharengaraju\" target=\"_blank\">@usharengaraju</a>!</p>",
          "rawMarkdown": "Thanks @usharengaraju!"
        }
      ]
    },
    {
      "id": 1241930,
      "postDate": "2021-03-17T09:32:45.393Z",
      "content": "<p>Strong finish. Congrats.</p>",
      "rawMarkdown": "Strong finish. Congrats.",
      "votes": 1,
      "replies": [
        {
          "id": 1242037,
          "postDate": "2021-03-17T11:03:15.830Z",
          "content": "<p>Thank you <a href=\"https://www.kaggle.com/underwearfitting\" target=\"_blank\">@underwearfitting</a> for all your contributions and congrats with the second place!</p>",
          "rawMarkdown": "Thank you @underwearfitting for all your contributions and congrats with the second place!"
        }
      ]
    },
    {
      "id": 1241886,
      "postDate": "2021-03-17T09:05:25.747Z",
      "content": "<p>Congratulation!</p>\n<p>I would like to see the code for power mean. Please.</p>\n<p>I am a google collab pro user, Do you recommend using Neptune.ai with colab?</p>\n<p>Thank you :)</p>",
      "rawMarkdown": "Congratulation!\n\nI would like to see the code for power mean. Please.\n\nI am a google collab pro user, Do you recommend using Neptune.ai with colab?\n\nThank you :)\n",
      "replies": [
        {
          "id": 1241969,
          "postDate": "2021-03-17T10:03:34.597Z",
          "content": "<p>Thanks <a href=\"https://www.kaggle.com/faisalalsrheed\" target=\"_blank\">@faisalalsrheed</a>! I just made <a href=\"https://www.kaggle.com/kozodoi/71st-place-ensembling-pipeline\" target=\"_blank\">the notebook reproducing my submission</a> public, please have a look if you are interested. The power mean is implemented as <code>np.mean(np.power(preds, p) * w, axis = 1) ** (1/p)</code>, where <code>p</code> is a parameter that can be tuned and <code>w</code> are model weights.</p>\n<p>I recommend using Neptune.ai regardless of the environment :) I personally do not use their JupyterLab extension for versioning notebooks and create a separate file for each experiment. But I rely on Neptune API to track CV performance and upload model weights and configurations.</p>",
          "rawMarkdown": "Thanks @faisalalsrheed! I just made [the notebook reproducing my submission](https://www.kaggle.com/kozodoi/71st-place-ensembling-pipeline) public, please have a look if you are interested. The power mean is implemented as `np.mean(np.power(preds, p) * w, axis = 1) ** (1/p)`, where `p` is a parameter that can be tuned and `w` are model weights.\n\nI recommend using Neptune.ai regardless of the environment :) I personally do not use their JupyterLab extension for versioning notebooks and create a separate file for each experiment. But I rely on Neptune API to track CV performance and upload model weights and configurations.",
          "votes": 1
        },
        {
          "id": 1242130,
          "postDate": "2021-03-17T12:23:10.910Z",
          "content": "<p>Thank you <a href=\"https://www.kaggle.com/kozodo\" target=\"_blank\">@kozodo</a> I appreciate it<br>\nall the best :)</p>",
          "rawMarkdown": "Thank you @kozodo I appreciate it\nall the best :)"
        }
      ]
    },
    {
      "id": 1246826,
      "postDate": "2021-03-21T06:23:24.440Z",
      "rawMarkdown": "",
      "isDeleted": true
    },
    {
      "id": 1246398,
      "postDate": "2021-03-20T17:52:09.753Z",
      "content": "<p>thanks for sharing</p>",
      "rawMarkdown": "thanks for sharing"
    }
  ],
  "comments": [
    {
      "id": 1242068,
      "author_name": "Thrinesh Duvvuru",
      "author_url": "",
      "post_date": "2021-03-17T11:34:47.387000",
      "content": "<p>Thank you for sharing <a href=\"https://www.kaggle.com/kozodoi\" target=\"_blank\">@kozodoi</a>. Very informative and congratulations.keep rocking 👍</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1242014,
      "author_name": "Tensor Girl",
      "author_url": "",
      "post_date": "2021-03-17T10:48:05.400000",
      "content": "<p><a href=\"https://www.kaggle.com/kozodoi\" target=\"_blank\">@kozodoi</a> Congratulations on Silver Finish . Great writeup .</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1242111,
          "author_name": "Nikita Kozodoi",
          "author_url": "",
          "post_date": "2021-03-17T12:03:23.950000",
          "content": "<p>Thanks <a href=\"https://www.kaggle.com/usharengaraju\" target=\"_blank\">@usharengaraju</a>!</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1241930,
      "author_name": "sin",
      "author_url": "",
      "post_date": "2021-03-17T09:32:45.393000",
      "content": "<p>Strong finish. Congrats.</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1242037,
          "author_name": "Nikita Kozodoi",
          "author_url": "",
          "post_date": "2021-03-17T11:03:15.830000",
          "content": "<p>Thank you <a href=\"https://www.kaggle.com/underwearfitting\" target=\"_blank\">@underwearfitting</a> for all your contributions and congrats with the second place!</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1241886,
      "author_name": "Faisal Alsrheed",
      "author_url": "",
      "post_date": "2021-03-17T09:05:25.747000",
      "content": "<p>Congratulation!</p>\n<p>I would like to see the code for power mean. Please.</p>\n<p>I am a google collab pro user, Do you recommend using Neptune.ai with colab?</p>\n<p>Thank you :)</p>",
      "votes": 0,
      "replies": [
        {
          "id": 1241969,
          "author_name": "Nikita Kozodoi",
          "author_url": "",
          "post_date": "2021-03-17T10:03:34.597000",
          "content": "<p>Thanks <a href=\"https://www.kaggle.com/faisalalsrheed\" target=\"_blank\">@faisalalsrheed</a>! I just made <a href=\"https://www.kaggle.com/kozodoi/71st-place-ensembling-pipeline\" target=\"_blank\">the notebook reproducing my submission</a> public, please have a look if you are interested. The power mean is implemented as <code>np.mean(np.power(preds, p) * w, axis = 1) ** (1/p)</code>, where <code>p</code> is a parameter that can be tuned and <code>w</code> are model weights.</p>\n<p>I recommend using Neptune.ai regardless of the environment :) I personally do not use their JupyterLab extension for versioning notebooks and create a separate file for each experiment. But I rely on Neptune API to track CV performance and upload model weights and configurations.</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 1242130,
          "author_name": "Faisal Alsrheed",
          "author_url": "",
          "post_date": "2021-03-17T12:23:10.910000",
          "content": "<p>Thank you <a href=\"https://www.kaggle.com/kozodo\" target=\"_blank\">@kozodo</a> I appreciate it<br>\nall the best :)</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1246826,
      "author_name": "",
      "author_url": "",
      "post_date": "2021-03-21T06:23:24.440000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1246398,
      "author_name": "Alif Rahman",
      "author_url": "",
      "post_date": "2021-03-20T17:52:09.753000",
      "content": "<p>thanks for sharing</p>",
      "votes": 0,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "1241843": "## Summary\n\nCongrats to the winners and thanks to organizers for hosting this competition! I was only able to join three weeks ago and did not have time to test all ideas (not using external data and annotations). Still, I am glad to reach top-5% and happy to share my solution. Although there are many Grandmasters among the winners, I hope my summary will provide some value for some of you :)\n\nMy solution is an ensemble of 5+2 CNN models; see the diagram below. All models are implemented in PyTorch and trained using Google Colab or a local machine with Quadro RTX 6000.\n![ensemble](https://i.postimg.cc/c4cPcXng/ranzcr.png)\nFrom my experience, the most important things in this competition were:\n- large image size, which required gradient accumulation to have a decent batch size\n- careful augmentations, as heavy rotation/crop were harming CNN performance\n- ensembling with power mean to maximize AUC, which is a ranking indicator\n\n## Code\n- [Kaggle notebook](https://www.kaggle.com/kozodoi/71st-place-ensembling-pipeline) reproducing my submission and detailing the ensembling pipeline\n- [GitHub repo](https://github.com/kozodoi/Kaggle_RANZCR_Challenge) with the complete training codes and notebooks\n\n## Data\n- [Group stratified 5-fold CV](https://www.kaggle.com/underwearfitting/how-to-properly-split-folds) proposed by @underwearfitting \n- Augmenting training folds with up to 1% of pseudo-labeled public test data\n\n## Augmentations\n- Training augmentations:\n```\n- RandomResizedCrop(scale = (0.8, 1))\n- ShiftScaleRotate(0.05, 0.05, 0.05)\n- HorizontalFlip\n- HueSaturationValue\n- RandomBrightnessContrast\n- Blur and Distortion\n- Cutout\n```\n- TTA: averaging over 2 images with `HorizontalFlip `\n- Image size: between 600 and 886\n\n## Base models\nThe table below from Neptune.ai provides the main parameters of the 5 base models:\n![models](https://i.postimg.cc/sgcZRfD2/Screen-2021-03-16-at-17-51-00.jpg)\n- ResNet models were initialized from the [public pretrained weights](https://www.kaggle.com/underwearfitting/resnet200d-baseline-benchmark-public)\n- Scheduler: 1-epoch warmup + cosine annealing afterwards\n\n## Ensembling\n\nAlthough all CNNs have a full 11-label head, I was considering each label separately on the ensembling stage. For each of the labels, I compared two options to mix model predictions:\n- simple blends (arithmetic, geometric, power or rank mean)\n- stacking with LightGBM (including predictions for all labels as features)\n\nUsing OOF predictions, I found power mean with `p = 1/11` to perform best for 6 labels. The intuition behind such a low `p` is the desire to assign higher scores to images where at least one model suspects a positive class. For 5 other labels, stacking performed slightly better.\n\nCombining stacking and power mean allowed me to reach the local CV of **0.9660**. As usual, it was tempting to choose another sub with a better public LB score, but trusting CV paid off: selecting a higher-scoring sub on public LB would have kicked me out of the medal zone.\n\nFinally, I blended my best CV ensemble (`w = 75%`) with the 2 public models (`w = 25%`):\n- [SeResNet152D](https://www.kaggle.com/ammarali32/seresnet152d-cv9615) by @ammarali32\n- [ResNet200D](https://www.kaggle.com/ammarali32/resnet200d-public) by @ammarali32\n\nThe final solution achieves **0.97156** on the private LB (71st place). Happy to answer any questions in the comments and see you in the next competitions! 😊",
    "1242068": "Thank you for sharing @kozodoi. Very informative and congratulations.keep rocking 👍",
    "1242014": "@kozodoi Congratulations on Silver Finish . Great writeup .",
    "1241930": "Strong finish. Congrats.",
    "1241886": "Congratulation!\n\nI would like to see the code for power mean. Please.\n\nI am a google collab pro user, Do you recommend using Neptune.ai with colab?\n\nThank you :)\n",
    "1246826": "",
    "1246398": "thanks for sharing"
  }
}