Created
November 26, 2021 04:16
-
-
Save ShairozS/549a2522c60ba78862527ef1164bbb2c to your computer and use it in GitHub Desktop.
Training MNIST with NT-Xent Loss
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Training on MNIST Dataset with Contrastive NTXent Loss\n", | |
"-------------------------" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"D:\\Research\\ContrastiveRepresentationLearning\n" | |
] | |
} | |
], | |
"source": [ | |
"import os\n", | |
"#import torchsummary\n", | |
"import matplotlib.pyplot as plt\n", | |
"import torch\n", | |
"import numpy as np\n", | |
"import cv2\n", | |
"from torch import nn\n", | |
"from torch.utils.data import Dataset, DataLoader, SubsetRandomSampler\n", | |
"from torchvision import transforms, models\n", | |
"\n", | |
"os.chdir('..'); os.chdir('..')\n", | |
"print(os.getcwd()) # Should be .\\ContrastiveLearning\n", | |
"from Code.trainers import Trainer\n", | |
"#from Code.models import SiameseNet\n", | |
"from Code.losses import form_triplets, ContrastiveLoss\n", | |
"from Code.dataloaders import LabeledContrastiveDataset\n", | |
"from Code.utils import extract_embeddings, plot_embeddings\n", | |
"\n", | |
"\n", | |
"\n", | |
"# Hyperparameters\n", | |
"N = 3000\n", | |
"EMB_SIZE = 32\n", | |
"DEVICE = 'cuda'\n", | |
"LR = 0.0005\n", | |
"EPOCHS = 10\n", | |
"MARGIN = 1.0\n", | |
"NAME = 'MNIST_NTXent_LOSS_' + '_'.join([str(N), str(EMB_SIZE), str(LR), str(EPOCHS), str(MARGIN)])\n", | |
"\n", | |
"# Reproduciblity\n", | |
"SEED = 911\n", | |
"torch.manual_seed(SEED)\n", | |
"torch.backends.cudnn.deterministic = True\n", | |
"torch.backends.cudnn.benchmark = False\n", | |
"np.random.seed(SEED)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Create Dataloader and Inspect Data\n", | |
"---------------------" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"root = r'D:\\Data\\Imagery\\MNIST\\MNIST'\n", | |
"mean, std = 0.1307, 0.3081\n", | |
"\n", | |
"tfms = transforms.Compose([\n", | |
" transforms.ToTensor(),\n", | |
" transforms.Normalize((mean,), (std,))\n", | |
" ])\n", | |
"\n", | |
"\n", | |
"lcd = LabeledContrastiveDataset(root, transforms=tfms)\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"torch.Size([10, 1, 28, 28])\n", | |
"torch.Size([10, 1, 28, 28])\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"C:\\Users\\Shair\\.conda\\envs\\pytorch\\lib\\site-packages\\torchvision\\transforms\\functional.py:114: UserWarning: The given NumPy array is not writeable, and PyTorch does not support non-writeable tensors. This means you can write to the underlying (supposedly non-writeable) NumPy array using the tensor. You may want to copy the array to protect its data or make it writeable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at ..\\torch\\csrc\\utils\\tensor_numpy.cpp:143.)\n", | |
" img = torch.from_numpy(pic.transpose((2, 0, 1))).contiguous()\n" | |
] | |
} | |
], | |
"source": [ | |
"datadict = lcd.__getitem__(4)\n", | |
"print(datadict[\"x1\"].shape); print(datadict[\"x2\"].shape)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from torchvision import transforms\n", | |
"\n", | |
"\n", | |
"train_sampler = SubsetRandomSampler(range(int(N*0.9)))\n", | |
"test_sampler = SubsetRandomSampler(range(int(N*0.9), N))\n", | |
"\n", | |
"siamese_train_loader = torch.utils.data.DataLoader(lcd, batch_size=None, sampler=train_sampler)\n", | |
"siamese_test_loader = torch.utils.data.DataLoader(lcd, batch_size=None, shuffle=test_sampler)\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Model\n", | |
"------------" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"embedding_net = models.resnet18()\n", | |
"embedding_net.conv1 = nn.Conv2d(1, 64, (7,7), (2,2), (3,3))\n", | |
"embedding_net.fc = nn.Linear(512, EMB_SIZE)\n", | |
"model = embedding_net\n", | |
"model.train(); print() ; #torchsummary.summary(model, input_size = [(1,28,28),(1, 28, 28)], device=DEVICE)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Training\n", | |
"-------------------------" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"\n", | |
"TL = ContrastiveLoss(margin=1.0, mode='ntxent', batch_size = 10)\n", | |
"\n", | |
"t = Trainer(model = model, \n", | |
" dataloader = siamese_train_loader,\n", | |
" lr=LR,\n", | |
" loss_function= TL)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
" 0%| | 0/2700 [00:00<?, ?it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"----- Epoch: 0 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:47<00:00, 25.20it/s]\n", | |
" 0%| | 3/2700 [00:00<01:43, 25.97it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 1.1427636008350937\n", | |
"----- Epoch: 1 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:48<00:00, 24.98it/s]\n", | |
" 0%| | 3/2700 [00:00<01:43, 26.09it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 1.120519821997042\n", | |
"----- Epoch: 2 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:46<00:00, 25.36it/s]\n", | |
" 0%| | 3/2700 [00:00<01:41, 26.55it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 1.112935041277497\n", | |
"----- Epoch: 3 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:43<00:00, 26.12it/s]\n", | |
" 0%| | 3/2700 [00:00<01:42, 26.40it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 1.1078951011101406\n", | |
"----- Epoch: 4 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:43<00:00, 26.11it/s]\n", | |
" 0%| | 3/2700 [00:00<01:43, 26.03it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 1.1045549644275947\n", | |
"----- Epoch: 5 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:43<00:00, 26.02it/s]\n", | |
" 0%| | 3/2700 [00:00<01:48, 24.89it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 1.1020821028874244\n", | |
"----- Epoch: 6 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:44<00:00, 25.81it/s]\n", | |
" 0%| | 3/2700 [00:00<01:43, 26.09it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 1.0999324538720348\n", | |
"----- Epoch: 7 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:43<00:00, 26.03it/s]\n", | |
" 0%| | 3/2700 [00:00<01:42, 26.32it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 1.0985735298251664\n", | |
"----- Epoch: 8 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:43<00:00, 26.12it/s]\n", | |
" 0%| | 3/2700 [00:00<01:41, 26.56it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 1.0973107377099403\n", | |
"----- Epoch: 9 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:43<00:00, 26.06it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 1.096144219968054\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"losses = t.train(EPOCHS, print_every=1)#, writer = writer)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Text(0.5, 0, 'Epochs')" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.plot(losses)\n", | |
"plt.title(\"Training Loss - NTXent\")\n", | |
"plt.ylabel(\"Train loss\"); plt.xlabel(\"Epochs\")\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[1.1427636008350937,\n", | |
" 1.0982760431589904,\n", | |
" 1.0977654798384067,\n", | |
" 1.0927752806080713,\n", | |
" 1.091194417697412,\n", | |
" 1.0897177951865726,\n", | |
" 1.087034559779697,\n", | |
" 1.089061061497088,\n", | |
" 1.0872084007881306,\n", | |
" 1.0856455602910784]" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"losses" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Inspecting Embeddings\n", | |
"-------------------" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"EMBS_TO_VISUALIZE = N - int(N*0.9)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"performing PCA to reduce embeddings to 2 dimensions\n", | |
"0.35407612 % variance explained using PCA\n" | |
] | |
} | |
], | |
"source": [ | |
"test_embs = extract_embeddings(siamese_test_loader, model, EMBS_TO_VISUALIZE, reduce_to_dimension=2)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Emb</th>\n", | |
" <th>Label</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>[-6.6898828, -2.7485585]</td>\n", | |
" <td>5</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>[-7.843275, -4.9827704]</td>\n", | |
" <td>1</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>[-7.2975945, -3.3626952]</td>\n", | |
" <td>4</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>[-8.779517, -8.967726]</td>\n", | |
" <td>2</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>[-1.7745602, -6.386529]</td>\n", | |
" <td>8</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Emb Label\n", | |
"0 [-6.6898828, -2.7485585] 5\n", | |
"1 [-7.843275, -4.9827704] 1\n", | |
"2 [-7.2975945, -3.3626952] 4\n", | |
"3 [-8.779517, -8.967726] 2\n", | |
"4 [-1.7745602, -6.386529] 8" | |
] | |
}, | |
"execution_count": 12, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"test_embs.head()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAFuCAYAAACStS/DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABVa0lEQVR4nO3dd5xeZZ3//9d1zrl7mXta2qRXAiGUYCCQBFBpCq4ofAX8gazrrrJYUBeJSFtAkK/lYVvB9fF1cUGxAO7aQQMSSgihhJCQhPQyk+nl7vdp1++PSQZCytwzmSRTPs/HA03Ouc+5r2uS3O/7Kue6lNZaI4QQQvTCONYFEEIIMTRIYAghhCiLBIYQQoiySGAIIYQoiwSGEEKIskhgCCGEKIt1rAsghra7776blStXArB582bq6uoIh8MA/OpXv+r5dTlWr17No48+yp133rnfuSVLlvD8889TVVW1z/GPfvSjXHPNNWW/x3vf+16+973vceKJJ5Z9zbvdeeedVFZW8rnPfW6/c6eccgq///3v6ejo4Cc/+Qnf//73+/0+Qgw2EhjisNxyyy09v37ve9/Lt771rX5/GG/atImmpqaDnr/22mv5p3/6p37d+2g78cQTJSzEsCOBIY6Y3/zmNzzyyCP4vk8qleLWW29l2rRpvPzyy3zjG9/A930APv3pTzN37ly+//3vk8lk+OpXv8q9997bp/d673vfy8UXX8yLL75IV1cXn/rUp3j11VdZu3YtlmVx//33M3r0aAB+8YtfsH79emzb5h//8R+57LLLAHjqqae4//77cRyHcDjMTTfdxCmnnEI2m+VrX/sa69evZ9SoUZimybx58wB4+eWXueuuu1BKceKJJ/bUacWKFdx111384Q9/YMmSJcTjcTZs2EBjYyOzZs3ivvvuIxaL8cwzz/Ctb30LwzCYPXs2L7zwAr/4xS8IhULcdNNNdHR0AHD22Wdzww03DMQfixD9p4UYIOeee65evXq11lrrFStW6Kuuukrn83mttdbPPvusvvDCC7XWWl9zzTX6D3/4g9Za63Xr1uk77rhDa631Y489pv/lX/7lgPe+6aab9MKFC/WHPvShff5bv359z3vfc889Wmut//jHP+rjjjtOr1u3Tmut9b/+67/q+++/v+d1t99+u9Za68bGRr1gwQL91ltv6a1bt+qLL75Yt7e3a621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\n", | |
"text/plain": [ | |
"<Figure size 401.625x360 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plot_embeddings(test_embs)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Saving Model\n", | |
"-------------------------" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"ename": "SyntaxError", | |
"evalue": "EOL while scanning string literal (<ipython-input-14-872e5bb6d12b>, line 1)", | |
"output_type": "error", | |
"traceback": [ | |
"\u001b[1;36m File \u001b[1;32m\"<ipython-input-14-872e5bb6d12b>\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m outpath = os.getcwd() + r'\\Outputs\\Weights\\' + NAME\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m EOL while scanning string literal\n" | |
] | |
} | |
], | |
"source": [ | |
"outpath = os.getcwd() + r'\\Outputs\\Weights\\' + NAME \n", | |
"torch.save(model.state_dict(), outpath); print(outpath)" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.8.8" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment