{
  "id": 103654,
  "title": "최종 제출 inference 할 때 주의할 부분 (kernel only 대회 한정)",
  "url": "/competitions/2019-3rd-ml-month-with-kakr/discussion/103654",
  "author_name": "saewonYang",
  "post_date": "2019-08-10T16:09:56.408000",
  "votes": 9,
  "comment_count": 11,
  "views": 0,
  "content": "<p>제가 캐글 대회하면서 실수할 뻔한 부분들에 대해서 공유해보고자 합니다. 열심히 했는데 만약에 갑자기 실격이 된다면 매우 상심이 크겠죠. 저도 실제로 toxic 대회 참여했으나 사소한 실수로 한두 달 노력한 것이 물거품 되었습니다. (이 경우는 inference 시에 남들이 많이 사용했던 데이터셋을 썼으나 최종 inference 직전에 해당 dataset을 보유했던 사람이 지우면서 실격 당했습니다)\n<br>\n1. test dataset을 사전에 box crop하여 pickle로 만든 것을 불러와서 inference하는 것은 안됩니다.\n현재 리더보드는 33프로 가량의 데이터로 평가되고 있는 반면에, 최종 등수는 현재 사용하지 않는 나머지 66프로의 데이터를 활용하여 평가하게 됩니다. 따라서 pickle로 불러와서 제출하신다면 아마 실격처리 되실 것으로 예상됩니다.\n<br>\n많은 분들이 허태명님의 커널을 참고하여 학습하고 inference 하실 텐데요, 최종 제출할 때는 train과 다르게 test set은 전처리를 하고 inference 하는 것이 맞습니다. 아래 처럼 inference 하시기 전에 crop box 함수를 사용하셔서 해당 커널에서 반드시 전처리를 하셔야 합니다. train 시에는 자유롭게 pickle 활용하시면 되겠습니다.\n<br>\n2. test set과 관련된 부분을 하드코딩하시면 안됩니다. 예를 들어보면 pytorch 기준으로 다음과 같이 inference를 하실텐데요.</p>\n\n<p>```\nprediction = np.zeros((len(test_dataset), num_classes))\n        with torch.no_grad():\n            for i, images in enumerate(test_loader):\n                images = images.cuda()</p>\n\n<pre><code>            preds = model(images).detach().cpu().numpy()\n            prediction[i * batch_size: (i+1) * batch_size] = preds\n</code></pre>\n\n<p>```\n<br>\n만약에 위와 같은 코드에서 첫번째 줄을 다음과 같이 작성한다면 문제가 됩니다.\nprediction = np.zeros((3000, num_classes))    (현재 test image의 개수가 3000개라고 가정하면)\n이렇게 현재 평가의 기준이 되는 test set의 수를 명시해 준다면, 이 또한 실격되실 것으로 예상됩니다. 최종 평가는 현재의 test set 과는 다른 것으로 대체가 되기 때문이죠.\n<br>\n혹시 제 생각이 틀렸다면 comment로 자유롭게 알려주시면 좋을것 같네요 :)</p>",
  "messages": [
    {
      "id": 596422,
      "postDate": "2019-08-10T16:09:56.407Z",
      "content": "<p>제가 캐글 대회하면서 실수할 뻔한 부분들에 대해서 공유해보고자 합니다. 열심히 했는데 만약에 갑자기 실격이 된다면 매우 상심이 크겠죠. 저도 실제로 toxic 대회 참여했으나 사소한 실수로 한두 달 노력한 것이 물거품 되었습니다. (이 경우는 inference 시에 남들이 많이 사용했던 데이터셋을 썼으나 최종 inference 직전에 해당 dataset을 보유했던 사람이 지우면서 실격 당했습니다)\n<br>\n1. test dataset을 사전에 box crop하여 pickle로 만든 것을 불러와서 inference하는 것은 안됩니다.\n현재 리더보드는 33프로 가량의 데이터로 평가되고 있는 반면에, 최종 등수는 현재 사용하지 않는 나머지 66프로의 데이터를 활용하여 평가하게 됩니다. 따라서 pickle로 불러와서 제출하신다면 아마 실격처리 되실 것으로 예상됩니다.\n<br>\n많은 분들이 허태명님의 커널을 참고하여 학습하고 inference 하실 텐데요, 최종 제출할 때는 train과 다르게 test set은 전처리를 하고 inference 하는 것이 맞습니다. 아래 처럼 inference 하시기 전에 crop box 함수를 사용하셔서 해당 커널에서 반드시 전처리를 하셔야 합니다. train 시에는 자유롭게 pickle 활용하시면 되겠습니다.\n<br>\n2. test set과 관련된 부분을 하드코딩하시면 안됩니다. 예를 들어보면 pytorch 기준으로 다음과 같이 inference를 하실텐데요.</p>\n\n<p>```\nprediction = np.zeros((len(test_dataset), num_classes))\n        with torch.no_grad():\n            for i, images in enumerate(test_loader):\n                images = images.cuda()</p>\n\n<pre><code>            preds = model(images).detach().cpu().numpy()\n            prediction[i * batch_size: (i+1) * batch_size] = preds\n</code></pre>\n\n<p>```\n<br>\n만약에 위와 같은 코드에서 첫번째 줄을 다음과 같이 작성한다면 문제가 됩니다.\nprediction = np.zeros((3000, num_classes))    (현재 test image의 개수가 3000개라고 가정하면)\n이렇게 현재 평가의 기준이 되는 test set의 수를 명시해 준다면, 이 또한 실격되실 것으로 예상됩니다. 최종 평가는 현재의 test set 과는 다른 것으로 대체가 되기 때문이죠.\n<br>\n혹시 제 생각이 틀렸다면 comment로 자유롭게 알려주시면 좋을것 같네요 :)</p>",
      "rawMarkdown": "제가 캐글 대회하면서 실수할 뻔한 부분들에 대해서 공유해보고자 합니다. 열심히 했는데 만약에 갑자기 실격이 된다면 매우 상심이 크겠죠. 저도 실제로 toxic 대회 참여했으나 사소한 실수로 한두 달 노력한 것이 물거품 되었습니다. (이 경우는 inference 시에 남들이 많이 사용했던 데이터셋을 썼으나 최종 inference 직전에 해당 dataset을 보유했던 사람이 지우면서 실격 당했습니다)\n<br>\n1. test dataset을 사전에 box crop하여 pickle로 만든 것을 불러와서 inference하는 것은 안됩니다.\n현재 리더보드는 33프로 가량의 데이터로 평가되고 있는 반면에, 최종 등수는 현재 사용하지 않는 나머지 66프로의 데이터를 활용하여 평가하게 됩니다. 따라서 pickle로 불러와서 제출하신다면 아마 실격처리 되실 것으로 예상됩니다.\n<br>\n많은 분들이 허태명님의 커널을 참고하여 학습하고 inference 하실 텐데요, 최종 제출할 때는 train과 다르게 test set은 전처리를 하고 inference 하는 것이 맞습니다. 아래 처럼 inference 하시기 전에 crop box 함수를 사용하셔서 해당 커널에서 반드시 전처리를 하셔야 합니다. train 시에는 자유롭게 pickle 활용하시면 되겠습니다.\n<br>\n2. test set과 관련된 부분을 하드코딩하시면 안됩니다. 예를 들어보면 pytorch 기준으로 다음과 같이 inference를 하실텐데요.\n\n```\nprediction = np.zeros((len(test_dataset), num_classes))\n        with torch.no_grad():\n            for i, images in enumerate(test_loader):\n                images = images.cuda()\n\n                preds = model(images).detach().cpu().numpy()\n                prediction[i * batch_size: (i+1) * batch_size] = preds\n```\n<br>\n만약에 위와 같은 코드에서 첫번째 줄을 다음과 같이 작성한다면 문제가 됩니다.\nprediction = np.zeros((3000, num_classes))    (현재 test image의 개수가 3000개라고 가정하면)\n이렇게 현재 평가의 기준이 되는 test set의 수를 명시해 준다면, 이 또한 실격되실 것으로 예상됩니다. 최종 평가는 현재의 test set 과는 다른 것으로 대체가 되기 때문이죠.\n<br>\n혹시 제 생각이 틀렸다면 comment로 자유롭게 알려주시면 좋을것 같네요 :)\n\n",
      "votes": 8
    },
    {
      "id": 601829,
      "postDate": "2019-08-18T07:49:52.377Z",
      "content": "<p>초보자로서 잘 참고해야할것 같아요 감솨합니다!</p>",
      "rawMarkdown": "초보자로서 잘 참고해야할것 같아요 감솨합니다!"
    },
    {
      "id": 596431,
      "postDate": "2019-08-10T16:23:20.047Z",
      "content": "<p>소중한 경험 공유 감사합니다.\n그런데, 말씀하신 사항은 kernels-only 컴피티션에 해당하는 사항 아닌가요?\n제가 이해하기로는 이번 컴피티션은 서브미션 파일로만 평가하는 걸로 알고 있는데요..\n운영진에서 정한 규칙에 검증을 위해 커널 제출 조건이 있긴 하지만, 이건 운영진에서 직접 돌려보시는 걸로 이해하고 있는데요..</p>",
      "rawMarkdown": "소중한 경험 공유 감사합니다.\n그런데, 말씀하신 사항은 kernels-only 컴피티션에 해당하는 사항 아닌가요?\n제가 이해하기로는 이번 컴피티션은 서브미션 파일로만 평가하는 걸로 알고 있는데요..\n운영진에서 정한 규칙에 검증을 위해 커널 제출 조건이 있긴 하지만, 이건 운영진에서 직접 돌려보시는 걸로 이해하고 있는데요..",
      "replies": [
        {
          "id": 596436,
          "postDate": "2019-08-10T16:25:18.650Z",
          "content": "<p>아 그런가요 ^^ 제가 커널 only 컴페티션으로 착각했나봅니다. 요즘 하두 커널 제한 대회만 참가해서 이 대회도 그럴거라고 생각했네요 ㅎㅎ 지적 감사합니다. 커널 only만 해당하는것 맞습니다.</p>",
          "rawMarkdown": "아 그런가요 ^^ 제가 커널 only 컴페티션으로 착각했나봅니다. 요즘 하두 커널 제한 대회만 참가해서 이 대회도 그럴거라고 생각했네요 ㅎㅎ 지적 감사합니다. 커널 only만 해당하는것 맞습니다.",
          "votes": 1
        },
        {
          "id": 596439,
          "postDate": "2019-08-10T16:28:05.410Z",
          "content": "<p>커널 only 대회일 경우만 참고하시면 좋을것 같습니다 :)</p>",
          "rawMarkdown": "커널 only 대회일 경우만 참고하시면 좋을것 같습니다 :)"
        },
        {
          "id": 596440,
          "postDate": "2019-08-10T16:30:17.643Z",
          "content": "<p>네, 확인 감사합니다. ㅎㅎ</p>\n\n<p>주제와는 논외로 세원님 공유하신 커널들 너무 감사하게 잘 보고 있습니다.\n덕분에 pytorch도 공부하고, 코드 한줄 한줄이 정말 유용한 테크닉을 많이 넣으셔서, 정말 도움이 많이 됐습니다!\n저 개인적으로 세원님의 커널들이 이번 컴피티션 최고의 커널입니다. 감사합니다. ㅎㅎ </p>",
          "rawMarkdown": "네, 확인 감사합니다. ㅎㅎ\n\n주제와는 논외로 세원님 공유하신 커널들 너무 감사하게 잘 보고 있습니다.\n덕분에 pytorch도 공부하고, 코드 한줄 한줄이 정말 유용한 테크닉을 많이 넣으셔서, 정말 도움이 많이 됐습니다!\n저 개인적으로 세원님의 커널들이 이번 컴피티션 최고의 커널입니다. 감사합니다. ㅎㅎ "
        },
        {
          "id": 596445,
          "postDate": "2019-08-10T16:39:38.890Z",
          "content": "<p>굉장히 지저분하고 보기 불편한 코드 좋게 봐주셔서 감사합니다... 사실 고칠 부분이 엄청 많이 보이는데 다른 대회 참가하느라 바쁘다는 핑계로 업데이트를 안하고 있네요 ㅜㅜ 다음엔 더 나은 코드 작성하도록 노력하겠습니다 ㅎㅎ 저도 태명님 2차 대회부터 공유해주시는 커널들 매우 유용하게 봤습니다. 감사합니다 :)</p>",
          "rawMarkdown": "굉장히 지저분하고 보기 불편한 코드 좋게 봐주셔서 감사합니다... 사실 고칠 부분이 엄청 많이 보이는데 다른 대회 참가하느라 바쁘다는 핑계로 업데이트를 안하고 있네요 ㅜㅜ 다음엔 더 나은 코드 작성하도록 노력하겠습니다 ㅎㅎ 저도 태명님 2차 대회부터 공유해주시는 커널들 매우 유용하게 봤습니다. 감사합니다 :)",
          "votes": 1
        }
      ]
    },
    {
      "id": 596792,
      "postDate": "2019-08-11T10:06:11.710Z",
      "rawMarkdown": "",
      "votes": 1,
      "isDeleted": true,
      "replies": [
        {
          "id": 596888,
          "postDate": "2019-08-11T12:56:05.783Z",
          "content": "<p>아래 댓글에서 얘기했듯이, 세원님이 공유해하신 팁은 kernels-only 컴피티션일 경우 주의해야 할 부분이고, 이번 컴피티션은 kernels-only 컴피티션이 아니라 서브미션 파일로 평가하기 때문에 해당 사항은 아닙니다..\n참고만 하시면 되겠습니다~</p>",
          "rawMarkdown": "아래 댓글에서 얘기했듯이, 세원님이 공유해하신 팁은 kernels-only 컴피티션일 경우 주의해야 할 부분이고, 이번 컴피티션은 kernels-only 컴피티션이 아니라 서브미션 파일로 평가하기 때문에 해당 사항은 아닙니다..\n참고만 하시면 되겠습니다~"
        },
        {
          "id": 597039,
          "postDate": "2019-08-11T17:42:33.373Z",
          "content": "<p>최종 제출 그렇게 하셔도 됩니다 ㅎㅎ 다음에 커널 온리 대회 한번 참여해보시면 이게 무슨 말인지 이해가시게 될거에요 :) 제가 착각했네요</p>",
          "rawMarkdown": "최종 제출 그렇게 하셔도 됩니다 ㅎㅎ 다음에 커널 온리 대회 한번 참여해보시면 이게 무슨 말인지 이해가시게 될거에요 :) 제가 착각했네요"
        },
        {
          "id": 597176,
          "postDate": "2019-08-12T00:53:07.433Z",
          "rawMarkdown": "",
          "isDeleted": true
        },
        {
          "id": 597177,
          "postDate": "2019-08-12T00:54:13.757Z",
          "rawMarkdown": "",
          "votes": 1,
          "isDeleted": true
        }
      ]
    }
  ],
  "comments": [
    {
      "id": 601829,
      "author_name": "HyeonhoJi",
      "author_url": "",
      "post_date": "2019-08-18T07:49:52.377000",
      "content": "<p>초보자로서 잘 참고해야할것 같아요 감솨합니다!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 596431,
      "author_name": "Taemyung Heo",
      "author_url": "",
      "post_date": "2019-08-10T16:23:20.047000",
      "content": "<p>소중한 경험 공유 감사합니다.\n그런데, 말씀하신 사항은 kernels-only 컴피티션에 해당하는 사항 아닌가요?\n제가 이해하기로는 이번 컴피티션은 서브미션 파일로만 평가하는 걸로 알고 있는데요..\n운영진에서 정한 규칙에 검증을 위해 커널 제출 조건이 있긴 하지만, 이건 운영진에서 직접 돌려보시는 걸로 이해하고 있는데요..</p>",
      "votes": 0,
      "replies": [
        {
          "id": 596436,
          "author_name": "saewonYang",
          "author_url": "",
          "post_date": "2019-08-10T16:25:18.650000",
          "content": "<p>아 그런가요 ^^ 제가 커널 only 컴페티션으로 착각했나봅니다. 요즘 하두 커널 제한 대회만 참가해서 이 대회도 그럴거라고 생각했네요 ㅎㅎ 지적 감사합니다. 커널 only만 해당하는것 맞습니다.</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 596439,
          "author_name": "saewonYang",
          "author_url": "",
          "post_date": "2019-08-10T16:28:05.410000",
          "content": "<p>커널 only 대회일 경우만 참고하시면 좋을것 같습니다 :)</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 596440,
          "author_name": "Taemyung Heo",
          "author_url": "",
          "post_date": "2019-08-10T16:30:17.643000",
          "content": "<p>네, 확인 감사합니다. ㅎㅎ</p>\n\n<p>주제와는 논외로 세원님 공유하신 커널들 너무 감사하게 잘 보고 있습니다.\n덕분에 pytorch도 공부하고, 코드 한줄 한줄이 정말 유용한 테크닉을 많이 넣으셔서, 정말 도움이 많이 됐습니다!\n저 개인적으로 세원님의 커널들이 이번 컴피티션 최고의 커널입니다. 감사합니다. ㅎㅎ </p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 596445,
          "author_name": "saewonYang",
          "author_url": "",
          "post_date": "2019-08-10T16:39:38.890000",
          "content": "<p>굉장히 지저분하고 보기 불편한 코드 좋게 봐주셔서 감사합니다... 사실 고칠 부분이 엄청 많이 보이는데 다른 대회 참가하느라 바쁘다는 핑계로 업데이트를 안하고 있네요 ㅜㅜ 다음엔 더 나은 코드 작성하도록 노력하겠습니다 ㅎㅎ 저도 태명님 2차 대회부터 공유해주시는 커널들 매우 유용하게 봤습니다. 감사합니다 :)</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 596792,
      "author_name": "",
      "author_url": "",
      "post_date": "2019-08-11T10:06:11.710000",
      "content": "",
      "votes": 1,
      "replies": [
        {
          "id": 596888,
          "author_name": "Taemyung Heo",
          "author_url": "",
          "post_date": "2019-08-11T12:56:05.783000",
          "content": "<p>아래 댓글에서 얘기했듯이, 세원님이 공유해하신 팁은 kernels-only 컴피티션일 경우 주의해야 할 부분이고, 이번 컴피티션은 kernels-only 컴피티션이 아니라 서브미션 파일로 평가하기 때문에 해당 사항은 아닙니다..\n참고만 하시면 되겠습니다~</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 597039,
          "author_name": "saewonYang",
          "author_url": "",
          "post_date": "2019-08-11T17:42:33.373000",
          "content": "<p>최종 제출 그렇게 하셔도 됩니다 ㅎㅎ 다음에 커널 온리 대회 한번 참여해보시면 이게 무슨 말인지 이해가시게 될거에요 :) 제가 착각했네요</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 597176,
          "author_name": "",
          "author_url": "",
          "post_date": "2019-08-12T00:53:07.433000",
          "content": "",
          "votes": 0,
          "replies": []
        },
        {
          "id": 597177,
          "author_name": "",
          "author_url": "",
          "post_date": "2019-08-12T00:54:13.757000",
          "content": "",
          "votes": 1,
          "replies": []
        }
      ]
    }
  ],
  "raw_markdown_by_id": {
    "596422": "제가 캐글 대회하면서 실수할 뻔한 부분들에 대해서 공유해보고자 합니다. 열심히 했는데 만약에 갑자기 실격이 된다면 매우 상심이 크겠죠. 저도 실제로 toxic 대회 참여했으나 사소한 실수로 한두 달 노력한 것이 물거품 되었습니다. (이 경우는 inference 시에 남들이 많이 사용했던 데이터셋을 썼으나 최종 inference 직전에 해당 dataset을 보유했던 사람이 지우면서 실격 당했습니다)\n<br>\n1. test dataset을 사전에 box crop하여 pickle로 만든 것을 불러와서 inference하는 것은 안됩니다.\n현재 리더보드는 33프로 가량의 데이터로 평가되고 있는 반면에, 최종 등수는 현재 사용하지 않는 나머지 66프로의 데이터를 활용하여 평가하게 됩니다. 따라서 pickle로 불러와서 제출하신다면 아마 실격처리 되실 것으로 예상됩니다.\n<br>\n많은 분들이 허태명님의 커널을 참고하여 학습하고 inference 하실 텐데요, 최종 제출할 때는 train과 다르게 test set은 전처리를 하고 inference 하는 것이 맞습니다. 아래 처럼 inference 하시기 전에 crop box 함수를 사용하셔서 해당 커널에서 반드시 전처리를 하셔야 합니다. train 시에는 자유롭게 pickle 활용하시면 되겠습니다.\n<br>\n2. test set과 관련된 부분을 하드코딩하시면 안됩니다. 예를 들어보면 pytorch 기준으로 다음과 같이 inference를 하실텐데요.\n\n```\nprediction = np.zeros((len(test_dataset), num_classes))\n        with torch.no_grad():\n            for i, images in enumerate(test_loader):\n                images = images.cuda()\n\n                preds = model(images).detach().cpu().numpy()\n                prediction[i * batch_size: (i+1) * batch_size] = preds\n```\n<br>\n만약에 위와 같은 코드에서 첫번째 줄을 다음과 같이 작성한다면 문제가 됩니다.\nprediction = np.zeros((3000, num_classes))    (현재 test image의 개수가 3000개라고 가정하면)\n이렇게 현재 평가의 기준이 되는 test set의 수를 명시해 준다면, 이 또한 실격되실 것으로 예상됩니다. 최종 평가는 현재의 test set 과는 다른 것으로 대체가 되기 때문이죠.\n<br>\n혹시 제 생각이 틀렸다면 comment로 자유롭게 알려주시면 좋을것 같네요 :)\n\n",
    "601829": "초보자로서 잘 참고해야할것 같아요 감솨합니다!",
    "596431": "소중한 경험 공유 감사합니다.\n그런데, 말씀하신 사항은 kernels-only 컴피티션에 해당하는 사항 아닌가요?\n제가 이해하기로는 이번 컴피티션은 서브미션 파일로만 평가하는 걸로 알고 있는데요..\n운영진에서 정한 규칙에 검증을 위해 커널 제출 조건이 있긴 하지만, 이건 운영진에서 직접 돌려보시는 걸로 이해하고 있는데요..",
    "596792": ""
  }
}