{
  "id": 203271,
  "title": "Focal Cosine Loss (Pytorch)",
  "url": "/competitions/cassava-leaf-disease-classification/discussion/203271",
  "author_name": "Serigne ",
  "post_date": "2020-12-14T14:09:15.386000",
  "votes": 103,
  "comment_count": 18,
  "views": 0,
  "content": "<p>I've implemented a custom loss function for training.  But I use Focal Cosine Loss for validation.  And the results are pretty much consistent with LB.  Of course you can also use it for training and it will likely give better results than regular Cross Entropy</p>\n<p>The loss fuction was introcuded <a href=\"https://arxiv.org/abs/2007.07805\" target=\"_blank\">in this paper</a>  : Data-Efficient Deep Learning Method for Image Classification Using Data Augmentation, Focal Cosine Loss, and Ensemble. </p>\n<p>Here you go :</p>\n<pre><code>import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport math\n\n\nclass FocalCosineLoss(nn.Module):\n    def __init__(self, alpha=1, gamma=2, xent=.1):\n        super(FocalCosineLoss, self).__init__()\n        self.alpha = alpha\n        self.gamma = gamma\n\n        self.xent = xent\n\n        self.y = torch.Tensor([1]).cuda()\n\n    def forward(self, input, target, reduction=\"mean\"):\n        cosine_loss = F.cosine_embedding_loss(input, F.one_hot(target, num_classes=input.size(-1)), self.y, reduction=reduction)\n\n        cent_loss = F.cross_entropy(F.normalize(input), target, reduce=False)\n        pt = torch.exp(-cent_loss)\n        focal_loss = self.alpha * (1-pt)**self.gamma * cent_loss\n\n        if reduction == \"mean\":\n            focal_loss = torch.mean(focal_loss)\n\n        return cosine_loss + self.xent * focal_loss\n</code></pre>\n<p>The implementation can also be found <a href=\"https://github.com/byeongjokim/VIPriors-Image-Classification-Challenge/blob/332e04fd3e82b20d312128bad302a9081f5c37ce/timm/loss/cosine.py\" target=\"_blank\">here</a> </p>",
  "messages": [
    {
      "id": 1112358,
      "postDate": "2020-12-14T14:09:15.387Z",
      "content": "<p>I've implemented a custom loss function for training.  But I use Focal Cosine Loss for validation.  And the results are pretty much consistent with LB.  Of course you can also use it for training and it will likely give better results than regular Cross Entropy</p>\n<p>The loss fuction was introcuded <a href=\"https://arxiv.org/abs/2007.07805\" target=\"_blank\">in this paper</a>  : Data-Efficient Deep Learning Method for Image Classification Using Data Augmentation, Focal Cosine Loss, and Ensemble. </p>\n<p>Here you go :</p>\n<pre><code>import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport math\n\n\nclass FocalCosineLoss(nn.Module):\n    def __init__(self, alpha=1, gamma=2, xent=.1):\n        super(FocalCosineLoss, self).__init__()\n        self.alpha = alpha\n        self.gamma = gamma\n\n        self.xent = xent\n\n        self.y = torch.Tensor([1]).cuda()\n\n    def forward(self, input, target, reduction=\"mean\"):\n        cosine_loss = F.cosine_embedding_loss(input, F.one_hot(target, num_classes=input.size(-1)), self.y, reduction=reduction)\n\n        cent_loss = F.cross_entropy(F.normalize(input), target, reduce=False)\n        pt = torch.exp(-cent_loss)\n        focal_loss = self.alpha * (1-pt)**self.gamma * cent_loss\n\n        if reduction == \"mean\":\n            focal_loss = torch.mean(focal_loss)\n\n        return cosine_loss + self.xent * focal_loss\n</code></pre>\n<p>The implementation can also be found <a href=\"https://github.com/byeongjokim/VIPriors-Image-Classification-Challenge/blob/332e04fd3e82b20d312128bad302a9081f5c37ce/timm/loss/cosine.py\" target=\"_blank\">here</a> </p>",
      "rawMarkdown": "I've implemented a custom loss function for training.  But I use Focal Cosine Loss for validation.  And the results are pretty much consistent with LB.  Of course you can also use it for training and it will likely give better results than regular Cross Entropy\n\nThe loss fuction was introcuded [in this paper](https://arxiv.org/abs/2007.07805)  : Data-Efficient Deep Learning Method for Image Classification Using Data Augmentation, Focal Cosine Loss, and Ensemble. \n\n\nHere you go :\n\n\n```\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport math\n\n\nclass FocalCosineLoss(nn.Module):\n    def __init__(self, alpha=1, gamma=2, xent=.1):\n        super(FocalCosineLoss, self).__init__()\n        self.alpha = alpha\n        self.gamma = gamma\n\n        self.xent = xent\n        \n        self.y = torch.Tensor([1]).cuda()\n        \n    def forward(self, input, target, reduction=\"mean\"):\n        cosine_loss = F.cosine_embedding_loss(input, F.one_hot(target, num_classes=input.size(-1)), self.y, reduction=reduction)\n\n        cent_loss = F.cross_entropy(F.normalize(input), target, reduce=False)\n        pt = torch.exp(-cent_loss)\n        focal_loss = self.alpha * (1-pt)**self.gamma * cent_loss\n\n        if reduction == \"mean\":\n            focal_loss = torch.mean(focal_loss)\n        \n        return cosine_loss + self.xent * focal_loss\n```\n\n\n\n\nThe implementation can also be found [here](https://github.com/byeongjokim/VIPriors-Image-Classification-Challenge/blob/332e04fd3e82b20d312128bad302a9081f5c37ce/timm/loss/cosine.py) ",
      "votes": 103
    },
    {
      "id": 1113911,
      "postDate": "2020-12-15T19:48:17.700Z",
      "content": "<p>Thanks a lot for sharing! I have couple of questions; 1) you said you are using it in validation does it mean local focal cosine loss is correlated with LB accuracy? 2) I thought focal loss was meant to focus on hard samples but in our case if we have noisy labels wouldn't it be even worse to use it since it will focus on hard noisy samples and try to learn them. Maybe, a cleaning needed on data?</p>",
      "rawMarkdown": "Thanks a lot for sharing! I have couple of questions; 1) you said you are using it in validation does it mean local focal cosine loss is correlated with LB accuracy? 2) I thought focal loss was meant to focus on hard samples but in our case if we have noisy labels wouldn't it be even worse to use it since it will focus on hard noisy samples and try to learn them. Maybe, a cleaning needed on data?",
      "votes": 3
    },
    {
      "id": 1148296,
      "postDate": "2021-01-11T04:14:53.697Z",
      "content": "<p>Thanks for sharing <a href=\"https://www.kaggle.com/serigne\" target=\"_blank\">@serigne</a> <br>\nI tried FocalCosineLoss, and locla CV and public LB is similar more than softmax CE.<br>\nHowever, FocalCosineLoss score is lower than my best.<br>\nI don't know cause of this ( maybe learning rate or epoch?) :(</p>",
      "rawMarkdown": "Thanks for sharing @serigne \nI tried FocalCosineLoss, and locla CV and public LB is similar more than softmax CE.\nHowever, FocalCosineLoss score is lower than my best.\nI don't know cause of this ( maybe learning rate or epoch?) :("
    },
    {
      "id": 1135548,
      "postDate": "2021-01-02T10:36:55.397Z",
      "content": "<p><a href=\"https://www.kaggle.com/serigne\" target=\"_blank\">@serigne</a> thanks for this! Would you happen to know of any publicly available paper that introduces or explains cosine focal loss?</p>",
      "rawMarkdown": "@serigne thanks for this! Would you happen to know of any publicly available paper that introduces or explains cosine focal loss?"
    },
    {
      "id": 1120615,
      "postDate": "2020-12-21T01:33:54.643Z",
      "content": "<p>After using your loss instead of smoothing CE,  my CV increased but LB decreased.</p>",
      "rawMarkdown": "After using your loss instead of smoothing CE,  my CV increased but LB decreased."
    },
    {
      "id": 1116861,
      "postDate": "2020-12-17T14:21:15.930Z",
      "content": "<p>Hi,I use the tf_efficientnet_b4_ns to train the model,the data is 2019 and 2020,I use you share the FocalCosineLoss to train the model,I use 5 fold and 512 size,but I get the cv is 0.8925.So I dont know what happend?Do you know there is why?Thanks!</p>",
      "rawMarkdown": "Hi,I use the tf_efficientnet_b4_ns to train the model,the data is 2019 and 2020,I use you share the FocalCosineLoss to train the model,I use 5 fold and 512 size,but I get the cv is 0.8925.So I dont know what happend?Do you know there is why?Thanks!"
    },
    {
      "id": 1113961,
      "postDate": "2020-12-15T20:52:57.617Z",
      "content": "<p>Since we are talking about losses, I thought I'd ask if anyone has tried OHEM loss and saw improvements with it.</p>",
      "rawMarkdown": "Since we are talking about losses, I thought I'd ask if anyone has tried OHEM loss and saw improvements with it."
    },
    {
      "id": 1113680,
      "postDate": "2020-12-15T16:26:02.300Z",
      "content": "<p>Hi <a href=\"https://www.kaggle.com/serigne\" target=\"_blank\">@serigne</a> thanks for sharing your work and insight.</p>",
      "rawMarkdown": "Hi @serigne thanks for sharing your work and insight."
    },
    {
      "id": 1113055,
      "postDate": "2020-12-15T06:35:23.220Z",
      "content": "<p>Hi, <a href=\"https://www.kaggle.com/serigne\" target=\"_blank\">@serigne</a>, here's a noob question.<br>\nI am not sure what is meant by using loss for validation. I thought loss is calculated for only training samples for backprop. </p>",
      "rawMarkdown": "Hi, @serigne, here's a noob question.\nI am not sure what is meant by using loss for validation. I thought loss is calculated for only training samples for backprop. ",
      "replies": [
        {
          "id": 1113076,
          "postDate": "2020-12-15T06:55:39.127Z",
          "content": "<p><a href=\"https://www.kaggle.com/mightyrains\" target=\"_blank\">@mightyrains</a> Normally validation loss is used to judge how well your model performs. even though there is no backpropagation of the loss during validation. If you see your train loss decreasing but valid loss not improving similarly, it would mean that the model is not learning properly. Basically, validation loss and validation metric helps you see how the model performs overall on unseen data.</p>",
          "rawMarkdown": "@mightyrains Normally validation loss is used to judge how well your model performs. even though there is no backpropagation of the loss during validation. If you see your train loss decreasing but valid loss not improving similarly, it would mean that the model is not learning properly. Basically, validation loss and validation metric helps you see how the model performs overall on unseen data.",
          "votes": 2,
          "replies": [
            {
              "id": 1113161,
              "postDate": "2020-12-15T08:46:41.263Z",
              "content": "<p><a href=\"https://www.kaggle.com/yovinyahathugoda\" target=\"_blank\">@yovinyahathugoda</a> thanks for the reply.<br>\nGot it, we do that to see if the model is training properly or overfitting.<br>\nI hadn't come across anybody doing that with different losses for training and validation. Cool thing!!</p>",
              "rawMarkdown": "@yovinyahathugoda thanks for the reply.\nGot it, we do that to see if the model is training properly or overfitting.\nI hadn't come across anybody doing that with different losses for training and validation. Cool thing!!"
            }
          ]
        },
        {
          "id": 1113374,
          "postDate": "2020-12-15T12:04:38.507Z",
          "content": "<p>It is very common, and actually the correct way, when you use label smoothing param to your train loss e.g. BCE. Then you define as val loss a \"clean\" BCE w/o smoothing  to assess model performance   </p>",
          "rawMarkdown": "It is very common, and actually the correct way, when you use label smoothing param to your train loss e.g. BCE. Then you define as val loss a \"clean\" BCE w/o smoothing  to assess model performance   ",
          "votes": 5
        }
      ]
    },
    {
      "id": 1112959,
      "postDate": "2020-12-15T04:04:15.400Z",
      "content": "<p>Thanks for sharing I guess you are using focal cosine loss + some regularization method for training ? Am I correct ? </p>",
      "rawMarkdown": "Thanks for sharing I guess you are using focal cosine loss + some regularization method for training ? Am I correct ? "
    },
    {
      "id": 1112543,
      "postDate": "2020-12-14T17:36:22.270Z",
      "content": "<p>Can I ask that is there a reason it is only used for validation?</p>\n<p><a href=\"https://www.kaggle.com/serigne\" target=\"_blank\">@serigne</a> </p>",
      "rawMarkdown": "Can I ask that is there a reason it is only used for validation?\n\n@serigne ",
      "replies": [
        {
          "id": 1112677,
          "postDate": "2020-12-14T19:57:03.277Z",
          "content": "<p>I used a custom loss function for training which is not relevant for validation. </p>\n<p>But I was using Focal Cosine for training earlier in the competition. </p>",
          "rawMarkdown": "I used a custom loss function for training which is not relevant for validation. \n\nBut I was using Focal Cosine for training earlier in the competition. ",
          "votes": 1
        },
        {
          "id": 1112687,
          "postDate": "2020-12-14T20:06:53.883Z",
          "content": "<p>Interesting. Your custom loss is pretty good on this dataset.</p>\n<p><a href=\"https://www.kaggle.com/serigne\" target=\"_blank\">@serigne</a> </p>",
          "rawMarkdown": "Interesting. Your custom loss is pretty good on this dataset.\n\n@serigne "
        }
      ]
    },
    {
      "id": 1153842,
      "postDate": "2021-01-15T07:32:55.017Z",
      "rawMarkdown": "",
      "votes": 1,
      "isDeleted": true
    },
    {
      "id": 1113461,
      "postDate": "2020-12-15T13:00:11.140Z",
      "rawMarkdown": "",
      "isDeleted": true
    },
    {
      "id": 1127101,
      "postDate": "2020-12-26T08:36:47.043Z",
      "content": "<p>Thanks for sharing <a href=\"https://www.kaggle.com/Serigne\" target=\"_blank\">@Serigne</a>!!!</p>",
      "rawMarkdown": "Thanks for sharing @Serigne!!!",
      "votes": 1
    }
  ],
  "comments": [
    {
      "id": 1113911,
      "author_name": "Kerem Turgutlu",
      "author_url": "",
      "post_date": "2020-12-15T19:48:17.700000",
      "content": "<p>Thanks a lot for sharing! I have couple of questions; 1) you said you are using it in validation does it mean local focal cosine loss is correlated with LB accuracy? 2) I thought focal loss was meant to focus on hard samples but in our case if we have noisy labels wouldn't it be even worse to use it since it will focus on hard noisy samples and try to learn them. Maybe, a cleaning needed on data?</p>",
      "votes": 3,
      "replies": []
    },
    {
      "id": 1148296,
      "author_name": "imori",
      "author_url": "",
      "post_date": "2021-01-11T04:14:53.697000",
      "content": "<p>Thanks for sharing <a href=\"https://www.kaggle.com/serigne\" target=\"_blank\">@serigne</a> <br>\nI tried FocalCosineLoss, and locla CV and public LB is similar more than softmax CE.<br>\nHowever, FocalCosineLoss score is lower than my best.<br>\nI don't know cause of this ( maybe learning rate or epoch?) :(</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1135548,
      "author_name": "Alexander Soare",
      "author_url": "",
      "post_date": "2021-01-02T10:36:55.397000",
      "content": "<p><a href=\"https://www.kaggle.com/serigne\" target=\"_blank\">@serigne</a> thanks for this! Would you happen to know of any publicly available paper that introduces or explains cosine focal loss?</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1120615,
      "author_name": "sky_fly",
      "author_url": "",
      "post_date": "2020-12-21T01:33:54.643000",
      "content": "<p>After using your loss instead of smoothing CE,  my CV increased but LB decreased.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1116861,
      "author_name": "Bcw93",
      "author_url": "",
      "post_date": "2020-12-17T14:21:15.930000",
      "content": "<p>Hi,I use the tf_efficientnet_b4_ns to train the model,the data is 2019 and 2020,I use you share the FocalCosineLoss to train the model,I use 5 fold and 512 size,but I get the cv is 0.8925.So I dont know what happend?Do you know there is why?Thanks!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1113961,
      "author_name": "Phaedrus",
      "author_url": "",
      "post_date": "2020-12-15T20:52:57.617000",
      "content": "<p>Since we are talking about losses, I thought I'd ask if anyone has tried OHEM loss and saw improvements with it.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1113680,
      "author_name": "Patrick Uzuwe",
      "author_url": "",
      "post_date": "2020-12-15T16:26:02.300000",
      "content": "<p>Hi <a href=\"https://www.kaggle.com/serigne\" target=\"_blank\">@serigne</a> thanks for sharing your work and insight.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1113055,
      "author_name": "Mighty Rains",
      "author_url": "",
      "post_date": "2020-12-15T06:35:23.220000",
      "content": "<p>Hi, <a href=\"https://www.kaggle.com/serigne\" target=\"_blank\">@serigne</a>, here's a noob question.<br>\nI am not sure what is meant by using loss for validation. I thought loss is calculated for only training samples for backprop. </p>",
      "votes": 0,
      "replies": [
        {
          "id": 1113076,
          "author_name": "Yovin Yahathugoda",
          "author_url": "",
          "post_date": "2020-12-15T06:55:39.127000",
          "content": "<p><a href=\"https://www.kaggle.com/mightyrains\" target=\"_blank\">@mightyrains</a> Normally validation loss is used to judge how well your model performs. even though there is no backpropagation of the loss during validation. If you see your train loss decreasing but valid loss not improving similarly, it would mean that the model is not learning properly. Basically, validation loss and validation metric helps you see how the model performs overall on unseen data.</p>",
          "votes": 2,
          "replies": [
            {
              "id": 1113161,
              "author_name": "Mighty Rains",
              "author_url": "",
              "post_date": "2020-12-15T08:46:41.263000",
              "content": "<p><a href=\"https://www.kaggle.com/yovinyahathugoda\" target=\"_blank\">@yovinyahathugoda</a> thanks for the reply.<br>\nGot it, we do that to see if the model is training properly or overfitting.<br>\nI hadn't come across anybody doing that with different losses for training and validation. Cool thing!!</p>",
              "votes": 0,
              "replies": []
            }
          ]
        },
        {
          "id": 1113374,
          "author_name": "Ioannis M",
          "author_url": "",
          "post_date": "2020-12-15T12:04:38.507000",
          "content": "<p>It is very common, and actually the correct way, when you use label smoothing param to your train loss e.g. BCE. Then you define as val loss a \"clean\" BCE w/o smoothing  to assess model performance   </p>",
          "votes": 5,
          "replies": []
        }
      ]
    },
    {
      "id": 1112959,
      "author_name": "Atharva Phatak",
      "author_url": "",
      "post_date": "2020-12-15T04:04:15.400000",
      "content": "<p>Thanks for sharing I guess you are using focal cosine loss + some regularization method for training ? Am I correct ? </p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1112543,
      "author_name": "Heroseo",
      "author_url": "",
      "post_date": "2020-12-14T17:36:22.270000",
      "content": "<p>Can I ask that is there a reason it is only used for validation?</p>\n<p><a href=\"https://www.kaggle.com/serigne\" target=\"_blank\">@serigne</a> </p>",
      "votes": 0,
      "replies": [
        {
          "id": 1112677,
          "author_name": "Serigne ",
          "author_url": "",
          "post_date": "2020-12-14T19:57:03.277000",
          "content": "<p>I used a custom loss function for training which is not relevant for validation. </p>\n<p>But I was using Focal Cosine for training earlier in the competition. </p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 1112687,
          "author_name": "Heroseo",
          "author_url": "",
          "post_date": "2020-12-14T20:06:53.883000",
          "content": "<p>Interesting. Your custom loss is pretty good on this dataset.</p>\n<p><a href=\"https://www.kaggle.com/serigne\" target=\"_blank\">@serigne</a> </p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1153842,
      "author_name": "",
      "author_url": "",
      "post_date": "2021-01-15T07:32:55.017000",
      "content": "",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1113461,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-12-15T13:00:11.140000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1127101,
      "author_name": "Saurabh Shahane",
      "author_url": "",
      "post_date": "2020-12-26T08:36:47.043000",
      "content": "<p>Thanks for sharing <a href=\"https://www.kaggle.com/Serigne\" target=\"_blank\">@Serigne</a>!!!</p>",
      "votes": 1,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "1112358": "I've implemented a custom loss function for training.  But I use Focal Cosine Loss for validation.  And the results are pretty much consistent with LB.  Of course you can also use it for training and it will likely give better results than regular Cross Entropy\n\nThe loss fuction was introcuded [in this paper](https://arxiv.org/abs/2007.07805)  : Data-Efficient Deep Learning Method for Image Classification Using Data Augmentation, Focal Cosine Loss, and Ensemble. \n\n\nHere you go :\n\n\n```\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport math\n\n\nclass FocalCosineLoss(nn.Module):\n    def __init__(self, alpha=1, gamma=2, xent=.1):\n        super(FocalCosineLoss, self).__init__()\n        self.alpha = alpha\n        self.gamma = gamma\n\n        self.xent = xent\n        \n        self.y = torch.Tensor([1]).cuda()\n        \n    def forward(self, input, target, reduction=\"mean\"):\n        cosine_loss = F.cosine_embedding_loss(input, F.one_hot(target, num_classes=input.size(-1)), self.y, reduction=reduction)\n\n        cent_loss = F.cross_entropy(F.normalize(input), target, reduce=False)\n        pt = torch.exp(-cent_loss)\n        focal_loss = self.alpha * (1-pt)**self.gamma * cent_loss\n\n        if reduction == \"mean\":\n            focal_loss = torch.mean(focal_loss)\n        \n        return cosine_loss + self.xent * focal_loss\n```\n\n\n\n\nThe implementation can also be found [here](https://github.com/byeongjokim/VIPriors-Image-Classification-Challenge/blob/332e04fd3e82b20d312128bad302a9081f5c37ce/timm/loss/cosine.py) ",
    "1113911": "Thanks a lot for sharing! I have couple of questions; 1) you said you are using it in validation does it mean local focal cosine loss is correlated with LB accuracy? 2) I thought focal loss was meant to focus on hard samples but in our case if we have noisy labels wouldn't it be even worse to use it since it will focus on hard noisy samples and try to learn them. Maybe, a cleaning needed on data?",
    "1148296": "Thanks for sharing @serigne \nI tried FocalCosineLoss, and locla CV and public LB is similar more than softmax CE.\nHowever, FocalCosineLoss score is lower than my best.\nI don't know cause of this ( maybe learning rate or epoch?) :(",
    "1135548": "@serigne thanks for this! Would you happen to know of any publicly available paper that introduces or explains cosine focal loss?",
    "1120615": "After using your loss instead of smoothing CE,  my CV increased but LB decreased.",
    "1116861": "Hi,I use the tf_efficientnet_b4_ns to train the model,the data is 2019 and 2020,I use you share the FocalCosineLoss to train the model,I use 5 fold and 512 size,but I get the cv is 0.8925.So I dont know what happend?Do you know there is why?Thanks!",
    "1113961": "Since we are talking about losses, I thought I'd ask if anyone has tried OHEM loss and saw improvements with it.",
    "1113680": "Hi @serigne thanks for sharing your work and insight.",
    "1113055": "Hi, @serigne, here's a noob question.\nI am not sure what is meant by using loss for validation. I thought loss is calculated for only training samples for backprop. ",
    "1112959": "Thanks for sharing I guess you are using focal cosine loss + some regularization method for training ? Am I correct ? ",
    "1112543": "Can I ask that is there a reason it is only used for validation?\n\n@serigne ",
    "1153842": "",
    "1113461": "",
    "1127101": "Thanks for sharing @Serigne!!!"
  }
}