{
  "id": 82361,
  "title": "15-th plcae solution: sphereface, image alignment and multi-layer fusion",
  "url": "/competitions/humpback-whale-identification/discussion/82361",
  "author_name": "",
  "post_date": "2019-03-01T01:19:39.517349700Z",
  "votes": 26,
  "comment_count": 17,
  "views": 0,
  "content": "<p>First， thank my teammates for their helps (hanhan chen, zhangboshen, T-mac, zouhongwei) and sorry to them for what happened. We solve this task via classification with angular margin loss. It seems this task is more a fitting competition and the risk of over-fitting is not high.</p>\n\n<h2>preprocess</h2>\n\n<p>We oversample images in 5004 class that occur less than 20 to 20. Images are resized to 384 and 512 as Input. Data augmentation is randompadding+randomcrop. We also tried random erase and random affine. But they work not so well as randompadding+randomcrop.</p>\n\n<h2>sphereface</h2>\n\n<p>At the beginning, we using pure softmax to classification 5005 class. The best result we obtain is around 0.86X using seresnext50. Then we resort to sphereface. To use sphereface, we abandon new whales, which means we only use around 19K images. This gives us 0.920 using seresnext-50(multi-layer fusion, 384*384), 0.919 using resnext50(multi-layer fusion,384*384). We also tried arcface, which gives us 0.911 using seresnext-50(multi-layer fusion,384*384).</p>\n\n<h2>multi-layer fusion</h2>\n\n<p>Actually, we resort to this tick quit early when we used the softmax as loss fuction. In particular, we cat feature from layer 1 to layer 4. In resnext, it gives us feature of 3840 d. After using multi-layer fusion, the public score improved from 0.79X to 0.86X. So I didn't test what if remove it from our best model. However, we tried the original Inception and densenet without multi-layer fusion. Each gives me 0.83 and 0.88 using spereface. So I think this trick really works.</p>\n\n<h2>Image alignment</h2>\n\n<p>We trained a self-designed keypoint detector on 1000 Hand-Annotated Humpback Whale Fluke Keypoints dataset provided by Paul Johnson in discussion. Then we affine the image to prefined coordinate using the keypoints by learning a transfer matrix. After using this, we obtain 0.943, which is also our best single model. I will give some example aligned images latter.</p>\n\n<h2>ensemble</h2>\n\n<p>Since there is some badly aligned images. We merge models that trained without alignment. And ensemble models trained on 384 and 512. We arrive 0.953.</p>\n\n<h2>Pseudo-Labelling and making use of newwhale</h2>\n\n<p>We use our best model to give label to the playground images and use threshold to merge the two dataset. We also tried to making use of newwhale. We designed a loss function to repress the response of newwhale on the 5004 classes. By these tricks, we obtain 0.954 after ensemble.</p>\n\n<p>Really hope I can win a gold next time :)</p>",
  "messages": [
    {
      "id": "481028",
      "postDate": "03/01/2019 01:19:39",
      "content": "<p>First， thank my teammates for their helps (hanhan chen, zhangboshen, T-mac, zouhongwei) and sorry to them for what happened. We solve this task via classification with angular margin loss. It seems this task is more a fitting competition and the risk of over-fitting is not high.</p>\n\n<h2>preprocess</h2>\n\n<p>We oversample images in 5004 class that occur less than 20 to 20. Images are resized to 384 and 512 as Input. Data augmentation is randompadding+randomcrop. We also tried random erase and random affine. But they work not so well as randompadding+randomcrop.</p>\n\n<h2>sphereface</h2>\n\n<p>At the beginning, we using pure softmax to classification 5005 class. The best result we obtain is around 0.86X using seresnext50. Then we resort to sphereface. To use sphereface, we abandon new whales, which means we only use around 19K images. This gives us 0.920 using seresnext-50(multi-layer fusion, 384*384), 0.919 using resnext50(multi-layer fusion,384*384). We also tried arcface, which gives us 0.911 using seresnext-50(multi-layer fusion,384*384).</p>\n\n<h2>multi-layer fusion</h2>\n\n<p>Actually, we resort to this tick quit early when we used the softmax as loss fuction. In particular, we cat feature from layer 1 to layer 4. In resnext, it gives us feature of 3840 d. After using multi-layer fusion, the public score improved from 0.79X to 0.86X. So I didn't test what if remove it from our best model. However, we tried the original Inception and densenet without multi-layer fusion. Each gives me 0.83 and 0.88 using spereface. So I think this trick really works.</p>\n\n<h2>Image alignment</h2>\n\n<p>We trained a self-designed keypoint detector on 1000 Hand-Annotated Humpback Whale Fluke Keypoints dataset provided by Paul Johnson in discussion. Then we affine the image to prefined coordinate using the keypoints by learning a transfer matrix. After using this, we obtain 0.943, which is also our best single model. I will give some example aligned images latter.</p>\n\n<h2>ensemble</h2>\n\n<p>Since there is some badly aligned images. We merge models that trained without alignment. And ensemble models trained on 384 and 512. We arrive 0.953.</p>\n\n<h2>Pseudo-Labelling and making use of newwhale</h2>\n\n<p>We use our best model to give label to the playground images and use threshold to merge the two dataset. We also tried to making use of newwhale. We designed a loss function to repress the response of newwhale on the 5004 classes. By these tricks, we obtain 0.954 after ensemble.</p>\n\n<p>Really hope I can win a gold next time :)</p>",
      "rawMarkdown": "First， thank my teammates for their helps (hanhan chen, zhangboshen, T-mac, zouhongwei) and sorry to them for what happened. We solve this task via classification with angular margin loss. It seems this task is more a fitting competition and the risk of over-fitting is not high.\n##preprocess\nWe oversample images in 5004 class that occur less than 20 to 20. Images are resized to 384 and 512 as Input. Data augmentation is randompadding+randomcrop. We also tried random erase and random affine. But they work not so well as randompadding+randomcrop.\n##sphereface\nAt the beginning, we using pure softmax to classification 5005 class. The best result we obtain is around 0.86X using seresnext50. Then we resort to sphereface. To use sphereface, we abandon new whales, which means we only use around 19K images. This gives us 0.920 using seresnext-50(multi-layer fusion, 384*384), 0.919 using resnext50(multi-layer fusion,384*384). We also tried arcface, which gives us 0.911 using seresnext-50(multi-layer fusion,384*384).\n##multi-layer fusion\nActually, we resort to this tick quit early when we used the softmax as loss fuction. In particular, we cat feature from layer 1 to layer 4. In resnext, it gives us feature of 3840 d. After using multi-layer fusion, the public score improved from 0.79X to 0.86X. So I didn't test what if remove it from our best model. However, we tried the original Inception and densenet without multi-layer fusion. Each gives me 0.83 and 0.88 using spereface. So I think this trick really works.\n##Image alignment\nWe trained a self-designed keypoint detector on 1000 Hand-Annotated Humpback Whale Fluke Keypoints dataset provided by Paul Johnson in discussion. Then we affine the image to prefined coordinate using the keypoints by learning a transfer matrix. After using this, we obtain 0.943, which is also our best single model. I will give some example aligned images latter.\n##ensemble\nSince there is some badly aligned images. We merge models that trained without alignment. And ensemble models trained on 384 and 512. We arrive 0.953.\n##Pseudo-Labelling and making use of newwhale\nWe use our best model to give label to the playground images and use threshold to merge the two dataset. We also tried to making use of newwhale. We designed a loss function to repress the response of newwhale on the 5004 classes. By these tricks, we obtain 0.954 after ensemble.\n\n\nReally hope I can win a gold next time :)",
      "votes": null
    },
    {
      "id": "481175",
      "postDate": "03/01/2019 05:39:46",
      "content": "<p>Why is my score removed? If some other team ever submitted the sample_submission.csv using my computer(same IP but no information  shared), will my score be removed?</p>",
      "rawMarkdown": "Why is my score removed? If some other team ever submitted the sample_submission.csv using my computer(same IP but no information  shared), will my score be removed?",
      "votes": null
    },
    {
      "id": "481190",
      "postDate": "03/01/2019 06:11:13",
      "content": "<p>I don't think to submit sample_submission will cause this. One possible reason is your teammate may have multiple accounts participate this competition</p>",
      "rawMarkdown": "I don't think to submit sample_submission will cause this. One possible reason is your teammate may have multiple accounts participate this competition",
      "votes": null
    },
    {
      "id": "481220",
      "postDate": "03/01/2019 07:11:48",
      "content": "<p>Congrats! Dalao :) so cool!</p>",
      "rawMarkdown": "Congrats! Dalao :) so cool!",
      "votes": null
    },
    {
      "id": "481232",
      "postDate": "03/01/2019 07:24:32",
      "content": "<p>Congratulation for the score and I'm sad that your score was deleted:( </p>\n\n<p>About approach, nice trick for multi-layer fusion, I think it would also work for my side.\nCould you show the some images before and after aligment? I was trying to learn the model for a while are results was poor. Could you share how did you learn the 'key-point' model?</p>",
      "rawMarkdown": "Congratulation for the score and I'm sad that your score was deleted:( \n\nAbout approach, nice trick for multi-layer fusion, I think it would also work for my side.\nCould you show the some images before and after aligment? I was trying to learn the model for a while are results was poor. Could you share how did you learn the 'key-point' model?",
      "votes": null
    },
    {
      "id": "481250",
      "postDate": "03/01/2019 07:37:35",
      "content": "<p>I am really sad about the deletion. But I will give some images before and after alignment after we clean up our works. As for detecting keypoint model，this is one of my partner's job. Our alignment seems good. We check the testing set. There only about 30-40 failure cases. And we are working on publishing a paper about it, so I cannot offer you  detailed method util the paper is published. Sorry. :(</p>",
      "rawMarkdown": "I am really sad about the deletion. But I will give some images before and after alignment after we clean up our works. As for detecting keypoint model，this is one of my partner's job. Our alignment seems good. We check the testing set. There only about 30-40 failure cases. And we are working on publishing a paper about it, so I cannot offer you  detailed method util the paper is published. Sorry. :(",
      "votes": null
    },
    {
      "id": "481324",
      "postDate": "03/01/2019 09:10:21",
      "content": "<p>Thanks for the description and I hope your score will get reinstantiated.\nCan you please elaborate a bit more on your multi-layer fusion approach? Any articles on the topic? Do you downsample (how?) earlier layers for fusion with later layers, while keeping their total number of channels?\nThanks</p>",
      "rawMarkdown": "Thanks for the description and I hope your score will get reinstantiated.\nCan you please elaborate a bit more on your multi-layer fusion approach? Any articles on the topic? Do you downsample (how?) earlier layers for fusion with later layers, while keeping their total number of channels?\nThanks",
      "votes": null
    },
    {
      "id": "481412",
      "postDate": "03/01/2019 11:23:33",
      "content": "<p>I used global average pool to each layer(layer 1- 4) and concatenated them.</p>",
      "rawMarkdown": "I used global average pool to each layer(layer 1- 4) and concatenated them.",
      "votes": null
    },
    {
      "id": "481472",
      "postDate": "03/01/2019 13:06:49",
      "content": "<p><a href=\"/xf1994\">@xf1994</a>, sorry to see what happened.</p>",
      "rawMarkdown": "xf1994, sorry to see what happened.",
      "votes": null
    },
    {
      "id": "481660",
      "postDate": "03/01/2019 17:30:37",
      "content": "<p>hi xftts ,sorry to hear that..\nyour work is good. Could you give brief about the processing steps\n1) are you talking about this loss impl\n<a href=\"https://github.com/clcarwin/sphereface_pytorch/blob/master/net_sphere.py\">https://github.com/clcarwin/sphereface_pytorch/blob/master/net_sphere.py</a></p>\n\n<p>2) did you try to combine simaese with this loss or used any Triple net ?</p>",
      "rawMarkdown": "hi xftts ,sorry to hear that..\nyour work is good. Could you give brief about the processing steps\n1) are you talking about this loss impl\nhttps://github.com/clcarwin/sphereface_pytorch/blob/master/net_sphere.py\n\n2) did you try to combine simaese with this loss or used any Triple net ?",
      "votes": null
    },
    {
      "id": "481685",
      "postDate": "03/01/2019 18:03:56",
      "content": "<p>@xftts Sorry about what happened, but glad that my keypoint data was useful for at least one team!</p>\n\n<p>Looking forward to the writeup about how you were able to use the keypoints to align the images.</p>",
      "rawMarkdown": "xftts Sorry about what happened, but glad that my keypoint data was useful for at least one team!\n\nLooking forward to the writeup about how you were able to use the keypoints to align the images.",
      "votes": null
    },
    {
      "id": "481820",
      "postDate": "03/01/2019 22:13:57",
      "content": "<p>Great solution and sorry for what happened.</p>",
      "rawMarkdown": "Great solution and sorry for what happened.",
      "votes": null
    },
    {
      "id": "481855",
      "postDate": "03/01/2019 23:34:20",
      "content": "<p>1) yes.\n2)I did not try to combine triplet loss or simaese loss. </p>",
      "rawMarkdown": "1) yes.\n2)I did not try to combine triplet loss or simaese loss.",
      "votes": null
    },
    {
      "id": "481856",
      "postDate": "03/01/2019 23:35:05",
      "content": "<p>Your work is awesome.:)</p>",
      "rawMarkdown": "Your work is awesome.:)",
      "votes": null
    },
    {
      "id": "482236",
      "postDate": "03/02/2019 15:04:37",
      "content": "<p>Actually, we resort to this tick quit early when we used the softmax as loss fuction\nwhich loss function you mean here is it CrossEntropyLoss ??</p>",
      "rawMarkdown": "Actually, we resort to this tick quit early when we used the softmax as loss fuction\nwhich loss function you mean here is it CrossEntropyLoss ??",
      "votes": null
    },
    {
      "id": "482240",
      "postDate": "03/02/2019 15:12:14",
      "content": "<p>yes.</p>",
      "rawMarkdown": "yes.",
      "votes": null
    },
    {
      "id": "482499",
      "postDate": "03/03/2019 05:03:33",
      "content": "<p>Thanks xftts\nfew more queries\n1) your output channel of network  eq to number  of channels ?  how you managed to match yhat size (N* nC)  and y(actual=N*1) ...</p>",
      "rawMarkdown": "Thanks xftts\nfew more queries\n1) your output channel of network  eq to number  of channels ?  how you managed to match yhat size (N* nC)  and y(actual=N*1) ...",
      "votes": null
    },
    {
      "id": "482500",
      "postDate": "03/03/2019 05:12:22",
      "content": "<p>I used the angle linear in sphereface to map the feature to cls. U can refer to the paper.</p>",
      "rawMarkdown": "I used the angle linear in sphereface to map the feature to cls. U can refer to the paper.",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 481175,
      "author_name": "xf1994",
      "author_url": "",
      "post_date": "03/01/2019 05:39:46",
      "content": "<p>Why is my score removed? If some other team ever submitted the sample_submission.csv using my computer(same IP but no information  shared), will my score be removed?</p>",
      "votes": null,
      "replies": [
        {
          "id": 481190,
          "author_name": "strideradu",
          "author_url": "",
          "post_date": "03/01/2019 06:11:13",
          "content": "<p>I don't think to submit sample_submission will cause this. One possible reason is your teammate may have multiple accounts participate this competition</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 481220,
      "author_name": "arthasmenethil",
      "author_url": "",
      "post_date": "03/01/2019 07:11:48",
      "content": "<p>Congrats! Dalao :) so cool!</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 481232,
      "author_name": "melgor",
      "author_url": "",
      "post_date": "03/01/2019 07:24:32",
      "content": "<p>Congratulation for the score and I'm sad that your score was deleted:( </p>\n\n<p>About approach, nice trick for multi-layer fusion, I think it would also work for my side.\nCould you show the some images before and after aligment? I was trying to learn the model for a while are results was poor. Could you share how did you learn the 'key-point' model?</p>",
      "votes": null,
      "replies": [
        {
          "id": 481250,
          "author_name": "xf1994",
          "author_url": "",
          "post_date": "03/01/2019 07:37:35",
          "content": "<p>I am really sad about the deletion. But I will give some images before and after alignment after we clean up our works. As for detecting keypoint model，this is one of my partner's job. Our alignment seems good. We check the testing set. There only about 30-40 failure cases. And we are working on publishing a paper about it, so I cannot offer you  detailed method util the paper is published. Sorry. :(</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 481324,
      "author_name": "sakvaua",
      "author_url": "",
      "post_date": "03/01/2019 09:10:21",
      "content": "<p>Thanks for the description and I hope your score will get reinstantiated.\nCan you please elaborate a bit more on your multi-layer fusion approach? Any articles on the topic? Do you downsample (how?) earlier layers for fusion with later layers, while keeping their total number of channels?\nThanks</p>",
      "votes": null,
      "replies": [
        {
          "id": 481412,
          "author_name": "xf1994",
          "author_url": "",
          "post_date": "03/01/2019 11:23:33",
          "content": "<p>I used global average pool to each layer(layer 1- 4) and concatenated them.</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 481660,
          "author_name": "jaideepvalani",
          "author_url": "",
          "post_date": "03/01/2019 17:30:37",
          "content": "<p>hi xftts ,sorry to hear that..\nyour work is good. Could you give brief about the processing steps\n1) are you talking about this loss impl\n<a href=\"https://github.com/clcarwin/sphereface_pytorch/blob/master/net_sphere.py\">https://github.com/clcarwin/sphereface_pytorch/blob/master/net_sphere.py</a></p>\n\n<p>2) did you try to combine simaese with this loss or used any Triple net ?</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 481855,
          "author_name": "xf1994",
          "author_url": "",
          "post_date": "03/01/2019 23:34:20",
          "content": "<p>1) yes.\n2)I did not try to combine triplet loss or simaese loss. </p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 482236,
          "author_name": "jaideepvalani",
          "author_url": "",
          "post_date": "03/02/2019 15:04:37",
          "content": "<p>Actually, we resort to this tick quit early when we used the softmax as loss fuction\nwhich loss function you mean here is it CrossEntropyLoss ??</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 482240,
          "author_name": "xf1994",
          "author_url": "",
          "post_date": "03/02/2019 15:12:14",
          "content": "<p>yes.</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 482499,
          "author_name": "jaideepvalani",
          "author_url": "",
          "post_date": "03/03/2019 05:03:33",
          "content": "<p>Thanks xftts\nfew more queries\n1) your output channel of network  eq to number  of channels ?  how you managed to match yhat size (N* nC)  and y(actual=N*1) ...</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 482500,
          "author_name": "xf1994",
          "author_url": "",
          "post_date": "03/03/2019 05:12:22",
          "content": "<p>I used the angle linear in sphereface to map the feature to cls. U can refer to the paper.</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 481472,
      "author_name": "sheriytm",
      "author_url": "",
      "post_date": "03/01/2019 13:06:49",
      "content": "<p><a href=\"/xf1994\">@xf1994</a>, sorry to see what happened.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 481685,
      "author_name": "oewyn000",
      "author_url": "",
      "post_date": "03/01/2019 18:03:56",
      "content": "<p>@xftts Sorry about what happened, but glad that my keypoint data was useful for at least one team!</p>\n\n<p>Looking forward to the writeup about how you were able to use the keypoints to align the images.</p>",
      "votes": null,
      "replies": [
        {
          "id": 481856,
          "author_name": "xf1994",
          "author_url": "",
          "post_date": "03/01/2019 23:35:05",
          "content": "<p>Your work is awesome.:)</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 481820,
      "author_name": "titericz",
      "author_url": "",
      "post_date": "03/01/2019 22:13:57",
      "content": "<p>Great solution and sorry for what happened.</p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "481028": "First， thank my teammates for their helps (hanhan chen, zhangboshen, T-mac, zouhongwei) and sorry to them for what happened. We solve this task via classification with angular margin loss. It seems this task is more a fitting competition and the risk of over-fitting is not high.\n##preprocess\nWe oversample images in 5004 class that occur less than 20 to 20. Images are resized to 384 and 512 as Input. Data augmentation is randompadding+randomcrop. We also tried random erase and random affine. But they work not so well as randompadding+randomcrop.\n##sphereface\nAt the beginning, we using pure softmax to classification 5005 class. The best result we obtain is around 0.86X using seresnext50. Then we resort to sphereface. To use sphereface, we abandon new whales, which means we only use around 19K images. This gives us 0.920 using seresnext-50(multi-layer fusion, 384*384), 0.919 using resnext50(multi-layer fusion,384*384). We also tried arcface, which gives us 0.911 using seresnext-50(multi-layer fusion,384*384).\n##multi-layer fusion\nActually, we resort to this tick quit early when we used the softmax as loss fuction. In particular, we cat feature from layer 1 to layer 4. In resnext, it gives us feature of 3840 d. After using multi-layer fusion, the public score improved from 0.79X to 0.86X. So I didn't test what if remove it from our best model. However, we tried the original Inception and densenet without multi-layer fusion. Each gives me 0.83 and 0.88 using spereface. So I think this trick really works.\n##Image alignment\nWe trained a self-designed keypoint detector on 1000 Hand-Annotated Humpback Whale Fluke Keypoints dataset provided by Paul Johnson in discussion. Then we affine the image to prefined coordinate using the keypoints by learning a transfer matrix. After using this, we obtain 0.943, which is also our best single model. I will give some example aligned images latter.\n##ensemble\nSince there is some badly aligned images. We merge models that trained without alignment. And ensemble models trained on 384 and 512. We arrive 0.953.\n##Pseudo-Labelling and making use of newwhale\nWe use our best model to give label to the playground images and use threshold to merge the two dataset. We also tried to making use of newwhale. We designed a loss function to repress the response of newwhale on the 5004 classes. By these tricks, we obtain 0.954 after ensemble.\n\n\nReally hope I can win a gold next time :)",
    "481175": "Why is my score removed? If some other team ever submitted the sample_submission.csv using my computer(same IP but no information  shared), will my score be removed?",
    "481190": "I don't think to submit sample_submission will cause this. One possible reason is your teammate may have multiple accounts participate this competition",
    "481220": "Congrats! Dalao :) so cool!",
    "481232": "Congratulation for the score and I'm sad that your score was deleted:( \n\nAbout approach, nice trick for multi-layer fusion, I think it would also work for my side.\nCould you show the some images before and after aligment? I was trying to learn the model for a while are results was poor. Could you share how did you learn the 'key-point' model?",
    "481250": "I am really sad about the deletion. But I will give some images before and after alignment after we clean up our works. As for detecting keypoint model，this is one of my partner's job. Our alignment seems good. We check the testing set. There only about 30-40 failure cases. And we are working on publishing a paper about it, so I cannot offer you  detailed method util the paper is published. Sorry. :(",
    "481324": "Thanks for the description and I hope your score will get reinstantiated.\nCan you please elaborate a bit more on your multi-layer fusion approach? Any articles on the topic? Do you downsample (how?) earlier layers for fusion with later layers, while keeping their total number of channels?\nThanks",
    "481412": "I used global average pool to each layer(layer 1- 4) and concatenated them.",
    "481472": "xf1994, sorry to see what happened.",
    "481660": "hi xftts ,sorry to hear that..\nyour work is good. Could you give brief about the processing steps\n1) are you talking about this loss impl\nhttps://github.com/clcarwin/sphereface_pytorch/blob/master/net_sphere.py\n\n2) did you try to combine simaese with this loss or used any Triple net ?",
    "481685": "xftts Sorry about what happened, but glad that my keypoint data was useful for at least one team!\n\nLooking forward to the writeup about how you were able to use the keypoints to align the images.",
    "481820": "Great solution and sorry for what happened.",
    "481855": "1) yes.\n2)I did not try to combine triplet loss or simaese loss.",
    "481856": "Your work is awesome.:)",
    "482236": "Actually, we resort to this tick quit early when we used the softmax as loss fuction\nwhich loss function you mean here is it CrossEntropyLoss ??",
    "482240": "yes.",
    "482499": "Thanks xftts\nfew more queries\n1) your output channel of network  eq to number  of channels ?  how you managed to match yhat size (N* nC)  and y(actual=N*1) ...",
    "482500": "I used the angle linear in sphereface to map the feature to cls. U can refer to the paper."
  },
  "source": "meta"
}