{
  "id": 100414,
  "title": "[LB 0.583] simple metric learning approach",
  "url": "/competitions/recursion-cellular-image-classification/discussion/100414",
  "author_name": "",
  "post_date": "2019-07-18T11:56:54.915639500Z",
  "votes": 132,
  "comment_count": 47,
  "views": 0,
  "content": "<p>share my approach, but only overview.\nit is so simple and just baseline solution.\n<strong> dataset </strong>\n* only this competition's data, no external data\n* image size: 384x384\n* use 6 channels\n<strong> model </strong>\n* arcface approach is used\n* densenet201(imagenet pretrained)\n<strong> train </strong>\n* train model with all data, then separate all data into each experiment\n<strong> inference </strong>\n* cosine similarity of train and test feature vectors</p>",
  "messages": [
    {
      "id": "579003",
      "postDate": "07/18/2019 11:56:54",
      "content": "<p>share my approach, but only overview.\nit is so simple and just baseline solution.\n<strong> dataset </strong>\n* only this competition's data, no external data\n* image size: 384x384\n* use 6 channels\n<strong> model </strong>\n* arcface approach is used\n* densenet201(imagenet pretrained)\n<strong> train </strong>\n* train model with all data, then separate all data into each experiment\n<strong> inference </strong>\n* cosine similarity of train and test feature vectors</p>",
      "rawMarkdown": "share my approach, but only overview.\nit is so simple and just baseline solution.\n<strong> dataset </strong>\n* only this competition's data, no external data\n* image size: 384x384\n* use 6 channels\n<strong> model </strong>\n* arcface approach is used\n* densenet201(imagenet pretrained)\n<strong> train </strong>\n* train model with all data, then separate all data into each experiment\n<strong> inference </strong>\n* cosine similarity of train and test feature vectors",
      "votes": null
    },
    {
      "id": "579044",
      "postDate": "07/18/2019 12:22:46",
      "content": "<p>Thank you for sharing your great approach!!!\nThat's really helpful!</p>\n\n<p>I'd be grateful if you could also share your machine resource.\nIt's fine if you can't.</p>",
      "rawMarkdown": "Thank you for sharing your great approach!!!\nThat's really helpful!\n\nI'd be grateful if you could also share your machine resource.\nIt's fine if you can't.",
      "votes": null
    },
    {
      "id": "579047",
      "postDate": "07/18/2019 12:24:34",
      "content": "<p>machine resource: 1080ti*3 and kaggle kernel.</p>",
      "rawMarkdown": "machine resource: 1080ti*3 and kaggle kernel.",
      "votes": null
    },
    {
      "id": "579055",
      "postDate": "07/18/2019 12:41:22",
      "content": "<p>Thanks a lot!!</p>",
      "rawMarkdown": "Thanks a lot!!",
      "votes": null
    },
    {
      "id": "579056",
      "postDate": "07/18/2019 12:42:44",
      "content": "<p>That's a really nice score with such a simple approach, thanks for sharing! I'll need to keep trying arcface then :)</p>\n\n<blockquote>\n  <p>train model with all data, then separate all data into each experiment</p>\n</blockquote>\n\n<p>What do you mean by separating all data into each experiment?</p>",
      "rawMarkdown": "That's a really nice score with such a simple approach, thanks for sharing! I'll need to keep trying arcface then :)\n\n&gt; train model with all data, then separate all data into each experiment\n\nWhat do you mean by separating all data into each experiment?",
      "votes": null
    },
    {
      "id": "579064",
      "postDate": "07/18/2019 12:52:31",
      "content": "<ol>\n<li>train model with all data.</li>\n<li>separate all data into each experiment and train 4 model.\nrefer to below image\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1620223%2F75425c8f68648bed024d5cc828a1b521%2Fpipeline_1.png?generation=1563454273088251&amp;alt=media\" alt=\"\"></li>\n</ol>",
      "rawMarkdown": "1. train model with all data.\n2. separate all data into each experiment and train 4 model.\nrefer to below image\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1620223%2F75425c8f68648bed024d5cc828a1b521%2Fpipeline_1.png?generation=1563454273088251&amp;alt=media)",
      "votes": null
    },
    {
      "id": "579107",
      "postDate": "07/18/2019 14:00:27",
      "content": "<p>May I know the reason to use metric learning instead of vanilla softmax classification? AFAIK, metric learning is good for open set problems.</p>",
      "rawMarkdown": "May I know the reason to use metric learning instead of vanilla softmax classification? AFAIK, metric learning is good for open set problems.",
      "votes": null
    },
    {
      "id": "579142",
      "postDate": "07/18/2019 14:33:45",
      "content": "<p>Thanks!\nFYI,  pudae's arcface code: <a href=\"https://github.com/pudae/kaggle-humpback/blob/master/tasks/identifier.py\">https://github.com/pudae/kaggle-humpback/blob/master/tasks/identifier.py</a></p>",
      "rawMarkdown": "Thanks!\nFYI,  pudae's arcface code: https://github.com/pudae/kaggle-humpback/blob/master/tasks/identifier.py",
      "votes": null
    },
    {
      "id": "579187",
      "postDate": "07/18/2019 15:32:54",
      "content": "<p>Thanks for sharing!</p>",
      "rawMarkdown": "Thanks for sharing!",
      "votes": null
    },
    {
      "id": "579238",
      "postDate": "07/18/2019 16:35:57",
      "content": "<p>Aha I see, that's really clever! I imagine cell-type-specific models are initialized from the model trained on all cell types, right?</p>",
      "rawMarkdown": "Aha I see, that's really clever! I imagine cell-type-specific models are initialized from the model trained on all cell types, right?",
      "votes": null
    },
    {
      "id": "579539",
      "postDate": "07/19/2019 00:02:49",
      "content": "<p>yes</p>",
      "rawMarkdown": "yes",
      "votes": null
    },
    {
      "id": "579559",
      "postDate": "07/19/2019 01:08:30",
      "content": "<p>Thanks a lot for sharing. Would you mind to disclose are you using the control experiments at all?</p>",
      "rawMarkdown": "Thanks a lot for sharing. Would you mind to disclose are you using the control experiments at all?",
      "votes": null
    },
    {
      "id": "579565",
      "postDate": "07/19/2019 01:18:23",
      "content": "<p>Thank you for your approach </p>",
      "rawMarkdown": "Thank you for your approach",
      "votes": null
    },
    {
      "id": "579569",
      "postDate": "07/19/2019 01:31:43",
      "content": "<p>I think cosine based softmax is better than vanilla softmax in few shot learning.\nMaybe this paper is helpful(little different from my idea)\n<a href=\"https://openreview.net/forum?id=HkxLXnAcFQ\">https://openreview.net/forum?id=HkxLXnAcFQ</a></p>",
      "rawMarkdown": "I think cosine based softmax is better than vanilla softmax in few shot learning.\nMaybe this paper is helpful(little different from my idea)\nhttps://openreview.net/forum?id=HkxLXnAcFQ",
      "votes": null
    },
    {
      "id": "579570",
      "postDate": "07/19/2019 01:33:26",
      "content": "<p>I'm trying it now.\ncontrol is keypoint in this competition, I think.</p>",
      "rawMarkdown": "I'm trying it now.\ncontrol is keypoint in this competition, I think.",
      "votes": null
    },
    {
      "id": "579902",
      "postDate": "07/19/2019 11:34:41",
      "content": "<p>many thanks for sharing your approaches! :-)</p>",
      "rawMarkdown": "many thanks for sharing your approaches! :-)",
      "votes": null
    },
    {
      "id": "580303",
      "postDate": "07/20/2019 01:43:55",
      "content": "<p>What is the arcface approach? is it a loss function?</p>",
      "rawMarkdown": "What is the arcface approach? is it a loss function?",
      "votes": null
    },
    {
      "id": "580332",
      "postDate": "07/20/2019 02:31:03",
      "content": "<p>You can refer to this code: <a href=\"https://github.com/pudae/kaggle-humpback/blob/master/tasks/identifier.py\">pudae's arcface code</a></p>",
      "rawMarkdown": "You can refer to this code: [pudae's arcface code](https://github.com/pudae/kaggle-humpback/blob/master/tasks/identifier.py)",
      "votes": null
    },
    {
      "id": "580452",
      "postDate": "07/20/2019 07:07:59",
      "content": "<p>super</p>",
      "rawMarkdown": "super",
      "votes": null
    },
    {
      "id": "580560",
      "postDate": "07/20/2019 11:07:43",
      "content": "<p>Hey, Can anyone please tell me how to give 6 channels as input to a pretrained model, I tried adding an extra layer in the beginning of a pretrained model but it doesn't seem to be working, please give me any pointers on how to do that. I am using Keras.\nThanks in advance! </p>",
      "rawMarkdown": "Hey, Can anyone please tell me how to give 6 channels as input to a pretrained model, I tried adding an extra layer in the beginning of a pretrained model but it doesn't seem to be working, please give me any pointers on how to do that. I am using Keras.\nThanks in advance!",
      "votes": null
    },
    {
      "id": "580655",
      "postDate": "07/20/2019 14:16:18",
      "content": "<p>Hi, \nI'm not sure but u can't use 6 channels (as input to a pretrained model directly)\nYou can add simple Conv2D to reduce to a 3 channels and then use pretrained model \n(load your model and weights , delete model's input and add your own )\nYou can find here how to implement it: <a href=\"https://stackoverflow.com/questions/49546922/keras-replacing-input-layer\">https://stackoverflow.com/questions/49546922/keras-replacing-input-layer</a></p>",
      "rawMarkdown": "Hi, \nI'm not sure but u can't use 6 channels (as input to a pretrained model directly)\nYou can add simple Conv2D to reduce to a 3 channels and then use pretrained model \n(load your model and weights , delete model's input and add your own )\nYou can find here how to implement it: https://stackoverflow.com/questions/49546922/keras-replacing-input-layer",
      "votes": null
    },
    {
      "id": "580676",
      "postDate": "07/20/2019 14:52:45",
      "content": "<p>Hey, thanks for the help, I don't know why I am getting a graph disconnected error, I think I should try a different approach, this has taken my whole day. :/</p>",
      "rawMarkdown": "Hey, thanks for the help, I don't know why I am getting a graph disconnected error, I think I should try a different approach, this has taken my whole day. :/",
      "votes": null
    },
    {
      "id": "581030",
      "postDate": "07/21/2019 09:28:48",
      "content": "<p>Very good approach.  </p>",
      "rawMarkdown": "Very good approach.",
      "votes": null
    },
    {
      "id": "581047",
      "postDate": "07/21/2019 09:58:00",
      "content": "<p>The 6 channels are quite \"independent\" from each other, they highlight different parts of the cell. This is quite different from a standard RGB image, and more similar to multi-filter astronomical imaging, where each filter shows a different component of an object. Have you considered building x6 models, one for each filter?</p>",
      "rawMarkdown": "The 6 channels are quite \"independent\" from each other, they highlight different parts of the cell. This is quite different from a standard RGB image, and more similar to multi-filter astronomical imaging, where each filter shows a different component of an object. Have you considered building x6 models, one for each filter?",
      "votes": null
    },
    {
      "id": "581113",
      "postDate": "07/21/2019 12:49:25",
      "content": "<p>Nice approach but I think it can be by softmax classification.Thanks</p>",
      "rawMarkdown": "Nice approach but I think it can be by softmax classification.Thanks",
      "votes": null
    },
    {
      "id": "581504",
      "postDate": "07/22/2019 03:08:53",
      "content": "<p>Thanks for that！</p>",
      "rawMarkdown": "Thanks for that！",
      "votes": null
    },
    {
      "id": "581599",
      "postDate": "07/22/2019 06:37:37",
      "content": "<p>sorry for a stupid question, so you pass weights from all data trained model to 4 different models and train them from there?</p>",
      "rawMarkdown": "sorry for a stupid question, so you pass weights from all data trained model to 4 different models and train them from there?",
      "votes": null
    },
    {
      "id": "581925",
      "postDate": "07/22/2019 14:45:51",
      "content": "<p>Thanks for that！</p>",
      "rawMarkdown": "Thanks for that！",
      "votes": null
    },
    {
      "id": "582221",
      "postDate": "07/22/2019 23:16:58",
      "content": "<p>Hi <a href=\"/phalanx\">@phalanx</a> , thanks so much for sharing ! </p>\n\n<p>BTW, how many epochs do we need to get this score ? Further, is it possible to share what your (train/val) loss / accuracy looks like ?</p>",
      "rawMarkdown": "Hi @phalanx , thanks so much for sharing ! \n\nBTW, how many epochs do we need to get this score ? Further, is it possible to share what your (train/val) loss / accuracy looks like ?",
      "votes": null
    },
    {
      "id": "582695",
      "postDate": "07/23/2019 13:28:27",
      "content": "<p>I'm looking forward to read your solution😎 </p>",
      "rawMarkdown": "I'm looking forward to read your solution😎",
      "votes": null
    },
    {
      "id": "582997",
      "postDate": "07/23/2019 21:35:30",
      "content": "<p>hi <a href=\"/phalanx\">@phalanx</a> can you please clarify what does \"feature vector\" represent? Also, how are you making use the info on \"cosine similarity of train and test\"? Say I have a test image and i find the closest train image and predict the test image with the train image's label? thanks! :) </p>",
      "rawMarkdown": "hi @phalanx can you please clarify what does \"feature vector\" represent? Also, how are you making use the info on \"cosine similarity of train and test\"? Say I have a test image and i find the closest train image and predict the test image with the train image's label? thanks! :)",
      "votes": null
    },
    {
      "id": "583213",
      "postDate": "07/24/2019 06:58:40",
      "content": "<p>epochs. 1st stage: 40, 2nd stage: 30\naccuracy. 2nd stage: 0.65</p>",
      "rawMarkdown": "epochs. 1st stage: 40, 2nd stage: 30\naccuracy. 2nd stage: 0.65",
      "votes": null
    },
    {
      "id": "583422",
      "postDate": "07/24/2019 13:15:06",
      "content": "<p>please read journal.\narcface: <a href=\"https://arxiv.org/abs/1801.07698\">https://arxiv.org/abs/1801.07698</a>\ndeep face recognition survey: <a href=\"https://arxiv.org/abs/1804.06655\">https://arxiv.org/abs/1804.06655</a></p>",
      "rawMarkdown": "please read journal.\narcface: [https://arxiv.org/abs/1801.07698](https://arxiv.org/abs/1801.07698)\ndeep face recognition survey: [https://arxiv.org/abs/1804.06655](https://arxiv.org/abs/1804.06655)",
      "votes": null
    },
    {
      "id": "583479",
      "postDate": "07/24/2019 14:26:10",
      "content": "<p>Also I tried domain adaption, but it didn't work for me.\nAdversarial Discriminative Domain Adaptation: <a href=\"https://arxiv.org/abs/1702.05464\">https://arxiv.org/abs/1702.05464</a>\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1620223%2Fb0aa0e5414fd91aa7174693a7194f334%2Fdomain_adaption.png?generation=1563978324397616&amp;alt=media\" alt=\"\"></p>",
      "rawMarkdown": "Also I tried domain adaption, but it didn't work for me.\nAdversarial Discriminative Domain Adaptation: https://arxiv.org/abs/1702.05464\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1620223%2Fb0aa0e5414fd91aa7174693a7194f334%2Fdomain_adaption.png?generation=1563978324397616&amp;alt=media)",
      "votes": null
    },
    {
      "id": "585667",
      "postDate": "07/27/2019 20:36:27",
      "content": "<p>I guess so. </p>",
      "rawMarkdown": "I guess so.",
      "votes": null
    },
    {
      "id": "585701",
      "postDate": "07/27/2019 21:48:43",
      "content": "<p>hey <a href=\"/phalanx\">@phalanx</a> do you use any validation data during stage 1, when you \"train model with all data\"? thanks!</p>",
      "rawMarkdown": "hey @phalanx do you use any validation data during stage 1, when you \"train model with all data\"? thanks!",
      "votes": null
    },
    {
      "id": "586901",
      "postDate": "07/29/2019 21:12:02",
      "content": "<p>hi phalanx, i wonder do you mind sharing how are you implementing the head of your network? I tried using <code>ArcFaceLoss</code> and getting 0 accuracy. Are you using a different embedding, i.e., not 512 and adding some other layers after the final <code>fc</code> layer in your densenet? Thank you.</p>\n\n<p>```\nmetric_fc = ArcMarginProduct(512, NUM_CLASSES, s=30, m=0.5)\nmetric_fc.to(device)</p>\n\n<h1>training loop</h1>\n\n<p>feature = model(input)\noutput = metric_fc(feature, target) <br>\nloss = criterion(output, target) # nn.CrossEntropyLoss()\n```</p>",
      "rawMarkdown": "hi phalanx, i wonder do you mind sharing how are you implementing the head of your network? I tried using `ArcFaceLoss` and getting 0 accuracy. Are you using a different embedding, i.e., not 512 and adding some other layers after the final `fc` layer in your densenet? Thank you.\n\n```\nmetric_fc = ArcMarginProduct(512, NUM_CLASSES, s=30, m=0.5)\nmetric_fc.to(device)\n\n# training loop\nfeature = model(input)\noutput = metric_fc(feature, target)        \nloss = criterion(output, target) # nn.CrossEntropyLoss()\n```",
      "votes": null
    },
    {
      "id": "592277",
      "postDate": "08/05/2019 05:35:46",
      "content": "<p><a href=\"/phalanx\">@phalanx</a> - when you say <code>cosine similarity of train and test feature vectors</code> , is this the same as <code>CosineEmbeddingLoss</code> in pytorch <a href=\"https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html\">https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html</a> ?</p>",
      "rawMarkdown": "phalanx - when you say `cosine similarity of train and test feature vectors` , is this the same as `CosineEmbeddingLoss` in pytorch https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html ?",
      "votes": null
    },
    {
      "id": "594983",
      "postDate": "08/08/2019 17:51:02",
      "content": "<p>Have you thought about doing something similar with the controls?</p>",
      "rawMarkdown": "Have you thought about doing something similar with the controls?",
      "votes": null
    },
    {
      "id": "598426",
      "postDate": "08/13/2019 15:03:48",
      "content": "<p>repoke <a href=\"/phalanx\">@phalanx</a> , feel free to let me know this is a too-noob question for you to answer hehe</p>",
      "rawMarkdown": "repoke @phalanx , feel free to let me know this is a too-noob question for you to answer hehe",
      "votes": null
    },
    {
      "id": "598447",
      "postDate": "08/13/2019 15:29:34",
      "content": "<p>sorry, I forgot to reply.\nYes, it is same as CosineEmbeddingLoss.</p>\n\n<p>How to calculate similarity between train and test feature\n1. calculate all train feature\n2. calculate center feature of each class\n<code>train_feature: (1108, 32, 512)</code>\n <code>(1108: number of classes, 32: number of samples, 512: number of features)</code>\n<code>center_feature = np.mean(train_feature, axis=1)</code>\n3. calculate all test features (19897, 512)\n4. calculate cosine similarity between center feature and test feature\n<code>from sklearn.metrics.pairwise import cosine_similarity</code>\n<code>train_test_similarity = cosine_similarity(test_feature, center_feature)</code>\n <code>train_test_similarity.shape #(19897, 1108)</code></p>",
      "rawMarkdown": "sorry, I forgot to reply.\nYes, it is same as CosineEmbeddingLoss.\n\nHow to calculate similarity between train and test feature\n1. calculate all train feature\n2. calculate center feature of each class\n`train_feature: (1108, 32, 512)`\n `(1108: number of classes, 32: number of samples, 512: number of features)`\n` center_feature = np.mean(train_feature, axis=1)`\n3. calculate all test features (19897, 512)\n4. calculate cosine similarity between center feature and test feature\n`from sklearn.metrics.pairwise import cosine_similarity`\n`train_test_similarity = cosine_similarity(test_feature, center_feature)`\n `train_test_similarity.shape #(19897, 1108)`",
      "votes": null
    },
    {
      "id": "598477",
      "postDate": "08/13/2019 16:09:03",
      "content": "<p><code>do you use any validation data during stage 1, when you \"train model with all data\"?</code>\nYes, I created validation data.\n<code>head of my network</code>\nMaybe, it is same as you (What is ArcMarginProduct?)</p>",
      "rawMarkdown": "`do you use any validation data during stage 1, when you \"train model with all data\"?`\nYes, I created validation data.\n`head of my network`\nMaybe, it is same as you (What is ArcMarginProduct?)",
      "votes": null
    },
    {
      "id": "600583",
      "postDate": "08/16/2019 10:10:01",
      "content": "<p>Hey <a href=\"/phalanx\">@phalanx</a>, so you are using cosine similarity to actually classify the samples, did I understand it right? It means the mean embedding vector of every class from the train set is compared to every sample in the test set and the best cosine similarity is chosen ? \nI am working on a one-shot approach with ArcFace and PNasNet, but get really poor results yet. But I use the 1108D vector from the ArcFace Module as direct class assignment (like normal softmax + crossentropy classification). I guess your approach makes more sense.\nThanks for your answer :)</p>",
      "rawMarkdown": "Hey @phalanx, so you are using cosine similarity to actually classify the samples, did I understand it right? It means the mean embedding vector of every class from the train set is compared to every sample in the test set and the best cosine similarity is chosen ? \nI am working on a one-shot approach with ArcFace and PNasNet, but get really poor results yet. But I use the 1108D vector from the ArcFace Module as direct class assignment (like normal softmax + crossentropy classification). I guess your approach makes more sense.\nThanks for your answer :)",
      "votes": null
    },
    {
      "id": "600799",
      "postDate": "08/16/2019 15:11:28",
      "content": "<p>yes he is. i think your approach is doing cosine similarity over the softmax/probabilities, which do not really make sense?</p>",
      "rawMarkdown": "yes he is. i think your approach is doing cosine similarity over the softmax/probabilities, which do not really make sense?",
      "votes": null
    },
    {
      "id": "606078",
      "postDate": "08/23/2019 06:50:01",
      "content": "<p>Thanks for you sharing. Would you mind to share your detail training process? Did you use arcface metric learning when you trained with all data in stage one ? After separating all data into each experiment, sample images for each class is so less that the model cannot find a satisfactory feature.How did you slove this? Thanks a lot!</p>",
      "rawMarkdown": "Thanks for you sharing. Would you mind to share your detail training process? Did you use arcface metric learning when you trained with all data in stage one ? After separating all data into each experiment, sample images for each class is so less that the model cannot find a satisfactory feature.How did you slove this? Thanks a lot!",
      "votes": null
    },
    {
      "id": "613366",
      "postDate": "08/30/2019 12:58:29",
      "content": "<p>Has anyone been able to replicate these results?\nI've got difficulties to train using arcface loss..</p>",
      "rawMarkdown": "Has anyone been able to replicate these results?\nI've got difficulties to train using arcface loss..",
      "votes": null
    },
    {
      "id": "634062",
      "postDate": "09/25/2019 19:29:25",
      "content": "<p><a href=\"/phalanx\">@phalanx</a> did you perform any kind of data augmentation to get these results or not at all?</p>",
      "rawMarkdown": "phalanx did you perform any kind of data augmentation to get these results or not at all?",
      "votes": null
    },
    {
      "id": "783311",
      "postDate": "03/23/2020 07:14:35",
      "content": "<p>Thanks, the idea is Great!\nThe way is good, and why does it work? what papers talks about these?</p>",
      "rawMarkdown": "Thanks, the idea is Great!\nThe way is good, and why does it work? what papers talks about these?",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 579044,
      "author_name": "inoueu1",
      "author_url": "",
      "post_date": "07/18/2019 12:22:46",
      "content": "<p>Thank you for sharing your great approach!!!\nThat's really helpful!</p>\n\n<p>I'd be grateful if you could also share your machine resource.\nIt's fine if you can't.</p>",
      "votes": null,
      "replies": [
        {
          "id": 579047,
          "author_name": "phalanx",
          "author_url": "",
          "post_date": "07/18/2019 12:24:34",
          "content": "<p>machine resource: 1080ti*3 and kaggle kernel.</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 579055,
          "author_name": "inoueu1",
          "author_url": "",
          "post_date": "07/18/2019 12:41:22",
          "content": "<p>Thanks a lot!!</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 579056,
      "author_name": "lopuhin",
      "author_url": "",
      "post_date": "07/18/2019 12:42:44",
      "content": "<p>That's a really nice score with such a simple approach, thanks for sharing! I'll need to keep trying arcface then :)</p>\n\n<blockquote>\n  <p>train model with all data, then separate all data into each experiment</p>\n</blockquote>\n\n<p>What do you mean by separating all data into each experiment?</p>",
      "votes": null,
      "replies": [
        {
          "id": 579064,
          "author_name": "phalanx",
          "author_url": "",
          "post_date": "07/18/2019 12:52:31",
          "content": "<ol>\n<li>train model with all data.</li>\n<li>separate all data into each experiment and train 4 model.\nrefer to below image\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1620223%2F75425c8f68648bed024d5cc828a1b521%2Fpipeline_1.png?generation=1563454273088251&amp;alt=media\" alt=\"\"></li>\n</ol>",
          "votes": null,
          "replies": []
        },
        {
          "id": 579238,
          "author_name": "lopuhin",
          "author_url": "",
          "post_date": "07/18/2019 16:35:57",
          "content": "<p>Aha I see, that's really clever! I imagine cell-type-specific models are initialized from the model trained on all cell types, right?</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 579539,
          "author_name": "phalanx",
          "author_url": "",
          "post_date": "07/19/2019 00:02:49",
          "content": "<p>yes</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 581599,
          "author_name": "joven1997",
          "author_url": "",
          "post_date": "07/22/2019 06:37:37",
          "content": "<p>sorry for a stupid question, so you pass weights from all data trained model to 4 different models and train them from there?</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 585667,
          "author_name": "ttylacm",
          "author_url": "",
          "post_date": "07/27/2019 20:36:27",
          "content": "<p>I guess so. </p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 579107,
      "author_name": "wowfattie",
      "author_url": "",
      "post_date": "07/18/2019 14:00:27",
      "content": "<p>May I know the reason to use metric learning instead of vanilla softmax classification? AFAIK, metric learning is good for open set problems.</p>",
      "votes": null,
      "replies": [
        {
          "id": 579569,
          "author_name": "phalanx",
          "author_url": "",
          "post_date": "07/19/2019 01:31:43",
          "content": "<p>I think cosine based softmax is better than vanilla softmax in few shot learning.\nMaybe this paper is helpful(little different from my idea)\n<a href=\"https://openreview.net/forum?id=HkxLXnAcFQ\">https://openreview.net/forum?id=HkxLXnAcFQ</a></p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 579142,
      "author_name": "yiheng",
      "author_url": "",
      "post_date": "07/18/2019 14:33:45",
      "content": "<p>Thanks!\nFYI,  pudae's arcface code: <a href=\"https://github.com/pudae/kaggle-humpback/blob/master/tasks/identifier.py\">https://github.com/pudae/kaggle-humpback/blob/master/tasks/identifier.py</a></p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 579187,
      "author_name": "sawseen",
      "author_url": "",
      "post_date": "07/18/2019 15:32:54",
      "content": "<p>Thanks for sharing!</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 579559,
      "author_name": "mingzhao03",
      "author_url": "",
      "post_date": "07/19/2019 01:08:30",
      "content": "<p>Thanks a lot for sharing. Would you mind to disclose are you using the control experiments at all?</p>",
      "votes": null,
      "replies": [
        {
          "id": 579570,
          "author_name": "phalanx",
          "author_url": "",
          "post_date": "07/19/2019 01:33:26",
          "content": "<p>I'm trying it now.\ncontrol is keypoint in this competition, I think.</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 579565,
      "author_name": "elsa1717",
      "author_url": "",
      "post_date": "07/19/2019 01:18:23",
      "content": "<p>Thank you for your approach </p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 579902,
      "author_name": "projdev",
      "author_url": "",
      "post_date": "07/19/2019 11:34:41",
      "content": "<p>many thanks for sharing your approaches! :-)</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 580303,
      "author_name": "rinnqd",
      "author_url": "",
      "post_date": "07/20/2019 01:43:55",
      "content": "<p>What is the arcface approach? is it a loss function?</p>",
      "votes": null,
      "replies": [
        {
          "id": 580332,
          "author_name": "sarques",
          "author_url": "",
          "post_date": "07/20/2019 02:31:03",
          "content": "<p>You can refer to this code: <a href=\"https://github.com/pudae/kaggle-humpback/blob/master/tasks/identifier.py\">pudae's arcface code</a></p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 580452,
      "author_name": "suryasiriki",
      "author_url": "",
      "post_date": "07/20/2019 07:07:59",
      "content": "<p>super</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 580560,
      "author_name": "sarques",
      "author_url": "",
      "post_date": "07/20/2019 11:07:43",
      "content": "<p>Hey, Can anyone please tell me how to give 6 channels as input to a pretrained model, I tried adding an extra layer in the beginning of a pretrained model but it doesn't seem to be working, please give me any pointers on how to do that. I am using Keras.\nThanks in advance! </p>",
      "votes": null,
      "replies": [
        {
          "id": 580655,
          "author_name": "ayaroshevskiy",
          "author_url": "",
          "post_date": "07/20/2019 14:16:18",
          "content": "<p>Hi, \nI'm not sure but u can't use 6 channels (as input to a pretrained model directly)\nYou can add simple Conv2D to reduce to a 3 channels and then use pretrained model \n(load your model and weights , delete model's input and add your own )\nYou can find here how to implement it: <a href=\"https://stackoverflow.com/questions/49546922/keras-replacing-input-layer\">https://stackoverflow.com/questions/49546922/keras-replacing-input-layer</a></p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 580676,
          "author_name": "sarques",
          "author_url": "",
          "post_date": "07/20/2019 14:52:45",
          "content": "<p>Hey, thanks for the help, I don't know why I am getting a graph disconnected error, I think I should try a different approach, this has taken my whole day. :/</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 581030,
      "author_name": "akshmndal",
      "author_url": "",
      "post_date": "07/21/2019 09:28:48",
      "content": "<p>Very good approach.  </p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 581047,
      "author_name": "giuliasavorgnan",
      "author_url": "",
      "post_date": "07/21/2019 09:58:00",
      "content": "<p>The 6 channels are quite \"independent\" from each other, they highlight different parts of the cell. This is quite different from a standard RGB image, and more similar to multi-filter astronomical imaging, where each filter shows a different component of an object. Have you considered building x6 models, one for each filter?</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 581113,
      "author_name": "a4aakash",
      "author_url": "",
      "post_date": "07/21/2019 12:49:25",
      "content": "<p>Nice approach but I think it can be by softmax classification.Thanks</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 581504,
      "author_name": "shentao",
      "author_url": "",
      "post_date": "07/22/2019 03:08:53",
      "content": "<p>Thanks for that！</p>",
      "votes": null,
      "replies": [
        {
          "id": 582695,
          "author_name": "phalanx",
          "author_url": "",
          "post_date": "07/23/2019 13:28:27",
          "content": "<p>I'm looking forward to read your solution😎 </p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 581925,
      "author_name": "swaroop602",
      "author_url": "",
      "post_date": "07/22/2019 14:45:51",
      "content": "<p>Thanks for that！</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 582221,
      "author_name": "ratthachat",
      "author_url": "",
      "post_date": "07/22/2019 23:16:58",
      "content": "<p>Hi <a href=\"/phalanx\">@phalanx</a> , thanks so much for sharing ! </p>\n\n<p>BTW, how many epochs do we need to get this score ? Further, is it possible to share what your (train/val) loss / accuracy looks like ?</p>",
      "votes": null,
      "replies": [
        {
          "id": 583213,
          "author_name": "phalanx",
          "author_url": "",
          "post_date": "07/24/2019 06:58:40",
          "content": "<p>epochs. 1st stage: 40, 2nd stage: 30\naccuracy. 2nd stage: 0.65</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 582997,
      "author_name": "wjshenggggg",
      "author_url": "",
      "post_date": "07/23/2019 21:35:30",
      "content": "<p>hi <a href=\"/phalanx\">@phalanx</a> can you please clarify what does \"feature vector\" represent? Also, how are you making use the info on \"cosine similarity of train and test\"? Say I have a test image and i find the closest train image and predict the test image with the train image's label? thanks! :) </p>",
      "votes": null,
      "replies": [
        {
          "id": 583422,
          "author_name": "phalanx",
          "author_url": "",
          "post_date": "07/24/2019 13:15:06",
          "content": "<p>please read journal.\narcface: <a href=\"https://arxiv.org/abs/1801.07698\">https://arxiv.org/abs/1801.07698</a>\ndeep face recognition survey: <a href=\"https://arxiv.org/abs/1804.06655\">https://arxiv.org/abs/1804.06655</a></p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 585701,
          "author_name": "wjshenggggg",
          "author_url": "",
          "post_date": "07/27/2019 21:48:43",
          "content": "<p>hey <a href=\"/phalanx\">@phalanx</a> do you use any validation data during stage 1, when you \"train model with all data\"? thanks!</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 586901,
          "author_name": "wjshenggggg",
          "author_url": "",
          "post_date": "07/29/2019 21:12:02",
          "content": "<p>hi phalanx, i wonder do you mind sharing how are you implementing the head of your network? I tried using <code>ArcFaceLoss</code> and getting 0 accuracy. Are you using a different embedding, i.e., not 512 and adding some other layers after the final <code>fc</code> layer in your densenet? Thank you.</p>\n\n<p>```\nmetric_fc = ArcMarginProduct(512, NUM_CLASSES, s=30, m=0.5)\nmetric_fc.to(device)</p>\n\n<h1>training loop</h1>\n\n<p>feature = model(input)\noutput = metric_fc(feature, target) <br>\nloss = criterion(output, target) # nn.CrossEntropyLoss()\n```</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 598477,
          "author_name": "phalanx",
          "author_url": "",
          "post_date": "08/13/2019 16:09:03",
          "content": "<p><code>do you use any validation data during stage 1, when you \"train model with all data\"?</code>\nYes, I created validation data.\n<code>head of my network</code>\nMaybe, it is same as you (What is ArcMarginProduct?)</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 583479,
      "author_name": "phalanx",
      "author_url": "",
      "post_date": "07/24/2019 14:26:10",
      "content": "<p>Also I tried domain adaption, but it didn't work for me.\nAdversarial Discriminative Domain Adaptation: <a href=\"https://arxiv.org/abs/1702.05464\">https://arxiv.org/abs/1702.05464</a>\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1620223%2Fb0aa0e5414fd91aa7174693a7194f334%2Fdomain_adaption.png?generation=1563978324397616&amp;alt=media\" alt=\"\"></p>",
      "votes": null,
      "replies": [
        {
          "id": 594983,
          "author_name": "governor",
          "author_url": "",
          "post_date": "08/08/2019 17:51:02",
          "content": "<p>Have you thought about doing something similar with the controls?</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 592277,
      "author_name": "michelml",
      "author_url": "",
      "post_date": "08/05/2019 05:35:46",
      "content": "<p><a href=\"/phalanx\">@phalanx</a> - when you say <code>cosine similarity of train and test feature vectors</code> , is this the same as <code>CosineEmbeddingLoss</code> in pytorch <a href=\"https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html\">https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html</a> ?</p>",
      "votes": null,
      "replies": [
        {
          "id": 598426,
          "author_name": "michelml",
          "author_url": "",
          "post_date": "08/13/2019 15:03:48",
          "content": "<p>repoke <a href=\"/phalanx\">@phalanx</a> , feel free to let me know this is a too-noob question for you to answer hehe</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 598447,
          "author_name": "phalanx",
          "author_url": "",
          "post_date": "08/13/2019 15:29:34",
          "content": "<p>sorry, I forgot to reply.\nYes, it is same as CosineEmbeddingLoss.</p>\n\n<p>How to calculate similarity between train and test feature\n1. calculate all train feature\n2. calculate center feature of each class\n<code>train_feature: (1108, 32, 512)</code>\n <code>(1108: number of classes, 32: number of samples, 512: number of features)</code>\n<code>center_feature = np.mean(train_feature, axis=1)</code>\n3. calculate all test features (19897, 512)\n4. calculate cosine similarity between center feature and test feature\n<code>from sklearn.metrics.pairwise import cosine_similarity</code>\n<code>train_test_similarity = cosine_similarity(test_feature, center_feature)</code>\n <code>train_test_similarity.shape #(19897, 1108)</code></p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 600583,
          "author_name": "stanislavmalorodov",
          "author_url": "",
          "post_date": "08/16/2019 10:10:01",
          "content": "<p>Hey <a href=\"/phalanx\">@phalanx</a>, so you are using cosine similarity to actually classify the samples, did I understand it right? It means the mean embedding vector of every class from the train set is compared to every sample in the test set and the best cosine similarity is chosen ? \nI am working on a one-shot approach with ArcFace and PNasNet, but get really poor results yet. But I use the 1108D vector from the ArcFace Module as direct class assignment (like normal softmax + crossentropy classification). I guess your approach makes more sense.\nThanks for your answer :)</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 600799,
          "author_name": "wjshenggggg",
          "author_url": "",
          "post_date": "08/16/2019 15:11:28",
          "content": "<p>yes he is. i think your approach is doing cosine similarity over the softmax/probabilities, which do not really make sense?</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 783311,
          "author_name": "mingxingliu",
          "author_url": "",
          "post_date": "03/23/2020 07:14:35",
          "content": "<p>Thanks, the idea is Great!\nThe way is good, and why does it work? what papers talks about these?</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 606078,
      "author_name": "apotato",
      "author_url": "",
      "post_date": "08/23/2019 06:50:01",
      "content": "<p>Thanks for you sharing. Would you mind to share your detail training process? Did you use arcface metric learning when you trained with all data in stage one ? After separating all data into each experiment, sample images for each class is so less that the model cannot find a satisfactory feature.How did you slove this? Thanks a lot!</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 613366,
      "author_name": "olaflegrand",
      "author_url": "",
      "post_date": "08/30/2019 12:58:29",
      "content": "<p>Has anyone been able to replicate these results?\nI've got difficulties to train using arcface loss..</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 634062,
      "author_name": "michelml",
      "author_url": "",
      "post_date": "09/25/2019 19:29:25",
      "content": "<p><a href=\"/phalanx\">@phalanx</a> did you perform any kind of data augmentation to get these results or not at all?</p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "579003": "share my approach, but only overview.\nit is so simple and just baseline solution.\n<strong> dataset </strong>\n* only this competition's data, no external data\n* image size: 384x384\n* use 6 channels\n<strong> model </strong>\n* arcface approach is used\n* densenet201(imagenet pretrained)\n<strong> train </strong>\n* train model with all data, then separate all data into each experiment\n<strong> inference </strong>\n* cosine similarity of train and test feature vectors",
    "579044": "Thank you for sharing your great approach!!!\nThat's really helpful!\n\nI'd be grateful if you could also share your machine resource.\nIt's fine if you can't.",
    "579047": "machine resource: 1080ti*3 and kaggle kernel.",
    "579055": "Thanks a lot!!",
    "579056": "That's a really nice score with such a simple approach, thanks for sharing! I'll need to keep trying arcface then :)\n\n&gt; train model with all data, then separate all data into each experiment\n\nWhat do you mean by separating all data into each experiment?",
    "579064": "1. train model with all data.\n2. separate all data into each experiment and train 4 model.\nrefer to below image\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1620223%2F75425c8f68648bed024d5cc828a1b521%2Fpipeline_1.png?generation=1563454273088251&amp;alt=media)",
    "579107": "May I know the reason to use metric learning instead of vanilla softmax classification? AFAIK, metric learning is good for open set problems.",
    "579142": "Thanks!\nFYI,  pudae's arcface code: https://github.com/pudae/kaggle-humpback/blob/master/tasks/identifier.py",
    "579187": "Thanks for sharing!",
    "579238": "Aha I see, that's really clever! I imagine cell-type-specific models are initialized from the model trained on all cell types, right?",
    "579539": "yes",
    "579559": "Thanks a lot for sharing. Would you mind to disclose are you using the control experiments at all?",
    "579565": "Thank you for your approach",
    "579569": "I think cosine based softmax is better than vanilla softmax in few shot learning.\nMaybe this paper is helpful(little different from my idea)\nhttps://openreview.net/forum?id=HkxLXnAcFQ",
    "579570": "I'm trying it now.\ncontrol is keypoint in this competition, I think.",
    "579902": "many thanks for sharing your approaches! :-)",
    "580303": "What is the arcface approach? is it a loss function?",
    "580332": "You can refer to this code: [pudae's arcface code](https://github.com/pudae/kaggle-humpback/blob/master/tasks/identifier.py)",
    "580452": "super",
    "580560": "Hey, Can anyone please tell me how to give 6 channels as input to a pretrained model, I tried adding an extra layer in the beginning of a pretrained model but it doesn't seem to be working, please give me any pointers on how to do that. I am using Keras.\nThanks in advance!",
    "580655": "Hi, \nI'm not sure but u can't use 6 channels (as input to a pretrained model directly)\nYou can add simple Conv2D to reduce to a 3 channels and then use pretrained model \n(load your model and weights , delete model's input and add your own )\nYou can find here how to implement it: https://stackoverflow.com/questions/49546922/keras-replacing-input-layer",
    "580676": "Hey, thanks for the help, I don't know why I am getting a graph disconnected error, I think I should try a different approach, this has taken my whole day. :/",
    "581030": "Very good approach.",
    "581047": "The 6 channels are quite \"independent\" from each other, they highlight different parts of the cell. This is quite different from a standard RGB image, and more similar to multi-filter astronomical imaging, where each filter shows a different component of an object. Have you considered building x6 models, one for each filter?",
    "581113": "Nice approach but I think it can be by softmax classification.Thanks",
    "581504": "Thanks for that！",
    "581599": "sorry for a stupid question, so you pass weights from all data trained model to 4 different models and train them from there?",
    "581925": "Thanks for that！",
    "582221": "Hi @phalanx , thanks so much for sharing ! \n\nBTW, how many epochs do we need to get this score ? Further, is it possible to share what your (train/val) loss / accuracy looks like ?",
    "582695": "I'm looking forward to read your solution😎",
    "582997": "hi @phalanx can you please clarify what does \"feature vector\" represent? Also, how are you making use the info on \"cosine similarity of train and test\"? Say I have a test image and i find the closest train image and predict the test image with the train image's label? thanks! :)",
    "583213": "epochs. 1st stage: 40, 2nd stage: 30\naccuracy. 2nd stage: 0.65",
    "583422": "please read journal.\narcface: [https://arxiv.org/abs/1801.07698](https://arxiv.org/abs/1801.07698)\ndeep face recognition survey: [https://arxiv.org/abs/1804.06655](https://arxiv.org/abs/1804.06655)",
    "583479": "Also I tried domain adaption, but it didn't work for me.\nAdversarial Discriminative Domain Adaptation: https://arxiv.org/abs/1702.05464\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1620223%2Fb0aa0e5414fd91aa7174693a7194f334%2Fdomain_adaption.png?generation=1563978324397616&amp;alt=media)",
    "585667": "I guess so.",
    "585701": "hey @phalanx do you use any validation data during stage 1, when you \"train model with all data\"? thanks!",
    "586901": "hi phalanx, i wonder do you mind sharing how are you implementing the head of your network? I tried using `ArcFaceLoss` and getting 0 accuracy. Are you using a different embedding, i.e., not 512 and adding some other layers after the final `fc` layer in your densenet? Thank you.\n\n```\nmetric_fc = ArcMarginProduct(512, NUM_CLASSES, s=30, m=0.5)\nmetric_fc.to(device)\n\n# training loop\nfeature = model(input)\noutput = metric_fc(feature, target)        \nloss = criterion(output, target) # nn.CrossEntropyLoss()\n```",
    "592277": "phalanx - when you say `cosine similarity of train and test feature vectors` , is this the same as `CosineEmbeddingLoss` in pytorch https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html ?",
    "594983": "Have you thought about doing something similar with the controls?",
    "598426": "repoke @phalanx , feel free to let me know this is a too-noob question for you to answer hehe",
    "598447": "sorry, I forgot to reply.\nYes, it is same as CosineEmbeddingLoss.\n\nHow to calculate similarity between train and test feature\n1. calculate all train feature\n2. calculate center feature of each class\n`train_feature: (1108, 32, 512)`\n `(1108: number of classes, 32: number of samples, 512: number of features)`\n` center_feature = np.mean(train_feature, axis=1)`\n3. calculate all test features (19897, 512)\n4. calculate cosine similarity between center feature and test feature\n`from sklearn.metrics.pairwise import cosine_similarity`\n`train_test_similarity = cosine_similarity(test_feature, center_feature)`\n `train_test_similarity.shape #(19897, 1108)`",
    "598477": "`do you use any validation data during stage 1, when you \"train model with all data\"?`\nYes, I created validation data.\n`head of my network`\nMaybe, it is same as you (What is ArcMarginProduct?)",
    "600583": "Hey @phalanx, so you are using cosine similarity to actually classify the samples, did I understand it right? It means the mean embedding vector of every class from the train set is compared to every sample in the test set and the best cosine similarity is chosen ? \nI am working on a one-shot approach with ArcFace and PNasNet, but get really poor results yet. But I use the 1108D vector from the ArcFace Module as direct class assignment (like normal softmax + crossentropy classification). I guess your approach makes more sense.\nThanks for your answer :)",
    "600799": "yes he is. i think your approach is doing cosine similarity over the softmax/probabilities, which do not really make sense?",
    "606078": "Thanks for you sharing. Would you mind to share your detail training process? Did you use arcface metric learning when you trained with all data in stage one ? After separating all data into each experiment, sample images for each class is so less that the model cannot find a satisfactory feature.How did you slove this? Thanks a lot!",
    "613366": "Has anyone been able to replicate these results?\nI've got difficulties to train using arcface loss..",
    "634062": "phalanx did you perform any kind of data augmentation to get these results or not at all?",
    "783311": "Thanks, the idea is Great!\nThe way is good, and why does it work? what papers talks about these?"
  },
  "source": "meta"
}