Files
deeplearn-torch/Chapter_10.ipynb

2576 lines
224 KiB
Plaintext
Raw Normal View History

2026-01-14 15:19:22 +08:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T17:54:19.728545Z",
"start_time": "2021-04-03T17:54:18.435113Z"
},
"tags": [
"remove_cell"
]
},
"outputs": [],
"source": [
"import torch\n",
"import torch.nn as nn\n",
"import torch.nn.functional as F\n",
"import torchvision \n",
"from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence\n",
"from torchvision import transforms\n",
"\n",
"from torch.utils.data import Dataset, DataLoader\n",
"\n",
"from tqdm.autonotebook import tqdm\n",
"\n",
"import numpy as np\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.pyplot import imshow\n",
"\n",
"import pandas as pd\n",
"\n",
"from sklearn.metrics import accuracy_score\n",
"\n",
"import time\n",
"\n",
"from idlmam import train_network, Flatten, weight_reset, View, set_seed"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T17:54:19.734725Z",
"start_time": "2021-04-03T17:54:19.730121Z"
},
"tags": [
"remove_cell"
]
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"from IPython.display import set_matplotlib_formats\n",
"set_matplotlib_formats('png', 'pdf')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T17:54:19.749153Z",
"start_time": "2021-04-03T17:54:19.735879Z"
},
"tags": [
"remove_cell"
]
},
"outputs": [],
"source": [
"torch.backends.cudnn.deterministic=True\n",
"set_seed(42)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T17:54:19.782882Z",
"start_time": "2021-04-03T17:54:19.750977Z"
},
"tags": [
"remove_cell"
]
},
"outputs": [],
"source": [
"device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\"cpu\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T17:54:19.809218Z",
"start_time": "2021-04-03T17:54:19.784393Z"
}
},
"outputs": [],
"source": [
"mnist_train = torchvision.datasets.MNIST(\"./\", train=True, transform=transforms.ToTensor(), download=True)\n",
"mnist_test = torchvision.datasets.MNIST(\"./\", train=False, transform=transforms.ToTensor(), download=True)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T17:54:19.815705Z",
"start_time": "2021-04-03T17:54:19.811377Z"
}
},
"outputs": [],
"source": [
"class LargestDigit(Dataset):\n",
" \"\"\"\n",
" Creates a modified version of a dataset where some number of samples are taken, \n",
" and the true label is the largest label sampled. When used with MNIST the labels \n",
" correspond to their values (e.g., digit \"6\" has label 6)\n",
" \"\"\"\n",
"\n",
" def __init__(self, dataset, toSample=3):\n",
" \"\"\"\n",
" dataset: the dataset to sample from\n",
" toSample: the number of items from the dataset to sample\n",
" \"\"\"\n",
" self.dataset = dataset\n",
" self.toSample = toSample\n",
"\n",
" def __len__(self):\n",
" return len(self.dataset)\n",
"\n",
" def __getitem__(self, idx):\n",
" #Randomly select n=self.toSample items from the dataset\n",
" selected = np.random.randint(0,len(self.dataset), size=self.toSample)\n",
" \n",
" #Stack the n items of shape (B, *) shape into (B, n, *)\n",
" x_new = torch.stack([self.dataset[i][0] for i in selected])\n",
" #Label is the maximum label\n",
" y_new = max([self.dataset[i][1] for i in selected])\n",
" #Return (data, label) pair!\n",
" return x_new, y_new"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T17:54:19.821596Z",
"start_time": "2021-04-03T17:54:19.817125Z"
}
},
"outputs": [],
"source": [
"B = 128\n",
"epochs = 10\n",
"\n",
"largest_train = LargestDigit(mnist_train)\n",
"largest_test = LargestDigit(mnist_test)\n",
"\n",
"train_loader = DataLoader(largest_train, batch_size=B, shuffle=True)\n",
"test_loader = DataLoader(largest_test, batch_size=B)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T17:54:19.826405Z",
"start_time": "2021-04-03T17:54:19.822802Z"
},
"tags": [
"remove_cell"
]
},
"outputs": [],
"source": [
"#Want a consistent dataset split\n",
"set_seed(34)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T17:54:20.218399Z",
"start_time": "2021-04-03T17:54:19.827572Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True Label is = 8\n"
]
},
{
"data": {
"application/pdf": "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L0xlbmd0aCA4MCA+PgpzdHJlYW0KeJxFjLsNwDAIRHumYAR+JmafKJWzfxsgStxwT7p7uDoSMlPeYYaHBJ4MLIZT8QaZo2A1uEZSjZ3so7BuX3WB5npTq/X3BypPdnZxPc3LGfQKZW5kc3RyZWFtCmVuZG9iagoyMSAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3RoIDI0OCA+PgpzdHJlYW0KeJwtUTmSA0EIy+cVekJz0++xy5H3/+kKygGDhkMgOi1xUMZPEJYr3vLIVbTh75kYwXfBod/KdRsWORAVSNIYVE2oXbwevQd2HGYC86Q1LIMZ6wM/Ywo3enF4TMbZ7XUZNQR712tPZlAyKxdxycQFU3XYyJnDT6aMC+1czw3IuRHWZRikm5XGjIQjTSFSSKHqJqkzQZAEo6tRo40cxX7pyyOdYVUjagz7XEvb13MTzho0OxarPDmlR1ecy8nFCysH/bzNwEVUGqs8EBJwv9tD/Zzs5Dfe0rmzxfT4XnOyvDAVWPHmtRuQTbX4Ny/i+D3j6/n8A6ilWxYKZW5kc3RyZWFtCmVuZG9iagoyMiAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3RoIDIxMCA+PgpzdHJlYW0KeJw1UMsNQzEIu2cKFqgUAoFknla9df9rbdA7YRH/QljIlAh5qcnOKelLPjpMD7Yuv7EiC611JezKmiCeK++hmbKx0djiYHAaJl6AFjdg6GmNGjV04YKmLpVCgcUl8Jl8dXvovk8ZeGoZcnYEEUPJYAlquhZNWLQ8n5BOAeL/fsPuLeShkvPKnhv5G5zt8DuzbuEnanYi0XIVMtSzNMcYCBNFHjx5RaZw4rPWd9U0EtRmC06WAa5OP4wOAGAiXlmA7K5EOUvSjqWfb7zH9w9AAFO0CmVuZHN0cmVhbQplbmRvYmoKMTcgMCBvYmoKPDwgL0Jhc2VGb250IC9EZWphVnVTYW5zIC9DaGFyUHJvY3MgMTggMCBSCi9FbmNvZGluZyA8PCAvRGlmZmVyZW5jZXMgWyA0OCAvemVybyAvb25lIC90d28gNTMgL2ZpdmUgXSAvVHlwZSAvRW5jb2RpbmcgPj4KL0ZpcnN0Q2hhciAwIC9Gb250QkJveCBbIC0xMDIxIC00NjMgMTc5NCAxMjMzIF0gL0ZvbnREZXNjcmlwdG9yIDE2IDAgUgovRm9udE1hdHJpeCBbIDAuMDAxIDAgMCAwLjAwMSAwIDAgXSAvTGFzdENoYXIgMjU1IC9OYW1lIC9EZWphVnVTYW5zCi9TdWJ0eXBlIC9UeXBlMyAvVHlwZSAvRm9udCAvV2lkdGhzIDE1IDAgUiA+PgplbmRvYmoKMTYgMCBvYmoKPDwgL0FzY2VudCA5MjkgL0NhcEhlaWdodCAwIC9EZXNjZW50IC0yMzYgL0ZsYWdzIDMyCi9Gb250QkJveCBbIC0xMDIxIC00NjMgMTc5NCAxMjMzIF0gL0ZvbnROYW1lIC9EZWphVnVTYW5zIC9JdGFsaWNBbmdsZSAwCi9NYXhXaWR0aCAxMzQyIC9TdGVtViAwIC9UeXBlIC9Gb250RGVzY3JpcHRvciAvWEhlaWdodCAwID4+CmVuZG9iagoxNSAwIG9ia
"image/png": "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
"text/plain": [
"<Figure size 720x720 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"x, y = largest_train[0]\n",
"\n",
"f, axarr = plt.subplots(1,3, figsize=(10,10))\n",
"for i in range(3):\n",
" axarr[i].imshow(x[i,0,:].numpy(), cmap='gray', vmin=0, vmax=1)\n",
"print(\"True Label is = \", y)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:00:32.432167Z",
"start_time": "2021-04-03T17:54:20.219640Z"
},
"tags": [
"remove_output"
]
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c5ff1c0ca9be44c28c22c1f13127c081",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Epoch'), FloatProgress(value=0.0, max=10.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"neurons = 256\n",
"classes = 10\n",
"simpleNet = nn.Sequential(\n",
" nn.Flatten(),\n",
" nn.Linear(784*3,neurons), # 784*3 because there are 784 pixels in an image and 3 images in the bag\n",
" nn.LeakyReLU(),\n",
" nn.BatchNorm1d(neurons),\n",
" nn.Linear(neurons,neurons),\n",
" nn.LeakyReLU(),\n",
" nn.BatchNorm1d(neurons),\n",
" nn.Linear(neurons,neurons),\n",
" nn.LeakyReLU(),\n",
" nn.BatchNorm1d(neurons),\n",
" nn.Linear(neurons, classes )\n",
") \n",
"simple_results = train_network(simpleNet, nn.CrossEntropyLoss(), train_loader, val_loader=test_loader, epochs=epochs, score_funcs={'Accuracy': accuracy_score}, device=device)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:00:32.631217Z",
"start_time": "2021-04-03T18:00:32.433308Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:xlabel='epoch', ylabel='val Accuracy'>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/pdf": "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
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.lineplot(x='epoch', y='val Accuracy', data=simple_results, label='Regular')"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:00:32.635405Z",
"start_time": "2021-04-03T18:00:32.632400Z"
}
},
"outputs": [],
"source": [
"class Flatten2(nn.Module):\n",
" \"\"\"\n",
" Takes a vector of shape (A, B, C, D, E, ...)\n",
" and flattens everything but the first two dimensions, \n",
" giving a result of shape (A, B, C*D*E*...)\n",
" \"\"\"\n",
" def forward(self, input):\n",
" return input.view(input.size(0), input.size(1), -1)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:00:32.640740Z",
"start_time": "2021-04-03T18:00:32.636661Z"
}
},
"outputs": [],
"source": [
"class Combiner(nn.Module):\n",
" \"\"\"\n",
" This class is used to combine a feature exraction network F and a importance prediction network W,\n",
" and combine their outputs by adding and summing them together. \n",
" \"\"\"\n",
"\n",
" def __init__(self, featureExtraction, weightSelection):\n",
" \"\"\"\n",
" featureExtraction: a network that takes an input of shape (B, T, D) and outputs a new \n",
" representation of shape (B, T, D'). \n",
" weightSelection: a network that takes in an input of shape (B, T, D') and outputs a \n",
" tensor of shape (B, T, 1) or (B, T). It should be normalized, so that the T \n",
" values at the end sum to one (torch.sum(_, dim=1) = 1.0)\n",
" \"\"\"\n",
" super(Combiner, self).__init__()\n",
" self.featureExtraction = featureExtraction\n",
" self.weightSelection = weightSelection\n",
" \n",
" def forward(self, input):\n",
" \"\"\"\n",
" input: a tensor of shape (B, T, D)\n",
" return: a new tensor of shape (B, D')\n",
" \"\"\"\n",
" features = self.featureExtraction(input) #(B, T, D) $\\boldsymbol{h}_i = F(\\boldsymbol{x}_i)$\n",
" weights = self.weightSelection(features) #(B, T) or (B, T, 1) for $\\boldsymbol{\\alpha}$\n",
" if len(weights.shape) == 2: #(B, T) shape\n",
" weights.unsqueese(2) #now (B, T, 1) shape\n",
" \n",
" r = features*weights #(B, T, D), computes $\\alpha_i \\cdot \\boldsymbol{h}_i$\n",
" \n",
" return torch.sum(r, dim=1) #sum over the T dimension, giving (B, D) final shape $\\bar{\\boldsymbol{x}}$"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:00:32.646025Z",
"start_time": "2021-04-03T18:00:32.641977Z"
}
},
"outputs": [],
"source": [
"T = 3\n",
"D = 784"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:00:32.653320Z",
"start_time": "2021-04-03T18:00:32.647525Z"
}
},
"outputs": [],
"source": [
"backboneNetwork = nn.Sequential(\n",
" Flatten2(),# Shape is now (B, T, D)\n",
" nn.Linear(D,neurons), #Shape becomes (B, T, neurons)\n",
" nn.LeakyReLU(),\n",
" nn.Linear(neurons,neurons),\n",
" nn.LeakyReLU(),\n",
" nn.Linear(neurons,neurons),\n",
" nn.LeakyReLU(), #still (B, T, neurons) on the way out\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:00:32.658366Z",
"start_time": "2021-04-03T18:00:32.655139Z"
}
},
"outputs": [],
"source": [
"attentionMechanism = nn.Sequential(\n",
" #Shape is (B, T, neurons)\n",
" nn.Linear(neurons,neurons),\n",
" nn.LeakyReLU(),\n",
" nn.Linear(neurons, 1 ), # (B, T, 1)\n",
" nn.Softmax(dim=1),\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:06:49.065560Z",
"start_time": "2021-04-03T18:00:32.659504Z"
},
"tags": [
"remove_output"
]
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3bc4ceaff244459986839a3e64e033e2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Epoch'), FloatProgress(value=0.0, max=10.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"simpleAttentionNet = nn.Sequential(\n",
" #input is (B, T, C, W, H). backbone & attention will be used by combiner to process\n",
" Combiner(backboneNetwork, attentionMechanism), # result is (B, neurons)\n",
" nn.BatchNorm1d(neurons),\n",
" nn.Linear(neurons,neurons),\n",
" nn.LeakyReLU(),\n",
" nn.BatchNorm1d(neurons),\n",
" nn.Linear(neurons, classes )\n",
" )\n",
"simple_attn_results = train_network(simpleAttentionNet, nn.CrossEntropyLoss(), train_loader, val_loader=test_loader, epochs=epochs, score_funcs={'Accuracy': accuracy_score}, device=device)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:06:49.297156Z",
"start_time": "2021-04-03T18:06:49.066794Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:xlabel='epoch', ylabel='val Accuracy'>"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/pdf": "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
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.lineplot(x='epoch', y='val Accuracy', data=simple_results, label='Regular')\n",
"sns.lineplot(x='epoch', y='val Accuracy', data=simple_attn_results, label='Simple Attention')"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:06:49.300954Z",
"start_time": "2021-04-03T18:06:49.298384Z"
},
"tags": [
"remove_cell"
]
},
"outputs": [],
"source": [
"set_seed(1)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:06:49.687226Z",
"start_time": "2021-04-03T18:06:49.303858Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True Label is = 9\n"
]
},
{
"data": {
"application/pdf": "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
"image/png": "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
"text/plain": [
"<Figure size 720x720 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"x, y = largest_train[0] # Select a data point (which is a bag)\n",
"x = x.to(device) #move it to the compute device\n",
"\n",
"with torch.no_grad():\n",
" weights = attentionMechanism(backboneNetwork(x.unsqueeze(0))) #apply score(F(x))\n",
" weights = weights.cpu().numpy().ravel() #convert to numpy array\n",
"\n",
"f, axarr = plt.subplots(1,3, figsize=(10,10))#make a plot for all 3 digits\n",
"for i in range(3):\n",
" axarr[i].imshow(x[i,0,:].cpu().numpy(), cmap='gray', vmin=0, vmax=1) # Plot the digit\n",
" axarr[i].text(0.0, 0.5, str(round(weights[i],2)), dict(size=40, color='red')) #Draw the attention score in the top left\n",
" \n",
"print(\"True Label is = \", y)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:06:49.692283Z",
"start_time": "2021-04-03T18:06:49.688747Z"
}
},
"outputs": [],
"source": [
"class DotScore(nn.Module):\n",
"\n",
" def __init__(self, H):\n",
" \"\"\"\n",
" H: the number of dimensions coming into the dot score. \n",
" \"\"\"\n",
" super(DotScore, self).__init__()\n",
" self.H = H\n",
" \n",
" def forward(self, states, context):\n",
" \"\"\"\n",
" states: (B, T, H) shape\n",
" context: (B, H) shape\n",
" output: (B, T, 1), giving a score to each of the T items based on the context \n",
" \n",
" \"\"\"\n",
" T = states.size(1)\n",
" #compute $\\boldsymbol{h}_t^\\top \\bar{\\boldsymbol{h}}$\n",
" scores = torch.bmm(states,context.unsqueeze(2)) / np.sqrt(self.H) #(B, T, H) -> (B, T, 1)\n",
" return scores"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:06:49.700060Z",
"start_time": "2021-04-03T18:06:49.693366Z"
}
},
"outputs": [],
"source": [
"class GeneralScore(nn.Module):\n",
"\n",
" def __init__(self, H):\n",
" \"\"\"\n",
" H: the number of dimensions coming into the dot score. \n",
" \"\"\"\n",
" super(GeneralScore, self).__init__()\n",
" self.w = nn.Bilinear(H, H, 1) #stores $W$\n",
" \n",
" def forward(self, states, context):\n",
" \"\"\"\n",
" states: (B, T, H) shape\n",
" context: (B, H) shape\n",
" output: (B, T, 1), giving a score to each of the T items based on the context \n",
" \n",
" \"\"\"\n",
" T = states.size(1)\n",
" #Repeating the values T times \n",
" context = torch.stack([context for _ in range(T)], dim=1) #(B, H) -> (B, T, H)\n",
" #computes $\\boldsymbol{h}_{t}^{\\top} W \\bar{\\boldsymbol{h}}$\n",
" scores = self.w(states, context) #(B, T, H) -> (B, T, 1)\n",
" return scores "
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:06:49.706634Z",
"start_time": "2021-04-03T18:06:49.701734Z"
}
},
"outputs": [],
"source": [
"class AdditiveAttentionScore(nn.Module):\n",
"\n",
" def __init__(self, H):\n",
" super(AdditiveAttentionScore, self).__init__()\n",
" self.v = nn.Linear(H, 1) \n",
" self.w = nn.Linear(2*H, H)#2*H because we are going to concatenate two inputs\n",
" \n",
" def forward(self, states, context):\n",
" \"\"\"\n",
" states: (B, T, H) shape\n",
" context: (B, H) shape\n",
" output: (B, T, 1), giving a score to each of the T items based on the context \n",
" \n",
" \"\"\"\n",
" T = states.size(1)\n",
" #Repeating the values T times \n",
" context = torch.stack([context for _ in range(T)], dim=1) #(B, H) -> (B, T, H)\n",
" state_context_combined = torch.cat((states, context), dim=2) #(B, T, H) + (B, T, H) -> (B, T, 2*H)\n",
" scores = self.v(torch.tanh(self.w(state_context_combined))) # (B, T, 2*H) -> (B, T, 1)\n",
" return scores"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:06:49.712834Z",
"start_time": "2021-04-03T18:06:49.708312Z"
}
},
"outputs": [],
"source": [
"class ApplyAttention(nn.Module):\n",
" \"\"\"\n",
" This helper module is used to apply the results of an attention mechanism toa set of inputs. \n",
" \"\"\"\n",
"\n",
" def __init__(self):\n",
" super(ApplyAttention, self).__init__()\n",
" \n",
" def forward(self, states, attention_scores, mask=None):\n",
" \"\"\"\n",
" states: (B, T, H) shape giving the T different possible inputs\n",
" attention_scores: (B, T, 1) score for each item at each context\n",
" mask: None if all items are present. Else a boolean tensor of shape \n",
" (B, T), with `True` indicating which items are present / valid. \n",
" \n",
" returns: a tuple with two tensors. The first tensor is the final context\n",
" from applying the attention to the states (B, H) shape. The second tensor\n",
" is the weights for each state with shape (B, T, 1). \n",
" \"\"\"\n",
" \n",
" if mask is not None:\n",
" #set everything not present to a large negative value that will cause vanishing gradients \n",
" attention_scores[~mask] = -1000.0\n",
" #compute the weight for each score\n",
" weights = F.softmax(attention_scores, dim=1) #(B, T, 1) still, but sum(T) = 1\n",
" \n",
" final_context = (states*weights).sum(dim=1) #(B, T, D) * (B, T, 1) -> (B, D)\n",
" return final_context, weights"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:06:49.718546Z",
"start_time": "2021-04-03T18:06:49.714176Z"
}
},
"outputs": [],
"source": [
"def getMaskByFill(x, time_dimension=1, fill=0):\n",
" \"\"\"\n",
" x: the original input with three or more dimensions, (B, ..., T, ...)\n",
" which may have unsued items in the tensor. B is the batch size, \n",
" and T is the time dimension. \n",
" time_dimension: the axis in the tensor `x` that denotes the time dimension\n",
" fill: the constant used to denote that an item in the tensor is not in use,\n",
" and should be masked out (`False` in the mask). \n",
" \n",
" return: A boolean tensor of shape (B, T), where `True` indicates the value\n",
" at that time is good to use, and `False` that it is not. \n",
" \"\"\"\n",
" to_sum_over = list(range(1,len(x.shape))) #skip the first dimension 0 because that is the batch dimension\n",
" \n",
" if time_dimension in to_sum_over:\n",
" to_sum_over.remove(time_dimension)\n",
" \n",
" with torch.no_grad():\n",
" #(x!=fill) determines locations that might be unused, beause they are \n",
" #missing the fill value we are looking for to indicate lack of use. \n",
" #We then count the number of non-fill values over everything in that\n",
" #time slot (reducing changes the shape to (B, T)). If any one entry \n",
" #is non equal to this value, the item represent must be in use - \n",
" #so return a value of true. \n",
" mask = torch.sum((x != fill), dim=to_sum_over) > 0\n",
" return mask"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:06:49.726023Z",
"start_time": "2021-04-03T18:06:49.719880Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"tensor([[ True, True, False],\n",
" [ True, True, True],\n",
" [ True, True, True],\n",
" [False, False, False],\n",
" [ True, True, True]])\n"
]
}
],
"source": [
"with torch.no_grad():\n",
" x = torch.rand((5,3,1,7,7))\n",
" x[0,-1,:] = 0 #Don't use the last item in the first input\n",
" x[3,:] = 0 #Don't use any of the 4'th item!\n",
" x[4,0,0,0] = 0 #Make it _look_ like we aren't using part of the 5th, but we still are!\n",
" #This last line was added to show that this works even on tricky inputs\n",
" \n",
" mask = getMaskByFill(x)\n",
"print(mask)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:06:49.734611Z",
"start_time": "2021-04-03T18:06:49.727659Z"
},
"tags": [
"remove_cell"
]
},
"outputs": [],
"source": [
"class SmarterAttentionNet(nn.Module):\n",
"\n",
" def __init__(self, input_size, hidden_size, out_size, score_net=None):\n",
" super(SmarterAttentionNet, self).__init__()\n",
" self.backbone = nn.Sequential(\n",
" Flatten2(),# Shape is now (B, T, D)\n",
" nn.Linear(input_size,hidden_size), #Shape becomes (B, T, H)\n",
" nn.LeakyReLU(),\n",
" nn.Linear(hidden_size,hidden_size),\n",
" nn.LeakyReLU(),\n",
" nn.Linear(hidden_size,hidden_size),\n",
" nn.LeakyReLU(),\n",
" )#returns (B, T, H)\n",
" \n",
" #Try changing this and see how the results change!\n",
" self.score_net = AdditiveAttentionScore(hidden_size) if (score_net is None) else score_net\n",
"\n",
" self.apply_attn = ApplyAttention()\n",
" \n",
" self.prediction_net = nn.Sequential( #(B, H), \n",
" nn.BatchNorm1d(hidden_size),\n",
" nn.Linear(hidden_size,hidden_size),\n",
" nn.LeakyReLU(),\n",
" nn.BatchNorm1d(hidden_size),\n",
" nn.Linear(hidden_size, out_size ) #(B, H)\n",
" )\n",
" \n",
" \n",
" def forward(self, input):\n",
"\n",
" mask = getMaskByFill(input)\n",
"\n",
" h = self.backbone(input) #(B, T, D) -> (B, T, H)\n",
"\n",
" #h_context = torch.mean(h, dim=1) \n",
" #computes torch.mean but ignoring the masked out parts\n",
" #first add together all the valid items\n",
" h_context = (mask.unsqueeze(-1)*h).sum(dim=1)#(B, T, H) -> (B, H)\n",
" #then divide by the number of valid items, pluss a small value incase a bag was all empty\n",
" h_context = h_context/(mask.sum(dim=1).unsqueeze(-1)+1e-10)\n",
"\n",
" scores = self.score_net(h, h_context) # (B, T, H) , (B, H) -> (B, T, 1)\n",
"\n",
" final_context, _ = self.apply_attn(h, scores, mask=mask)\n",
"\n",
" return self.prediction_net(final_context)\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:25:54.246651Z",
"start_time": "2021-04-03T18:06:49.736072Z"
},
"tags": [
"remove_output"
]
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e3e0affeb0c84656a30ef76d3f9faa6c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Epoch'), FloatProgress(value=0.0, max=10.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5384fc792fbe43ee9720a69636e86f16",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Epoch'), FloatProgress(value=0.0, max=10.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5e0ef3fb6bcf46f5abf257f3cf99549c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Epoch'), FloatProgress(value=0.0, max=10.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"attn_dot = SmarterAttentionNet(D, neurons, classes, score_net=DotScore(neurons))\n",
"attn_gen = SmarterAttentionNet(D, neurons, classes, score_net=GeneralScore(neurons))\n",
"attn_add = SmarterAttentionNet(D, neurons, classes, score_net=AdditiveAttentionScore(neurons))\n",
"\n",
"attn_results_dot = train_network(attn_dot, nn.CrossEntropyLoss(), train_loader, val_loader=test_loader,epochs=epochs, score_funcs={'Accuracy': accuracy_score}, device=device)\n",
"attn_results_gen = train_network(attn_gen, nn.CrossEntropyLoss(), train_loader, val_loader=test_loader,epochs=epochs, score_funcs={'Accuracy': accuracy_score}, device=device)\n",
"attn_results_add = train_network(attn_add, nn.CrossEntropyLoss(), train_loader, val_loader=test_loader,epochs=epochs, score_funcs={'Accuracy': accuracy_score}, device=device)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:25:54.555308Z",
"start_time": "2021-04-03T18:25:54.247830Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:xlabel='epoch', ylabel='val Accuracy'>"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/pdf": "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
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.lineplot(x='epoch', y='val Accuracy', data=simple_results, label='Regular')\n",
"sns.lineplot(x='epoch', y='val Accuracy', data=simple_attn_results, label='Simple Attention')\n",
"sns.lineplot(x='epoch', y='val Accuracy', data=attn_results_dot, label='Dot')\n",
"sns.lineplot(x='epoch', y='val Accuracy', data=attn_results_gen, label='General')\n",
"sns.lineplot(x='epoch', y='val Accuracy', data=attn_results_add, label='Additive')"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:25:54.561109Z",
"start_time": "2021-04-03T18:25:54.556649Z"
}
},
"outputs": [],
"source": [
"class LargestDigitVariable(Dataset):\n",
" \"\"\"\n",
" Creates a modified version of a dataset where some variable number of samples are \n",
" taken, and the true label is the largest label sampled. When used with MNIST the\n",
" labels correspond to their values (e.g., digit \"6\" has label 6). Each datum will \n",
" be padded with 0 values if the maximum number of items was not sampled. \n",
" \"\"\"\n",
"\n",
" def __init__(self, dataset, maxToSample=6):\n",
" \"\"\"\n",
" dataset: the dataset to sample from\n",
" toSample: the number of items from the dataset to sample\n",
" \"\"\"\n",
" self.dataset = dataset\n",
" self.maxToSample = maxToSample\n",
"\n",
" def __len__(self):\n",
" return len(self.dataset)\n",
"\n",
" def __getitem__(self, idx):\n",
" \n",
" #NEW: how many items should we select?\n",
" how_many = np.random.randint(1,self.maxToSample, size=1)[0]\n",
" #Randomly select n=self.toSample items from the dataset\n",
" selected = np.random.randint(0,len(self.dataset), size=how_many)\n",
" \n",
" #Stack the n items of shape (B, *) shape into (B, n, *)\n",
" #NEW: pad with zero values up to the max size\n",
" x_new = torch.stack([self.dataset[i][0] for i in selected] + \n",
" [torch.zeros((1,28,28)) for i in range(self.maxToSample-how_many)])\n",
" #Label is the maximum label\n",
" y_new = max([self.dataset[i][1] for i in selected])\n",
" #Return (data, label) pair\n",
" return x_new, y_new"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:25:54.567235Z",
"start_time": "2021-04-03T18:25:54.562367Z"
}
},
"outputs": [],
"source": [
"largestV_train = LargestDigitVariable(mnist_train)\n",
"largestV_test = LargestDigitVariable(mnist_test)\n",
"\n",
"trainV_loader = DataLoader(largest_train, batch_size=B, shuffle=True)\n",
"testV_loader = DataLoader(largest_test, batch_size=B)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-03T18:25:59.501012Z",
"start_time": "2021-04-03T18:25:54.568449Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Variable Length Accuracy: 0.967\n"
]
}
],
"source": [
"attn_dot = attn_dot.eval()\n",
"\n",
"preds = []\n",
"truths = []\n",
"with torch.no_grad():\n",
" for inputs, labels in testV_loader:\n",
" pred = attn_dot(inputs.to(device))\n",
" pred = torch.argmax(pred, dim=1).cpu().numpy()\n",
" \n",
" preds.extend(pred.ravel())\n",
" truths.extend(labels.numpy().ravel())\n",
"print(\"Variable Length Accuracy: \", accuracy_score(preds, truths))"
]
}
],
"metadata": {
"author": "BLUE About Validation Loss?",
"celltoolbar": "Tags",
"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.7.9"
},
"latex_envs": {
"LaTeX_envs_menu_present": true,
"autoclose": false,
"autocomplete": true,
"bibliofile": "biblio.bib",
"cite_by": "apalike",
"current_citInitial": 1,
"eqLabelWithNumbers": true,
"eqNumInitial": 1,
"hotkeys": {
"equation": "Ctrl-E",
"itemize": "Ctrl-I"
},
"labels_anchors": false,
"latex_user_defs": false,
"report_style_numbering": false,
"user_envs_cfg": false
},
"latex_metadata": {
"title": "Attention Mechanisms"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}