{
  "id": 176511,
  "title": "Explanation of Our 8TTA (get_trans)",
  "url": "/competitions/siim-isic-melanoma-classification/discussion/176511",
  "author_name": "",
  "post_date": "2020-08-22T04:40:34.454547200Z",
  "votes": 18,
  "comment_count": 1,
  "views": 0,
  "content": "<p>I see some people didn't understand our 8TTA function (<code>def get_trans</code>) in our <a href=\"https://www.kaggle.com/haqishen/1st-place-soluiton-code-small-ver\" target=\"_blank\">notebook</a> well, so I decide to explain a little bit more about it, by visualizing an image here.</p>\n<h1>8TTA Function</h1>\n<pre><code>def get_trans(img, I):\n    if I &gt;= 4:\n        img = img.transpose(2,3)\n    if I % 4 == 0:\n        return img\n    elif I % 4 == 1:\n        return img.flip(2)\n    elif I % 4 == 2:\n        return img.flip(3)\n    elif I % 4 == 3:\n        return img.flip(2).flip(3)\n</code></pre>\n<h1>Visualization Example</h1>\n<pre><code># Read an Image\n\nimage = cv2.imread(df_train.loc[98].filepath)\nimage = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)\n\nimage = image.transpose(2, 0, 1)[np.newaxis]\nimage = torch.tensor(image)\n\n# Visualization!!\n\nfrom pylab import rcParams\nrcParams['figure.figsize'] = 20,10\nfor i in range(2):\n    f, axarr = plt.subplots(1,4)\n    for p in range(4):\n        I = i*4 + p\n        img = get_trans(image, I)\n        axarr[p].imshow(img.squeeze().transpose(0, 1).transpose(1,2))\n</code></pre>\n<h1>Output</h1>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F448347%2Fcd8d12329b47614072865bf0bb38db09%2Fimage.png?generation=1598070858263879&amp;alt=media\" alt=\"\"></p>\n<p>As you can see, actually it gives 8 unique images when <code>n_test = 8</code> .</p>\n<h1>Thanks</h1>",
  "messages": [
    {
      "id": "980982",
      "postDate": "08/22/2020 04:40:34",
      "content": "<p>I see some people didn't understand our 8TTA function (<code>def get_trans</code>) in our <a href=\"https://www.kaggle.com/haqishen/1st-place-soluiton-code-small-ver\" target=\"_blank\">notebook</a> well, so I decide to explain a little bit more about it, by visualizing an image here.</p>\n<h1>8TTA Function</h1>\n<pre><code>def get_trans(img, I):\n    if I &gt;= 4:\n        img = img.transpose(2,3)\n    if I % 4 == 0:\n        return img\n    elif I % 4 == 1:\n        return img.flip(2)\n    elif I % 4 == 2:\n        return img.flip(3)\n    elif I % 4 == 3:\n        return img.flip(2).flip(3)\n</code></pre>\n<h1>Visualization Example</h1>\n<pre><code># Read an Image\n\nimage = cv2.imread(df_train.loc[98].filepath)\nimage = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)\n\nimage = image.transpose(2, 0, 1)[np.newaxis]\nimage = torch.tensor(image)\n\n# Visualization!!\n\nfrom pylab import rcParams\nrcParams['figure.figsize'] = 20,10\nfor i in range(2):\n    f, axarr = plt.subplots(1,4)\n    for p in range(4):\n        I = i*4 + p\n        img = get_trans(image, I)\n        axarr[p].imshow(img.squeeze().transpose(0, 1).transpose(1,2))\n</code></pre>\n<h1>Output</h1>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F448347%2Fcd8d12329b47614072865bf0bb38db09%2Fimage.png?generation=1598070858263879&amp;alt=media\" alt=\"\"></p>\n<p>As you can see, actually it gives 8 unique images when <code>n_test = 8</code> .</p>\n<h1>Thanks</h1>",
      "rawMarkdown": "I see some people didn't understand our 8TTA function (`def get_trans`) in our [notebook](https://www.kaggle.com/haqishen/1st-place-soluiton-code-small-ver) well, so I decide to explain a little bit more about it, by visualizing an image here.\n\n# 8TTA Function\n\n```\ndef get_trans(img, I):\n    if I >= 4:\n        img = img.transpose(2,3)\n    if I % 4 == 0:\n        return img\n    elif I % 4 == 1:\n        return img.flip(2)\n    elif I % 4 == 2:\n        return img.flip(3)\n    elif I % 4 == 3:\n        return img.flip(2).flip(3)\n```\n\n\n# Visualization Example\n\n```\n# Read an Image\n\nimage = cv2.imread(df_train.loc[98].filepath)\nimage = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)\n\nimage = image.transpose(2, 0, 1)[np.newaxis]\nimage = torch.tensor(image)\n\n# Visualization!!\n\nfrom pylab import rcParams\nrcParams['figure.figsize'] = 20,10\nfor i in range(2):\n    f, axarr = plt.subplots(1,4)\n    for p in range(4):\n        I = i*4 + p\n        img = get_trans(image, I)\n        axarr[p].imshow(img.squeeze().transpose(0, 1).transpose(1,2))\n```\n\n\n# Output\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F448347%2Fcd8d12329b47614072865bf0bb38db09%2Fimage.png?generation=1598070858263879&alt=media)\n\nAs you can see, actually it gives 8 unique images when `n_test = 8` .\n\n\n# Thanks",
      "votes": null
    },
    {
      "id": "981260",
      "postDate": "08/22/2020 10:29:41",
      "content": "<p>I used this TTA in my validation as it is very efficient, see my code:</p>\n<pre><code>def val_epoch(loader, model, device):\n\n    model.eval()\n    val_loss = []\n    LOGITS = []\n    TARGETS = []\n\n    with torch.no_grad():\n        with autocast():\n            bar = (range(len(loader)))\n            load_iter = iter(loader)\n            batch = load_iter.next()\n            batch = {k:batch[k].cuda(non_blocking=True) for k in batch.keys() }\n\n            for i in bar:\n\n                data = batch['image']\n                target = batch['target']\n                external = batch['external']\n                gt = batch['gt']\n                if i + 1 &lt; len(loader):\n                    batch = load_iter.next()\n                    batch = {k:batch[k].cuda(non_blocking=True) for k in batch.keys() }\n\n                logits = model(data, external)['logits'].detach()\n                logits = logits + model(data.flip(2), external)['logits'].detach()\n                logits = logits + model(data.flip(3), external)['logits'].detach()\n                logits = logits + model(data.flip(2).flip(3), external)['logits'].detach()\n                data = data.transpose(2, 3)\n                logits = logits + model(data, external)['logits'].detach()\n                logits = logits + model(data.flip(2), external)['logits'].detach()\n                logits = logits + model(data.flip(3), external)['logits'].detach()\n                logits = logits + model(data.flip(2).flip(3), external)['logits'].detach()\n                logits = (logits) / 8.\n                loss = criterion(logits, target)   \n                loss_np = loss.detach().cpu().numpy()\n                LOGITS.append(logits.detach())\n                TARGETS.append(target.detach())\n                val_loss.append(loss_np) \n\n            val_loss = np.mean(val_loss)\n\n    LOGITS = torch.cat(LOGITS).cpu().numpy()\n    TARGETS = torch.cat(TARGETS).cpu().numpy()\n    auc = fast_auc(TARGETS, LOGITS)\n\n    return val_loss, auc, LOGITS\n</code></pre>",
      "rawMarkdown": "I used this TTA in my validation as it is very efficient, see my code:\n\n```\ndef val_epoch(loader, model, device):\n\n    model.eval()\n    val_loss = []\n    LOGITS = []\n    TARGETS = []\n    \n    with torch.no_grad():\n        with autocast():\n            bar = (range(len(loader)))\n            load_iter = iter(loader)\n            batch = load_iter.next()\n            batch = {k:batch[k].cuda(non_blocking=True) for k in batch.keys() }\n\n            for i in bar:\n\n                data = batch['image']\n                target = batch['target']\n                external = batch['external']\n                gt = batch['gt']\n                if i + 1 < len(loader):\n                    batch = load_iter.next()\n                    batch = {k:batch[k].cuda(non_blocking=True) for k in batch.keys() }\n                    \n                logits = model(data, external)['logits'].detach()\n                logits = logits + model(data.flip(2), external)['logits'].detach()\n                logits = logits + model(data.flip(3), external)['logits'].detach()\n                logits = logits + model(data.flip(2).flip(3), external)['logits'].detach()\n                data = data.transpose(2, 3)\n                logits = logits + model(data, external)['logits'].detach()\n                logits = logits + model(data.flip(2), external)['logits'].detach()\n                logits = logits + model(data.flip(3), external)['logits'].detach()\n                logits = logits + model(data.flip(2).flip(3), external)['logits'].detach()\n                logits = (logits) / 8.\n                loss = criterion(logits, target)   \n                loss_np = loss.detach().cpu().numpy()\n                LOGITS.append(logits.detach())\n                TARGETS.append(target.detach())\n                val_loss.append(loss_np) \n                \n            val_loss = np.mean(val_loss)\n    \n    LOGITS = torch.cat(LOGITS).cpu().numpy()\n    TARGETS = torch.cat(TARGETS).cpu().numpy()\n    auc = fast_auc(TARGETS, LOGITS)\n    \n    return val_loss, auc, LOGITS\n```",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 981260,
      "author_name": "cpmpml",
      "author_url": "",
      "post_date": "08/22/2020 10:29:41",
      "content": "<p>I used this TTA in my validation as it is very efficient, see my code:</p>\n<pre><code>def val_epoch(loader, model, device):\n\n    model.eval()\n    val_loss = []\n    LOGITS = []\n    TARGETS = []\n\n    with torch.no_grad():\n        with autocast():\n            bar = (range(len(loader)))\n            load_iter = iter(loader)\n            batch = load_iter.next()\n            batch = {k:batch[k].cuda(non_blocking=True) for k in batch.keys() }\n\n            for i in bar:\n\n                data = batch['image']\n                target = batch['target']\n                external = batch['external']\n                gt = batch['gt']\n                if i + 1 &lt; len(loader):\n                    batch = load_iter.next()\n                    batch = {k:batch[k].cuda(non_blocking=True) for k in batch.keys() }\n\n                logits = model(data, external)['logits'].detach()\n                logits = logits + model(data.flip(2), external)['logits'].detach()\n                logits = logits + model(data.flip(3), external)['logits'].detach()\n                logits = logits + model(data.flip(2).flip(3), external)['logits'].detach()\n                data = data.transpose(2, 3)\n                logits = logits + model(data, external)['logits'].detach()\n                logits = logits + model(data.flip(2), external)['logits'].detach()\n                logits = logits + model(data.flip(3), external)['logits'].detach()\n                logits = logits + model(data.flip(2).flip(3), external)['logits'].detach()\n                logits = (logits) / 8.\n                loss = criterion(logits, target)   \n                loss_np = loss.detach().cpu().numpy()\n                LOGITS.append(logits.detach())\n                TARGETS.append(target.detach())\n                val_loss.append(loss_np) \n\n            val_loss = np.mean(val_loss)\n\n    LOGITS = torch.cat(LOGITS).cpu().numpy()\n    TARGETS = torch.cat(TARGETS).cpu().numpy()\n    auc = fast_auc(TARGETS, LOGITS)\n\n    return val_loss, auc, LOGITS\n</code></pre>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "980982": "I see some people didn't understand our 8TTA function (`def get_trans`) in our [notebook](https://www.kaggle.com/haqishen/1st-place-soluiton-code-small-ver) well, so I decide to explain a little bit more about it, by visualizing an image here.\n\n# 8TTA Function\n\n```\ndef get_trans(img, I):\n    if I >= 4:\n        img = img.transpose(2,3)\n    if I % 4 == 0:\n        return img\n    elif I % 4 == 1:\n        return img.flip(2)\n    elif I % 4 == 2:\n        return img.flip(3)\n    elif I % 4 == 3:\n        return img.flip(2).flip(3)\n```\n\n\n# Visualization Example\n\n```\n# Read an Image\n\nimage = cv2.imread(df_train.loc[98].filepath)\nimage = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)\n\nimage = image.transpose(2, 0, 1)[np.newaxis]\nimage = torch.tensor(image)\n\n# Visualization!!\n\nfrom pylab import rcParams\nrcParams['figure.figsize'] = 20,10\nfor i in range(2):\n    f, axarr = plt.subplots(1,4)\n    for p in range(4):\n        I = i*4 + p\n        img = get_trans(image, I)\n        axarr[p].imshow(img.squeeze().transpose(0, 1).transpose(1,2))\n```\n\n\n# Output\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F448347%2Fcd8d12329b47614072865bf0bb38db09%2Fimage.png?generation=1598070858263879&alt=media)\n\nAs you can see, actually it gives 8 unique images when `n_test = 8` .\n\n\n# Thanks",
    "981260": "I used this TTA in my validation as it is very efficient, see my code:\n\n```\ndef val_epoch(loader, model, device):\n\n    model.eval()\n    val_loss = []\n    LOGITS = []\n    TARGETS = []\n    \n    with torch.no_grad():\n        with autocast():\n            bar = (range(len(loader)))\n            load_iter = iter(loader)\n            batch = load_iter.next()\n            batch = {k:batch[k].cuda(non_blocking=True) for k in batch.keys() }\n\n            for i in bar:\n\n                data = batch['image']\n                target = batch['target']\n                external = batch['external']\n                gt = batch['gt']\n                if i + 1 < len(loader):\n                    batch = load_iter.next()\n                    batch = {k:batch[k].cuda(non_blocking=True) for k in batch.keys() }\n                    \n                logits = model(data, external)['logits'].detach()\n                logits = logits + model(data.flip(2), external)['logits'].detach()\n                logits = logits + model(data.flip(3), external)['logits'].detach()\n                logits = logits + model(data.flip(2).flip(3), external)['logits'].detach()\n                data = data.transpose(2, 3)\n                logits = logits + model(data, external)['logits'].detach()\n                logits = logits + model(data.flip(2), external)['logits'].detach()\n                logits = logits + model(data.flip(3), external)['logits'].detach()\n                logits = logits + model(data.flip(2).flip(3), external)['logits'].detach()\n                logits = (logits) / 8.\n                loss = criterion(logits, target)   \n                loss_np = loss.detach().cpu().numpy()\n                LOGITS.append(logits.detach())\n                TARGETS.append(target.detach())\n                val_loss.append(loss_np) \n                \n            val_loss = np.mean(val_loss)\n    \n    LOGITS = torch.cat(LOGITS).cpu().numpy()\n    TARGETS = torch.cat(TARGETS).cpu().numpy()\n    auc = fast_auc(TARGETS, LOGITS)\n    \n    return val_loss, auc, LOGITS\n```"
  },
  "source": "meta"
}