Created
November 25, 2021 23:11
-
-
Save ShairozS/7d4a33dbb788d96f869f61b98eb35dae to your computer and use it in GitHub Desktop.
Training a Pytorch contrastive backbone with pairwise contrastive 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 Pairs 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", | |
"# 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_PAIR_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", | |
"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='pairs')\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 [02:44<00:00, 16.44it/s]\n", | |
" 0%| | 3/2700 [00:00<01:58, 22.82it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 0.04647024116440055\n", | |
"----- Epoch: 1 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [02:22<00:00, 18.89it/s]\n", | |
" 0%| | 3/2700 [00:00<01:48, 24.83it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 0.02958299503657515\n", | |
"----- Epoch: 2 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [02:02<00:00, 22.02it/s]\n", | |
" 0%| | 3/2700 [00:00<01:45, 25.64it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 0.02280590784906603\n", | |
"----- Epoch: 3 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:51<00:00, 24.14it/s]\n", | |
" 0%| | 3/2700 [00:00<01:44, 25.86it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 0.017991772402449355\n", | |
"----- Epoch: 4 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:49<00:00, 24.66it/s]\n", | |
" 0%| | 3/2700 [00:00<01:46, 25.41it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 0.015129790639827759\n", | |
"----- Epoch: 5 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:51<00:00, 24.18it/s]\n", | |
" 0%| | 3/2700 [00:00<01:46, 25.21it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 0.01323084365027221\n", | |
"----- Epoch: 6 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:50<00:00, 24.51it/s]\n", | |
" 0%| | 3/2700 [00:00<01:53, 23.80it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 0.011587587445622171\n", | |
"----- Epoch: 7 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:49<00:00, 24.68it/s]\n", | |
" 0%| | 3/2700 [00:00<01:45, 25.63it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 0.010335876384317311\n", | |
"----- Epoch: 8 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:47<00:00, 25.00it/s]\n", | |
" 0%| | 3/2700 [00:00<01:46, 25.42it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 0.009299262001579317\n", | |
"----- Epoch: 9 -----\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████████████████████████████████████████████████████████████████████████| 2700/2700 [01:48<00:00, 24.94it/s]" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Avg train loss: 0.008486182559181838\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 - Contrastive Pair Loss\")\n", | |
"plt.ylabel(\"Train loss\"); plt.xlabel(\"Epochs\")\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[0.04647024116440055,\n", | |
" 0.01269574890874975,\n", | |
" 0.009251733474047796,\n", | |
" 0.00354936606259933,\n", | |
" 0.003681863589341379,\n", | |
" 0.0037361087024944733,\n", | |
" 0.0017280502177219306,\n", | |
" 0.0015738989551832843,\n", | |
" 0.001006346939675369,\n", | |
" 0.001168467577604512]" | |
] | |
}, | |
"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.45079494 % 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>[-0.10142087, 0.9861553]</td>\n", | |
" <td>5</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>[-0.29980388, 0.47371897]</td>\n", | |
" <td>6</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>[0.32089403, -0.11234523]</td>\n", | |
" <td>2</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>[-0.10230484, -0.2726765]</td>\n", | |
" <td>9</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>[-0.33229306, -0.032638874]</td>\n", | |
" <td>8</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Emb Label\n", | |
"0 [-0.10142087, 0.9861553] 5\n", | |
"1 [-0.29980388, 0.47371897] 6\n", | |
"2 [0.32089403, -0.11234523] 2\n", | |
"3 [-0.10230484, -0.2726765] 9\n", | |
"4 [-0.33229306, -0.032638874] 8" | |
] | |
}, | |
"execution_count": 12, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"test_embs.head()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAFuCAYAAABwaTS6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAB5JElEQVR4nOzdeZxcZZ3o/89zltqrurp6S3c6vWTp7JCNnYRFUFEUFBCiQ5yRUWfBe2fwIug4yAAXcNS5Kgo6eke9/By3qCPLiBsRIoYlIftK1k7S+1pd+1me3x+VFOmkk+50Ounu9PN+vXiRPk+dU986XV3fenYhpZQoiqIoyiloox2AoiiKMvapZKEoiqIMSiULRVEUZVAqWSiKoiiDUslCURRFGZRKFoqiKMqgjNEOQDm/PPLII7zxxhsA7Nmzh8mTJ+Pz+QD4yU9+Uvj3UGzatImVK1fy0EMPnVB2//3388orrxCLxfodv+WWW1ixYsWQn+Paa6/la1/7GvPnzx/yOcd76KGHKC4u5lOf+tQJZQsXLuTZZ5+lu7ub73znO3z9618f9vMoymhSyUIZUZ///OcL/7722mv58pe/POwP4t27d9Pa2nrS8r/8y7/krrvuGta1z7X58+erRKGMaypZKOfMz372M370ox/hui7RaJR//ud/Ztq0aaxdu5bHH38c13UB+OQnP8kFF1zA17/+dfr6+vjsZz/LY489dlrPde2113LjjTfy6quv0tvby1//9V/z5ptvsnXrVgzD4KmnnqKiogKA//zP/2THjh3kcjn+6q/+iltvvRWAF198kaeeegrLsvD5fNx3330sXLiQRCLBP/3TP7Fjxw7Ky8vRdZ3FixcDsHbtWh5++GGEEMyfP7/wml577TUefvhhnnvuOe6//35CoRA7d+6kpaWFmTNn8sUvfpFgMMhLL73El7/8ZTRNY/bs2fz5z3/mP//zP/F6vdx33310d3cDcNVVV/EP//API/FrUZShkYpyllxzzTVy06ZNUkopX3vtNfnhD39YplIpKaWUq1evlu9+97ullFKuWLFCPvfcc1JKKbdv3y4ffPBBKaWUP//5z+UnPvGJAa993333ySuvvFK+//3v7/ffjh07Cs/96KOPSimlfP755+WsWbPk9u3bpZRS/t3f/Z186qmnCo/7whe+IKWUsqWlRV522WVy165dct++ffLGG2+UXV1dUkopd+3aJa+44gqZTCbl//7f/1t+5jOfka7rys7OTrls2TL59a9/XWazWXn55ZfLP//5z1JKKZ999lnZ0NAgDx48KF999VX53ve+txD77bffLrPZrMzlcvLmm2+WK1eulF1dXfLiiy8uxPmLX/yicP43vvEN+c///M9SSimTyaT8h3/4BxmPx8/4d6QoQ6VqFso58cc//pEDBw5wxx13FI7F43F6enq44YYbeOihh3jxxRe5/PLLueeee4Z0zcGaod75zncCMGXKFEpLS5k1axYANTU19Pb2Fh53NKaKigquuOIK1qxZg67rtLW18Zd/+ZeFxwkhaGxsZM2aNXzuc59DCEEsFuP6668HYNeuXRiGwWWXXQbAjTfeyAMPPDBgbEuXLsXj8QDQ0NBAb28va9euZdq0aYU4P/CBD/DII48UHv+JT3yC5uZmLr/8cj796U8TDoeHdJ8UZSSoZKGcE67rctNNN3HvvfcWfm5ra6OoqIg77riDa665hldeeYXVq1fzjW98gxdeeOGMn/PohzGAaZonfZymvT0o0HVdDMPAcRwuu+wyvvrVrxbKmpubKS8vB0Aes6SaruuFf8vjllozjIH/xI7t6BdCIKVE1/UTzj8a2wUXXMAf/vAH1qxZw6uvvsptt93Gd77zHebNm3fS16UoI0kNnVXOiSuvvJLnn3+etrY2AH70ox/x0Y9+FMh/s9++fTsf/OAHefjhh4nH47S3t6PrOrZtn/XYfvnLXwLQ1NTEmjVruOyyy7jssst45ZVX2LNnDwAvvfQS73//+8lkMixdupSVK1fiui69vb384Q9/AGDmzJlIKXnppZcA+MMf/tCvBjOYRYsWsX//fnbs2AHAb37zG+LxOEIIvvzlL/Pkk09y3XXX8U//9E9Mnz6dt956ayRvg6KckqpZKOfElVdeycc//nE+9rGPIYQgFArxjW98AyEE/+t//S8effRRvvrVryKE4O6776a6uhrHcfjmN7/J3XffzTe+8Y0Trvn973+fZ555pt+xCy+8cMChtqeSzWb5wAc+gGVZfP7zn6e+vh7ID4m95557kFIWOsWDwSCf+tSn+MIXvsANN9xALBajoaEByNdevvnNb/Lggw/yb//2b8yePZuSkpIhxxGNRvm3f/s37rvvPjRNY968eRiGgd/v56Mf/Sj3338/N954Ix6Ph5kz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nBWqwYR8krAyDjs2ttDVnmD/W534gybxnjQVk4sQAl59eS9T6oupqo7y1rZWdENj8WU1LLq0hlCRj0DQM9ovQ1EU5axRyQJI9uX44292sntHG7bl0N2VYtLkIl57ZR+XLKsnHPGBhNdX7+fNVxtBQLTYT0lpEKm9vf2poijK+WrCN0MJBFvfPFxYz6n5UJypDaXs3tFOw+wK/rxqN+/+4DyaGntoPtyDz2cy58JKSitCSA21D7aiKBPChK9Z5LI27a1vTw5sOthD+aQI2YxNW1OcWfMq2bmlBcPQWHJ5HUuvm0FlTRFoallxRVEmjgmfLI5fAdZ1JevfaOTa98ykckqUDa8fpKczRTqTwzA0dFNgWarZSVGUiWXCN0OZHp1QxEsini0cSyVy/OkPu6mdWsx7bplHMOTF8OqARM2zUxRlIprwNQvd0Ji7oGrAssONvXj9JrpHU3tQKIoyoU34ZOG6ktKKMBcvrScY9haOl5QFufK6GfgCE77ypSiKopqhACSS8qowJeUzyGUdhACvzwShahOKoiigkkWB60qEJvAe2XdCItWwWEVRlCMmfDOUoiiKMjiVLBRFUZRBqWShKIqiDEolC0VRFGVQKlkoiqIog1LJQlEURRmUShaKoijKoFSyUBRFUQalkoWiKIoyKCGlWtBCURRFOTVVs1AURVEGpZKFoiiKMiiVLBRFUZRBqWShKIqiDEolC0VRFGVQKlkoiqIog1LJQlEURRnUmN8pL5PJcO+999LZ2UkwGOSLX/wisVisUL59+3YeffTRws8bNmzgm9/8JkuXLmXZsmXU1dUBsGDBAj796U+f1VgAHnnkEd58802CwSAATz75JKZpDnreSMfx/e9/n+effx6Aq666irvvvhsp5YjdE9d1efDBB9m5cycej4dHHnmE2traQvmLL77IN7/5TQzD4JZbbuFDH/rQoOecjTiee+45fvCDH6DrOg0NDTz44INomsbNN99MOBwGoLq6mscee+yM4hhKLN/73vdYuXJl4Xf1L//yL9TV1Y34PRkslvb2du65557CY7dv386nP/1pli9fflbuC8DGjRv58pe/zNNPP93v+Ll6nwwllnP5XhmX5Bj3H//xH/LrX/+6lFLK5557Tj788MMnfex///d/y3vuuUdKKeX+/fvlJz/5yXMeyx133CE7OztP+7yRjKOxsVF+4AMfkLZtS8dx5O233y63b98+ovfkN7/5jbzvvvuklFKuX79e/s3f/E2hLJfLyeuuu0729PTIbDYrP/jBD8q2trZTnnM24kin0/Id73iHTKVSUkop//Ef/1H+/ve/l5lMRt50001n/NynE4uUUn7605+WmzdvPq1zzlYsR7355pvyzjvvlLZtn7X78u///u/yxhtvlLfddlu/4+fyfTJYLOf6vTIejflmqHXr1rF06VIAli1bxpo1awZ8XCqV4oknnuCf/umfANi6dSutra3ceeedfPzjH2fv3r1nPRbXdTlw4AAPPPAAd9xxBytXrjyt1zBScUyaNInvfve76LqOpmnYto3X6x3Re3JsDAsWLGDLli2Fsj179lBTU0NRUREej4fFixezdu3aU55zNuLweDz8+Mc/xu/3AxTuw44dO0in03zsYx9jxYoVbNiw4YzjGCwWyL8n//3f/53ly5fz7W9/e0jnnK1YAKSUPPzwwzz44IPoun7W7ktNTQ1PPPHECcfP5ftksFjO9XtlPBpTzVA/+9nP+MEPftDvWElJSaEKGAwG6evrG/DclStX8u53v7tQxS8rK+MTn/gEN9xwA2vXruXee+/l5z//+VmNJZVK8Rd/8Rf81V/9FY7jsGLFCubNm0cikRjSaxipOEzTJBaLIaXkX//1X5kzZw719fV0dHSc0T05ViKRIBQKFX7WdR3btjEMo9/rPRpjIpE45TnDdaprappGaWkpAE8//TSpVIorrriCXbt2cdddd3Hbbbexf/9+Pv7xj/PCCy+cURyDxQLw3ve+lw9/+MOEQiHuvvtuVq1adVbuyVBigXwT0IwZM5g6dSoAPp/vrNyXd73rXRw6dGjAGM/V+2SwWM71e2U8GlOv+LbbbuO2227rd+zuu+8mmUwCkEwmiUQiA5777LPP8vWvf73w87x589B1HYAlS5bQ2tqKlBIhxFmLxe/3s2LFisK3k0svvZQdO3YQCoWG9BpGKg6AbDbL5z73OYLBIF/4wheAM78nxzr2NUG+VnX0D+j4smQySTgcPuU5wzXYNV3X5Utf+hL79u3jiSeeQAhBfX09tbW1hX9Ho1Ha29uprKw8a7FIKfnoRz9a+HC86qqr2LZt21m5J4PFctQzzzzDihUrCj+frfsy1BjP5vtkKM7le2U8GvPNUIsWLeKll14C4OWXX2bx4sUnPKavr49cLtfvF/iNb3yj8I18x44dVFVVDetD8XRi2b9/Px/+8IdxHAfLsnjzzTeZO3fukF7DSMYhpeTv/u7vmDlzJg899FAhQYzkPVm0aBEvv/wykB9U0NDQUCibNm0aBw4coKenh1wux9q1a1m4cOEpzxmuwa75wAMPkM1mefLJJwtJfOXKlTz++OMAtLa2kkgkKCsrO6uxJBIJbrzxRpLJJFJKXnvtNebNm3dW7slgsRy1detWFi1aVPj5bN2XkzmX75OhOJfvlfFozK86m06nue+++2hvb8c0Tb7yla9QVlbG9773PWpqanjHO97Bpk2b+Na3vsWTTz5ZOK+3t5d7772XVCqFrus88MADTJs27azH8p3vfIcXXngB0zS56aabWL58+UnPO1txuK7LPffcw4IFCwrn3HPPPUydOnXE7snRESu7du1CSsmjjz7Ktm3bSKVS3H777YVRLlJKbrnlFj7ykf+/HXtHYRCIojB8bFyN5TRWLsLCIiC4AQuxcT12VspsaZjSBVilEwIhNxB8BP6vv3C4M8yBebyd+fVMPuXIskxlWco5t5diXdcqikLDMCjGqCRJ1Pf9y6N5RJaqqjTPs8ZxVJqmyvNcbdsespNvsqzrqqZptCzLPrNt2yF7kaQQgrqu0zRN8t6ffk+sLGfflX90+7IAAFzv9t9QAIDrURYAABNlAQAwURYAABNlAQAwURYAABNlAQAwPQE51lTGb4HZzgAAAABJRU5ErkJggg==\n", | |
"text/plain": [ | |
"<Figure size 401.625x360 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"\n", | |
"plot_embeddings(test_embs)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Saving Model\n", | |
"-------------------------" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Model saved at: D:/Research/ContrastiveRepresentationLearning/Outputs/Weights/MNIST_PAIR_LOSS_3000_32_0.0005_10_1.0.pth\n" | |
] | |
} | |
], | |
"source": [ | |
"weightfol = r'D:/Research/ContrastiveRepresentationLearning/Outputs/Weights'\n", | |
"outpath = weightfol + r\"/\" + NAME + '.pth'\n", | |
"torch.save(model.state_dict(), outpath); print(\"Model saved at: \", 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