From c3aff8b5b5c516eddc3929828be3e622bf5f6b1f Mon Sep 17 00:00:00 2001 From: "Shakes (WhiteOut)" Date: Sun, 17 Sep 2023 21:47:51 +1000 Subject: [PATCH 01/24] Added recognition branch and README for info. --- recognition/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 recognition/README.md diff --git a/recognition/README.md b/recognition/README.md new file mode 100644 index 000000000..5c646231c --- /dev/null +++ b/recognition/README.md @@ -0,0 +1,10 @@ +# Recognition Tasks +Various recognition tasks solved in deep learning frameworks. + +Tasks may include: +* Image Segmentation +* Object detection +* Graph node classification +* Image super resolution +* Disease classification +* Generative modelling with StyleGAN and Stable Diffusion From 54e5a63f7c40aa741b3e42f69225244f87cb9e10 Mon Sep 17 00:00:00 2001 From: oliver Date: Sun, 15 Oct 2023 00:32:51 +1000 Subject: [PATCH 02/24] image loader --- .../image-loading.ipynb | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 recognition/vision-transformer-4696689/image-loading.ipynb diff --git a/recognition/vision-transformer-4696689/image-loading.ipynb b/recognition/vision-transformer-4696689/image-loading.ipynb new file mode 100644 index 000000000..0d0ba2d37 --- /dev/null +++ b/recognition/vision-transformer-4696689/image-loading.ipynb @@ -0,0 +1,92 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 8, + "id": "206e485b", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"numpy and torch\"\"\"\n", + "import numpy as np\n", + "import torch\n", + "\n", + "\"\"\"PIL\"\"\"\n", + "from PIL import Image\n", + "\n", + "\"\"\"torchvision and utils\"\"\"\n", + "import torchvision.transforms as transforms\n", + "from torch.utils.data import DataLoader, Dataset\n", + "from torchvision.utils import make_grid\n", + "from torchvision.utils import save_image\n", + "\n", + "\"\"\"os\"\"\"\n", + "import os\n", + "\n", + "\n", + "\"\"\"Get image to tensor\"\"\"\n", + "transform = transforms.Compose([\n", + " transforms.PILToTensor()\n", + "])\n", + "\n", + "\"\"\"Loading data into arrays\"\"\"\n", + "xtrain, xtrain, xtest, ytest = [], [], [], []\n", + "\n", + "\"\"\"training data\"\"\"\n", + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "size = [0, 0]\n", + "for i, DIR in enumerate(trainDIRs):\n", + " for filename in os.listdir(DIR):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " xtrain.append(tensor/255)\n", + " size[i] += 1\n", + "ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + "\n", + "\"\"\"testing data\"\"\"\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "size = [0, 0]\n", + "for i, DIR in enumerate(testDIRs):\n", + " for filename in os.listdir(DIR):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " xtrain.append(tensor/255)\n", + " size[i] += 1\n", + "ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e4ae7366", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From e1ffe8b6cd333e74a8ce649d3218cdf16621a482 Mon Sep 17 00:00:00 2001 From: oliver Date: Sun, 15 Oct 2023 16:14:27 +1000 Subject: [PATCH 03/24] added positional embedding, fixed some issues with image loading --- .../image-loading.ipynb | 17 ++- .../vision-transformer-4696689/model.ipynb | 112 ++++++++++++++++++ 2 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 recognition/vision-transformer-4696689/model.ipynb diff --git a/recognition/vision-transformer-4696689/image-loading.ipynb b/recognition/vision-transformer-4696689/image-loading.ipynb index 0d0ba2d37..093e08a92 100644 --- a/recognition/vision-transformer-4696689/image-loading.ipynb +++ b/recognition/vision-transformer-4696689/image-loading.ipynb @@ -2,10 +2,21 @@ "cells": [ { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "id": "206e485b", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so, 6): Library not loaded: @rpath/libpng16.16.dylib\n", + " Referenced from: /Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so\n", + " Reason: Incompatible library version: image.so requires version 56.0.0 or later, but libpng16.16.dylib provides version 54.0.0'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", + " warn(\n" + ] + } + ], "source": [ "\"\"\"numpy and torch\"\"\"\n", "import numpy as np\n", @@ -62,7 +73,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e4ae7366", + "id": "f8b7d0eb", "metadata": {}, "outputs": [], "source": [] diff --git a/recognition/vision-transformer-4696689/model.ipynb b/recognition/vision-transformer-4696689/model.ipynb new file mode 100644 index 000000000..49949fe83 --- /dev/null +++ b/recognition/vision-transformer-4696689/model.ipynb @@ -0,0 +1,112 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 63, + "id": "206e485b", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"numpy and torch\"\"\"\n", + "import numpy as np\n", + "import torch\n", + "\n", + "\"\"\"PIL\"\"\"\n", + "from PIL import Image\n", + "\n", + "\"\"\"torchvision and utils\"\"\"\n", + "import torchvision.transforms as transforms\n", + "from torch.utils.data import DataLoader, Dataset\n", + "from torchvision.utils import make_grid\n", + "from torchvision.utils import save_image\n", + "\n", + "\"\"\"os\"\"\"\n", + "import os\n", + "\n", + "\n", + "\"\"\"Get image to tensor\"\"\"\n", + "transform = transforms.Compose([\n", + " transforms.PILToTensor()\n", + "])\n", + "\n", + "\"\"\"Loading data into arrays\"\"\"\n", + "xtrain, xtrain, xtest, ytest = [], [], [], []\n", + "\n", + "\"\"\"training data\"\"\"\n", + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "size = [0, 0]\n", + "for i, DIR in enumerate(trainDIRs):\n", + " for filename in os.listdir(DIR):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " xtrain.append(tensor/255)\n", + " size[i] += 1\n", + "xtrain = torch.stack(xtrain)\n", + "ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + "\n", + "\"\"\"testing data\"\"\"\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "size = [0, 0]\n", + "for i, DIR in enumerate(testDIRs):\n", + " for filename in os.listdir(DIR):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " xtest.append(tensor/255)\n", + " size[i] += 1\n", + "xtest = torch.stack(xtest)\n", + "ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "e4ae7366", + "metadata": {}, + "outputs": [], + "source": [ + "def posEmbedding(imgs, wsize, hsize):\n", + " N, C, W, H = imgs.shape #number imgs, channels, width, height\n", + " size = (N, C, W // wsize, wsize, H // hsize, hsize)\n", + " perm = (0, 2, 4, 1, 3, 5) #bring col, row index of patch to front\n", + " flat = (1, 2) #flatten (col, row) index into col*row entry index for patches\n", + " imgs = imgs.reshape(size).permute(perm).flatten(*flat)\n", + " return imgs" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "8fb7b4f1", + "metadata": {}, + "outputs": [], + "source": [ + "patches = posEmbedding(xtrain, 16, 16)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 8bfe02cd62352b04e0bc53925ea1174552b6c3e7 Mon Sep 17 00:00:00 2001 From: oliver Date: Tue, 17 Oct 2023 21:55:56 +1000 Subject: [PATCH 04/24] class token and positional embedding added, with start of VT class --- .../image-loading.ipynb | 6 +- .../vision-transformer-4696689/model.ipynb | 196 +++++++++++++++++- 2 files changed, 197 insertions(+), 5 deletions(-) diff --git a/recognition/vision-transformer-4696689/image-loading.ipynb b/recognition/vision-transformer-4696689/image-loading.ipynb index 093e08a92..4bd45408c 100644 --- a/recognition/vision-transformer-4696689/image-loading.ipynb +++ b/recognition/vision-transformer-4696689/image-loading.ipynb @@ -54,6 +54,7 @@ " tensor.require_grad = True\n", " xtrain.append(tensor/255)\n", " size[i] += 1\n", + "xtrain = torch.stack(xtrain)\n", "ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", "\n", "\"\"\"testing data\"\"\"\n", @@ -65,15 +66,16 @@ " img = Image.open(f)\n", " tensor = transform(img).float()\n", " tensor.require_grad = True\n", - " xtrain.append(tensor/255)\n", + " xtest.append(tensor/255)\n", " size[i] += 1\n", + "xtest = torch.stack(xtest)\n", "ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))" ] }, { "cell_type": "code", "execution_count": null, - "id": "f8b7d0eb", + "id": "3e6af055", "metadata": {}, "outputs": [], "source": [] diff --git a/recognition/vision-transformer-4696689/model.ipynb b/recognition/vision-transformer-4696689/model.ipynb index 49949fe83..68206ef64 100644 --- a/recognition/vision-transformer-4696689/model.ipynb +++ b/recognition/vision-transformer-4696689/model.ipynb @@ -68,7 +68,7 @@ "metadata": {}, "outputs": [], "source": [ - "def posEmbedding(imgs, wsize, hsize):\n", + "def createPatches(imgs, wsize, hsize):\n", " N, C, W, H = imgs.shape #number imgs, channels, width, height\n", " size = (N, C, W // wsize, wsize, H // hsize, hsize)\n", " perm = (0, 2, 4, 1, 3, 5) #bring col, row index of patch to front\n", @@ -80,11 +80,201 @@ { "cell_type": "code", "execution_count": 80, - "id": "8fb7b4f1", + "id": "ed1fa920", "metadata": {}, "outputs": [], "source": [ - "patches = posEmbedding(xtrain, 16, 16)" + "patches = createPatches(xtrain, 16, 16)" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "1734a153", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "whole thing\n", + "torch.Size([21520, 1, 240, 256])\n", + "torch.Size([21520, 240, 1, 16, 16])\n", + "individual image\n", + "torch.Size([1, 240, 256])\n", + "torch.Size([240, 1, 16, 16])\n" + ] + } + ], + "source": [ + "print(\"whole thing\")\n", + "print(xtrain.shape)\n", + "print(patches.shape)\n", + "print(\"individual image\")\n", + "print(xtrain[0].shape)\n", + "print(patches[0].shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "id": "2e6836c8", + "metadata": {}, + "outputs": [], + "source": [ + "import torch.nn as nn\n", + "\n", + "def flattenPatches(imgs): #takes input (N, Npatches, C, W, H)\n", + " return imgs.flatten(2, 4)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "id": "3b55bc20", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([21520, 240, 256])\n" + ] + } + ], + "source": [ + "flattenedpatches = flattenPatches(patches)\n", + "print(flattenedpatches.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "87f60f02", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([21520, 240, 123])\n" + ] + } + ], + "source": [ + "\"\"\"projecting the patches to tokens\"\"\"\n", + "EMBED_DIMENSION = 123\n", + "wsize, hsize = 16, 16\n", + "N, C, W, H = xtrain.shape\n", + "proj = nn.Linear(C*wsize*hsize, EMBED_DIMENSION)\n", + "tokens = proj(flattenedpatches)" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "id": "b6d9e2f1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([21520, 240, 123])\n" + ] + } + ], + "source": [ + "print(tokens.shape) #of the form N, Ntokens, EMBED_DIMENSION" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "78efdb7e", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"adding the class tokens\"\"\"\n", + "clstoken = nn.Parameter(torch.zeros(1, 1, EMBED_DIMENSION))" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "id": "34c6a456", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"positional embedding\"\"\"\n", + "def embedding(npatches, EMBED_DIMENSION, freq):\n", + " posembed = torch.zeros(npatches, EMBED_DIMENSION)\n", + " for i in range(npatches):\n", + " for j in range(EMBED_DIMENSION):\n", + " if j % 2 == 0:\n", + " posembed[i][j] = np.sin(i/(freq**(j/EMBED_DIMENSION)))\n", + " else:\n", + " posembed[i][j] = np.cos(i/(freq**((j-1)/EMBED_DIMENSION)))\n", + " return posembed" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "id": "b84bded5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([[ 0.0000, 1.0000, 0.0000, 1.0000, 0.0000, 1.0000],\n", + " [ 0.8415, 0.5403, 0.4477, 0.8942, 0.2138, 0.9769],\n", + " [ 0.9093, -0.4161, 0.8006, 0.5992, 0.4177, 0.9086],\n", + " [ 0.1411, -0.9900, 0.9841, 0.1774, 0.6023, 0.7983]])\n" + ] + } + ], + "source": [ + "#test the positional embedding\n", + "embed = embedding(4, 6, 10)\n", + "print(embed)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "078e74aa", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Vision Transformer Class to create a vision transformer model\n", + "\"\"\"\n", + "class VisionTransformer(nn.Module):\n", + " def __init__(self, imgsize, patchsize):\n", + " super().__init__()\n", + " self.C, self.W, self.H = *imgsize\n", + " self.wsize, self.hsize = *patchsize\n", + " \"\"\"components\"\"\"\n", + " self.proj = nn.Linear(self.C*self.W*self.H, EMBED_DIMENSION)\n", + " self.clstoken = nn.Parameter(torch.zeros(1, 1, EMBED_DIMENSION))\n", + " \n", + " def createPatches(self, imgs, wsize, hsize):\n", + " N, C, W, H = imgs.shape\n", + " if (W % wsize != 0) or (H % hsize != 0):\n", + " raise Exception(\"patchsize is not appropriate\")\n", + " else if (self.C != C) or (self.H != H):\n", + " raise Exception(\"given sizes do not match\")\n", + " \"\"\"if everything ok\"\"\"\n", + " size = (N, C, W // wsize, wsize, H // hsize, hsize)\n", + " perm = (0, 2, 4, 1, 3, 5) #bring col, row index of patch to front\n", + " flat = (1, 2) #flatten (col, row) index into col*row entry index for patches\n", + " imgs = imgs.reshape(size).permute(perm).flatten(*flat)\n", + " return imgs #in format Nimgs, Npatches, C, Wpatch, Hpatch\n", + " \n", + " def forward(self, imgs): #assume size checking done by createPatches\n", + " patches = self.createPatches(imgs, self.wsize, self.hsize)" ] } ], From d38105746f43a1e7412f24f9fa9c43903dbaaaf3 Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 18 Oct 2023 00:42:04 +1000 Subject: [PATCH 05/24] done positional embedding and some changes to the model --- .../vision-transformer-4696689/model.ipynb | 146 ++++++++++++------ 1 file changed, 97 insertions(+), 49 deletions(-) diff --git a/recognition/vision-transformer-4696689/model.ipynb b/recognition/vision-transformer-4696689/model.ipynb index 68206ef64..e579e6687 100644 --- a/recognition/vision-transformer-4696689/model.ipynb +++ b/recognition/vision-transformer-4696689/model.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 63, + "execution_count": 4, "id": "206e485b", "metadata": {}, "outputs": [], @@ -63,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 5, "id": "e4ae7366", "metadata": {}, "outputs": [], @@ -79,8 +79,8 @@ }, { "cell_type": "code", - "execution_count": 80, - "id": "ed1fa920", + "execution_count": 6, + "id": "7cf030d3", "metadata": {}, "outputs": [], "source": [ @@ -89,8 +89,8 @@ }, { "cell_type": "code", - "execution_count": 104, - "id": "1734a153", + "execution_count": 7, + "id": "081275a2", "metadata": {}, "outputs": [ { @@ -117,8 +117,8 @@ }, { "cell_type": "code", - "execution_count": 109, - "id": "2e6836c8", + "execution_count": 15, + "id": "9c9ac8df", "metadata": {}, "outputs": [], "source": [ @@ -130,8 +130,8 @@ }, { "cell_type": "code", - "execution_count": 111, - "id": "3b55bc20", + "execution_count": 16, + "id": "0f3c8de9", "metadata": {}, "outputs": [ { @@ -149,18 +149,10 @@ }, { "cell_type": "code", - "execution_count": 118, - "id": "87f60f02", + "execution_count": 17, + "id": "fe04de85", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([21520, 240, 123])\n" - ] - } - ], + "outputs": [], "source": [ "\"\"\"projecting the patches to tokens\"\"\"\n", "EMBED_DIMENSION = 123\n", @@ -172,8 +164,8 @@ }, { "cell_type": "code", - "execution_count": 119, - "id": "b6d9e2f1", + "execution_count": 18, + "id": "884f3bf7", "metadata": {}, "outputs": [ { @@ -190,8 +182,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "78efdb7e", + "execution_count": 19, + "id": "055cb6ba", "metadata": {}, "outputs": [], "source": [ @@ -201,8 +193,8 @@ }, { "cell_type": "code", - "execution_count": 125, - "id": "34c6a456", + "execution_count": 20, + "id": "d3b08350", "metadata": {}, "outputs": [], "source": [ @@ -220,31 +212,28 @@ }, { "cell_type": "code", - "execution_count": 126, - "id": "b84bded5", + "execution_count": 26, + "id": "0d529c3f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "tensor([[ 0.0000, 1.0000, 0.0000, 1.0000, 0.0000, 1.0000],\n", - " [ 0.8415, 0.5403, 0.4477, 0.8942, 0.2138, 0.9769],\n", - " [ 0.9093, -0.4161, 0.8006, 0.5992, 0.4177, 0.9086],\n", - " [ 0.1411, -0.9900, 0.9841, 0.1774, 0.6023, 0.7983]])\n" + "torch.Size([4, 6])\n" ] } ], "source": [ "#test the positional embedding\n", "embed = embedding(4, 6, 10)\n", - "print(embed)" + "print(embed.shape)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "078e74aa", + "execution_count": 34, + "id": "caf9b479", "metadata": {}, "outputs": [], "source": [ @@ -254,28 +243,87 @@ "class VisionTransformer(nn.Module):\n", " def __init__(self, imgsize, patchsize):\n", " super().__init__()\n", - " self.C, self.W, self.H = *imgsize\n", - " self.wsize, self.hsize = *patchsize\n", - " \"\"\"components\"\"\"\n", - " self.proj = nn.Linear(self.C*self.W*self.H, EMBED_DIMENSION)\n", - " self.clstoken = nn.Parameter(torch.zeros(1, 1, EMBED_DIMENSION))\n", - " \n", - " def createPatches(self, imgs, wsize, hsize):\n", - " N, C, W, H = imgs.shape\n", + " (self.N, self.C, self.W, self.H) = imgsize\n", + " (self.wsize, self.hsize) = patchsize\n", + " \"\"\"check for errors with sizing\"\"\"\n", " if (W % wsize != 0) or (H % hsize != 0):\n", " raise Exception(\"patchsize is not appropriate\")\n", - " else if (self.C != C) or (self.H != H):\n", + " if (self.C != C) or (self.H != H):\n", " raise Exception(\"given sizes do not match\")\n", - " \"\"\"if everything ok\"\"\"\n", - " size = (N, C, W // wsize, wsize, H // hsize, hsize)\n", + " \"\"\"components\"\"\"\n", + " self.proj = nn.Linear(self.C*self.wsize*self.hsize, EMBED_DIMENSION)\n", + " self.clstoken = nn.Parameter(torch.zeros(1, 1, EMBED_DIMENSION))\n", + " Np = (self.W // wsize) * (self.H // hsize)\n", + " self.posembed = embedding(Np+1, EMBED_DIMENSION, freq=10000) #10000 is described in ViT paper\n", + " self.posembed = self.posembed.repeat(N, 1, 1)\n", + " \n", + " def createPatches(self, imgs):\n", + " size = (self.N, self.C, self.W // self.wsize, self.wsize, self.H // self.hsize, self.hsize)\n", " perm = (0, 2, 4, 1, 3, 5) #bring col, row index of patch to front\n", " flat = (1, 2) #flatten (col, row) index into col*row entry index for patches\n", " imgs = imgs.reshape(size).permute(perm).flatten(*flat)\n", " return imgs #in format Nimgs, Npatches, C, Wpatch, Hpatch\n", " \n", - " def forward(self, imgs): #assume size checking done by createPatches\n", - " patches = self.createPatches(imgs, self.wsize, self.hsize)" + " def flattenPatches(self, imgs): #takes input (N, Npatches, C, W, H)\n", + " return imgs.flatten(2, 4)\n", + " \n", + " def embedding(npatches, EMBED_DIMENSION, freq):\n", + " posembed = torch.zeros(npatches, EMBED_DIMENSION)\n", + " for i in range(npatches):\n", + " for j in range(EMBED_DIMENSION):\n", + " if j % 2 == 0:\n", + " posembed[i][j] = np.sin(i/(freq**(j/EMBED_DIMENSION)))\n", + " else:\n", + " posembed[i][j] = np.cos(i/(freq**((j-1)/EMBED_DIMENSION)))\n", + " return posembed\n", + " \n", + " def forward(self, imgs, prepatched=True): #assume size checking done by createPatches\n", + " if not prepatched:\n", + " imgs = self.createPatches(imgs)\n", + " imgs = self.flattenPatches(imgs)\n", + " \"\"\"projection embedding\"\"\"\n", + " tokens = self.proj(imgs)\n", + " print(\"tokens shape:\", tokens.shape)\n", + " N, Np, P = tokens.shape\n", + " clstoken = self.clstoken.repeat(N, 1, 1)\n", + " print(\"cls shape:\", clstoken.shape)\n", + " tokens = torch.cat([clstoken, tokens], dim=1)\n", + " print(\"tokens shape:\", tokens.shape)\n", + " tokens = tokens + self.posembed\n", + " print(\"tokens+embed shape:\", tokens.shape)\n", + " " ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "caab0810", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tokens shape: torch.Size([21520, 240, 123])\n", + "cls shape: torch.Size([21520, 1, 123])\n", + "tokens shape: torch.Size([21520, 241, 123])\n", + "tokens+embed shape: torch.Size([21520, 241, 123])\n" + ] + } + ], + "source": [ + "patchsize = (16, 16)\n", + "ViT = VisionTransformer(xtrain.shape, patchsize)\n", + "ViT.forward(xtrain, prepatched=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b226909e", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 8fa1522bb60bff94274958114c075e2a09464d51 Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 18 Oct 2023 04:29:15 +1000 Subject: [PATCH 06/24] added attention and transformer block --- .../vision-transformer-4696689/model.ipynb | 89 ++++++++++++++----- 1 file changed, 66 insertions(+), 23 deletions(-) diff --git a/recognition/vision-transformer-4696689/model.ipynb b/recognition/vision-transformer-4696689/model.ipynb index e579e6687..1159dc92c 100644 --- a/recognition/vision-transformer-4696689/model.ipynb +++ b/recognition/vision-transformer-4696689/model.ipynb @@ -80,7 +80,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "7cf030d3", + "id": "cda6b4d2", "metadata": {}, "outputs": [], "source": [ @@ -90,7 +90,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "081275a2", + "id": "b75b1f37", "metadata": {}, "outputs": [ { @@ -118,7 +118,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "9c9ac8df", + "id": "4a5e269a", "metadata": {}, "outputs": [], "source": [ @@ -131,7 +131,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "0f3c8de9", + "id": "77000fbb", "metadata": {}, "outputs": [ { @@ -150,7 +150,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "fe04de85", + "id": "5459379c", "metadata": {}, "outputs": [], "source": [ @@ -165,7 +165,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "884f3bf7", + "id": "a9140821", "metadata": {}, "outputs": [ { @@ -183,7 +183,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "055cb6ba", + "id": "48408915", "metadata": {}, "outputs": [], "source": [ @@ -194,7 +194,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "d3b08350", + "id": "44377362", "metadata": {}, "outputs": [], "source": [ @@ -213,7 +213,7 @@ { "cell_type": "code", "execution_count": 26, - "id": "0d529c3f", + "id": "67f42615", "metadata": {}, "outputs": [ { @@ -233,7 +233,7 @@ { "cell_type": "code", "execution_count": 34, - "id": "caf9b479", + "id": "be1ad77d", "metadata": {}, "outputs": [], "source": [ @@ -279,25 +279,22 @@ " \n", " def forward(self, imgs, prepatched=True): #assume size checking done by createPatches\n", " if not prepatched:\n", - " imgs = self.createPatches(imgs)\n", - " imgs = self.flattenPatches(imgs)\n", - " \"\"\"projection embedding\"\"\"\n", - " tokens = self.proj(imgs)\n", - " print(\"tokens shape:\", tokens.shape)\n", + " imgs = self.createPatches(imgs) #create patches\n", + " imgs = self.flattenPatches(imgs) #flatten patch C,W,H into one array\n", + " \"\"\"Linear Projection and Positional Embedding\"\"\"\n", + " tokens = self.proj(imgs) #perform linear projection\n", " N, Np, P = tokens.shape\n", " clstoken = self.clstoken.repeat(N, 1, 1)\n", - " print(\"cls shape:\", clstoken.shape)\n", - " tokens = torch.cat([clstoken, tokens], dim=1)\n", - " print(\"tokens shape:\", tokens.shape)\n", - " tokens = tokens + self.posembed\n", - " print(\"tokens+embed shape:\", tokens.shape)\n", + " tokens = torch.cat([clstoken, tokens], dim=1) #concat the class token\n", + " tokens = tokens + self.posembed #add positional encoding\n", + " \"\"\"Transformer\"\"\"\n", " " ] }, { "cell_type": "code", "execution_count": 35, - "id": "caab0810", + "id": "e88c7967", "metadata": {}, "outputs": [ { @@ -317,13 +314,59 @@ "ViT.forward(xtrain, prepatched=False)" ] }, + { + "cell_type": "code", + "execution_count": 36, + "id": "32a484b1", + "metadata": {}, + "outputs": [], + "source": [ + "class Attention(nn.Module):\n", + " def __init__(self, heads, EMBED_DIMENSION):\n", + " super().__init__()\n", + " self.heads = heads\n", + " self.attn = nn.MultiheadAttention(EMBED_DIMENSION, heads, batch_first=True)\n", + " self.Q = nn.Linear(EMBED_DIMENSION, EMBED_DIMENSION, bias=False)\n", + " self.K = nn.Linear(EMBED_DIMENSION, EMBED_DIMENSION, bias=False)\n", + " self.V = nn.Linear(EMBED_DIMENSION, EMBED_DIMENSION, bias=False)\n", + " \n", + " def forward(self, x):\n", + " Q = self.Q(x)\n", + " K = self.K(x)\n", + " V = self.V(x)\n", + " \n", + " attnout, attnweights = self.attn(Q, K, V)" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "b226909e", + "id": "49b11d09", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "class TransBlock(nn.Module):\n", + " def __init__(self, heads, EMBED_DIMENSION, fflsize)\n", + " super().__init__()\n", + " self.fnorm = nn.LayerNorm(EMBED_DIMENSION)\n", + " self.snorm = nn.LayerNorm(EMBED_DIMENSION)\n", + " self.attn = Attention(heads, EMBED_DIMENSION)\n", + " self.ffl = nn.Sequential(\n", + " nn.Linear(EMBED_DIMENSION, fflsize),\n", + " nn.GELU(),\n", + " nn.Linear(fflsize, EMBED_DIMENSION)\n", + " )\n", + " \n", + " def forward(self, x):\n", + " \"\"\"\n", + " Switching to pre-MHA LayerNorm is supposed to give better performance,\n", + " this is used in other models such as LLMs like GPT. Gradients are meant\n", + " to be stabilised. This is different to the original ViT paper.\n", + " \"\"\"\n", + " x = x + self.attn(self.fnorm(x))\n", + " x = x + self.ffl(self.snorm(x))\n", + " return x" + ] } ], "metadata": { From e1fb46a2b0eaa0156552898fc052668cac238a56 Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 18 Oct 2023 04:45:27 +1000 Subject: [PATCH 07/24] cleaned up model file --- .../vision-transformer-4696689/model.ipynb | 339 +++--------------- 1 file changed, 43 insertions(+), 296 deletions(-) diff --git a/recognition/vision-transformer-4696689/model.ipynb b/recognition/vision-transformer-4696689/model.ipynb index 1159dc92c..05760ddee 100644 --- a/recognition/vision-transformer-4696689/model.ipynb +++ b/recognition/vision-transformer-4696689/model.ipynb @@ -2,238 +2,62 @@ "cells": [ { "cell_type": "code", - "execution_count": 4, - "id": "206e485b", - "metadata": {}, - "outputs": [], - "source": [ - "\"\"\"numpy and torch\"\"\"\n", - "import numpy as np\n", - "import torch\n", - "\n", - "\"\"\"PIL\"\"\"\n", - "from PIL import Image\n", - "\n", - "\"\"\"torchvision and utils\"\"\"\n", - "import torchvision.transforms as transforms\n", - "from torch.utils.data import DataLoader, Dataset\n", - "from torchvision.utils import make_grid\n", - "from torchvision.utils import save_image\n", - "\n", - "\"\"\"os\"\"\"\n", - "import os\n", - "\n", - "\n", - "\"\"\"Get image to tensor\"\"\"\n", - "transform = transforms.Compose([\n", - " transforms.PILToTensor()\n", - "])\n", - "\n", - "\"\"\"Loading data into arrays\"\"\"\n", - "xtrain, xtrain, xtest, ytest = [], [], [], []\n", - "\n", - "\"\"\"training data\"\"\"\n", - "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", - "size = [0, 0]\n", - "for i, DIR in enumerate(trainDIRs):\n", - " for filename in os.listdir(DIR):\n", - " f = os.path.join(DIR, filename)\n", - " img = Image.open(f)\n", - " tensor = transform(img).float()\n", - " tensor.require_grad = True\n", - " xtrain.append(tensor/255)\n", - " size[i] += 1\n", - "xtrain = torch.stack(xtrain)\n", - "ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", - "\n", - "\"\"\"testing data\"\"\"\n", - "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", - "size = [0, 0]\n", - "for i, DIR in enumerate(testDIRs):\n", - " for filename in os.listdir(DIR):\n", - " f = os.path.join(DIR, filename)\n", - " img = Image.open(f)\n", - " tensor = transform(img).float()\n", - " tensor.require_grad = True\n", - " xtest.append(tensor/255)\n", - " size[i] += 1\n", - "xtest = torch.stack(xtest)\n", - "ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "e4ae7366", - "metadata": {}, - "outputs": [], - "source": [ - "def createPatches(imgs, wsize, hsize):\n", - " N, C, W, H = imgs.shape #number imgs, channels, width, height\n", - " size = (N, C, W // wsize, wsize, H // hsize, hsize)\n", - " perm = (0, 2, 4, 1, 3, 5) #bring col, row index of patch to front\n", - " flat = (1, 2) #flatten (col, row) index into col*row entry index for patches\n", - " imgs = imgs.reshape(size).permute(perm).flatten(*flat)\n", - " return imgs" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "cda6b4d2", - "metadata": {}, - "outputs": [], - "source": [ - "patches = createPatches(xtrain, 16, 16)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "b75b1f37", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "whole thing\n", - "torch.Size([21520, 1, 240, 256])\n", - "torch.Size([21520, 240, 1, 16, 16])\n", - "individual image\n", - "torch.Size([1, 240, 256])\n", - "torch.Size([240, 1, 16, 16])\n" - ] - } - ], - "source": [ - "print(\"whole thing\")\n", - "print(xtrain.shape)\n", - "print(patches.shape)\n", - "print(\"individual image\")\n", - "print(xtrain[0].shape)\n", - "print(patches[0].shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "4a5e269a", - "metadata": {}, - "outputs": [], - "source": [ - "import torch.nn as nn\n", - "\n", - "def flattenPatches(imgs): #takes input (N, Npatches, C, W, H)\n", - " return imgs.flatten(2, 4)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "77000fbb", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([21520, 240, 256])\n" - ] - } - ], - "source": [ - "flattenedpatches = flattenPatches(patches)\n", - "print(flattenedpatches.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "5459379c", - "metadata": {}, - "outputs": [], - "source": [ - "\"\"\"projecting the patches to tokens\"\"\"\n", - "EMBED_DIMENSION = 123\n", - "wsize, hsize = 16, 16\n", - "N, C, W, H = xtrain.shape\n", - "proj = nn.Linear(C*wsize*hsize, EMBED_DIMENSION)\n", - "tokens = proj(flattenedpatches)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "a9140821", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([21520, 240, 123])\n" - ] - } - ], - "source": [ - "print(tokens.shape) #of the form N, Ntokens, EMBED_DIMENSION" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "48408915", + "execution_count": 36, + "id": "8df4e19a", "metadata": {}, "outputs": [], "source": [ - "\"\"\"adding the class tokens\"\"\"\n", - "clstoken = nn.Parameter(torch.zeros(1, 1, EMBED_DIMENSION))" + "class Attention(nn.Module):\n", + " def __init__(self, heads, EMBED_DIMENSION):\n", + " super().__init__()\n", + " self.heads = heads\n", + " self.attn = nn.MultiheadAttention(EMBED_DIMENSION, heads, batch_first=True)\n", + " self.Q = nn.Linear(EMBED_DIMENSION, EMBED_DIMENSION, bias=False)\n", + " self.K = nn.Linear(EMBED_DIMENSION, EMBED_DIMENSION, bias=False)\n", + " self.V = nn.Linear(EMBED_DIMENSION, EMBED_DIMENSION, bias=False)\n", + " \n", + " def forward(self, x):\n", + " Q = self.Q(x)\n", + " K = self.K(x)\n", + " V = self.V(x)\n", + " \n", + " attnout, attnweights = self.attn(Q, K, V)" ] }, { "cell_type": "code", - "execution_count": 20, - "id": "44377362", + "execution_count": null, + "id": "339c9272", "metadata": {}, "outputs": [], "source": [ - "\"\"\"positional embedding\"\"\"\n", - "def embedding(npatches, EMBED_DIMENSION, freq):\n", - " posembed = torch.zeros(npatches, EMBED_DIMENSION)\n", - " for i in range(npatches):\n", - " for j in range(EMBED_DIMENSION):\n", - " if j % 2 == 0:\n", - " posembed[i][j] = np.sin(i/(freq**(j/EMBED_DIMENSION)))\n", - " else:\n", - " posembed[i][j] = np.cos(i/(freq**((j-1)/EMBED_DIMENSION)))\n", - " return posembed" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "67f42615", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([4, 6])\n" - ] - } - ], - "source": [ - "#test the positional embedding\n", - "embed = embedding(4, 6, 10)\n", - "print(embed.shape)" + "class TransBlock(nn.Module):\n", + " def __init__(self, heads, EMBED_DIMENSION, fflsize)\n", + " super().__init__()\n", + " self.fnorm = nn.LayerNorm(EMBED_DIMENSION)\n", + " self.snorm = nn.LayerNorm(EMBED_DIMENSION)\n", + " self.attn = Attention(heads, EMBED_DIMENSION)\n", + " self.ffl = nn.Sequential(\n", + " nn.Linear(EMBED_DIMENSION, fflsize),\n", + " nn.GELU(),\n", + " nn.Linear(fflsize, EMBED_DIMENSION)\n", + " )\n", + " \n", + " def forward(self, x):\n", + " \"\"\"\n", + " Switching to pre-MHA LayerNorm is supposed to give better performance,\n", + " this is used in other models such as LLMs like GPT. Gradients are meant\n", + " to be stabilised. This is different to the original ViT paper.\n", + " \"\"\"\n", + " x = x + self.attn(self.fnorm(x))\n", + " x = x + self.ffl(self.snorm(x))\n", + " return x" ] }, { "cell_type": "code", "execution_count": 34, - "id": "be1ad77d", + "id": "ed2d628d", "metadata": {}, "outputs": [], "source": [ @@ -241,7 +65,7 @@ "Vision Transformer Class to create a vision transformer model\n", "\"\"\"\n", "class VisionTransformer(nn.Module):\n", - " def __init__(self, imgsize, patchsize):\n", + " def __init__(self, imgsize, patchsize, fflscale, nblocks):\n", " super().__init__()\n", " (self.N, self.C, self.W, self.H) = imgsize\n", " (self.wsize, self.hsize) = patchsize\n", @@ -286,87 +110,10 @@ " N, Np, P = tokens.shape\n", " clstoken = self.clstoken.repeat(N, 1, 1)\n", " tokens = torch.cat([clstoken, tokens], dim=1) #concat the class token\n", - " tokens = tokens + self.posembed #add positional encoding\n", + " x = tokens + self.posembed #add positional encoding\n", " \"\"\"Transformer\"\"\"\n", " " ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "e88c7967", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tokens shape: torch.Size([21520, 240, 123])\n", - "cls shape: torch.Size([21520, 1, 123])\n", - "tokens shape: torch.Size([21520, 241, 123])\n", - "tokens+embed shape: torch.Size([21520, 241, 123])\n" - ] - } - ], - "source": [ - "patchsize = (16, 16)\n", - "ViT = VisionTransformer(xtrain.shape, patchsize)\n", - "ViT.forward(xtrain, prepatched=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "32a484b1", - "metadata": {}, - "outputs": [], - "source": [ - "class Attention(nn.Module):\n", - " def __init__(self, heads, EMBED_DIMENSION):\n", - " super().__init__()\n", - " self.heads = heads\n", - " self.attn = nn.MultiheadAttention(EMBED_DIMENSION, heads, batch_first=True)\n", - " self.Q = nn.Linear(EMBED_DIMENSION, EMBED_DIMENSION, bias=False)\n", - " self.K = nn.Linear(EMBED_DIMENSION, EMBED_DIMENSION, bias=False)\n", - " self.V = nn.Linear(EMBED_DIMENSION, EMBED_DIMENSION, bias=False)\n", - " \n", - " def forward(self, x):\n", - " Q = self.Q(x)\n", - " K = self.K(x)\n", - " V = self.V(x)\n", - " \n", - " attnout, attnweights = self.attn(Q, K, V)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "49b11d09", - "metadata": {}, - "outputs": [], - "source": [ - "class TransBlock(nn.Module):\n", - " def __init__(self, heads, EMBED_DIMENSION, fflsize)\n", - " super().__init__()\n", - " self.fnorm = nn.LayerNorm(EMBED_DIMENSION)\n", - " self.snorm = nn.LayerNorm(EMBED_DIMENSION)\n", - " self.attn = Attention(heads, EMBED_DIMENSION)\n", - " self.ffl = nn.Sequential(\n", - " nn.Linear(EMBED_DIMENSION, fflsize),\n", - " nn.GELU(),\n", - " nn.Linear(fflsize, EMBED_DIMENSION)\n", - " )\n", - " \n", - " def forward(self, x):\n", - " \"\"\"\n", - " Switching to pre-MHA LayerNorm is supposed to give better performance,\n", - " this is used in other models such as LLMs like GPT. Gradients are meant\n", - " to be stabilised. This is different to the original ViT paper.\n", - " \"\"\"\n", - " x = x + self.attn(self.fnorm(x))\n", - " x = x + self.ffl(self.snorm(x))\n", - " return x" - ] } ], "metadata": { From 6960226943f1fba6fdaf42e23f09cc4347d9a6c6 Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 18 Oct 2023 05:15:08 +1000 Subject: [PATCH 08/24] cleaned up files --- .../vision-transformer-4696689/dataset.ipynb | 110 ++++++++++++++++++ .../vision-transformer-4696689/model.ipynb | 48 +++++--- 2 files changed, 139 insertions(+), 19 deletions(-) create mode 100644 recognition/vision-transformer-4696689/dataset.ipynb diff --git a/recognition/vision-transformer-4696689/dataset.ipynb b/recognition/vision-transformer-4696689/dataset.ipynb new file mode 100644 index 000000000..9891e689b --- /dev/null +++ b/recognition/vision-transformer-4696689/dataset.ipynb @@ -0,0 +1,110 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "206e485b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so, 6): Library not loaded: @rpath/libpng16.16.dylib\n", + " Referenced from: /Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so\n", + " Reason: Incompatible library version: image.so requires version 56.0.0 or later, but libpng16.16.dylib provides version 54.0.0'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", + " warn(\n" + ] + } + ], + "source": [ + "\"\"\"numpy and torch\"\"\"\n", + "import numpy as np\n", + "import torch\n", + "\n", + "\"\"\"PIL\"\"\"\n", + "from PIL import Image\n", + "\n", + "\"\"\"torchvision and utils\"\"\"\n", + "import torchvision.transforms as transforms\n", + "from torch.utils.data import DataLoader, Dataset\n", + "\n", + "\"\"\"os\"\"\"\n", + "import os\n", + "\n", + "\"\"\"Assumes images have pixel values in range [0,255]\"\"\"\n", + "def getImages(trainDIRs, testDIRS)\n", + " \"\"\"Get image to tensor\"\"\"\n", + " transform = transforms.Compose([\n", + " transforms.PILToTensor()\n", + " ])\n", + " \"\"\"Loading data into arrays\"\"\"\n", + " xtrain, xtrain, xtest, ytest = [], [], [], []\n", + " \"\"\"training data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(trainDIRs):\n", + " for filename in os.listdir(DIR):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " xtrain.append(tensor/255)\n", + " size[i] += 1\n", + " xtrain = torch.stack(xtrain)\n", + " ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " \"\"\"testing data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(testDIRs):\n", + " for filename in os.listdir(DIR):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " xtest.append(tensor/255)\n", + " size[i] += 1\n", + " xtest = torch.stack(xtest)\n", + " ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " return xtrain, ytrain, xtest, ytest" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e0583f37", + "metadata": {}, + "outputs": [], + "source": [ + "def createPatches(self, imgs):\n", + " size = (self.N, self.C, self.W // self.wsize, self.wsize, self.H // self.hsize, self.hsize)\n", + " perm = (0, 2, 4, 1, 3, 5) #bring col, row index of patch to front\n", + " flat = (1, 2) #flatten (col, row) index into col*row entry index for patches\n", + " imgs = imgs.reshape(size).permute(perm).flatten(*flat)\n", + " return imgs #in format Nimgs, Npatches, C, Wpatch, Hpatch\n", + " \n", + "def flattenPatches(self, imgs): #takes input (N, Npatches, C, W, H)\n", + " return imgs.flatten(2, 4)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/recognition/vision-transformer-4696689/model.ipynb b/recognition/vision-transformer-4696689/model.ipynb index 05760ddee..ce6c07c4e 100644 --- a/recognition/vision-transformer-4696689/model.ipynb +++ b/recognition/vision-transformer-4696689/model.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": 36, - "id": "8df4e19a", + "id": "58be4eb2", "metadata": {}, "outputs": [], "source": [ @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": null, - "id": "339c9272", + "id": "bdfc6404", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +57,7 @@ { "cell_type": "code", "execution_count": 34, - "id": "ed2d628d", + "id": "b133fec8", "metadata": {}, "outputs": [], "source": [ @@ -65,7 +65,7 @@ "Vision Transformer Class to create a vision transformer model\n", "\"\"\"\n", "class VisionTransformer(nn.Module):\n", - " def __init__(self, imgsize, patchsize, fflscale, nblocks):\n", + " def __init__(self, classes=2, imgsize, patchsize=(16,16), heads=2, fflscale=2, nblocks):\n", " super().__init__()\n", " (self.N, self.C, self.W, self.H) = imgsize\n", " (self.wsize, self.hsize) = patchsize\n", @@ -80,16 +80,13 @@ " Np = (self.W // wsize) * (self.H // hsize)\n", " self.posembed = embedding(Np+1, EMBED_DIMENSION, freq=10000) #10000 is described in ViT paper\n", " self.posembed = self.posembed.repeat(N, 1, 1)\n", - " \n", - " def createPatches(self, imgs):\n", - " size = (self.N, self.C, self.W // self.wsize, self.wsize, self.H // self.hsize, self.hsize)\n", - " perm = (0, 2, 4, 1, 3, 5) #bring col, row index of patch to front\n", - " flat = (1, 2) #flatten (col, row) index into col*row entry index for patches\n", - " imgs = imgs.reshape(size).permute(perm).flatten(*flat)\n", - " return imgs #in format Nimgs, Npatches, C, Wpatch, Hpatch\n", - " \n", - " def flattenPatches(self, imgs): #takes input (N, Npatches, C, W, H)\n", - " return imgs.flatten(2, 4)\n", + " self.transformer = nn.Sequential(\n", + " *((TransBlock(heads, EMBED_DIMENSION, int(fflscale*EMBED_DIMENSION)))*nblocks)\n", + " )\n", + " self.classifier = nn.Sequential(\n", + " nn.LayerNorm(EMBED_DIMENSION),\n", + " nn.Linear(classes)\n", + " )\n", " \n", " def embedding(npatches, EMBED_DIMENSION, freq):\n", " posembed = torch.zeros(npatches, EMBED_DIMENSION)\n", @@ -101,10 +98,7 @@ " posembed[i][j] = np.cos(i/(freq**((j-1)/EMBED_DIMENSION)))\n", " return posembed\n", " \n", - " def forward(self, imgs, prepatched=True): #assume size checking done by createPatches\n", - " if not prepatched:\n", - " imgs = self.createPatches(imgs) #create patches\n", - " imgs = self.flattenPatches(imgs) #flatten patch C,W,H into one array\n", + " def forward(self, imgs): #assume size checking done by createPatches\n", " \"\"\"Linear Projection and Positional Embedding\"\"\"\n", " tokens = self.proj(imgs) #perform linear projection\n", " N, Np, P = tokens.shape\n", @@ -112,7 +106,23 @@ " tokens = torch.cat([clstoken, tokens], dim=1) #concat the class token\n", " x = tokens + self.posembed #add positional encoding\n", " \"\"\"Transformer\"\"\"\n", - " " + " x = self.transformer(x)\n", + " \"\"\"Classification\"\"\"\n", + " y = x[0]\n", + " return self.classifier(y)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4364b735", + "metadata": {}, + "outputs": [], + "source": [ + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "\n", + "from dataset.py import " ] } ], From 44a60d6ca5922eb855614c9aa90a8e4fba5344fa Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 18 Oct 2023 05:16:23 +1000 Subject: [PATCH 09/24] deleted image-loading file --- .../image-loading.ipynb | 105 ------------------ 1 file changed, 105 deletions(-) delete mode 100644 recognition/vision-transformer-4696689/image-loading.ipynb diff --git a/recognition/vision-transformer-4696689/image-loading.ipynb b/recognition/vision-transformer-4696689/image-loading.ipynb deleted file mode 100644 index 4bd45408c..000000000 --- a/recognition/vision-transformer-4696689/image-loading.ipynb +++ /dev/null @@ -1,105 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "id": "206e485b", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so, 6): Library not loaded: @rpath/libpng16.16.dylib\n", - " Referenced from: /Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so\n", - " Reason: Incompatible library version: image.so requires version 56.0.0 or later, but libpng16.16.dylib provides version 54.0.0'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", - " warn(\n" - ] - } - ], - "source": [ - "\"\"\"numpy and torch\"\"\"\n", - "import numpy as np\n", - "import torch\n", - "\n", - "\"\"\"PIL\"\"\"\n", - "from PIL import Image\n", - "\n", - "\"\"\"torchvision and utils\"\"\"\n", - "import torchvision.transforms as transforms\n", - "from torch.utils.data import DataLoader, Dataset\n", - "from torchvision.utils import make_grid\n", - "from torchvision.utils import save_image\n", - "\n", - "\"\"\"os\"\"\"\n", - "import os\n", - "\n", - "\n", - "\"\"\"Get image to tensor\"\"\"\n", - "transform = transforms.Compose([\n", - " transforms.PILToTensor()\n", - "])\n", - "\n", - "\"\"\"Loading data into arrays\"\"\"\n", - "xtrain, xtrain, xtest, ytest = [], [], [], []\n", - "\n", - "\"\"\"training data\"\"\"\n", - "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", - "size = [0, 0]\n", - "for i, DIR in enumerate(trainDIRs):\n", - " for filename in os.listdir(DIR):\n", - " f = os.path.join(DIR, filename)\n", - " img = Image.open(f)\n", - " tensor = transform(img).float()\n", - " tensor.require_grad = True\n", - " xtrain.append(tensor/255)\n", - " size[i] += 1\n", - "xtrain = torch.stack(xtrain)\n", - "ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", - "\n", - "\"\"\"testing data\"\"\"\n", - "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", - "size = [0, 0]\n", - "for i, DIR in enumerate(testDIRs):\n", - " for filename in os.listdir(DIR):\n", - " f = os.path.join(DIR, filename)\n", - " img = Image.open(f)\n", - " tensor = transform(img).float()\n", - " tensor.require_grad = True\n", - " xtest.append(tensor/255)\n", - " size[i] += 1\n", - "xtest = torch.stack(xtest)\n", - "ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3e6af055", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.9.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From e3adfde0a56d237377231bbb2f1c490735038f69 Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 18 Oct 2023 15:31:39 +1000 Subject: [PATCH 10/24] cleaned up into multiple files, tested working, tested training (but not with train/test functions). Left to do: make 3D model, then check still works --- .../vision-transformer-4696689/dataset.ipynb | 183 +++++++++- .../vision-transformer-4696689/dataset.py | 106 ++++++ .../vision-transformer-4696689/model.ipynb | 71 ++-- .../vision-transformer-4696689/model.py | 87 +++++ .../vision-transformer-4696689/train.ipynb | 322 ++++++++++++++++++ 5 files changed, 721 insertions(+), 48 deletions(-) create mode 100644 recognition/vision-transformer-4696689/dataset.py create mode 100644 recognition/vision-transformer-4696689/model.py create mode 100644 recognition/vision-transformer-4696689/train.ipynb diff --git a/recognition/vision-transformer-4696689/dataset.ipynb b/recognition/vision-transformer-4696689/dataset.ipynb index 9891e689b..ee941623b 100644 --- a/recognition/vision-transformer-4696689/dataset.ipynb +++ b/recognition/vision-transformer-4696689/dataset.ipynb @@ -2,8 +2,8 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, - "id": "206e485b", + "execution_count": 1, + "id": "d12ae03c", "metadata": {}, "outputs": [ { @@ -18,6 +18,9 @@ } ], "source": [ + "\"\"\"\n", + "Imports Here\n", + "\"\"\"\n", "\"\"\"numpy and torch\"\"\"\n", "import numpy as np\n", "import torch\n", @@ -30,10 +33,41 @@ "from torch.utils.data import DataLoader, Dataset\n", "\n", "\"\"\"os\"\"\"\n", - "import os\n", - "\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d7621a39", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nLoading data from local file\\n'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Loading data from local file\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "206e485b", + "metadata": {}, + "outputs": [], + "source": [ "\"\"\"Assumes images have pixel values in range [0,255]\"\"\"\n", - "def getImages(trainDIRs, testDIRS)\n", + "def getImages(trainDIRs, testDIRS):\n", " \"\"\"Get image to tensor\"\"\"\n", " transform = transforms.Compose([\n", " transforms.PILToTensor()\n", @@ -69,21 +103,150 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "e0583f37", + "execution_count": 4, + "id": "16828153", "metadata": {}, "outputs": [], "source": [ - "def createPatches(self, imgs):\n", - " size = (self.N, self.C, self.W // self.wsize, self.wsize, self.H // self.hsize, self.hsize)\n", + "def createPatches(imgs, patchsize):\n", + " (N, C, W, H) = imgs.shape\n", + " (wsize, hsize) = patchsize\n", + " \"\"\"check for errors with sizing\"\"\"\n", + " if (W % wsize != 0) or (H % hsize != 0):\n", + " raise Exception(\"patchsize is not appropriate\")\n", + " if (C != C) or (H != H):\n", + " raise Exception(\"given sizes do not match\")\n", + " size = (N, C, W // wsize, wsize, H // hsize, hsize)\n", " perm = (0, 2, 4, 1, 3, 5) #bring col, row index of patch to front\n", " flat = (1, 2) #flatten (col, row) index into col*row entry index for patches\n", " imgs = imgs.reshape(size).permute(perm).flatten(*flat)\n", " return imgs #in format Nimgs, Npatches, C, Wpatch, Hpatch\n", " \n", - "def flattenPatches(self, imgs): #takes input (N, Npatches, C, W, H)\n", + "def flattenPatches(imgs): #takes input (N, Npatches, C, W, H)\n", " return imgs.flatten(2, 4)" ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "8dd9ba68", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nDataloader\\n'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Dataloader\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0da50adb", + "metadata": {}, + "outputs": [], + "source": [ + "class DatasetWrapper(Dataset):\n", + " def __init__(self, X, y=None):\n", + " self.X, self.y = X, y\n", + "\n", + " def __len__(self):\n", + " return len(self.X)\n", + "\n", + " def __getitem__(self, idx):\n", + " if self.y is None:\n", + " return self.X[idx]\n", + " else:\n", + " return self.X[idx], self.y[idx]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "00855a85", + "metadata": {}, + "outputs": [ + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [7]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m trainDIRs \u001b[38;5;241m=\u001b[39m [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m../../../AD_NC/train/AD/\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m../../../AD_NC/train/NC\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 2\u001b[0m testDIRs \u001b[38;5;241m=\u001b[39m [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m../../../AD_NC/test/AD/\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m../../../AD_NC/test/NC\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m----> 3\u001b[0m xtrain, ytrain, xtest, ytest \u001b[38;5;241m=\u001b[39m \u001b[43mgetImages\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtrainDIRs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtestDIRs\u001b[49m\u001b[43m)\u001b[49m\n", + "Input \u001b[0;32mIn [3]\u001b[0m, in \u001b[0;36mgetImages\u001b[0;34m(trainDIRs, testDIRS)\u001b[0m\n\u001b[1;32m 13\u001b[0m f \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(DIR, filename)\n\u001b[1;32m 14\u001b[0m img \u001b[38;5;241m=\u001b[39m Image\u001b[38;5;241m.\u001b[39mopen(f)\n\u001b[0;32m---> 15\u001b[0m tensor \u001b[38;5;241m=\u001b[39m \u001b[43mtransform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimg\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mfloat()\n\u001b[1;32m 16\u001b[0m tensor\u001b[38;5;241m.\u001b[39mrequire_grad \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m 17\u001b[0m xtrain\u001b[38;5;241m.\u001b[39mappend(tensor\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m255\u001b[39m)\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torchvision/transforms/transforms.py:95\u001b[0m, in \u001b[0;36mCompose.__call__\u001b[0;34m(self, img)\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, img):\n\u001b[1;32m 94\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtransforms:\n\u001b[0;32m---> 95\u001b[0m img \u001b[38;5;241m=\u001b[39m \u001b[43mt\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m img\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torchvision/transforms/transforms.py:166\u001b[0m, in \u001b[0;36mPILToTensor.__call__\u001b[0;34m(self, pic)\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, pic):\n\u001b[1;32m 155\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 156\u001b[0m \u001b[38;5;124;03m .. note::\u001b[39;00m\n\u001b[1;32m 157\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[38;5;124;03m Tensor: Converted image.\u001b[39;00m\n\u001b[1;32m 165\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 166\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpil_to_tensor\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpic\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torchvision/transforms/functional.py:207\u001b[0m, in \u001b[0;36mpil_to_tensor\u001b[0;34m(pic)\u001b[0m\n\u001b[1;32m 204\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m torch\u001b[38;5;241m.\u001b[39mas_tensor(nppic)\n\u001b[1;32m 206\u001b[0m \u001b[38;5;66;03m# handle PIL Image\u001b[39;00m\n\u001b[0;32m--> 207\u001b[0m img \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mas_tensor(\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marray\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpic\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m)\n\u001b[1;32m 208\u001b[0m img \u001b[38;5;241m=\u001b[39m img\u001b[38;5;241m.\u001b[39mview(pic\u001b[38;5;241m.\u001b[39msize[\u001b[38;5;241m1\u001b[39m], pic\u001b[38;5;241m.\u001b[39msize[\u001b[38;5;241m0\u001b[39m], F_pil\u001b[38;5;241m.\u001b[39mget_image_num_channels(pic))\n\u001b[1;32m 209\u001b[0m \u001b[38;5;66;03m# put it from HWC to CHW format\u001b[39;00m\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/PIL/Image.py:675\u001b[0m, in \u001b[0;36mImage.__array__\u001b[0;34m(self, dtype)\u001b[0m\n\u001b[1;32m 673\u001b[0m new[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtobytes(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraw\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mL\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 674\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 675\u001b[0m new[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtobytes\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 677\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m np\u001b[38;5;241m.\u001b[39marray(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ArrayData(new), dtype)\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/PIL/Image.py:718\u001b[0m, in \u001b[0;36mImage.tobytes\u001b[0;34m(self, encoder_name, *args)\u001b[0m\n\u001b[1;32m 715\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m encoder_name \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraw\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m args \u001b[38;5;241m==\u001b[39m ():\n\u001b[1;32m 716\u001b[0m args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmode\n\u001b[0;32m--> 718\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 720\u001b[0m \u001b[38;5;66;03m# unpack data\u001b[39;00m\n\u001b[1;32m 721\u001b[0m e \u001b[38;5;241m=\u001b[39m _getencoder(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmode, encoder_name, args)\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/PIL/ImageFile.py:253\u001b[0m, in \u001b[0;36mImageFile.load\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 247\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m(\n\u001b[1;32m 248\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimage file is truncated \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 249\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m(\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(b)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m bytes not processed)\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 250\u001b[0m )\n\u001b[1;32m 252\u001b[0m b \u001b[38;5;241m=\u001b[39m b \u001b[38;5;241m+\u001b[39m s\n\u001b[0;32m--> 253\u001b[0m n, err_code \u001b[38;5;241m=\u001b[39m \u001b[43mdecoder\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 254\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m n \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m 255\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8790aae4", + "metadata": {}, + "outputs": [], + "source": [ + "xtrain = flattenPatches(createPatches(xtrain, (16,16)))\n", + "xtest = flattenPatches(createPatches(xtest, (16,16)))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5e33b2e", + "metadata": {}, + "outputs": [], + "source": [ + "def trainloader(batchsize=16):\n", + " return DataLoader(DatasetWrapper(xtrain, ytrain), batchsize=batchsize, shuffle=True)\n", + "\n", + "def testloader():\n", + " return DataLoader(DatasetWrapper(xtest, ytest), batchsize=1, shuffle=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e722bf46", + "metadata": {}, + "outputs": [], + "source": [ + "def trainshape():\n", + " return xtrain.shape\n", + "\n", + "def testshape():\n", + " return xtest.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d704f722", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/recognition/vision-transformer-4696689/dataset.py b/recognition/vision-transformer-4696689/dataset.py new file mode 100644 index 000000000..bc423f80f --- /dev/null +++ b/recognition/vision-transformer-4696689/dataset.py @@ -0,0 +1,106 @@ +""" +Imports Here +""" +"""numpy and torch""" +import numpy as np +import torch + +"""PIL""" +from PIL import Image + +"""torchvision and utils""" +import torchvision.transforms as transforms +from torch.utils.data import DataLoader, Dataset + +"""os""" +import os + +""" +Loading data from local file +""" + +"""Assumes images have pixel values in range [0,255]""" +def getImages(trainDIRs, testDIRS): + """Get image to tensor""" + transform = transforms.Compose([ + transforms.PILToTensor() + ]) + """Loading data into arrays""" + xtrain, xtrain, xtest, ytest = [], [], [], [] + """training data""" + size = [0, 0] + for i, DIR in enumerate(trainDIRs): + for filename in os.listdir(DIR): + f = os.path.join(DIR, filename) + img = Image.open(f) + tensor = transform(img).float() + tensor.require_grad = True + xtrain.append(tensor/255) + size[i] += 1 + xtrain = torch.stack(xtrain) + ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0)) + """testing data""" + size = [0, 0] + for i, DIR in enumerate(testDIRs): + for filename in os.listdir(DIR): + f = os.path.join(DIR, filename) + img = Image.open(f) + tensor = transform(img).float() + tensor.require_grad = True + xtest.append(tensor/255) + size[i] += 1 + xtest = torch.stack(xtest) + ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0)) + return xtrain, ytrain, xtest, ytest + +def createPatches(imgs, patchsize): + (N, C, W, H) = imgs.shape + (wsize, hsize) = patchsize + """check for errors with sizing""" + if (W % wsize != 0) or (H % hsize != 0): + raise Exception("patchsize is not appropriate") + if (C != C) or (H != H): + raise Exception("given sizes do not match") + size = (N, C, W // wsize, wsize, H // hsize, hsize) + perm = (0, 2, 4, 1, 3, 5) #bring col, row index of patch to front + flat = (1, 2) #flatten (col, row) index into col*row entry index for patches + imgs = imgs.reshape(size).permute(perm).flatten(*flat) + return imgs #in format Nimgs, Npatches, C, Wpatch, Hpatch + +def flattenPatches(imgs): #takes input (N, Npatches, C, W, H) + return imgs.flatten(2, 4) + +""" +Dataloader +""" + +class DatasetWrapper(Dataset): + def __init__(self, X, y=None): + self.X, self.y = X, y + + def __len__(self): + return len(self.X) + + def __getitem__(self, idx): + if self.y is None: + return self.X[idx] + else: + return self.X[idx], self.y[idx] + +trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC'] +testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC'] +xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs) +xtrain = flattenPatches(createPatches(xtrain, (16,16))) +xtest = flattenPatches(createPatches(xtest, (16,16))) + +def trainloader(batchsize=16): + return DataLoader(DatasetWrapper(xtrain, ytrain), batch_size=batchsize, shuffle=True) + +def testloader(): + return DataLoader(DatasetWrapper(xtest, ytest), batch_size=1, shuffle=True) + +def trainshape(): + return xtrain.shape[1:] + +def testshape(): + return xtest.shape \ No newline at end of file diff --git a/recognition/vision-transformer-4696689/model.ipynb b/recognition/vision-transformer-4696689/model.ipynb index ce6c07c4e..f686287c6 100644 --- a/recognition/vision-transformer-4696689/model.ipynb +++ b/recognition/vision-transformer-4696689/model.ipynb @@ -2,8 +2,23 @@ "cells": [ { "cell_type": "code", - "execution_count": 36, - "id": "58be4eb2", + "execution_count": 37, + "id": "fc1d26a6", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Imports Here\n", + "\"\"\"\n", + "import numpy as np\n", + "import torch\n", + "import torch.nn as nn" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "00044d75", "metadata": {}, "outputs": [], "source": [ @@ -21,18 +36,19 @@ " K = self.K(x)\n", " V = self.V(x)\n", " \n", - " attnout, attnweights = self.attn(Q, K, V)" + " attnout, attnweights = self.attn(Q, K, V)\n", + " return attnout" ] }, { "cell_type": "code", - "execution_count": null, - "id": "bdfc6404", + "execution_count": 43, + "id": "733599f9", "metadata": {}, "outputs": [], "source": [ "class TransBlock(nn.Module):\n", - " def __init__(self, heads, EMBED_DIMENSION, fflsize)\n", + " def __init__(self, heads, EMBED_DIMENSION, fflsize):\n", " super().__init__()\n", " self.fnorm = nn.LayerNorm(EMBED_DIMENSION)\n", " self.snorm = nn.LayerNorm(EMBED_DIMENSION)\n", @@ -49,15 +65,15 @@ " this is used in other models such as LLMs like GPT. Gradients are meant\n", " to be stabilised. This is different to the original ViT paper.\n", " \"\"\"\n", - " x = x + self.attn(self.fnorm(x))\n", + " x = x + self.attn(self.fnorm(x))[0]\n", " x = x + self.ffl(self.snorm(x))\n", " return x" ] }, { "cell_type": "code", - "execution_count": 34, - "id": "b133fec8", + "execution_count": 44, + "id": "e6ac9e2b", "metadata": {}, "outputs": [], "source": [ @@ -65,27 +81,20 @@ "Vision Transformer Class to create a vision transformer model\n", "\"\"\"\n", "class VisionTransformer(nn.Module):\n", - " def __init__(self, classes=2, imgsize, patchsize=(16,16), heads=2, fflscale=2, nblocks):\n", + " def __init__(self, classes=2, inputsize=(1,1,1), heads=2, fflscale=2, nblocks=1):\n", " super().__init__()\n", - " (self.N, self.C, self.W, self.H) = imgsize\n", - " (self.wsize, self.hsize) = patchsize\n", - " \"\"\"check for errors with sizing\"\"\"\n", - " if (W % wsize != 0) or (H % hsize != 0):\n", - " raise Exception(\"patchsize is not appropriate\")\n", - " if (self.C != C) or (self.H != H):\n", - " raise Exception(\"given sizes do not match\")\n", + " (self.N, self.Np, self.P) = inputsize\n", " \"\"\"components\"\"\"\n", - " self.proj = nn.Linear(self.C*self.wsize*self.hsize, EMBED_DIMENSION)\n", + " self.proj = nn.Linear(self.P, EMBED_DIMENSION)\n", " self.clstoken = nn.Parameter(torch.zeros(1, 1, EMBED_DIMENSION))\n", - " Np = (self.W // wsize) * (self.H // hsize)\n", - " self.posembed = embedding(Np+1, EMBED_DIMENSION, freq=10000) #10000 is described in ViT paper\n", - " self.posembed = self.posembed.repeat(N, 1, 1)\n", + " self.posembed = self.embedding(self.Np+1, EMBED_DIMENSION, freq=10000) #10000 is described in ViT paper\n", + " self.posembed = self.posembed.repeat(self.N, 1, 1)\n", " self.transformer = nn.Sequential(\n", - " *((TransBlock(heads, EMBED_DIMENSION, int(fflscale*EMBED_DIMENSION)))*nblocks)\n", + " *((TransBlock(heads, EMBED_DIMENSION, int(fflscale*EMBED_DIMENSION)),)*nblocks)\n", " )\n", " self.classifier = nn.Sequential(\n", " nn.LayerNorm(EMBED_DIMENSION),\n", - " nn.Linear(classes)\n", + " nn.Linear(EMBED_DIMENSION, classes)\n", " )\n", " \n", " def embedding(npatches, EMBED_DIMENSION, freq):\n", @@ -101,8 +110,7 @@ " def forward(self, imgs): #assume size checking done by createPatches\n", " \"\"\"Linear Projection and Positional Embedding\"\"\"\n", " tokens = self.proj(imgs) #perform linear projection\n", - " N, Np, P = tokens.shape\n", - " clstoken = self.clstoken.repeat(N, 1, 1)\n", + " clstoken = self.clstoken.repeat(self.N, 1, 1)\n", " tokens = torch.cat([clstoken, tokens], dim=1) #concat the class token\n", " x = tokens + self.posembed #add positional encoding\n", " \"\"\"Transformer\"\"\"\n", @@ -111,19 +119,6 @@ " y = x[0]\n", " return self.classifier(y)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4364b735", - "metadata": {}, - "outputs": [], - "source": [ - "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", - "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", - "\n", - "from dataset.py import " - ] } ], "metadata": { diff --git a/recognition/vision-transformer-4696689/model.py b/recognition/vision-transformer-4696689/model.py new file mode 100644 index 000000000..b29d2bab1 --- /dev/null +++ b/recognition/vision-transformer-4696689/model.py @@ -0,0 +1,87 @@ +""" +Imports Here +""" +import numpy as np +import torch +import torch.nn as nn + +class Attention(nn.Module): + def __init__(self, heads, embed): + super().__init__() + self.heads = heads + self.attn = nn.MultiheadAttention(embed, heads, batch_first=True) + self.Q = nn.Linear(embed, embed, bias=False) + self.K = nn.Linear(embed, embed, bias=False) + self.V = nn.Linear(embed, embed, bias=False) + + def forward(self, x): + Q = self.Q(x) + K = self.K(x) + V = self.V(x) + + attnout, attnweights = self.attn(Q, K, V) + return attnout + +class TransBlock(nn.Module): + def __init__(self, heads, embed, fflsize): + super().__init__() + self.fnorm = nn.LayerNorm(embed) + self.snorm = nn.LayerNorm(embed) + self.attn = Attention(heads, embed) + self.ffl = nn.Sequential( + nn.Linear(embed, fflsize), + nn.GELU(), + nn.Linear(fflsize, embed) + ) + + def forward(self, x): + """ + Switching to pre-MHA LayerNorm is supposed to give better performance, + this is used in other models such as LLMs like GPT. Gradients are meant + to be stabilised. This is different to the original ViT paper. + """ + x = x + self.attn(self.fnorm(x)) + x = x + self.ffl(self.snorm(x)) + return x + +""" +Vision Transformer Class to create a vision transformer model +""" +class VisionTransformer(nn.Module): + def __init__(self, classes=2, inputsize=(1,1,1), heads=2, embed=64, fflscale=2, nblocks=1): + super().__init__() + (self.N, self.Np, self.P) = inputsize + """components""" + self.proj = nn.Linear(self.P, embed) + self.clstoken = nn.Parameter(torch.zeros(1, 1, embed)) + self.posembed = self.embedding(self.Np+1, embed) + self.posembed = self.posembed.repeat(self.N, 1, 1) + self.transformer = nn.Sequential( + *((TransBlock(heads, embed, int(fflscale*embed)),)*nblocks) + ) + self.classifier = nn.Sequential( + nn.LayerNorm(embed), + nn.Linear(embed, classes) + ) + + def embedding(self, npatches, embed, freq=10000): #10000 is described in ViT paper + posembed = torch.zeros(npatches, embed) + for i in range(npatches): + for j in range(embed): + if j % 2 == 0: + posembed[i][j] = np.sin(i/(freq**(j/embed))) + else: + posembed[i][j] = np.cos(i/(freq**((j-1)/embed))) + return posembed + + def forward(self, imgs): #assume size checking done by createPatches + """Linear Projection and Positional Embedding""" + tokens = self.proj(imgs) #perform linear projection + clstoken = self.clstoken.repeat(self.N, 1, 1) + tokens = torch.cat([clstoken, tokens], dim=1) #concat the class token + x = tokens + self.posembed #add positional encoding + """Transformer""" + x = self.transformer(x) + """Classification""" + y = x[:,0] + return self.classifier(y) \ No newline at end of file diff --git a/recognition/vision-transformer-4696689/train.ipynb b/recognition/vision-transformer-4696689/train.ipynb new file mode 100644 index 000000000..403f99f6a --- /dev/null +++ b/recognition/vision-transformer-4696689/train.ipynb @@ -0,0 +1,322 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "73ebb771", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so, 6): Library not loaded: @rpath/libpng16.16.dylib\n", + " Referenced from: /Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so\n", + " Reason: Incompatible library version: image.so requires version 56.0.0 or later, but libpng16.16.dylib provides version 54.0.0'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", + " warn(\n" + ] + } + ], + "source": [ + "\"\"\"\n", + "Imports Here\n", + "\"\"\"\n", + "from dataset import trainloader\n", + "from dataset import testloader\n", + "from dataset import trainshape\n", + "from dataset import testshape" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "df0ea69a", + "metadata": {}, + "outputs": [], + "source": [ + "from model import VisionTransformer\n", + "from model import Attention\n", + "from model import TransBlock" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ae8aebe7", + "metadata": {}, + "outputs": [], + "source": [ + "TRAIN_LOSS = []\n", + "TRAIN_ACC = []\n", + "\n", + "def train(model, dataloader, lossfunc, lr=0.1, momentum=0.9, batch_size=16, nepochs=10):\n", + " device = next(net.parameters()).device # check what device the net parameters are on\n", + " optimizer = optim.Adam(net.parameters(), weight_decay=1e-5, lr=lr)\n", + " \n", + " \"\"\"training\"\"\"\n", + " for i in range(nepochs): # for each epoch\n", + " epoch_loss = 0\n", + " model.train()\n", + " n_batches = 0\n", + " for (x_batch, y_batch) in dataloader: # for each mini-batch\n", + " optimizer.zero_grad()\n", + " loss = lossfunc(model.forward(x_batch), y_batch)\n", + " loss.backward()\n", + " optimizer.step()\n", + " epoch_loss += loss\n", + " n_batches += 1\n", + " epoch_loss /= n_batches\n", + " \n", + " \"\"\"evaluating\"\"\"\n", + " model.eval()\n", + " accuracy = test(net, x, y, batch_size=batch_size)\n", + "\n", + " \"\"\"get performance\"\"\"\n", + " TRAIN_LOSS.append(epoch_loss)\n", + " TRAIN_ACC.append(accuracy)\n", + "\n", + "def test(model, dataloader, batch_size=1):\n", + " with torch.no_grad(): # disable automatic gradient computation for efficiency\n", + " device = next(net.parameters()).device\n", + " \n", + " \"\"\"make predictions\"\"\"\n", + " pcls = []\n", + " items = 0\n", + " for x, y in dataloader:\n", + " x = x.to(device)\n", + " torch.max(model(x), 1)[1].cpu()\n", + " tcls = torch.max(y, 1)[1].cpu()\n", + " pcls.append(tcls)\n", + " items += 1\n", + "\n", + " \"\"\"get accuracy\"\"\"\n", + " pcls = torch.cat(pcls) # concat predictions on the mini-batches\n", + " accuracy = pcls.sum().float() / items\n", + " return accuracy" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e550e8dd", + "metadata": {}, + "outputs": [], + "source": [ + "shape = trainshape()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9618c563", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([240, 256])\n" + ] + } + ], + "source": [ + "print(shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "75a45973", + "metadata": {}, + "outputs": [], + "source": [ + "batchsize=16\n", + "Np, P = trainshape()\n", + "model = VisionTransformer(inputsize=(batchsize, Np, P), nblocks=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "2114dc6c", + "metadata": {}, + "outputs": [], + "source": [ + "trainloader1 = trainloader(batchsize=batchsize)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "7b54a6f0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor(1.5862, grad_fn=)\n", + "90.11283302307129\n" + ] + } + ], + "source": [ + "import time\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.optim as optim\n", + "\n", + "criterion = nn.CrossEntropyLoss()\n", + "optimiser = optim.AdamW(model.parameters(), lr=1e-4)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "18488555", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor(0.7551, grad_fn=)\n", + "97.1146309375763\n" + ] + } + ], + "source": [ + "TIMES = []\n", + "LOSS = []\n", + "i = 0\n", + "criterion.zero_grad()\n", + "out = model(x)\n", + "loss = criterion(out, y.type(torch.LongTensor))\n", + "print(loss)\n", + "time0 = time.time()\n", + "for (x, y) in trainloader1:\n", + " #time1 = time.time()\n", + " criterion.zero_grad()\n", + " out = model(x)\n", + " loss = criterion(out, y.type(torch.LongTensor))\n", + " LOSS.append(loss.item())\n", + " loss.backward()\n", + " optimiser.step()\n", + " #time2 = time.time()\n", + " #TIMES.append(time2-time1)\n", + "time1 = time.time()\n", + "print(time1-time0)\n", + "#print(\"TIMES:\", TIMES)\n", + "#print(\"LOSS:\", LOSS)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "e2166df5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor(0.7144, grad_fn=)\n" + ] + } + ], + "source": [ + "criterion.zero_grad()\n", + "out = model(x)\n", + "loss = criterion(out, y.type(torch.LongTensor))\n", + "print(loss)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "d87adc9e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "62530\n" + ] + } + ], + "source": [ + "print(sum(param.numel() for param in model.parameters()))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "724959ba", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "64\n", + "16384\n", + "64\n", + "64\n", + "64\n", + "64\n", + "64\n", + "12288\n", + "192\n", + "4096\n", + "64\n", + "4096\n", + "4096\n", + "4096\n", + "8192\n", + "128\n", + "8192\n", + "64\n", + "64\n", + "64\n", + "128\n", + "2\n" + ] + } + ], + "source": [ + "for param in model.parameters():\n", + " print(param.numel())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1580bf48", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 0a9a516ea165acfea739d07faa2c2311ddd87131 Mon Sep 17 00:00:00 2001 From: oliver Date: Thu, 19 Oct 2023 00:45:44 +1000 Subject: [PATCH 11/24] made into 3D samples --- .../vision-transformer-4696689/dataset.ipynb | 154 +++++++++++------- 1 file changed, 94 insertions(+), 60 deletions(-) diff --git a/recognition/vision-transformer-4696689/dataset.ipynb b/recognition/vision-transformer-4696689/dataset.ipynb index ee941623b..692c45453 100644 --- a/recognition/vision-transformer-4696689/dataset.ipynb +++ b/recognition/vision-transformer-4696689/dataset.ipynb @@ -2,21 +2,10 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, - "id": "d12ae03c", + "execution_count": 10, + "id": "338da719", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so, 6): Library not loaded: @rpath/libpng16.16.dylib\n", - " Referenced from: /Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so\n", - " Reason: Incompatible library version: image.so requires version 56.0.0 or later, but libpng16.16.dylib provides version 54.0.0'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", - " warn(\n" - ] - } - ], + "outputs": [], "source": [ "\"\"\"\n", "Imports Here\n", @@ -38,8 +27,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "d7621a39", + "execution_count": 11, + "id": "65011ff4", "metadata": {}, "outputs": [ { @@ -48,7 +37,7 @@ "'\\nLoading data from local file\\n'" ] }, - "execution_count": 2, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -61,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 20, "id": "206e485b", "metadata": {}, "outputs": [], @@ -77,59 +66,94 @@ " \"\"\"training data\"\"\"\n", " size = [0, 0]\n", " for i, DIR in enumerate(trainDIRs):\n", - " for filename in os.listdir(DIR):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", " f = os.path.join(DIR, filename)\n", " img = Image.open(f)\n", " tensor = transform(img).float()\n", " tensor.require_grad = True\n", - " xtrain.append(tensor/255)\n", - " size[i] += 1\n", + " px.append(tensor/255)\n", + " j = (j+1) % 20\n", + " if j == 0:\n", + " xtrain.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", " xtrain = torch.stack(xtrain)\n", + " print(xtrain.shape)\n", " ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " \n", " \"\"\"testing data\"\"\"\n", " size = [0, 0]\n", " for i, DIR in enumerate(testDIRs):\n", - " for filename in os.listdir(DIR):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", " f = os.path.join(DIR, filename)\n", " img = Image.open(f)\n", " tensor = transform(img).float()\n", " tensor.require_grad = True\n", - " xtest.append(tensor/255)\n", - " size[i] += 1\n", + " px.append(tensor/255)\n", + " if j == 0:\n", + " xtest.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", " xtest = torch.stack(xtest)\n", + " print(xtest.shape)\n", " ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", " return xtrain, ytrain, xtest, ytest" ] }, { "cell_type": "code", - "execution_count": 4, - "id": "16828153", + "execution_count": 21, + "id": "a3c45c1a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1076, 20, 1, 240, 256])\n", + "torch.Size([9000, 1, 1, 240, 256])\n" + ] + } + ], + "source": [ + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "292100c2", "metadata": {}, "outputs": [], "source": [ "def createPatches(imgs, patchsize):\n", - " (N, C, W, H) = imgs.shape\n", + " (N, M, C, W, H) = imgs.shape\n", " (wsize, hsize) = patchsize\n", " \"\"\"check for errors with sizing\"\"\"\n", " if (W % wsize != 0) or (H % hsize != 0):\n", " raise Exception(\"patchsize is not appropriate\")\n", " if (C != C) or (H != H):\n", " raise Exception(\"given sizes do not match\")\n", - " size = (N, C, W // wsize, wsize, H // hsize, hsize)\n", - " perm = (0, 2, 4, 1, 3, 5) #bring col, row index of patch to front\n", - " flat = (1, 2) #flatten (col, row) index into col*row entry index for patches\n", + " size = (N, M, C, W // wsize, wsize, H // hsize, hsize)\n", + " perm = (0, 1, 3, 5, 2, 4, 6) #bring col, row index of patch to front\n", + " flat = (2, 3) #flatten (col, row) index into col*row entry index for patches\n", " imgs = imgs.reshape(size).permute(perm).flatten(*flat)\n", " return imgs #in format Nimgs, Npatches, C, Wpatch, Hpatch\n", " \n", - "def flattenPatches(imgs): #takes input (N, Npatches, C, W, H)\n", - " return imgs.flatten(2, 4)" + "def flattenPatches(imgs): #takes input (N, M, Npatches, C, W, H) returns (N, M*Npatches, C*W*H)\n", + " return imgs.flatten(3, 5).flatten(1, 2)" ] }, { "cell_type": "code", - "execution_count": 5, - "id": "8dd9ba68", + "execution_count": 24, + "id": "e0897522", "metadata": {}, "outputs": [ { @@ -138,7 +162,7 @@ "'\\nDataloader\\n'" ] }, - "execution_count": 5, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -152,7 +176,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "0da50adb", + "id": "05c80732", "metadata": {}, "outputs": [], "source": [ @@ -172,26 +196,16 @@ }, { "cell_type": "code", - "execution_count": 7, - "id": "00855a85", + "execution_count": 28, + "id": "ea41eef5", "metadata": {}, "outputs": [ { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Input \u001b[0;32mIn [7]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m trainDIRs \u001b[38;5;241m=\u001b[39m [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m../../../AD_NC/train/AD/\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m../../../AD_NC/train/NC\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 2\u001b[0m testDIRs \u001b[38;5;241m=\u001b[39m [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m../../../AD_NC/test/AD/\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m../../../AD_NC/test/NC\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m----> 3\u001b[0m xtrain, ytrain, xtest, ytest \u001b[38;5;241m=\u001b[39m \u001b[43mgetImages\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtrainDIRs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtestDIRs\u001b[49m\u001b[43m)\u001b[49m\n", - "Input \u001b[0;32mIn [3]\u001b[0m, in \u001b[0;36mgetImages\u001b[0;34m(trainDIRs, testDIRS)\u001b[0m\n\u001b[1;32m 13\u001b[0m f \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(DIR, filename)\n\u001b[1;32m 14\u001b[0m img \u001b[38;5;241m=\u001b[39m Image\u001b[38;5;241m.\u001b[39mopen(f)\n\u001b[0;32m---> 15\u001b[0m tensor \u001b[38;5;241m=\u001b[39m \u001b[43mtransform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimg\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mfloat()\n\u001b[1;32m 16\u001b[0m tensor\u001b[38;5;241m.\u001b[39mrequire_grad \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m 17\u001b[0m xtrain\u001b[38;5;241m.\u001b[39mappend(tensor\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m255\u001b[39m)\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torchvision/transforms/transforms.py:95\u001b[0m, in \u001b[0;36mCompose.__call__\u001b[0;34m(self, img)\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, img):\n\u001b[1;32m 94\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtransforms:\n\u001b[0;32m---> 95\u001b[0m img \u001b[38;5;241m=\u001b[39m \u001b[43mt\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m img\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torchvision/transforms/transforms.py:166\u001b[0m, in \u001b[0;36mPILToTensor.__call__\u001b[0;34m(self, pic)\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, pic):\n\u001b[1;32m 155\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 156\u001b[0m \u001b[38;5;124;03m .. note::\u001b[39;00m\n\u001b[1;32m 157\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[38;5;124;03m Tensor: Converted image.\u001b[39;00m\n\u001b[1;32m 165\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 166\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpil_to_tensor\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpic\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torchvision/transforms/functional.py:207\u001b[0m, in \u001b[0;36mpil_to_tensor\u001b[0;34m(pic)\u001b[0m\n\u001b[1;32m 204\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m torch\u001b[38;5;241m.\u001b[39mas_tensor(nppic)\n\u001b[1;32m 206\u001b[0m \u001b[38;5;66;03m# handle PIL Image\u001b[39;00m\n\u001b[0;32m--> 207\u001b[0m img \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mas_tensor(\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marray\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpic\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m)\n\u001b[1;32m 208\u001b[0m img \u001b[38;5;241m=\u001b[39m img\u001b[38;5;241m.\u001b[39mview(pic\u001b[38;5;241m.\u001b[39msize[\u001b[38;5;241m1\u001b[39m], pic\u001b[38;5;241m.\u001b[39msize[\u001b[38;5;241m0\u001b[39m], F_pil\u001b[38;5;241m.\u001b[39mget_image_num_channels(pic))\n\u001b[1;32m 209\u001b[0m \u001b[38;5;66;03m# put it from HWC to CHW format\u001b[39;00m\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/PIL/Image.py:675\u001b[0m, in \u001b[0;36mImage.__array__\u001b[0;34m(self, dtype)\u001b[0m\n\u001b[1;32m 673\u001b[0m new[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtobytes(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraw\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mL\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 674\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 675\u001b[0m new[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtobytes\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 677\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m np\u001b[38;5;241m.\u001b[39marray(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ArrayData(new), dtype)\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/PIL/Image.py:718\u001b[0m, in \u001b[0;36mImage.tobytes\u001b[0;34m(self, encoder_name, *args)\u001b[0m\n\u001b[1;32m 715\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m encoder_name \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraw\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m args \u001b[38;5;241m==\u001b[39m ():\n\u001b[1;32m 716\u001b[0m args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmode\n\u001b[0;32m--> 718\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 720\u001b[0m \u001b[38;5;66;03m# unpack data\u001b[39;00m\n\u001b[1;32m 721\u001b[0m e \u001b[38;5;241m=\u001b[39m _getencoder(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmode, encoder_name, args)\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/PIL/ImageFile.py:253\u001b[0m, in \u001b[0;36mImageFile.load\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 247\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m(\n\u001b[1;32m 248\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimage file is truncated \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 249\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m(\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(b)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m bytes not processed)\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 250\u001b[0m )\n\u001b[1;32m 252\u001b[0m b \u001b[38;5;241m=\u001b[39m b \u001b[38;5;241m+\u001b[39m s\n\u001b[0;32m--> 253\u001b[0m n, err_code \u001b[38;5;241m=\u001b[39m \u001b[43mdecoder\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 254\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m n \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m 255\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1076, 20, 1, 240, 256])\n", + "torch.Size([9000, 1, 1, 240, 256])\n" ] } ], @@ -203,8 +217,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "8790aae4", + "execution_count": 29, + "id": "1f077f43", "metadata": {}, "outputs": [], "source": [ @@ -214,8 +228,28 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "d5e33b2e", + "execution_count": 30, + "id": "074c00c1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1076, 4800, 256])\n", + "torch.Size([9000, 240, 256])\n" + ] + } + ], + "source": [ + "print(xtrain.shape)\n", + "print(xtest.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "a02e05bd", "metadata": {}, "outputs": [], "source": [ @@ -228,8 +262,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "e722bf46", + "execution_count": 32, + "id": "18d6ca10", "metadata": {}, "outputs": [], "source": [ @@ -243,7 +277,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d704f722", + "id": "cc6b7b32", "metadata": {}, "outputs": [], "source": [] From 1ec4fc78169c8160b4fd0d338257296a5b9be195 Mon Sep 17 00:00:00 2001 From: oliver Date: Thu, 19 Oct 2023 02:23:36 +1000 Subject: [PATCH 12/24] train/test working, experiment with batch size --- .../vision-transformer-4696689/dataset.py | 48 ++-- .../vision-transformer-4696689/train.ipynb | 248 ++++++++++-------- 2 files changed, 168 insertions(+), 128 deletions(-) diff --git a/recognition/vision-transformer-4696689/dataset.py b/recognition/vision-transformer-4696689/dataset.py index bc423f80f..cad1af88d 100644 --- a/recognition/vision-transformer-4696689/dataset.py +++ b/recognition/vision-transformer-4696689/dataset.py @@ -18,7 +18,6 @@ """ Loading data from local file """ - """Assumes images have pixel values in range [0,255]""" def getImages(trainDIRs, testDIRS): """Get image to tensor""" @@ -30,50 +29,65 @@ def getImages(trainDIRs, testDIRS): """training data""" size = [0, 0] for i, DIR in enumerate(trainDIRs): - for filename in os.listdir(DIR): + px = [] + j = 0 + for filename in sorted(os.listdir(DIR)): f = os.path.join(DIR, filename) img = Image.open(f) tensor = transform(img).float() tensor.require_grad = True - xtrain.append(tensor/255) - size[i] += 1 + px.append(tensor/255) + j = (j+1) % 20 + if j == 0: + xtrain.append(torch.stack(px)) + px = [] + size[i] += 1 xtrain = torch.stack(xtrain) ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0)) + """testing data""" size = [0, 0] for i, DIR in enumerate(testDIRs): - for filename in os.listdir(DIR): + px = [] + j = 0 + for filename in sorted(os.listdir(DIR)): f = os.path.join(DIR, filename) img = Image.open(f) tensor = transform(img).float() tensor.require_grad = True - xtest.append(tensor/255) - size[i] += 1 + px.append(tensor/255) + if j == 0: + xtest.append(torch.stack(px)) + px = [] + size[i] += 1 xtest = torch.stack(xtest) ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0)) return xtrain, ytrain, xtest, ytest +trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC'] +testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC'] +xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs) + def createPatches(imgs, patchsize): - (N, C, W, H) = imgs.shape + (N, M, C, W, H) = imgs.shape (wsize, hsize) = patchsize """check for errors with sizing""" if (W % wsize != 0) or (H % hsize != 0): raise Exception("patchsize is not appropriate") if (C != C) or (H != H): raise Exception("given sizes do not match") - size = (N, C, W // wsize, wsize, H // hsize, hsize) - perm = (0, 2, 4, 1, 3, 5) #bring col, row index of patch to front - flat = (1, 2) #flatten (col, row) index into col*row entry index for patches + size = (N, M, C, W // wsize, wsize, H // hsize, hsize) + perm = (0, 1, 3, 5, 2, 4, 6) #bring col, row index of patch to front + flat = (2, 3) #flatten (col, row) index into col*row entry index for patches imgs = imgs.reshape(size).permute(perm).flatten(*flat) return imgs #in format Nimgs, Npatches, C, Wpatch, Hpatch -def flattenPatches(imgs): #takes input (N, Npatches, C, W, H) - return imgs.flatten(2, 4) +def flattenPatches(imgs): #takes input (N, M, Npatches, C, W, H) returns (N, M*Npatches, C*W*H) + return imgs.flatten(3, 5).flatten(1, 2) """ Dataloader """ - class DatasetWrapper(Dataset): def __init__(self, X, y=None): self.X, self.y = X, y @@ -90,17 +104,21 @@ def __getitem__(self, idx): trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC'] testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC'] xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs) +ytrain, ytest = ytrain.type(torch.LongTensor), ytest.type(torch.LongTensor) xtrain = flattenPatches(createPatches(xtrain, (16,16))) xtest = flattenPatches(createPatches(xtest, (16,16))) def trainloader(batchsize=16): return DataLoader(DatasetWrapper(xtrain, ytrain), batch_size=batchsize, shuffle=True) +def trainaccloader(): + return DataLoader(DatasetWrapper(xtrain, ytrain), batch_size=1, shuffle=True) + def testloader(): return DataLoader(DatasetWrapper(xtest, ytest), batch_size=1, shuffle=True) def trainshape(): - return xtrain.shape[1:] + return xtrain.shape def testshape(): return xtest.shape \ No newline at end of file diff --git a/recognition/vision-transformer-4696689/train.ipynb b/recognition/vision-transformer-4696689/train.ipynb index 403f99f6a..5a90c82f8 100644 --- a/recognition/vision-transformer-4696689/train.ipynb +++ b/recognition/vision-transformer-4696689/train.ipynb @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 30, "id": "ae8aebe7", "metadata": {}, "outputs": [], @@ -49,9 +49,8 @@ "TRAIN_LOSS = []\n", "TRAIN_ACC = []\n", "\n", - "def train(model, dataloader, lossfunc, lr=0.1, momentum=0.9, batch_size=16, nepochs=10):\n", - " device = next(net.parameters()).device # check what device the net parameters are on\n", - " optimizer = optim.Adam(net.parameters(), weight_decay=1e-5, lr=lr)\n", + "def train(model, dataloader, accloader, lossfunc, optimiser, lr=0.1, momentum=0.9, batch_size=16, nepochs=10):\n", + " device = next(model.parameters()).device # check what device the net parameters are on\n", " \n", " \"\"\"training\"\"\"\n", " for i in range(nepochs): # for each epoch\n", @@ -59,35 +58,46 @@ " model.train()\n", " n_batches = 0\n", " for (x_batch, y_batch) in dataloader: # for each mini-batch\n", - " optimizer.zero_grad()\n", + " time1 = time.time()\n", + " optimiser.zero_grad()\n", " loss = lossfunc(model.forward(x_batch), y_batch)\n", " loss.backward()\n", - " optimizer.step()\n", + " optimiser.step()\n", " epoch_loss += loss\n", " n_batches += 1\n", + " time2 = time.time()\n", + " print(time2-time1)\n", + " if n_batches > 4:\n", + " break\n", " epoch_loss /= n_batches\n", " \n", " \"\"\"evaluating\"\"\"\n", " model.eval()\n", - " accuracy = test(net, x, y, batch_size=batch_size)\n", + " accuracy = test(model, accloader, batch_size=batch_size)\n", "\n", " \"\"\"get performance\"\"\"\n", " TRAIN_LOSS.append(epoch_loss)\n", " TRAIN_ACC.append(accuracy)\n", + " \n", + " if i > 3:\n", + " break\n", "\n", "def test(model, dataloader, batch_size=1):\n", " with torch.no_grad(): # disable automatic gradient computation for efficiency\n", - " device = next(net.parameters()).device\n", + " device = next(model.parameters()).device\n", " \n", " \"\"\"make predictions\"\"\"\n", " pcls = []\n", " items = 0\n", " for x, y in dataloader:\n", + " if items == 0:\n", + " print(\"shape:\", x.shape, y.shape)\n", + " time1=time.time()\n", " x = x.to(device)\n", - " torch.max(model(x), 1)[1].cpu()\n", - " tcls = torch.max(y, 1)[1].cpu()\n", - " pcls.append(tcls)\n", + " pcls.append(y.cpu()-torch.max(model(x), 1)[1].cpu())\n", " items += 1\n", + " time2=time.time()\n", + " print(time2-time1)\n", "\n", " \"\"\"get accuracy\"\"\"\n", " pcls = torch.cat(pcls) # concat predictions on the mini-batches\n", @@ -115,7 +125,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "torch.Size([240, 256])\n" + "torch.Size([1076, 4800, 256])\n" ] } ], @@ -125,41 +135,33 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 47, "id": "75a45973", "metadata": {}, "outputs": [], "source": [ - "batchsize=16\n", - "Np, P = trainshape()\n", + "batchsize=\n", + "N, Np, P = trainshape()\n", "model = VisionTransformer(inputsize=(batchsize, Np, P), nblocks=2)" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 48, "id": "2114dc6c", "metadata": {}, "outputs": [], "source": [ - "trainloader1 = trainloader(batchsize=batchsize)" + "loader = trainloader(batchsize=batchsize)\n", + "accloader = trainaccloader()" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 49, "id": "7b54a6f0", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tensor(1.5862, grad_fn=)\n", - "90.11283302307129\n" - ] - } - ], + "outputs": [], "source": [ "import time\n", "import torch\n", @@ -172,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 50, "id": "18488555", "metadata": {}, "outputs": [ @@ -180,119 +182,139 @@ "name": "stdout", "output_type": "stream", "text": [ - "tensor(0.7551, grad_fn=)\n", - "97.1146309375763\n" + "shape: torch.Size([4, 4800, 256]) torch.Size([4])\n", + "1.6988067626953125\n", + "1.6274349689483643\n", + "2.037522792816162\n", + "2.5007779598236084\n", + "2.4892430305480957\n", + "2.2384021282196045\n", + "2.03725004196167\n", + "2.2166709899902344\n", + "2.241147994995117\n", + "2.036005973815918\n", + "2.048389196395874\n", + "1.8653678894042969\n", + "1.885908842086792\n", + "1.8958747386932373\n", + "1.8863003253936768\n", + "1.9965801239013672\n", + "2.178816795349121\n", + "2.106549024581909\n", + "1.9829299449920654\n", + "1.8715488910675049\n", + "1.8145999908447266\n", + "1.8260700702667236\n", + "1.8493447303771973\n", + "1.8404717445373535\n", + "1.8289730548858643\n", + "1.8821001052856445\n", + "1.874634027481079\n", + "1.8917570114135742\n", + "1.854382038116455\n", + "1.8868191242218018\n", + "2.2410099506378174\n", + "2.0835301876068115\n", + "2.0032730102539062\n", + "1.9688708782196045\n", + "1.9962589740753174\n", + "1.9557182788848877\n", + "2.1488640308380127\n", + "2.0861761569976807\n", + "2.0471909046173096\n", + "2.059058904647827\n", + "2.0342600345611572\n", + "2.2233188152313232\n", + "2.085871696472168\n", + "2.0418989658355713\n", + "2.0245487689971924\n", + "1.991652011871338\n", + "2.025761127471924\n", + "2.067377805709839\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [50]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m#train(model, trainloader1, criterion, optimiser)\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m \u001b[43mtest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrainloader1\u001b[49m\u001b[43m)\u001b[49m\n", + "Input \u001b[0;32mIn [30]\u001b[0m, in \u001b[0;36mtest\u001b[0;34m(model, dataloader, batch_size)\u001b[0m\n\u001b[1;32m 47\u001b[0m time1\u001b[38;5;241m=\u001b[39mtime\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 48\u001b[0m x \u001b[38;5;241m=\u001b[39m x\u001b[38;5;241m.\u001b[39mto(device)\n\u001b[0;32m---> 49\u001b[0m pcls\u001b[38;5;241m.\u001b[39mappend(y\u001b[38;5;241m.\u001b[39mcpu()\u001b[38;5;241m-\u001b[39mtorch\u001b[38;5;241m.\u001b[39mmax(\u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m, \u001b[38;5;241m1\u001b[39m)[\u001b[38;5;241m1\u001b[39m]\u001b[38;5;241m.\u001b[39mcpu())\n\u001b[1;32m 50\u001b[0m items \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m 51\u001b[0m time2\u001b[38;5;241m=\u001b[39mtime\u001b[38;5;241m.\u001b[39mtime()\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/Desktop/COMP3710 Project/PatternAnalysis-2023/recognition/vision-transformer-4696689/model.py:84\u001b[0m, in \u001b[0;36mVisionTransformer.forward\u001b[0;34m(self, imgs)\u001b[0m\n\u001b[1;32m 82\u001b[0m x \u001b[38;5;241m=\u001b[39m tokens \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mposembed \u001b[38;5;66;03m#add positional encoding\u001b[39;00m\n\u001b[1;32m 83\u001b[0m \u001b[38;5;124;03m\"\"\"Transformer\"\"\"\u001b[39;00m\n\u001b[0;32m---> 84\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransformer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 85\u001b[0m \u001b[38;5;124;03m\"\"\"Classification\"\"\"\u001b[39;00m\n\u001b[1;32m 86\u001b[0m y \u001b[38;5;241m=\u001b[39m x[:,\u001b[38;5;241m0\u001b[39m]\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/container.py:217\u001b[0m, in \u001b[0;36mSequential.forward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m):\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m module \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m:\n\u001b[0;32m--> 217\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mmodule\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28minput\u001b[39m\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/Desktop/COMP3710 Project/PatternAnalysis-2023/recognition/vision-transformer-4696689/model.py:43\u001b[0m, in \u001b[0;36mTransBlock.forward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, x):\n\u001b[1;32m 38\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 39\u001b[0m \u001b[38;5;124;03m Switching to pre-MHA LayerNorm is supposed to give better performance,\u001b[39;00m\n\u001b[1;32m 40\u001b[0m \u001b[38;5;124;03m this is used in other models such as LLMs like GPT. Gradients are meant\u001b[39;00m\n\u001b[1;32m 41\u001b[0m \u001b[38;5;124;03m to be stabilised. This is different to the original ViT paper.\u001b[39;00m\n\u001b[1;32m 42\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m---> 43\u001b[0m x \u001b[38;5;241m=\u001b[39m x \u001b[38;5;241m+\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfnorm\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 44\u001b[0m x \u001b[38;5;241m=\u001b[39m x \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mffl(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msnorm(x))\n\u001b[1;32m 45\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m x\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/Desktop/COMP3710 Project/PatternAnalysis-2023/recognition/vision-transformer-4696689/model.py:22\u001b[0m, in \u001b[0;36mAttention.forward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 19\u001b[0m K \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mK(x)\n\u001b[1;32m 20\u001b[0m V \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mV(x)\n\u001b[0;32m---> 22\u001b[0m attnout, attnweights \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattn\u001b[49m\u001b[43m(\u001b[49m\u001b[43mQ\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mK\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mV\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 23\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m attnout\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/activation.py:1189\u001b[0m, in \u001b[0;36mMultiheadAttention.forward\u001b[0;34m(self, query, key, value, key_padding_mask, need_weights, attn_mask, average_attn_weights, is_causal)\u001b[0m\n\u001b[1;32m 1175\u001b[0m attn_output, attn_output_weights \u001b[38;5;241m=\u001b[39m F\u001b[38;5;241m.\u001b[39mmulti_head_attention_forward(\n\u001b[1;32m 1176\u001b[0m query, key, value, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39membed_dim, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnum_heads,\n\u001b[1;32m 1177\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39min_proj_weight, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39min_proj_bias,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1186\u001b[0m average_attn_weights\u001b[38;5;241m=\u001b[39maverage_attn_weights,\n\u001b[1;32m 1187\u001b[0m is_causal\u001b[38;5;241m=\u001b[39mis_causal)\n\u001b[1;32m 1188\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1189\u001b[0m attn_output, attn_output_weights \u001b[38;5;241m=\u001b[39m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmulti_head_attention_forward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1190\u001b[0m \u001b[43m \u001b[49m\u001b[43mquery\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43membed_dim\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnum_heads\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1191\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43min_proj_weight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43min_proj_bias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1192\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias_k\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias_v\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd_zero_attn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1193\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdropout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mout_proj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mout_proj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1194\u001b[0m \u001b[43m \u001b[49m\u001b[43mtraining\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtraining\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1195\u001b[0m \u001b[43m \u001b[49m\u001b[43mkey_padding_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkey_padding_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1196\u001b[0m \u001b[43m \u001b[49m\u001b[43mneed_weights\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mneed_weights\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1197\u001b[0m \u001b[43m \u001b[49m\u001b[43mattn_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattn_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1198\u001b[0m \u001b[43m \u001b[49m\u001b[43maverage_attn_weights\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maverage_attn_weights\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1199\u001b[0m \u001b[43m \u001b[49m\u001b[43mis_causal\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mis_causal\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1200\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbatch_first \u001b[38;5;129;01mand\u001b[39;00m is_batched:\n\u001b[1;32m 1201\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m attn_output\u001b[38;5;241m.\u001b[39mtranspose(\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m0\u001b[39m), attn_output_weights\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/functional.py:5300\u001b[0m, in \u001b[0;36mmulti_head_attention_forward\u001b[0;34m(query, key, value, embed_dim_to_check, num_heads, in_proj_weight, in_proj_bias, bias_k, bias_v, add_zero_attn, dropout_p, out_proj_weight, out_proj_bias, training, key_padding_mask, need_weights, attn_mask, use_separate_proj_weight, q_proj_weight, k_proj_weight, v_proj_weight, static_k, static_v, average_attn_weights, is_causal)\u001b[0m\n\u001b[1;32m 5298\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 5299\u001b[0m attn_output_weights \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mbmm(q_scaled, k\u001b[38;5;241m.\u001b[39mtranspose(\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m))\n\u001b[0;32m-> 5300\u001b[0m attn_output_weights \u001b[38;5;241m=\u001b[39m \u001b[43msoftmax\u001b[49m\u001b[43m(\u001b[49m\u001b[43mattn_output_weights\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdim\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 5301\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m dropout_p \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0.0\u001b[39m:\n\u001b[1;32m 5302\u001b[0m attn_output_weights \u001b[38;5;241m=\u001b[39m dropout(attn_output_weights, p\u001b[38;5;241m=\u001b[39mdropout_p)\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/functional.py:1843\u001b[0m, in \u001b[0;36msoftmax\u001b[0;34m(input, dim, _stacklevel, dtype)\u001b[0m\n\u001b[1;32m 1841\u001b[0m dim \u001b[38;5;241m=\u001b[39m _get_softmax_dim(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msoftmax\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28minput\u001b[39m\u001b[38;5;241m.\u001b[39mdim(), _stacklevel)\n\u001b[1;32m 1842\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m dtype \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1843\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43minput\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msoftmax\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdim\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1844\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1845\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m\u001b[38;5;241m.\u001b[39msoftmax(dim, dtype\u001b[38;5;241m=\u001b[39mdtype)\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ - "TIMES = []\n", - "LOSS = []\n", - "i = 0\n", - "criterion.zero_grad()\n", - "out = model(x)\n", - "loss = criterion(out, y.type(torch.LongTensor))\n", - "print(loss)\n", - "time0 = time.time()\n", - "for (x, y) in trainloader1:\n", - " #time1 = time.time()\n", - " criterion.zero_grad()\n", - " out = model(x)\n", - " loss = criterion(out, y.type(torch.LongTensor))\n", - " LOSS.append(loss.item())\n", - " loss.backward()\n", - " optimiser.step()\n", - " #time2 = time.time()\n", - " #TIMES.append(time2-time1)\n", - "time1 = time.time()\n", - "print(time1-time0)\n", + "#train(model, trainloader1, criterion, optimiser)\n", + "test(model, loader, accloader)\n", + "\n", + "# TIMES = []\n", + "# LOSS = []\n", + "# i = 0\n", + "# for (x, y) in trainloader1:\n", + "# time1 = time.time()\n", + "# criterion.zero_grad()\n", + "# out = model(x)\n", + "# loss = criterion(out, y.type(torch.LongTensor))\n", + "# LOSS.append(loss.item())\n", + "# loss.backward()\n", + "# optimiser.step()\n", + "# time2 = time.time()\n", + "# TIMES.append(time2-time1)\n", + "# print(time2-time1)\n", "#print(\"TIMES:\", TIMES)\n", "#print(\"LOSS:\", LOSS)" ] }, { "cell_type": "code", - "execution_count": 21, - "id": "e2166df5", + "execution_count": null, + "id": "d87adc9e", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tensor(0.7144, grad_fn=)\n" - ] - } - ], + "outputs": [], "source": [ - "criterion.zero_grad()\n", - "out = model(x)\n", - "loss = criterion(out, y.type(torch.LongTensor))\n", - "print(loss)" + "print(sum(param.numel() for param in model.parameters()))" ] }, { "cell_type": "code", - "execution_count": 23, - "id": "d87adc9e", + "execution_count": null, + "id": "724959ba", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "62530\n" - ] - } - ], + "outputs": [], "source": [ - "print(sum(param.numel() for param in model.parameters()))" + "for param in model.parameters():\n", + " print(param.numel())" ] }, { "cell_type": "code", - "execution_count": 24, - "id": "724959ba", + "execution_count": null, + "id": "bbaac2fc", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "64\n", - "16384\n", - "64\n", - "64\n", - "64\n", - "64\n", - "64\n", - "12288\n", - "192\n", - "4096\n", - "64\n", - "4096\n", - "4096\n", - "4096\n", - "8192\n", - "128\n", - "8192\n", - "64\n", - "64\n", - "64\n", - "128\n", - "2\n" - ] - } - ], + "outputs": [], "source": [ - "for param in model.parameters():\n", - " print(param.numel())" + "print(TRAIN_LOSS)" ] }, { "cell_type": "code", "execution_count": null, - "id": "1580bf48", + "id": "e34188c0", "metadata": {}, "outputs": [], "source": [] From f126a4068862444582f78cab2ea0519f9bf5eacc Mon Sep 17 00:00:00 2001 From: oliver Date: Thu, 19 Oct 2023 03:54:45 +1000 Subject: [PATCH 13/24] parameter changing, cleaning up --- .../vision-transformer-4696689/dataset.ipynb | 91 +++----- .../vision-transformer-4696689/dataset.py | 5 +- .../vision-transformer-4696689/model.py | 5 +- .../vision-transformer-4696689/train.ipynb | 220 ++++-------------- .../vision-transformer-4696689/train.py | 90 +++++++ 5 files changed, 170 insertions(+), 241 deletions(-) create mode 100644 recognition/vision-transformer-4696689/train.py diff --git a/recognition/vision-transformer-4696689/dataset.ipynb b/recognition/vision-transformer-4696689/dataset.ipynb index 692c45453..7faec9419 100644 --- a/recognition/vision-transformer-4696689/dataset.ipynb +++ b/recognition/vision-transformer-4696689/dataset.ipynb @@ -2,10 +2,21 @@ "cells": [ { "cell_type": "code", - "execution_count": 10, + "execution_count": 1, "id": "338da719", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so, 6): Library not loaded: @rpath/libpng16.16.dylib\n", + " Referenced from: /Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so\n", + " Reason: Incompatible library version: image.so requires version 56.0.0 or later, but libpng16.16.dylib provides version 54.0.0'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", + " warn(\n" + ] + } + ], "source": [ "\"\"\"\n", "Imports Here\n", @@ -27,7 +38,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 2, "id": "65011ff4", "metadata": {}, "outputs": [ @@ -37,7 +48,7 @@ "'\\nLoading data from local file\\n'" ] }, - "execution_count": 11, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -50,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 3, "id": "206e485b", "metadata": {}, "outputs": [], @@ -80,7 +91,6 @@ " px = []\n", " size[i] += 1\n", " xtrain = torch.stack(xtrain)\n", - " print(xtrain.shape)\n", " ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", " \n", " \"\"\"testing data\"\"\"\n", @@ -99,26 +109,16 @@ " px = []\n", " size[i] += 1\n", " xtest = torch.stack(xtest)\n", - " print(xtest.shape)\n", " ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", " return xtrain, ytrain, xtest, ytest" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 4, "id": "a3c45c1a", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([1076, 20, 1, 240, 256])\n", - "torch.Size([9000, 1, 1, 240, 256])\n" - ] - } - ], + "outputs": [], "source": [ "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", @@ -127,7 +127,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 5, "id": "292100c2", "metadata": {}, "outputs": [], @@ -152,7 +152,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 6, "id": "e0897522", "metadata": {}, "outputs": [ @@ -162,7 +162,7 @@ "'\\nDataloader\\n'" ] }, - "execution_count": 24, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -175,7 +175,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "05c80732", "metadata": {}, "outputs": [], @@ -196,19 +196,10 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 8, "id": "ea41eef5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([1076, 20, 1, 240, 256])\n", - "torch.Size([9000, 1, 1, 240, 256])\n" - ] - } - ], + "outputs": [], "source": [ "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", @@ -217,7 +208,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 9, "id": "1f077f43", "metadata": {}, "outputs": [], @@ -228,27 +219,7 @@ }, { "cell_type": "code", - "execution_count": 30, - "id": "074c00c1", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([1076, 4800, 256])\n", - "torch.Size([9000, 240, 256])\n" - ] - } - ], - "source": [ - "print(xtrain.shape)\n", - "print(xtest.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, + "execution_count": 10, "id": "a02e05bd", "metadata": {}, "outputs": [], @@ -262,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 11, "id": "18d6ca10", "metadata": {}, "outputs": [], @@ -273,14 +244,6 @@ "def testshape():\n", " return xtest.shape" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cc6b7b32", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/recognition/vision-transformer-4696689/dataset.py b/recognition/vision-transformer-4696689/dataset.py index cad1af88d..c641a3de1 100644 --- a/recognition/vision-transformer-4696689/dataset.py +++ b/recognition/vision-transformer-4696689/dataset.py @@ -56,6 +56,7 @@ def getImages(trainDIRs, testDIRS): tensor = transform(img).float() tensor.require_grad = True px.append(tensor/255) + j = (j+1) % 20 if j == 0: xtest.append(torch.stack(px)) px = [] @@ -105,8 +106,8 @@ def __getitem__(self, idx): testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC'] xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs) ytrain, ytest = ytrain.type(torch.LongTensor), ytest.type(torch.LongTensor) -xtrain = flattenPatches(createPatches(xtrain, (16,16))) -xtest = flattenPatches(createPatches(xtest, (16,16))) +xtrain = flattenPatches(createPatches(xtrain, (24,32))) +xtest = flattenPatches(createPatches(xtest, (24,32))) def trainloader(batchsize=16): return DataLoader(DatasetWrapper(xtrain, ytrain), batch_size=batchsize, shuffle=True) diff --git a/recognition/vision-transformer-4696689/model.py b/recognition/vision-transformer-4696689/model.py index b29d2bab1..b8fd3eeca 100644 --- a/recognition/vision-transformer-4696689/model.py +++ b/recognition/vision-transformer-4696689/model.py @@ -55,7 +55,6 @@ def __init__(self, classes=2, inputsize=(1,1,1), heads=2, embed=64, fflscale=2, self.proj = nn.Linear(self.P, embed) self.clstoken = nn.Parameter(torch.zeros(1, 1, embed)) self.posembed = self.embedding(self.Np+1, embed) - self.posembed = self.posembed.repeat(self.N, 1, 1) self.transformer = nn.Sequential( *((TransBlock(heads, embed, int(fflscale*embed)),)*nblocks) ) @@ -77,9 +76,9 @@ def embedding(self, npatches, embed, freq=10000): #10000 is described in ViT pap def forward(self, imgs): #assume size checking done by createPatches """Linear Projection and Positional Embedding""" tokens = self.proj(imgs) #perform linear projection - clstoken = self.clstoken.repeat(self.N, 1, 1) + clstoken = self.clstoken.repeat(imgs.shape[0], 1, 1) tokens = torch.cat([clstoken, tokens], dim=1) #concat the class token - x = tokens + self.posembed #add positional encoding + x = tokens + self.posembed.repeat(imgs.shape[0], 1, 1) #add positional encoding """Transformer""" x = self.transformer(x) """Classification""" diff --git a/recognition/vision-transformer-4696689/train.ipynb b/recognition/vision-transformer-4696689/train.ipynb index 5a90c82f8..331a7cd74 100644 --- a/recognition/vision-transformer-4696689/train.ipynb +++ b/recognition/vision-transformer-4696689/train.ipynb @@ -23,6 +23,7 @@ "\"\"\"\n", "from dataset import trainloader\n", "from dataset import testloader\n", + "from dataset import trainaccloader\n", "from dataset import trainshape\n", "from dataset import testshape" ] @@ -49,7 +50,7 @@ "TRAIN_LOSS = []\n", "TRAIN_ACC = []\n", "\n", - "def train(model, dataloader, accloader, lossfunc, optimiser, lr=0.1, momentum=0.9, batch_size=16, nepochs=10):\n", + "def train(model, dataloader, accloader, lossfunc, optimiser, lr=0.1, momentum=0.9, batchsize=16, nepochs=10):\n", " device = next(model.parameters()).device # check what device the net parameters are on\n", " \n", " \"\"\"training\"\"\"\n", @@ -57,108 +58,63 @@ " epoch_loss = 0\n", " model.train()\n", " n_batches = 0\n", - " for (x_batch, y_batch) in dataloader: # for each mini-batch\n", - " time1 = time.time()\n", + " time1 = time.time()\n", + " for (x, y) in dataloader: # for each mini-batch\n", " optimiser.zero_grad()\n", - " loss = lossfunc(model.forward(x_batch), y_batch)\n", + " loss = lossfunc(model.forward(x), y)\n", " loss.backward()\n", " optimiser.step()\n", " epoch_loss += loss\n", " n_batches += 1\n", - " time2 = time.time()\n", - " print(time2-time1)\n", - " if n_batches > 4:\n", - " break\n", + " time2 = time.time()\n", + " print(\"Done an epoch\", time2-time1)\n", " epoch_loss /= n_batches\n", " \n", " \"\"\"evaluating\"\"\"\n", " model.eval()\n", - " accuracy = test(model, accloader, batch_size=batch_size)\n", + " accuracy = test(model, accloader)\n", "\n", " \"\"\"get performance\"\"\"\n", - " TRAIN_LOSS.append(epoch_loss)\n", + " TRAIN_LOSS.append(epoch_loss.item())\n", " TRAIN_ACC.append(accuracy)\n", - " \n", - " if i > 3:\n", - " break\n", "\n", - "def test(model, dataloader, batch_size=1):\n", + "def test(model, dataloader):\n", " with torch.no_grad(): # disable automatic gradient computation for efficiency\n", " device = next(model.parameters()).device\n", " \n", " \"\"\"make predictions\"\"\"\n", " pcls = []\n", " items = 0\n", + " time1=time.time()\n", " for x, y in dataloader:\n", - " if items == 0:\n", - " print(\"shape:\", x.shape, y.shape)\n", - " time1=time.time()\n", " x = x.to(device)\n", - " pcls.append(y.cpu()-torch.max(model(x), 1)[1].cpu())\n", + " pcls.append(abs(y.cpu()-torch.max(model(x), 1)[1].cpu()))\n", " items += 1\n", - " time2=time.time()\n", - " print(time2-time1)\n", + " time2 = time.time()\n", + " print(\"found accuracy in:\", time2-time1)\n", "\n", " \"\"\"get accuracy\"\"\"\n", " pcls = torch.cat(pcls) # concat predictions on the mini-batches\n", - " accuracy = pcls.sum().float() / items\n", + " accuracy = 1 - (pcls.sum().float() / items)\n", + " print(\"accuracy:\", accuracy)\n", " return accuracy" ] }, { "cell_type": "code", - "execution_count": 4, - "id": "e550e8dd", - "metadata": {}, - "outputs": [], - "source": [ - "shape = trainshape()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "9618c563", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([1076, 4800, 256])\n" - ] - } - ], - "source": [ - "print(shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 47, + "execution_count": 31, "id": "75a45973", "metadata": {}, "outputs": [], "source": [ - "batchsize=\n", + "batchsize=16\n", "N, Np, P = trainshape()\n", - "model = VisionTransformer(inputsize=(batchsize, Np, P), nblocks=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "2114dc6c", - "metadata": {}, - "outputs": [], - "source": [ - "loader = trainloader(batchsize=batchsize)\n", - "accloader = trainaccloader()" + "model = VisionTransformer(inputsize=(batchsize, Np, P), embed=128, fflscale=2, nblocks=4)" ] }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 32, "id": "7b54a6f0", "metadata": {}, "outputs": [], @@ -174,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 33, "id": "18488555", "metadata": {}, "outputs": [ @@ -182,55 +138,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "shape: torch.Size([4, 4800, 256]) torch.Size([4])\n", - "1.6988067626953125\n", - "1.6274349689483643\n", - "2.037522792816162\n", - "2.5007779598236084\n", - "2.4892430305480957\n", - "2.2384021282196045\n", - "2.03725004196167\n", - "2.2166709899902344\n", - "2.241147994995117\n", - "2.036005973815918\n", - "2.048389196395874\n", - "1.8653678894042969\n", - "1.885908842086792\n", - "1.8958747386932373\n", - "1.8863003253936768\n", - "1.9965801239013672\n", - "2.178816795349121\n", - "2.106549024581909\n", - "1.9829299449920654\n", - "1.8715488910675049\n", - "1.8145999908447266\n", - "1.8260700702667236\n", - "1.8493447303771973\n", - "1.8404717445373535\n", - "1.8289730548858643\n", - "1.8821001052856445\n", - "1.874634027481079\n", - "1.8917570114135742\n", - "1.854382038116455\n", - "1.8868191242218018\n", - "2.2410099506378174\n", - "2.0835301876068115\n", - "2.0032730102539062\n", - "1.9688708782196045\n", - "1.9962589740753174\n", - "1.9557182788848877\n", - "2.1488640308380127\n", - "2.0861761569976807\n", - "2.0471909046173096\n", - "2.059058904647827\n", - "2.0342600345611572\n", - "2.2233188152313232\n", - "2.085871696472168\n", - "2.0418989658355713\n", - "2.0245487689971924\n", - "1.991652011871338\n", - "2.025761127471924\n", - "2.067377805709839\n" + "loop time: 3.66955304145813\n", + "loop time: 4.265578031539917\n", + "loop time: 5.169572830200195\n", + "loop time: 4.732528924942017\n" ] }, { @@ -240,81 +151,46 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Input \u001b[0;32mIn [50]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m#train(model, trainloader1, criterion, optimiser)\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m \u001b[43mtest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrainloader1\u001b[49m\u001b[43m)\u001b[49m\n", - "Input \u001b[0;32mIn [30]\u001b[0m, in \u001b[0;36mtest\u001b[0;34m(model, dataloader, batch_size)\u001b[0m\n\u001b[1;32m 47\u001b[0m time1\u001b[38;5;241m=\u001b[39mtime\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 48\u001b[0m x \u001b[38;5;241m=\u001b[39m x\u001b[38;5;241m.\u001b[39mto(device)\n\u001b[0;32m---> 49\u001b[0m pcls\u001b[38;5;241m.\u001b[39mappend(y\u001b[38;5;241m.\u001b[39mcpu()\u001b[38;5;241m-\u001b[39mtorch\u001b[38;5;241m.\u001b[39mmax(\u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m, \u001b[38;5;241m1\u001b[39m)[\u001b[38;5;241m1\u001b[39m]\u001b[38;5;241m.\u001b[39mcpu())\n\u001b[1;32m 50\u001b[0m items \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m 51\u001b[0m time2\u001b[38;5;241m=\u001b[39mtime\u001b[38;5;241m.\u001b[39mtime()\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", - "File \u001b[0;32m~/Desktop/COMP3710 Project/PatternAnalysis-2023/recognition/vision-transformer-4696689/model.py:84\u001b[0m, in \u001b[0;36mVisionTransformer.forward\u001b[0;34m(self, imgs)\u001b[0m\n\u001b[1;32m 82\u001b[0m x \u001b[38;5;241m=\u001b[39m tokens \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mposembed \u001b[38;5;66;03m#add positional encoding\u001b[39;00m\n\u001b[1;32m 83\u001b[0m \u001b[38;5;124;03m\"\"\"Transformer\"\"\"\u001b[39;00m\n\u001b[0;32m---> 84\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransformer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 85\u001b[0m \u001b[38;5;124;03m\"\"\"Classification\"\"\"\u001b[39;00m\n\u001b[1;32m 86\u001b[0m y \u001b[38;5;241m=\u001b[39m x[:,\u001b[38;5;241m0\u001b[39m]\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/container.py:217\u001b[0m, in \u001b[0;36mSequential.forward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m):\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m module \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m:\n\u001b[0;32m--> 217\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mmodule\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28minput\u001b[39m\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", - "File \u001b[0;32m~/Desktop/COMP3710 Project/PatternAnalysis-2023/recognition/vision-transformer-4696689/model.py:43\u001b[0m, in \u001b[0;36mTransBlock.forward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, x):\n\u001b[1;32m 38\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 39\u001b[0m \u001b[38;5;124;03m Switching to pre-MHA LayerNorm is supposed to give better performance,\u001b[39;00m\n\u001b[1;32m 40\u001b[0m \u001b[38;5;124;03m this is used in other models such as LLMs like GPT. Gradients are meant\u001b[39;00m\n\u001b[1;32m 41\u001b[0m \u001b[38;5;124;03m to be stabilised. This is different to the original ViT paper.\u001b[39;00m\n\u001b[1;32m 42\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m---> 43\u001b[0m x \u001b[38;5;241m=\u001b[39m x \u001b[38;5;241m+\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfnorm\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 44\u001b[0m x \u001b[38;5;241m=\u001b[39m x \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mffl(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msnorm(x))\n\u001b[1;32m 45\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m x\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", - "File \u001b[0;32m~/Desktop/COMP3710 Project/PatternAnalysis-2023/recognition/vision-transformer-4696689/model.py:22\u001b[0m, in \u001b[0;36mAttention.forward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 19\u001b[0m K \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mK(x)\n\u001b[1;32m 20\u001b[0m V \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mV(x)\n\u001b[0;32m---> 22\u001b[0m attnout, attnweights \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattn\u001b[49m\u001b[43m(\u001b[49m\u001b[43mQ\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mK\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mV\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 23\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m attnout\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/activation.py:1189\u001b[0m, in \u001b[0;36mMultiheadAttention.forward\u001b[0;34m(self, query, key, value, key_padding_mask, need_weights, attn_mask, average_attn_weights, is_causal)\u001b[0m\n\u001b[1;32m 1175\u001b[0m attn_output, attn_output_weights \u001b[38;5;241m=\u001b[39m F\u001b[38;5;241m.\u001b[39mmulti_head_attention_forward(\n\u001b[1;32m 1176\u001b[0m query, key, value, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39membed_dim, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnum_heads,\n\u001b[1;32m 1177\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39min_proj_weight, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39min_proj_bias,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1186\u001b[0m average_attn_weights\u001b[38;5;241m=\u001b[39maverage_attn_weights,\n\u001b[1;32m 1187\u001b[0m is_causal\u001b[38;5;241m=\u001b[39mis_causal)\n\u001b[1;32m 1188\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1189\u001b[0m attn_output, attn_output_weights \u001b[38;5;241m=\u001b[39m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmulti_head_attention_forward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1190\u001b[0m \u001b[43m \u001b[49m\u001b[43mquery\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43membed_dim\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnum_heads\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1191\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43min_proj_weight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43min_proj_bias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1192\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias_k\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias_v\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd_zero_attn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1193\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdropout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mout_proj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mout_proj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1194\u001b[0m \u001b[43m \u001b[49m\u001b[43mtraining\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtraining\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1195\u001b[0m \u001b[43m \u001b[49m\u001b[43mkey_padding_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkey_padding_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1196\u001b[0m \u001b[43m \u001b[49m\u001b[43mneed_weights\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mneed_weights\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1197\u001b[0m \u001b[43m \u001b[49m\u001b[43mattn_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattn_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1198\u001b[0m \u001b[43m \u001b[49m\u001b[43maverage_attn_weights\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maverage_attn_weights\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1199\u001b[0m \u001b[43m \u001b[49m\u001b[43mis_causal\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mis_causal\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1200\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbatch_first \u001b[38;5;129;01mand\u001b[39;00m is_batched:\n\u001b[1;32m 1201\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m attn_output\u001b[38;5;241m.\u001b[39mtranspose(\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m0\u001b[39m), attn_output_weights\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/functional.py:5300\u001b[0m, in \u001b[0;36mmulti_head_attention_forward\u001b[0;34m(query, key, value, embed_dim_to_check, num_heads, in_proj_weight, in_proj_bias, bias_k, bias_v, add_zero_attn, dropout_p, out_proj_weight, out_proj_bias, training, key_padding_mask, need_weights, attn_mask, use_separate_proj_weight, q_proj_weight, k_proj_weight, v_proj_weight, static_k, static_v, average_attn_weights, is_causal)\u001b[0m\n\u001b[1;32m 5298\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 5299\u001b[0m attn_output_weights \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mbmm(q_scaled, k\u001b[38;5;241m.\u001b[39mtranspose(\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m))\n\u001b[0;32m-> 5300\u001b[0m attn_output_weights \u001b[38;5;241m=\u001b[39m \u001b[43msoftmax\u001b[49m\u001b[43m(\u001b[49m\u001b[43mattn_output_weights\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdim\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 5301\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m dropout_p \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0.0\u001b[39m:\n\u001b[1;32m 5302\u001b[0m attn_output_weights \u001b[38;5;241m=\u001b[39m dropout(attn_output_weights, p\u001b[38;5;241m=\u001b[39mdropout_p)\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/functional.py:1843\u001b[0m, in \u001b[0;36msoftmax\u001b[0;34m(input, dim, _stacklevel, dtype)\u001b[0m\n\u001b[1;32m 1841\u001b[0m dim \u001b[38;5;241m=\u001b[39m _get_softmax_dim(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msoftmax\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28minput\u001b[39m\u001b[38;5;241m.\u001b[39mdim(), _stacklevel)\n\u001b[1;32m 1842\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m dtype \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1843\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43minput\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msoftmax\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdim\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1844\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1845\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m\u001b[38;5;241m.\u001b[39msoftmax(dim, dtype\u001b[38;5;241m=\u001b[39mdtype)\n", + "Input \u001b[0;32mIn [33]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrainloader\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbatchsize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbatchsize\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrainaccloader\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcriterion\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moptimiser\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnepochs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m10\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m test(model, testloader())\n", + "Input \u001b[0;32mIn [30]\u001b[0m, in \u001b[0;36mtrain\u001b[0;34m(model, dataloader, accloader, lossfunc, optimiser, lr, momentum, batchsize, nepochs)\u001b[0m\n\u001b[1;32m 15\u001b[0m optimiser\u001b[38;5;241m.\u001b[39mzero_grad()\n\u001b[1;32m 16\u001b[0m loss \u001b[38;5;241m=\u001b[39m lossfunc(model\u001b[38;5;241m.\u001b[39mforward(x), y)\n\u001b[0;32m---> 17\u001b[0m \u001b[43mloss\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 18\u001b[0m optimiser\u001b[38;5;241m.\u001b[39mstep()\n\u001b[1;32m 19\u001b[0m epoch_loss \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m loss\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/_tensor.py:487\u001b[0m, in \u001b[0;36mTensor.backward\u001b[0;34m(self, gradient, retain_graph, create_graph, inputs)\u001b[0m\n\u001b[1;32m 477\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m has_torch_function_unary(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 478\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m handle_torch_function(\n\u001b[1;32m 479\u001b[0m Tensor\u001b[38;5;241m.\u001b[39mbackward,\n\u001b[1;32m 480\u001b[0m (\u001b[38;5;28mself\u001b[39m,),\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 485\u001b[0m inputs\u001b[38;5;241m=\u001b[39minputs,\n\u001b[1;32m 486\u001b[0m )\n\u001b[0;32m--> 487\u001b[0m \u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mautograd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 488\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgradient\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minputs\u001b[49m\n\u001b[1;32m 489\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/autograd/__init__.py:200\u001b[0m, in \u001b[0;36mbackward\u001b[0;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)\u001b[0m\n\u001b[1;32m 195\u001b[0m retain_graph \u001b[38;5;241m=\u001b[39m create_graph\n\u001b[1;32m 197\u001b[0m \u001b[38;5;66;03m# The reason we repeat same the comment below is that\u001b[39;00m\n\u001b[1;32m 198\u001b[0m \u001b[38;5;66;03m# some Python versions print out the first line of a multi-line function\u001b[39;00m\n\u001b[1;32m 199\u001b[0m \u001b[38;5;66;03m# calls in the traceback and some print out the last line\u001b[39;00m\n\u001b[0;32m--> 200\u001b[0m \u001b[43mVariable\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_execution_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_backward\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Calls into the C++ engine to run the backward pass\u001b[39;49;00m\n\u001b[1;32m 201\u001b[0m \u001b[43m \u001b[49m\u001b[43mtensors\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgrad_tensors_\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 202\u001b[0m \u001b[43m \u001b[49m\u001b[43mallow_unreachable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maccumulate_grad\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ - "#train(model, trainloader1, criterion, optimiser)\n", - "test(model, loader, accloader)\n", - "\n", - "# TIMES = []\n", - "# LOSS = []\n", - "# i = 0\n", - "# for (x, y) in trainloader1:\n", - "# time1 = time.time()\n", - "# criterion.zero_grad()\n", - "# out = model(x)\n", - "# loss = criterion(out, y.type(torch.LongTensor))\n", - "# LOSS.append(loss.item())\n", - "# loss.backward()\n", - "# optimiser.step()\n", - "# time2 = time.time()\n", - "# TIMES.append(time2-time1)\n", - "# print(time2-time1)\n", - "#print(\"TIMES:\", TIMES)\n", - "#print(\"LOSS:\", LOSS)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d87adc9e", - "metadata": {}, - "outputs": [], - "source": [ - "print(sum(param.numel() for param in model.parameters()))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "724959ba", - "metadata": {}, - "outputs": [], - "source": [ - "for param in model.parameters():\n", - " print(param.numel())" + "start = time.time()\n", + "train(model, trainloader(batchsize=batchsize), trainaccloader(), criterion, optimiser, nepochs=10)\n", + "end = time.time()\n", + "print(\"training time: \" end-start)\n", + "test(model, testloader())" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "id": "bbaac2fc", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n", + "[]\n" + ] + } + ], "source": [ - "print(TRAIN_LOSS)" + "print(TRAIN_LOSS)\n", + "print(TRAIN_ACC)" ] }, { "cell_type": "code", "execution_count": null, - "id": "e34188c0", + "id": "eb7b77cf", "metadata": {}, "outputs": [], "source": [] diff --git a/recognition/vision-transformer-4696689/train.py b/recognition/vision-transformer-4696689/train.py new file mode 100644 index 000000000..e15f505ca --- /dev/null +++ b/recognition/vision-transformer-4696689/train.py @@ -0,0 +1,90 @@ +""" +Imports Here +""" +from dataset import trainloader +from dataset import testloader +from dataset import trainaccloader +from dataset import trainshape +from dataset import testshape + +from model import VisionTransformer +from model import Attention +from model import TransBlock + +import time +import torch +import torch.nn as nn +import torch.optim as optim + +"""for results""" +TRAIN_LOSS = [] +TRAIN_ACC = [] + +""" +function to train the model +""" +def train(model, dataloader, accloader, lossfunc, optimiser, lr=0.1, momentum=0.9, batchsize=16, nepochs=10): + device = next(model.parameters()).device # check what device the net parameters are on + + """training""" + for i in range(nepochs): # for each epoch + epoch_loss = 0 + model.train() + n_batches = 0 + time1 = time.time() + for (x, y) in dataloader: # for each mini-batch + optimiser.zero_grad() + loss = lossfunc(model.forward(x), y) + loss.backward() + optimiser.step() + epoch_loss += loss + n_batches += 1 + time2 = time.time() + print("Done an epoch", time2-time1) + epoch_loss /= n_batches + + """evaluating""" + model.eval() + accuracy = test(model, accloader) + + """get performance""" + TRAIN_LOSS.append(epoch_loss.item()) + TRAIN_ACC.append(accuracy) + +""" +function to test the model +""" +def test(model, dataloader): + with torch.no_grad(): # disable automatic gradient computation for efficiency + device = next(model.parameters()).device + + """make predictions""" + pcls = [] + items = 0 + time1=time.time() + for x, y in dataloader: + x = x.to(device) + pcls.append(abs(y.cpu()-torch.max(model(x), 1)[1].cpu())) + items += 1 + time2 = time.time() + print("found accuracy in:", time2-time1) + + """get accuracy""" + pcls = torch.cat(pcls) # concat predictions on the mini-batches + accuracy = 1 - (pcls.sum().float() / items) + print("accuracy:", accuracy) + return accuracy + +"""model training""" +batchsize=16 +N, Np, P = trainshape() +model = VisionTransformer(inputsize=(batchsize, Np, P), embed=128, fflscale=2, nblocks=4) +criterion = nn.CrossEntropyLoss() +optimiser = optim.AdamW(model.parameters(), lr=1e-4) +start = time.time() +train(model, trainloader(batchsize=batchsize), trainaccloader(), criterion, optimiser, nepochs=10) +end = time.time() +print("training time: " end-start) +test(model, testloader()) +print(TRAIN_LOSS) +print(TRAIN_ACC) \ No newline at end of file From ead1fe9358993fade986b5f8724886e2ce5c9a1f Mon Sep 17 00:00:00 2001 From: o-20 <141003717+o-20@users.noreply.github.com> Date: Thu, 19 Oct 2023 04:23:45 +1000 Subject: [PATCH 14/24] Update train.py to fix missing comma --- recognition/vision-transformer-4696689/train.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recognition/vision-transformer-4696689/train.py b/recognition/vision-transformer-4696689/train.py index e15f505ca..61e78832f 100644 --- a/recognition/vision-transformer-4696689/train.py +++ b/recognition/vision-transformer-4696689/train.py @@ -84,7 +84,7 @@ def test(model, dataloader): start = time.time() train(model, trainloader(batchsize=batchsize), trainaccloader(), criterion, optimiser, nepochs=10) end = time.time() -print("training time: " end-start) +print("training time: ", end-start) test(model, testloader()) print(TRAIN_LOSS) -print(TRAIN_ACC) \ No newline at end of file +print(TRAIN_ACC) From ce59382f19b778e5ebb2fb5c0eb8fd4ac9d1517b Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 25 Oct 2023 04:49:40 +1000 Subject: [PATCH 15/24] cleaned up files, done hyperparameter tuning, added conv layer (1 of 2 kinds) to go in front of the model --- .../vision-transformer-4696689/dataset.py | 121 +++--- .../extra/conv-block.py | 37 ++ .../extra/parameters.txt | 20 + .../vision-transformer-4696689/modules.py | 106 +++++ .../dataloader_torch-checkpoint.ipynb | 146 +++++++ .../dataset-checkpoint.ipynb | 277 +++++++++++++ .../dataset3d-checkpoint.ipynb | 339 ++++++++++++++++ .../datasetconv-checkpoint.ipynb | 291 ++++++++++++++ .../matplots-checkpoint.ipynb | 6 + .../.ipynb_checkpoints/model-checkpoint.ipynb | 182 +++++++++ .../.ipynb_checkpoints/train-checkpoint.ipynb | 246 ++++++++++++ .../vision-transformer-4696689/old/conv | 0 .../old/dataloader_torch.ipynb | 181 +++++++++ .../{ => old}/dataset.ipynb | 34 ++ .../old/dataset3d.ipynb | 319 +++++++++++++++ .../old/datasetconv.ipynb | 365 ++++++++++++++++++ .../old/matplots.ipynb | 88 +++++ .../{ => old}/model.ipynb | 37 ++ .../{ => old}/model.py | 0 .../old/model2 output | 6 + .../vision-transformer-4696689/old/model3d.py | 114 ++++++ .../old/output 2 epochs, lr=1e-4 | 0 .../old/train.ipynb | 315 +++++++++++++++ .../vision-transformer-4696689/train.ipynb | 220 ----------- .../vision-transformer-4696689/train.py | 49 ++- 25 files changed, 3192 insertions(+), 307 deletions(-) create mode 100644 recognition/vision-transformer-4696689/extra/conv-block.py create mode 100644 recognition/vision-transformer-4696689/extra/parameters.txt create mode 100644 recognition/vision-transformer-4696689/modules.py create mode 100644 recognition/vision-transformer-4696689/old/.ipynb_checkpoints/dataloader_torch-checkpoint.ipynb create mode 100644 recognition/vision-transformer-4696689/old/.ipynb_checkpoints/dataset-checkpoint.ipynb create mode 100644 recognition/vision-transformer-4696689/old/.ipynb_checkpoints/dataset3d-checkpoint.ipynb create mode 100644 recognition/vision-transformer-4696689/old/.ipynb_checkpoints/datasetconv-checkpoint.ipynb create mode 100644 recognition/vision-transformer-4696689/old/.ipynb_checkpoints/matplots-checkpoint.ipynb create mode 100644 recognition/vision-transformer-4696689/old/.ipynb_checkpoints/model-checkpoint.ipynb create mode 100644 recognition/vision-transformer-4696689/old/.ipynb_checkpoints/train-checkpoint.ipynb create mode 100644 recognition/vision-transformer-4696689/old/conv create mode 100644 recognition/vision-transformer-4696689/old/dataloader_torch.ipynb rename recognition/vision-transformer-4696689/{ => old}/dataset.ipynb (92%) create mode 100644 recognition/vision-transformer-4696689/old/dataset3d.ipynb create mode 100644 recognition/vision-transformer-4696689/old/datasetconv.ipynb create mode 100644 recognition/vision-transformer-4696689/old/matplots.ipynb rename recognition/vision-transformer-4696689/{ => old}/model.ipynb (78%) rename recognition/vision-transformer-4696689/{ => old}/model.py (100%) create mode 100644 recognition/vision-transformer-4696689/old/model2 output create mode 100644 recognition/vision-transformer-4696689/old/model3d.py create mode 100644 recognition/vision-transformer-4696689/old/output 2 epochs, lr=1e-4 create mode 100644 recognition/vision-transformer-4696689/old/train.ipynb delete mode 100644 recognition/vision-transformer-4696689/train.ipynb diff --git a/recognition/vision-transformer-4696689/dataset.py b/recognition/vision-transformer-4696689/dataset.py index c641a3de1..d2a3ea4e5 100644 --- a/recognition/vision-transformer-4696689/dataset.py +++ b/recognition/vision-transformer-4696689/dataset.py @@ -24,68 +24,68 @@ def getImages(trainDIRs, testDIRS): transform = transforms.Compose([ transforms.PILToTensor() ]) + hflip = transforms.Compose([ + transforms.RandomHorizontalFlip(p=1.0), + transforms.PILToTensor() + ]) + vflip = transforms.Compose([ + transforms.RandomVerticalFlip(p=1.0), + transforms.PILToTensor() + ]) + dflip = transforms.Compose([ + transforms.RandomHorizontalFlip(p=1.0), + transforms.RandomVerticalFlip(p=1.0), + transforms.PILToTensor() + ]) + tlist = [transform, hflip, vflip, dflip] """Loading data into arrays""" xtrain, xtrain, xtest, ytest = [], [], [], [] """training data""" size = [0, 0] for i, DIR in enumerate(trainDIRs): - px = [] - j = 0 - for filename in sorted(os.listdir(DIR)): - f = os.path.join(DIR, filename) - img = Image.open(f) - tensor = transform(img).float() - tensor.require_grad = True - px.append(tensor/255) - j = (j+1) % 20 - if j == 0: - xtrain.append(torch.stack(px)) - px = [] - size[i] += 1 + for t in tlist: + px = [] + j = 0 + for filename in sorted(os.listdir(DIR)): + f = os.path.join(DIR, filename) + img = Image.open(f) + tensor = t(img).float() + tensor.require_grad = True + px.append(tensor/255) + j = (j+1) % 20 + if j == 0: + xtrain.append(torch.stack(px)) + px = [] + size[i] += 1 xtrain = torch.stack(xtrain) ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0)) - + """testing data""" size = [0, 0] for i, DIR in enumerate(testDIRs): - px = [] - j = 0 - for filename in sorted(os.listdir(DIR)): - f = os.path.join(DIR, filename) - img = Image.open(f) - tensor = transform(img).float() - tensor.require_grad = True - px.append(tensor/255) - j = (j+1) % 20 - if j == 0: - xtest.append(torch.stack(px)) - px = [] - size[i] += 1 + for t in tlist: + px = [] + j = 0 + for filename in sorted(os.listdir(DIR)): + f = os.path.join(DIR, filename) + img = Image.open(f) + tensor = t(img).float() + tensor.require_grad = True + px.append(tensor/255) + j = (j+1) % 20 + if j == 0: + xtest.append(torch.stack(px)) + px = [] + size[i] += 1 xtest = torch.stack(xtest) + idx = torch.randperm(xtest.size(0)) + xtest = xtest[idx, :] + splitsize = int(xtest.shape[0]/2) + xval, xtest = xtest.split(splitsize, dim=0) ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0)) - return xtrain, ytrain, xtest, ytest - -trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC'] -testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC'] -xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs) - -def createPatches(imgs, patchsize): - (N, M, C, W, H) = imgs.shape - (wsize, hsize) = patchsize - """check for errors with sizing""" - if (W % wsize != 0) or (H % hsize != 0): - raise Exception("patchsize is not appropriate") - if (C != C) or (H != H): - raise Exception("given sizes do not match") - size = (N, M, C, W // wsize, wsize, H // hsize, hsize) - perm = (0, 1, 3, 5, 2, 4, 6) #bring col, row index of patch to front - flat = (2, 3) #flatten (col, row) index into col*row entry index for patches - imgs = imgs.reshape(size).permute(perm).flatten(*flat) - return imgs #in format Nimgs, Npatches, C, Wpatch, Hpatch - -def flattenPatches(imgs): #takes input (N, M, Npatches, C, W, H) returns (N, M*Npatches, C*W*H) - return imgs.flatten(3, 5).flatten(1, 2) - + ytest = ytest[idx] + yval, ytest = ytest.split(splitsize, dim=0) + return xtrain, ytrain, xtest, ytest, xval, yval """ Dataloader """ @@ -101,22 +101,23 @@ def __getitem__(self, idx): return self.X[idx] else: return self.X[idx], self.y[idx] - -trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC'] -testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC'] -xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs) + +trainDIRs = ['AD_NC/train/AD/', 'AD_NC/train/NC'] +testDIRs = ['AD_NC/test/AD/', 'AD_NC/test/NC'] +xtrain, ytrain, xtest, ytest, xval, yval = getImages(trainDIRs, testDIRs) ytrain, ytest = ytrain.type(torch.LongTensor), ytest.type(torch.LongTensor) -xtrain = flattenPatches(createPatches(xtrain, (24,32))) -xtest = flattenPatches(createPatches(xtest, (24,32))) +xtrain = xtrain.permute(0, 2, 1, 3, 4) +xtest = xtest.permute(0, 2, 1, 3, 4) +xval = xval.permute(0, 2, 1, 3, 4) def trainloader(batchsize=16): - return DataLoader(DatasetWrapper(xtrain, ytrain), batch_size=batchsize, shuffle=True) + return DataLoader(DatasetWrapper(xtrain, ytrain), batch_size=batchsize, shuffle=True, pin_memory=True) -def trainaccloader(): - return DataLoader(DatasetWrapper(xtrain, ytrain), batch_size=1, shuffle=True) +def valloader(): + return DataLoader(DatasetWrapper(xval, yval), batch_size=1, shuffle=True, pin_memory=True) def testloader(): - return DataLoader(DatasetWrapper(xtest, ytest), batch_size=1, shuffle=True) + return DataLoader(DatasetWrapper(xtest, ytest), batch_size=1, shuffle=True, pin_memory=True) def trainshape(): return xtrain.shape diff --git a/recognition/vision-transformer-4696689/extra/conv-block.py b/recognition/vision-transformer-4696689/extra/conv-block.py new file mode 100644 index 000000000..7e27374ee --- /dev/null +++ b/recognition/vision-transformer-4696689/extra/conv-block.py @@ -0,0 +1,37 @@ +""" +Conv v2 +""" +class ConvLayer2(nn.Module): + def __init__(self): + super().__init__() + #pool + self.pool = nn.MaxPool2d(kernel_size=3, stride=2) + self.relu = nn.ReLU() + #first layer + self.conv11_x = nn.Conv2d(20, 48, kernel_size=(11,11), stride=(4,4), padding=(0,0)) + self.conv11_y = nn.Conv2d(240, 48, kernel_size=(11,3), stride=(4,1), padding=(0,0)) + self.conv11_z = nn.Conv2d(256, 48, kernel_size=(3,11), stride=(1,4), padding=(0,0)) + #second layer + self.conv5_x = nn.Conv2d(48, 192, kernel_size=(5,5), stride=(2,2), padding=(0,0)) + self.conv5_y = nn.Conv2d(48, 192, kernel_size=(5,3), stride=(2,1), padding=(0,0)) + self.conv5_z = nn.Conv2d(48, 192, kernel_size=(3,5), stride=(1,2), padding=(0,0)) + #projection + self.l_x = nn.Linear(30, 32) + self.l_y = nn.Linear(12, 32) + self.l_z = nn.Linear(10, 32) + + def forward(self, imgs): + #input N, C, L, W, H + #first layer + x_x = self.relu(self.pool(self.conv11_x(imgs.flatten(1,2)))) + x_y = self.relu(self.pool(self.conv11_y(imgs.permute(0,1,3,4,2).flatten(1,2)))) + x_z = self.relu(self.pool(self.conv11_z(imgs.permute(0,1,4,2,3).flatten(1,2)))) + #second layer + x_x = self.relu(self.pool(self.conv5_x(x_x))) + x_y = self.relu(self.pool(self.conv5_y(x_y))) + x_z = self.relu(self.pool(self.conv5_z(x_z))) + #projection + x_x = self.l_x(x_x.flatten(2,3)) + x_y = self.l_y(x_y.flatten(2,3)) + x_z = self.l_z(x_z.flatten(2,3)) + return torch.cat([x_x, x_y, x_z], dim=2) \ No newline at end of file diff --git a/recognition/vision-transformer-4696689/extra/parameters.txt b/recognition/vision-transformer-4696689/extra/parameters.txt new file mode 100644 index 000000000..2f7b1c0cf --- /dev/null +++ b/recognition/vision-transformer-4696689/extra/parameters.txt @@ -0,0 +1,20 @@ +AdamW lr=1e-4, 175 epochs, 192, 120, heads=4, embed=360, fflscale=2, nblocks=4 +LOSS = [0.72875, 0.70531, 0.66767, 0.61233, 0.53435, 0.49842, 0.43119, 0.45669, 0.38625, 0.35263, 0.36537, 0.32514, 0.26318, 0.2506, 0.24311, 0.18782, 0.17435, 0.13011, 0.14882, 0.17382, 0.10999, 0.13796, 0.07506, 0.06944, 0.06198, 0.03524, 0.07395, 0.09999, 0.04692, 0.03988, 0.0566, 0.02929, 0.01366, 0.01277, 0.01246, 0.01824, 0.04371, 0.0791, 0.04064, 0.04082, 0.01846, 0.00784, 0.00725, 0.00714, 0.0071, 0.00703, 0.00697, 0.00684, 0.00686, 0.00677, 0.00665, 0.00629, 0.00595, 0.01606, 0.11788, 0.21843, 0.02893, 0.01473, 0.04044, 0.02642, 0.02621, 0.00663, 0.00604, 0.00071, 0.00035, 0.00026, 0.00022, 0.0002, 0.00018, 0.00016, 0.00015, 0.00014, 0.00013, 0.00012, 0.00011, 0.0001, 0.0001, 9e-05, 8e-05, 8e-05, 7e-05, 7e-05, 7e-05, 6e-05, 6e-05, 6e-05, 5e-05, 5e-05, 5e-05, 5e-05, 4e-05, 4e-05, 4e-05, 4e-05, 4e-05, 4e-05, 3e-05, 3e-05, 3e-05, 3e-05, 3e-05, 3e-05, 3e-05, 3e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ACC = [50.67, 51.11, 58.67, 63.11, 57.78, 62.67, 63.56, 66.22, 66.22, 67.11, 66.67, 65.78, 67.56, 65.33, 68.0, 68.44, 67.11, 64.89, 64.89, 67.56, 68.0, 69.33, 67.11, 67.56, 68.0, 67.56, 66.22, 71.11, 69.33, 67.11, 66.67, 69.78, 69.33, 69.78, 69.78, 68.0, 66.67, 68.89, 69.78, 69.78, 68.44, 67.56, 67.11, 67.56, 67.56, 67.56, 68.0, 68.0, 68.0, 68.0, 68.0, 67.56, 67.56, 68.0, 66.22, 70.67, 67.56, 66.67, 68.89, 65.33, 66.67, 70.22, 68.0, 69.78, 68.89, 68.0, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44] + +to plot: +import matplotlib.pyplot as plt +steps = range(175) +plt.plot(steps, LOSS) +plt.ylabel('LOSS') +plt.xlabel('epoch') +plt.show() +plt.plot(steps, ACC) +plt.ylabel('ACCURACY') +plt.xlabel('epoch') +plt.show() + +cuda +training time: 27699.315416812897 +test acc: tensor(0.6800) +TIME = [147.563, 146.343, 144.501, 147.546, 144.388, 143.652, 146.672, 144.336, 145.402, 146.032, 144.47, 144.527, 145.94, 145.326, 144.034, 145.458, 146.047, 143.858, 146.212, 144.663, 144.781, 146.169, 143.851, 146.982, 143.694, 145.329, 145.16, 146.066, 144.08, 145.364, 145.876, 143.906, 145.965, 144.99, 144.381, 147.893, 146.199, 144.357, 145.847, 144.55, 144.047, 145.702, 144.852, 143.926, 145.867, 144.55, 144.213, 146.131, 144.313, 144.568, 145.913, 144.292, 147.893, 147.291, 148.067, 148.66, 149.459, 148.164, 148.963, 149.543, 144.27, 145.208, 145.364, 143.899, 146.17, 143.49, 146.005, 144.319, 144.524, 145.954, 143.908, 145.923, 149.609, 148.143, 149.126, 147.25, 143.868, 145.934, 144.889, 144.385, 146.232, 144.071, 145.286, 145.871, 143.787, 145.719, 148.777, 147.816, 149.28, 148.8, 148.009, 149.313, 149.438, 147.923, 148.943, 149.355, 148.399, 148.242, 149.209, 149.388, 148.377, 148.594, 149.603, 148.353, 148.588, 149.617, 148.425, 148.436, 149.528, 148.536, 148.31, 149.578, 148.509, 148.387, 149.569, 148.542, 148.188, 149.53, 148.641, 148.101, 149.468, 148.894, 148.149, 148.935, 149.422, 148.588, 148.187, 149.229, 149.147, 149.19, 148.44, 148.16, 149.419, 148.88, 148.568, 148.514, 148.583, 148.594, 148.789, 148.996, 149.07, 149.142, 148.768, 148.309, 148.454, 148.685, 149.076, 149.272, 148.759, 148.253, 148.44, 149.121, 149.245, 148.525, 148.261, 148.695, 149.247, 149.253, 148.579, 148.307, 149.357, 147.468, 148.775, 147.945, 149.511, 148.644, 148.232, 149.552, 148.53, 148.147, 149.467, 148.824, 148.064, 149.387, 149.3] \ No newline at end of file diff --git a/recognition/vision-transformer-4696689/modules.py b/recognition/vision-transformer-4696689/modules.py new file mode 100644 index 000000000..07fabd881 --- /dev/null +++ b/recognition/vision-transformer-4696689/modules.py @@ -0,0 +1,106 @@ +""" +Imports Here +""" +import numpy as np +import torch +import torch.nn as nn + +class Attention(nn.Module): + def __init__(self, heads, embed): + super().__init__() + self.heads = heads + self.attn = nn.MultiheadAttention(embed, heads, batch_first=True) + self.Q = nn.Linear(embed, embed, bias=False) + self.K = nn.Linear(embed, embed, bias=False) + self.V = nn.Linear(embed, embed, bias=False) + + def forward(self, x): + Q = self.Q(x) + K = self.K(x) + V = self.V(x) + attnout, attnweights = self.attn(Q, K, V) + return attnout + +class TransBlock(nn.Module): + def __init__(self, heads, embed, fflsize): + super().__init__() + self.fnorm = nn.LayerNorm(embed) + self.snorm = nn.LayerNorm(embed) + self.attn = Attention(heads, embed) + self.ffl = nn.Sequential( + nn.Linear(embed, fflsize), + nn.GELU(), + nn.Linear(fflsize, embed) + ) + + def forward(self, x): + """ + Switching to pre-MHA LayerNorm is supposed to give better performance, + this is used in other models such as LLMs like GPT. Gradients are meant + to be stabilised. This is different to the original ViT paper. + """ + x = x + self.attn(self.fnorm(x)) + x = x + self.ffl(self.snorm(x)) + return x +""" +Convolution pre +""" +class ConvLayer(nn.Module): + def __init__(self): + super().__init__() + self.pool = nn.MaxPool3d(kernel_size=3, stride=2) + self.relu = nn.ReLU() + self.conv11 = nn.Conv3d(1, 48, kernel_size=(3,11,11), stride=(1,4,4), padding=(1,0,0)) + self.conv5 = nn.Conv3d(48, 192, kernel_size=(3,5,5), stride=(1,2,2), padding=(1,0,0)) + + def forward(self, imgs): + x = self.conv11(imgs) + x = self.relu(self.pool(x)) + x = self.conv5(x) + x = self.relu(self.pool(x)) + return x +""" +Vision Transformer Class to create a vision transformer model +""" +class VisionTransformer(nn.Module): + def __init__(self, classes=2, inputsize=(1,1,1), heads=2, embed=64, fflscale=2, nblocks=1): + super().__init__() + (self.N, self.Np, self.P) = inputsize + """components""" + self.proj = nn.Linear(self.P, embed) + self.clstoken = nn.Parameter(torch.randn(1, 1, embed)) + self.posembed = self.embedding(self.Np+1, embed) + self.transformer = nn.Sequential( + *((TransBlock(heads, embed, int(fflscale*embed)),)*nblocks) + ) + self.classifier = nn.Sequential( + nn.LayerNorm(embed), + nn.Linear(embed, classes) + ) + """convolutional components""" + self.conv = ConvLayer() + + def embedding(self, npatches, embed, freq=10000): #10000 is described in ViT paper + posembed = torch.zeros(npatches, embed) + for i in range(npatches): + for j in range(embed): + if j % 2 == 0: + posembed[i][j] = np.sin(i/(freq**(j/embed))) + else: + posembed[i][j] = np.cos(i/(freq**((j-1)/embed))) + return posembed + + def forward(self, imgs): #assume size checking done by createPatches + """Convolutional layer""" + imgs = self.conv(imgs) + imgs = imgs.flatten(2,4) + """Linear Projection and Positional Embedding""" + tokens = self.proj(imgs) #perform linear projection + clstoken = self.clstoken.repeat(imgs.shape[0], 1, 1) + tokens = torch.cat([clstoken, tokens], dim=1) #concat the class token + x = tokens + self.posembed.repeat(imgs.shape[0], 1, 1) #add positional encoding + """Transformer""" + x = self.transformer(x) + """Classification""" + y = x[:,0] + return self.classifier(y) \ No newline at end of file diff --git a/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/dataloader_torch-checkpoint.ipynb b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/dataloader_torch-checkpoint.ipynb new file mode 100644 index 000000000..b4222436e --- /dev/null +++ b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/dataloader_torch-checkpoint.ipynb @@ -0,0 +1,146 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "7f66ae1f", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Imports Here\n", + "\"\"\"\n", + "\"\"\"numpy and torch\"\"\"\n", + "import numpy as np\n", + "import torch\n", + "\n", + "\"\"\"PIL\"\"\"\n", + "from PIL import Image\n", + "\n", + "\"\"\"torchvision and utils\"\"\"\n", + "import torchvision.transforms as transforms\n", + "from torch.utils.data import DataLoader, Dataset\n", + "\n", + "\"\"\"os\"\"\"\n", + "import os\n", + "\n", + "\"\"\"\n", + "Loading data from local file\n", + "\"\"\"\n", + "\"\"\"Assumes images have pixel values in range [0,255]\"\"\"\n", + "def getImages(trainDIRs, testDIRS):\n", + " \"\"\"Get image to tensor\"\"\"\n", + " transform = transforms.Compose([\n", + " transforms.PILToTensor()\n", + " ])\n", + " \"\"\"Loading data into arrays\"\"\"\n", + " xtrain, xtrain, xtest, ytest = [], [], [], []\n", + " \"\"\"training data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(trainDIRs):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " j = (j+1) % 20\n", + " if j == 0:\n", + " xtrain.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtrain = torch.stack(xtrain)\n", + " ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + "\n", + " \n", + " \"\"\"testing data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(testDIRs):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " j = (j+1) % 20\n", + " if j == 0:\n", + " xtest.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtest = torch.stack(xtest)\n", + " idx = torch.randperm(xtest.size(0))\n", + " xtest = xtest[idx, :]\n", + " splitsize = int(xtest.shape[0]/2)\n", + " xval, xtest = xtest.split(splitsize, dim=0)\n", + " ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " ytest = ytest[idx]\n", + " yval, ytest = ytest.split(splitsize, dim=0)\n", + " return xtrain, ytrain, xtest, ytest, xval, yval\n", + "\n", + "\"\"\"\n", + "Dataloader\n", + "\"\"\"\n", + "class DatasetWrapper(Dataset):\n", + " def __init__(self, X, y=None):\n", + " self.X, self.y = X, y\n", + "\n", + " def __len__(self):\n", + " return len(self.X)\n", + "\n", + " def __getitem__(self, idx):\n", + " if self.y is None:\n", + " return self.X[idx]\n", + " else:\n", + " return self.X[idx], self.y[idx]\n", + "\n", + "trainDIRs = ['AD_NC/train/AD/', 'AD_NC/train/NC']\n", + "testDIRs = ['AD_NC/test/AD/', 'AD_NC/test/NC']\n", + "xtrain, ytrain, xtest, ytest, xval, yval = getImages(trainDIRs, testDIRs)\n", + "ytrain, ytest = ytrain.type(torch.LongTensor), ytest.type(torch.LongTensor)\n", + "xtrain = xtrain.permute(0, 2, 1, 3, 4)\n", + "xtest = xtest.permute(0, 2, 1, 3, 4)\n", + "xval = xval.permute(0, 2, 1, 3, 4)\n", + "\n", + "def trainloader(batchsize=16):\n", + " return DataLoader(DatasetWrapper(xtrain, ytrain), batch_size=batchsize, shuffle=True, pin_memory=True)\n", + "\n", + "def valloader():\n", + " return DataLoader(DatasetWrapper(xval, yval), batch_size=1, shuffle=True, pin_memory=True)\n", + "\n", + "def testloader():\n", + " return DataLoader(DatasetWrapper(xtest, ytest), batch_size=1, shuffle=True, pin_memory=True)\n", + "\n", + "def trainshape():\n", + " return xtrain.shape\n", + "\n", + "def testshape():\n", + " return xtest.shape" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/dataset-checkpoint.ipynb b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/dataset-checkpoint.ipynb new file mode 100644 index 000000000..024c99e75 --- /dev/null +++ b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/dataset-checkpoint.ipynb @@ -0,0 +1,277 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 10, + "id": "338da719", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Imports Here\n", + "\"\"\"\n", + "\"\"\"numpy and torch\"\"\"\n", + "import numpy as np\n", + "import torch\n", + "\n", + "\"\"\"PIL\"\"\"\n", + "from PIL import Image\n", + "\n", + "\"\"\"torchvision and utils\"\"\"\n", + "import torchvision.transforms as transforms\n", + "from torch.utils.data import DataLoader, Dataset\n", + "\n", + "\"\"\"os\"\"\"\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "65011ff4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nLoading data from local file\\n'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Loading data from local file\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "206e485b", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"Assumes images have pixel values in range [0,255]\"\"\"\n", + "def getImages(trainDIRs, testDIRS):\n", + " \"\"\"Get image to tensor\"\"\"\n", + " transform = transforms.Compose([\n", + " transforms.PILToTensor()\n", + " ])\n", + " \"\"\"Loading data into arrays\"\"\"\n", + " xtrain, xtrain, xtest, ytest = [], [], [], []\n", + " \"\"\"training data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(trainDIRs):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " j = (j+1) % 20\n", + " if j == 0:\n", + " xtrain.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtrain = torch.stack(xtrain)\n", + " ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " \n", + " \"\"\"testing data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(testDIRs):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " if j == 0:\n", + " xtest.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtest = torch.stack(xtest)\n", + " ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " return xtrain, ytrain, xtest, ytest" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "a3c45c1a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1076, 20, 1, 240, 256])\n", + "torch.Size([9000, 1, 1, 240, 256])\n" + ] + } + ], + "source": [ + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "292100c2", + "metadata": {}, + "outputs": [], + "source": [ + "def createPatches(imgs, patchsize):\n", + " (N, M, C, W, H) = imgs.shape\n", + " (wsize, hsize) = patchsize\n", + " \"\"\"check for errors with sizing\"\"\"\n", + " if (W % wsize != 0) or (H % hsize != 0):\n", + " raise Exception(\"patchsize is not appropriate\")\n", + " if (C != C) or (H != H):\n", + " raise Exception(\"given sizes do not match\")\n", + " size = (N, M, C, W // wsize, wsize, H // hsize, hsize)\n", + " perm = (0, 1, 3, 5, 2, 4, 6) #bring col, row index of patch to front\n", + " flat = (2, 3) #flatten (col, row) index into col*row entry index for patches\n", + " imgs = imgs.reshape(size).permute(perm).flatten(*flat)\n", + " return imgs #in format Nimgs, Npatches, C, Wpatch, Hpatch\n", + " \n", + "def flattenPatches(imgs): #takes input (N, M, Npatches, C, W, H) returns (N, M*Npatches, C*W*H)\n", + " return imgs.flatten(3, 5).flatten(1, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "e0897522", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nDataloader\\n'" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Dataloader\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "05c80732", + "metadata": {}, + "outputs": [], + "source": [ + "class DatasetWrapper(Dataset):\n", + " def __init__(self, X, y=None):\n", + " self.X, self.y = X, y\n", + "\n", + " def __len__(self):\n", + " return len(self.X)\n", + "\n", + " def __getitem__(self, idx):\n", + " if self.y is None:\n", + " return self.X[idx]\n", + " else:\n", + " return self.X[idx], self.y[idx]" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "ea41eef5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1076, 20, 1, 240, 256])\n", + "torch.Size([9000, 1, 1, 240, 256])\n" + ] + } + ], + "source": [ + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "1f077f43", + "metadata": {}, + "outputs": [], + "source": [ + "xtrain = flattenPatches(createPatches(xtrain, (16,16)))\n", + "xtest = flattenPatches(createPatches(xtest, (16,16)))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "a02e05bd", + "metadata": {}, + "outputs": [], + "source": [ + "def trainloader(batchsize=16):\n", + " return DataLoader(DatasetWrapper(xtrain, ytrain), batchsize=batchsize, shuffle=True)\n", + "\n", + "def testloader():\n", + " return DataLoader(DatasetWrapper(xtest, ytest), batchsize=1, shuffle=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "18d6ca10", + "metadata": {}, + "outputs": [], + "source": [ + "def trainshape():\n", + " return xtrain.shape\n", + "\n", + "def testshape():\n", + " return xtest.shape" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/dataset3d-checkpoint.ipynb b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/dataset3d-checkpoint.ipynb new file mode 100644 index 000000000..1cf393de9 --- /dev/null +++ b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/dataset3d-checkpoint.ipynb @@ -0,0 +1,339 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "338da719", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so, 6): Library not loaded: @rpath/libpng16.16.dylib\n", + " Referenced from: /Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so\n", + " Reason: Incompatible library version: image.so requires version 56.0.0 or later, but libpng16.16.dylib provides version 54.0.0'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", + " warn(\n" + ] + } + ], + "source": [ + "\"\"\"\n", + "Imports Here\n", + "\"\"\"\n", + "\"\"\"numpy and torch\"\"\"\n", + "import numpy as np\n", + "import torch\n", + "\n", + "\"\"\"PIL\"\"\"\n", + "from PIL import Image\n", + "\n", + "\"\"\"torchvision and utils\"\"\"\n", + "import torchvision.transforms as transforms\n", + "from torch.utils.data import DataLoader, Dataset\n", + "\n", + "\"\"\"os\"\"\"\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "65011ff4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nLoading data from local file\\n'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Loading data from local file\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "206e485b", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"Assumes images have pixel values in range [0,255]\"\"\"\n", + "def getImages(trainDIRs, testDIRS):\n", + " \"\"\"Get image to tensor\"\"\"\n", + " transform = transforms.Compose([\n", + " transforms.PILToTensor()\n", + " ])\n", + " \"\"\"Loading data into arrays\"\"\"\n", + " xtrain, xtrain, xtest, ytest = [], [], [], []\n", + " \"\"\"training data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(trainDIRs):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " j = (j+1) % 20\n", + " if j == 0:\n", + " xtrain.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtrain = torch.stack(xtrain)\n", + " ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " \n", + " \"\"\"testing data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(testDIRs):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " if j == 0:\n", + " xtest.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtest = torch.stack(xtest)\n", + " ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " return xtrain, ytrain, xtest, ytest" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a3c45c1a", + "metadata": {}, + "outputs": [], + "source": [ + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "292100c2", + "metadata": {}, + "outputs": [], + "source": [ + "def createPatches(imgs, patchsize):\n", + " (N, M, C, W, H) = imgs.shape\n", + " (wsize, hsize) = patchsize\n", + " \"\"\"check for errors with sizing\"\"\"\n", + " if (W % wsize != 0) or (H % hsize != 0):\n", + " raise Exception(\"patchsize is not appropriate\")\n", + " if (C != C) or (H != H):\n", + " raise Exception(\"given sizes do not match\")\n", + " size = (N, M, C, W // wsize, wsize, H // hsize, hsize)\n", + " perm = (0, 1, 3, 5, 2, 4, 6) #bring col, row index of patch to front\n", + " flat = (2, 3) #flatten (col, row) index into col*row entry index for patches\n", + " imgs = imgs.reshape(size).permute(perm).flatten(*flat)\n", + " return imgs #in format Nimgs, Npatches, C, Wpatch, Hpatch\n", + " \n", + "def flattenPatches(imgs): #takes input (N, M, Npatches, C, W, H) returns (N, M*Npatches, C*W*H)\n", + " return imgs.flatten(3, 5).flatten(1, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e0897522", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nDataloader\\n'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Dataloader\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "05c80732", + "metadata": {}, + "outputs": [], + "source": [ + "class DatasetWrapper(Dataset):\n", + " def __init__(self, X, y=None):\n", + " self.X, self.y = X, y\n", + "\n", + " def __len__(self):\n", + " return len(self.X)\n", + "\n", + " def __getitem__(self, idx):\n", + " if self.y is None:\n", + " return self.X[idx]\n", + " else:\n", + " return self.X[idx], self.y[idx]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ea41eef5", + "metadata": {}, + "outputs": [], + "source": [ + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "1f077f43", + "metadata": {}, + "outputs": [], + "source": [ + "xtrain = flattenPatches(createPatches(xtrain, (16,16)))\n", + "xtest = flattenPatches(createPatches(xtest, (16,16)))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a02e05bd", + "metadata": {}, + "outputs": [], + "source": [ + "def trainloader(batchsize=16):\n", + " return DataLoader(DatasetWrapper(xtrain, ytrain), batchsize=batchsize, shuffle=True)\n", + "\n", + "def testloader():\n", + " return DataLoader(DatasetWrapper(xtest, ytest), batchsize=1, shuffle=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "18d6ca10", + "metadata": {}, + "outputs": [], + "source": [ + "def trainshape():\n", + " return xtrain.shape\n", + "\n", + "def testshape():\n", + " return xtest.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "8979dcd1", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import torch\n", + "import torch.nn as nn" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "00d6d9fb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1076, 4800, 256])\n" + ] + }, + { + "ename": "RuntimeError", + "evalue": "Given groups=1, weight of size [8, 1, 3, 3], expected input[1, 1076, 4800, 256] to have 1 channels, but got 1076 channels instead", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [17]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconv(x)\u001b[38;5;241m.\u001b[39mshape)\n\u001b[1;32m 14\u001b[0m imgsize \u001b[38;5;241m=\u001b[39m xtrain\u001b[38;5;241m.\u001b[39mshape\n\u001b[0;32m---> 15\u001b[0m model \u001b[38;5;241m=\u001b[39m \u001b[43mTest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimgsize\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mforward\u001b[49m\u001b[43m(\u001b[49m\u001b[43mxtrain\u001b[49m\u001b[43m)\u001b[49m\n", + "Input \u001b[0;32mIn [17]\u001b[0m, in \u001b[0;36mTest.forward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, x):\n\u001b[1;32m 11\u001b[0m \u001b[38;5;28mprint\u001b[39m(x\u001b[38;5;241m.\u001b[39mshape)\n\u001b[0;32m---> 12\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconv\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mshape)\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/container.py:217\u001b[0m, in \u001b[0;36mSequential.forward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m):\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m module \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m:\n\u001b[0;32m--> 217\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mmodule\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28minput\u001b[39m\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/conv.py:463\u001b[0m, in \u001b[0;36mConv2d.forward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 462\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Tensor) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[0;32m--> 463\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_conv_forward\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/conv.py:459\u001b[0m, in \u001b[0;36mConv2d._conv_forward\u001b[0;34m(self, input, weight, bias)\u001b[0m\n\u001b[1;32m 455\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpadding_mode \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mzeros\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 456\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m F\u001b[38;5;241m.\u001b[39mconv2d(F\u001b[38;5;241m.\u001b[39mpad(\u001b[38;5;28minput\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reversed_padding_repeated_twice, mode\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpadding_mode),\n\u001b[1;32m 457\u001b[0m weight, bias, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstride,\n\u001b[1;32m 458\u001b[0m _pair(\u001b[38;5;241m0\u001b[39m), \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdilation, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgroups)\n\u001b[0;32m--> 459\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconv2d\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbias\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstride\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 460\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpadding\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdilation\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroups\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mRuntimeError\u001b[0m: Given groups=1, weight of size [8, 1, 3, 3], expected input[1, 1076, 4800, 256] to have 1 channels, but got 1076 channels instead" + ] + } + ], + "source": [ + "class Test(nn.Module):\n", + " def __init__(self, imgsize):\n", + " super().__init__()\n", + " (self.N, self.Np, self.P) = imgsize\n", + " self.conv = nn.Sequential(\n", + " nn.Conv2d(1, 8, kernel_size=3, padding=1),\n", + " nn.ReLU(),\n", + " nn.MaxPool2d(2, 2)\n", + " )\n", + " def forward(self, x):\n", + " print(x.shape)\n", + " print(self.conv(x).shape)\n", + "\n", + "imgsize = xtrain.shape\n", + "model = Test(imgsize).forward(xtrain)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "690cd78c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/datasetconv-checkpoint.ipynb b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/datasetconv-checkpoint.ipynb new file mode 100644 index 000000000..786bbfade --- /dev/null +++ b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/datasetconv-checkpoint.ipynb @@ -0,0 +1,291 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "338da719", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so, 6): Library not loaded: @rpath/libpng16.16.dylib\n", + " Referenced from: /Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so\n", + " Reason: Incompatible library version: image.so requires version 56.0.0 or later, but libpng16.16.dylib provides version 54.0.0'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", + " warn(\n" + ] + } + ], + "source": [ + "\"\"\"\n", + "Imports Here\n", + "\"\"\"\n", + "\"\"\"numpy and torch\"\"\"\n", + "import numpy as np\n", + "import torch\n", + "\n", + "\"\"\"PIL\"\"\"\n", + "from PIL import Image\n", + "\n", + "\"\"\"torchvision and utils\"\"\"\n", + "import torchvision.transforms as transforms\n", + "from torch.utils.data import DataLoader, Dataset\n", + "\n", + "\"\"\"os\"\"\"\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "65011ff4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nLoading data from local file\\n'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Loading data from local file\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "206e485b", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"Assumes images have pixel values in range [0,255]\"\"\"\n", + "def getImages(trainDIRs, testDIRS):\n", + " \"\"\"Get image to tensor\"\"\"\n", + " transform = transforms.Compose([\n", + " transforms.PILToTensor()\n", + " ])\n", + " \"\"\"Loading data into arrays\"\"\"\n", + " xtrain, xtrain, xtest, ytest = [], [], [], []\n", + " \"\"\"training data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(trainDIRs):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " j = (j+1) % 20\n", + " if j == 0:\n", + " xtrain.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtrain = torch.stack(xtrain)\n", + " ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " \n", + " \"\"\"testing data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(testDIRs):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " j = (j+1) % 20\n", + " if j == 0:\n", + " xtest.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtest = torch.stack(xtest)\n", + " ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " return xtrain, ytrain, xtest, ytest" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a3c45c1a", + "metadata": {}, + "outputs": [], + "source": [ + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "292100c2", + "metadata": {}, + "outputs": [], + "source": [ + "def createPatches(imgs, patchsize):\n", + " (N, M, C, W, H) = imgs.shape\n", + " (wsize, hsize) = patchsize\n", + " \"\"\"check for errors with sizing\"\"\"\n", + " if (W % wsize != 0) or (H % hsize != 0):\n", + " raise Exception(\"patchsize is not appropriate\")\n", + " if (C != C) or (H != H):\n", + " raise Exception(\"given sizes do not match\")\n", + " size = (N, M, C, W // wsize, wsize, H // hsize, hsize)\n", + " perm = (0, 1, 3, 5, 2, 4, 6) #bring col, row index of patch to front\n", + " flat = (2, 3) #flatten (col, row) index into col*row entry index for patches\n", + " imgs = imgs.reshape(size).permute(perm).flatten(*flat)\n", + " return imgs #in format Nimgs, Npatches, C, Wpatch, Hpatch\n", + " \n", + "def flattenPatches(imgs): #takes input (N, M, Npatches, C, W, H) returns (N, M*Npatches, C*W*H)\n", + " return imgs.flatten(3, 5).flatten(1, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e0897522", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nDataloader\\n'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Dataloader\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "05c80732", + "metadata": {}, + "outputs": [], + "source": [ + "class DatasetWrapper(Dataset):\n", + " def __init__(self, X, y=None):\n", + " self.X, self.y = X, y\n", + "\n", + " def __len__(self):\n", + " return len(self.X)\n", + "\n", + " def __getitem__(self, idx):\n", + " if self.y is None:\n", + " return self.X[idx]\n", + " else:\n", + " return self.X[idx], self.y[idx]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ea41eef5", + "metadata": {}, + "outputs": [], + "source": [ + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "1f077f43", + "metadata": {}, + "outputs": [], + "source": [ + "xtrain = flattenPatches(createPatches(xtrain, (16,16)))\n", + "xtest = flattenPatches(createPatches(xtest, (16,16)))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a02e05bd", + "metadata": {}, + "outputs": [], + "source": [ + "def trainloader(batchsize=16):\n", + " return DataLoader(DatasetWrapper(xtrain, ytrain), batchsize=batchsize, shuffle=True)\n", + "\n", + "def testloader():\n", + " return DataLoader(DatasetWrapper(xtest, ytest), batchsize=1, shuffle=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "18d6ca10", + "metadata": {}, + "outputs": [], + "source": [ + "def trainshape():\n", + " return xtrain.shape\n", + "\n", + "def testshape():\n", + " return xtest.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "8979dcd1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1076, 4800, 256])\n", + "torch.Size([450, 4800, 256])\n" + ] + } + ], + "source": [ + "print(xtrain.shape)\n", + "print(xtest.shape)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/matplots-checkpoint.ipynb b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/matplots-checkpoint.ipynb new file mode 100644 index 000000000..363fcab7e --- /dev/null +++ b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/matplots-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/model-checkpoint.ipynb b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/model-checkpoint.ipynb new file mode 100644 index 000000000..3263fcf63 --- /dev/null +++ b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/model-checkpoint.ipynb @@ -0,0 +1,182 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 37, + "id": "fc1d26a6", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Imports Here\n", + "\"\"\"\n", + "import numpy as np\n", + "import torch\n", + "import torch.nn as nn" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "00044d75", + "metadata": {}, + "outputs": [], + "source": [ + "class Attention(nn.Module):\n", + " def __init__(self, heads, EMBED_DIMENSION):\n", + " super().__init__()\n", + " self.heads = heads\n", + " self.attn = nn.MultiheadAttention(EMBED_DIMENSION, heads, batch_first=True)\n", + " self.Q = nn.Linear(EMBED_DIMENSION, EMBED_DIMENSION, bias=False)\n", + " self.K = nn.Linear(EMBED_DIMENSION, EMBED_DIMENSION, bias=False)\n", + " self.V = nn.Linear(EMBED_DIMENSION, EMBED_DIMENSION, bias=False)\n", + " \n", + " def forward(self, x):\n", + " Q = self.Q(x)\n", + " K = self.K(x)\n", + " V = self.V(x)\n", + " \n", + " attnout, attnweights = self.attn(Q, K, V)\n", + " return attnout" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "733599f9", + "metadata": {}, + "outputs": [], + "source": [ + "class TransBlock(nn.Module):\n", + " def __init__(self, heads, EMBED_DIMENSION, fflsize):\n", + " super().__init__()\n", + " self.fnorm = nn.LayerNorm(EMBED_DIMENSION)\n", + " self.snorm = nn.LayerNorm(EMBED_DIMENSION)\n", + " self.attn = Attention(heads, EMBED_DIMENSION)\n", + " self.ffl = nn.Sequential(\n", + " nn.Linear(EMBED_DIMENSION, fflsize),\n", + " nn.GELU(),\n", + " nn.Linear(fflsize, EMBED_DIMENSION)\n", + " )\n", + " \n", + " def forward(self, x):\n", + " \"\"\"\n", + " Switching to pre-MHA LayerNorm is supposed to give better performance,\n", + " this is used in other models such as LLMs like GPT. Gradients are meant\n", + " to be stabilised. This is different to the original ViT paper.\n", + " \"\"\"\n", + " x = x + self.attn(self.fnorm(x))[0]\n", + " x = x + self.ffl(self.snorm(x))\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2a5e050", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Inception module for efficient 7x7 convolution\n", + "\"\"\"\n", + "class Inception(nn.Module):\n", + " def __init__(self, dimin, dimout):\n", + " super().__init__()\n", + " self.branch1 = nn.Sequential(\n", + " nn.Conv2d(dimin, dimout[0], 1, stride=(1,1)),\n", + " nn.Conv2d(dimout[0], dimout[0], 3, stride=(1,1), padding=1),\n", + " nn.Conv2d(dimout[0], dimout[0], 3, stride=(1,1), padding=1)\n", + " )\n", + " self.branch2 = nn.Sequential(\n", + " nn.Conv2d(dimin, dimout[1]), 1, stride=(1,1),\n", + " nn.Conv2d(dimout[1], dimout[1], 3, stride=(1,1), padding=1)\n", + " )\n", + " self.branch3 = nn.Sequential(\n", + " nn.AvgPool2d(3, stride=(1,1), padding=1),\n", + " nn.Conv2d(dimin, dimout[2], 1, stride=(1,1))\n", + " )\n", + " self.branch4 = nn.Sequential(\n", + " nn.Conv2d(dimin, dimout[3], 1, stride=(1,1))\n", + " )\n", + " def forward(self, imgs)\n", + " x1 = self.branch1(imgs)\n", + " x2 = self.branch2(imgs)\n", + " x3 = self.branch3(imgs)\n", + " x4 = self.branch4(imgs)\n", + " return torch.cat([x1, x2, x3, x4], dim=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "e6ac9e2b", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Vision Transformer Class to create a vision transformer model\n", + "\"\"\"\n", + "class VisionTransformer(nn.Module):\n", + " def __init__(self, classes=2, inputsize=(1,1,1), heads=2, fflscale=2, nblocks=1):\n", + " super().__init__()\n", + " (self.N, self.Np, self.P) = inputsize\n", + " \"\"\"components\"\"\"\n", + " self.proj = nn.Linear(self.P, EMBED_DIMENSION)\n", + " self.clstoken = nn.Parameter(torch.zeros(1, 1, EMBED_DIMENSION))\n", + " self.posembed = self.embedding(self.Np+1, EMBED_DIMENSION, freq=10000) #10000 is described in ViT paper\n", + " self.posembed = self.posembed.repeat(self.N, 1, 1)\n", + " self.transformer = nn.Sequential(\n", + " *((TransBlock(heads, EMBED_DIMENSION, int(fflscale*EMBED_DIMENSION)),)*nblocks)\n", + " )\n", + " self.classifier = nn.Sequential(\n", + " nn.LayerNorm(EMBED_DIMENSION),\n", + " nn.Linear(EMBED_DIMENSION, classes)\n", + " )\n", + " \n", + " def embedding(npatches, EMBED_DIMENSION, freq):\n", + " posembed = torch.zeros(npatches, EMBED_DIMENSION)\n", + " for i in range(npatches):\n", + " for j in range(EMBED_DIMENSION):\n", + " if j % 2 == 0:\n", + " posembed[i][j] = np.sin(i/(freq**(j/EMBED_DIMENSION)))\n", + " else:\n", + " posembed[i][j] = np.cos(i/(freq**((j-1)/EMBED_DIMENSION)))\n", + " return posembed\n", + " \n", + " def forward(self, imgs): #assume size checking done by createPatches\n", + " \"\"\"Linear Projection and Positional Embedding\"\"\"\n", + " tokens = self.proj(imgs) #perform linear projection\n", + " clstoken = self.clstoken.repeat(self.N, 1, 1)\n", + " tokens = torch.cat([clstoken, tokens], dim=1) #concat the class token\n", + " x = tokens + self.posembed #add positional encoding\n", + " \"\"\"Transformer\"\"\"\n", + " x = self.transformer(x)\n", + " \"\"\"Classification\"\"\"\n", + " y = x[0]\n", + " return self.classifier(y)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/train-checkpoint.ipynb b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/train-checkpoint.ipynb new file mode 100644 index 000000000..04b276bce --- /dev/null +++ b/recognition/vision-transformer-4696689/old/.ipynb_checkpoints/train-checkpoint.ipynb @@ -0,0 +1,246 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "73ebb771", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so, 6): Library not loaded: @rpath/libpng16.16.dylib\n", + " Referenced from: /Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so\n", + " Reason: Incompatible library version: image.so requires version 56.0.0 or later, but libpng16.16.dylib provides version 54.0.0'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", + " warn(\n" + ] + } + ], + "source": [ + "\"\"\"\n", + "Imports Here\n", + "\"\"\"\n", + "from dataset import trainloader\n", + "from dataset import testloader\n", + "from dataset import trainaccloader\n", + "from dataset import trainshape\n", + "from dataset import testshape" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "df0ea69a", + "metadata": {}, + "outputs": [], + "source": [ + "from model import VisionTransformer\n", + "from model import Attention\n", + "from model import TransBlock\n", + "from model3d import Inception" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "ae8aebe7", + "metadata": {}, + "outputs": [], + "source": [ + "TRAIN_LOSS = []\n", + "TRAIN_ACC = []\n", + "\n", + "def train(model, dataloader, accloader, lossfunc, optimiser, lr=0.1, momentum=0.9, batchsize=16, nepochs=10):\n", + " device = next(model.parameters()).device # check what device the net parameters are on\n", + " \n", + " \"\"\"training\"\"\"\n", + " for i in range(nepochs): # for each epoch\n", + " epoch_loss = 0\n", + " model.train()\n", + " n_batches = 0\n", + " time1 = time.time()\n", + " for (x, y) in dataloader: # for each mini-batch\n", + " optimiser.zero_grad(set_to_none=True)\n", + " loss = lossfunc(model.forward(x), y)\n", + " loss.backward()\n", + " optimiser.step()\n", + " epoch_loss += loss\n", + " n_batches += 1\n", + " time2 = time.time()\n", + " print(\"Done an epoch\", time2-time1)\n", + " epoch_loss /= n_batches\n", + " \n", + " \"\"\"evaluating\"\"\"\n", + " model.eval()\n", + " accuracy = test(model, accloader)\n", + "\n", + " \"\"\"get performance\"\"\"\n", + " TRAIN_LOSS.append(epoch_loss.item())\n", + " TRAIN_ACC.append(accuracy)\n", + "\n", + "def test(model, dataloader):\n", + " with torch.no_grad(): # disable automatic gradient computation for efficiency\n", + " device = next(model.parameters()).device\n", + " \n", + " \"\"\"make predictions\"\"\"\n", + " pcls = []\n", + " items = 0\n", + " time1=time.time()\n", + " for x, y in dataloader:\n", + " x = x.to(device)\n", + " pcls.append(abs(y.cpu()-torch.max(model(x), 1)[1].cpu()))\n", + " items += 1\n", + " time2 = time.time()\n", + " print(\"found accuracy in:\", time2-time1)\n", + "\n", + " \"\"\"get accuracy\"\"\"\n", + " pcls = torch.cat(pcls) # concat predictions on the mini-batches\n", + " accuracy = 1 - (pcls.sum().float() / items)\n", + " print(\"accuracy:\", accuracy)\n", + " return accuracy" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "75a45973", + "metadata": {}, + "outputs": [], + "source": [ + "batchsize=16\n", + "N, Np, P = trainshape()\n", + "model = VisionTransformer(inputsize=(batchsize, Np, P), embed=128, fflscale=2, nblocks=4)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "7b54a6f0", + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.optim as optim\n", + "\n", + "criterion = nn.CrossEntropyLoss()\n", + "optimiser = optim.AdamW(model.parameters(), lr=1e-4)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "18488555", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done an epoch 346.20038080215454\n", + "found accuracy in: 135.9069368839264\n", + "accuracy: tensor(0.5288)\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [43]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m start \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[0;32m----> 2\u001b[0m \u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrainloader\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbatchsize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbatchsize\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrainaccloader\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcriterion\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moptimiser\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnepochs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m10\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m end \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtraining time: \u001b[39m\u001b[38;5;124m\"\u001b[39m, end\u001b[38;5;241m-\u001b[39mstart)\n", + "Input \u001b[0;32mIn [40]\u001b[0m, in \u001b[0;36mtrain\u001b[0;34m(model, dataloader, accloader, lossfunc, optimiser, lr, momentum, batchsize, nepochs)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m (x, y) \u001b[38;5;129;01min\u001b[39;00m dataloader: \u001b[38;5;66;03m# for each mini-batch\u001b[39;00m\n\u001b[1;32m 14\u001b[0m optimiser\u001b[38;5;241m.\u001b[39mzero_grad(set_to_none\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m---> 15\u001b[0m loss \u001b[38;5;241m=\u001b[39m lossfunc(\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mforward\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m, y)\n\u001b[1;32m 16\u001b[0m loss\u001b[38;5;241m.\u001b[39mbackward()\n\u001b[1;32m 17\u001b[0m optimiser\u001b[38;5;241m.\u001b[39mstep()\n", + "File \u001b[0;32m~/Desktop/COMP3710 Project/PatternAnalysis-2023/recognition/vision-transformer-4696689/model.py:84\u001b[0m, in \u001b[0;36mVisionTransformer.forward\u001b[0;34m(self, imgs)\u001b[0m\n\u001b[1;32m 82\u001b[0m x \u001b[38;5;241m=\u001b[39m tokens \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mposembed\u001b[38;5;241m.\u001b[39mrepeat(imgs\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m], \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m1\u001b[39m) \u001b[38;5;66;03m#add positional encoding\u001b[39;00m\n\u001b[1;32m 83\u001b[0m \u001b[38;5;124;03m\"\"\"Transformer\"\"\"\u001b[39;00m\n\u001b[0;32m---> 84\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransformer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 85\u001b[0m \u001b[38;5;124;03m\"\"\"Classification\"\"\"\u001b[39;00m\n\u001b[1;32m 86\u001b[0m y \u001b[38;5;241m=\u001b[39m x[:,\u001b[38;5;241m0\u001b[39m]\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/container.py:217\u001b[0m, in \u001b[0;36mSequential.forward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m):\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m module \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m:\n\u001b[0;32m--> 217\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mmodule\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28minput\u001b[39m\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/Desktop/COMP3710 Project/PatternAnalysis-2023/recognition/vision-transformer-4696689/model.py:43\u001b[0m, in \u001b[0;36mTransBlock.forward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, x):\n\u001b[1;32m 38\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 39\u001b[0m \u001b[38;5;124;03m Switching to pre-MHA LayerNorm is supposed to give better performance,\u001b[39;00m\n\u001b[1;32m 40\u001b[0m \u001b[38;5;124;03m this is used in other models such as LLMs like GPT. Gradients are meant\u001b[39;00m\n\u001b[1;32m 41\u001b[0m \u001b[38;5;124;03m to be stabilised. This is different to the original ViT paper.\u001b[39;00m\n\u001b[1;32m 42\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m---> 43\u001b[0m x \u001b[38;5;241m=\u001b[39m x \u001b[38;5;241m+\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfnorm\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 44\u001b[0m x \u001b[38;5;241m=\u001b[39m x \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mffl(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msnorm(x))\n\u001b[1;32m 45\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m x\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/Desktop/COMP3710 Project/PatternAnalysis-2023/recognition/vision-transformer-4696689/model.py:22\u001b[0m, in \u001b[0;36mAttention.forward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 19\u001b[0m K \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mK(x)\n\u001b[1;32m 20\u001b[0m V \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mV(x)\n\u001b[0;32m---> 22\u001b[0m attnout, attnweights \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattn\u001b[49m\u001b[43m(\u001b[49m\u001b[43mQ\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mK\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mV\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 23\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m attnout\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/activation.py:1189\u001b[0m, in \u001b[0;36mMultiheadAttention.forward\u001b[0;34m(self, query, key, value, key_padding_mask, need_weights, attn_mask, average_attn_weights, is_causal)\u001b[0m\n\u001b[1;32m 1175\u001b[0m attn_output, attn_output_weights \u001b[38;5;241m=\u001b[39m F\u001b[38;5;241m.\u001b[39mmulti_head_attention_forward(\n\u001b[1;32m 1176\u001b[0m query, key, value, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39membed_dim, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnum_heads,\n\u001b[1;32m 1177\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39min_proj_weight, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39min_proj_bias,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1186\u001b[0m average_attn_weights\u001b[38;5;241m=\u001b[39maverage_attn_weights,\n\u001b[1;32m 1187\u001b[0m is_causal\u001b[38;5;241m=\u001b[39mis_causal)\n\u001b[1;32m 1188\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1189\u001b[0m attn_output, attn_output_weights \u001b[38;5;241m=\u001b[39m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmulti_head_attention_forward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1190\u001b[0m \u001b[43m \u001b[49m\u001b[43mquery\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43membed_dim\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnum_heads\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1191\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43min_proj_weight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43min_proj_bias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1192\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias_k\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias_v\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd_zero_attn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1193\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdropout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mout_proj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mout_proj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1194\u001b[0m \u001b[43m \u001b[49m\u001b[43mtraining\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtraining\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1195\u001b[0m \u001b[43m \u001b[49m\u001b[43mkey_padding_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkey_padding_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1196\u001b[0m \u001b[43m \u001b[49m\u001b[43mneed_weights\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mneed_weights\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1197\u001b[0m \u001b[43m \u001b[49m\u001b[43mattn_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattn_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1198\u001b[0m \u001b[43m \u001b[49m\u001b[43maverage_attn_weights\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maverage_attn_weights\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1199\u001b[0m \u001b[43m \u001b[49m\u001b[43mis_causal\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mis_causal\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1200\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbatch_first \u001b[38;5;129;01mand\u001b[39;00m is_batched:\n\u001b[1;32m 1201\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m attn_output\u001b[38;5;241m.\u001b[39mtranspose(\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m0\u001b[39m), attn_output_weights\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/functional.py:5313\u001b[0m, in \u001b[0;36mmulti_head_attention_forward\u001b[0;34m(query, key, value, embed_dim_to_check, num_heads, in_proj_weight, in_proj_bias, bias_k, bias_v, add_zero_attn, dropout_p, out_proj_weight, out_proj_bias, training, key_padding_mask, need_weights, attn_mask, use_separate_proj_weight, q_proj_weight, k_proj_weight, v_proj_weight, static_k, static_v, average_attn_weights, is_causal)\u001b[0m\n\u001b[1;32m 5311\u001b[0m attn_output_weights \u001b[38;5;241m=\u001b[39m attn_output_weights\u001b[38;5;241m.\u001b[39mview(bsz, num_heads, tgt_len, src_len)\n\u001b[1;32m 5312\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m average_attn_weights:\n\u001b[0;32m-> 5313\u001b[0m attn_output_weights \u001b[38;5;241m=\u001b[39m \u001b[43mattn_output_weights\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmean\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdim\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 5315\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_batched:\n\u001b[1;32m 5316\u001b[0m \u001b[38;5;66;03m# squeeze the output if input was unbatched\u001b[39;00m\n\u001b[1;32m 5317\u001b[0m attn_output \u001b[38;5;241m=\u001b[39m attn_output\u001b[38;5;241m.\u001b[39msqueeze(\u001b[38;5;241m1\u001b[39m)\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "start = time.time()\n", + "train(model, trainloader(batchsize=batchsize), trainaccloader(), criterion, optimiser, nepochs=10)\n", + "end = time.time()\n", + "print(\"training time: \", end-start)\n", + "test(model, testloader())" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "bbaac2fc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n", + "[]\n" + ] + } + ], + "source": [ + "print(TRAIN_LOSS)\n", + "print(TRAIN_ACC)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "94178617", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "280706\n" + ] + } + ], + "source": [ + "print(sum(p.numel() for p in model.parameters()))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ccfcbae", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/recognition/vision-transformer-4696689/old/conv b/recognition/vision-transformer-4696689/old/conv new file mode 100644 index 000000000..e69de29bb diff --git a/recognition/vision-transformer-4696689/old/dataloader_torch.ipynb b/recognition/vision-transformer-4696689/old/dataloader_torch.ipynb new file mode 100644 index 000000000..48b59d112 --- /dev/null +++ b/recognition/vision-transformer-4696689/old/dataloader_torch.ipynb @@ -0,0 +1,181 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 8, + "id": "b8467df9", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Imports Here\n", + "\"\"\"\n", + "\"\"\"numpy and torch\"\"\"\n", + "import numpy as np\n", + "import torch\n", + "\n", + "\"\"\"PIL\"\"\"\n", + "from PIL import Image\n", + "\n", + "\"\"\"torchvision and utils\"\"\"\n", + "import torchvision.transforms as transforms\n", + "from torch.utils.data import DataLoader, Dataset\n", + "\n", + "\"\"\"os\"\"\"\n", + "import os\n", + "\n", + "\"\"\"\n", + "Loading data from local file\n", + "\"\"\"\n", + "\n", + "\"\"\"Assumes images have pixel values in range [0,255]\"\"\"\n", + "def getImages(trainDIRs, testDIRS):\n", + " \"\"\"Get image to tensor\"\"\"\n", + " transform = transforms.Compose([\n", + " transforms.PILToTensor()\n", + " ])\n", + " hflip = transforms.Compose([\n", + " transforms.RandomHorizontalFlip(p=1.0),\n", + " transforms.PILToTensor()\n", + " ])\n", + " vflip = transforms.Compose([\n", + " transforms.RandomVerticalFlip(p=1.0),\n", + " transforms.PILToTensor()\n", + " ])\n", + " dflip = transforms.Compose([\n", + " transforms.RandomHorizontalFlip(p=1.0),\n", + " transforms.RandomVerticalFlip(p=1.0),\n", + " transforms.PILToTensor()\n", + " ])\n", + " tlist = [transform, hflip, vflip, dflip]\n", + " \"\"\"Loading data into arrays\"\"\"\n", + " xtrain, xtrain, xtest, ytest = [], [], [], []\n", + " \"\"\"training data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(trainDIRs):\n", + " for t in tlist:\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = t(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " j = (j+1) % 20\n", + " if j == 0:\n", + " xtrain.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtrain = torch.stack(xtrain)\n", + " ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + "\n", + "\n", + " \"\"\"testing data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(testDIRs):\n", + " for t in tlist:\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " j = (j+1) % 20\n", + " if j == 0:\n", + " xtest.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtest = torch.stack(xtest)\n", + " idx = torch.randperm(xtest.size(0))\n", + " xtest = xtest[idx, :]\n", + " splitsize = int(xtest.shape[0]/2)\n", + " xval, xtest = xtest.split(splitsize, dim=0)\n", + " ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " ytest = ytest[idx]\n", + " yval, ytest = ytest.split(splitsize, dim=0)\n", + " return xtrain, ytrain, xtest, ytest, xval, yval\n", + "\n", + "\"\"\"\n", + "Dataloader\n", + "\"\"\"\n", + "class DatasetWrapper(Dataset):\n", + " def __init__(self, X, y=None):\n", + " self.X, self.y = X, y\n", + "\n", + " def __len__(self):\n", + " return len(self.X)\n", + "\n", + " def __getitem__(self, idx):\n", + " if self.y is None:\n", + " return self.X[idx]\n", + " else:\n", + " return self.X[idx], self.y[idx]\n", + "\n", + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "xtrain, ytrain, xtest, ytest, xval, yval = getImages(trainDIRs, testDIRs)\n", + "ytrain, ytest = ytrain.type(torch.LongTensor), ytest.type(torch.LongTensor)\n", + "xtrain = xtrain.permute(0, 2, 1, 3, 4)\n", + "xtest = xtest.permute(0, 2, 1, 3, 4)\n", + "xval = xval.permute(0, 2, 1, 3, 4)\n", + "\n", + "def trainloader(batchsize=16):\n", + " return DataLoader(DatasetWrapper(xtrain, ytrain), batch_size=batchsize, shuffle=True, pin_memory=True)\n", + "\n", + "def valloader():\n", + " return DataLoader(DatasetWrapper(xval, yval), batch_size=1, shuffle=True, pin_memory=True)\n", + "\n", + "def testloader():\n", + " return DataLoader(DatasetWrapper(xtest, ytest), batch_size=1, shuffle=True, pin_memory=True)\n", + "\n", + "def trainshape():\n", + " return xtrain.shape\n", + "\n", + "def testshape():\n", + " return xtest.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0334d1ac", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([4304, 1, 20, 240, 256]) torch.Size([900, 1, 20, 240, 256])\n" + ] + } + ], + "source": [ + "print(trainshape(), testshape())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/recognition/vision-transformer-4696689/dataset.ipynb b/recognition/vision-transformer-4696689/old/dataset.ipynb similarity index 92% rename from recognition/vision-transformer-4696689/dataset.ipynb rename to recognition/vision-transformer-4696689/old/dataset.ipynb index 7faec9419..f0321fffd 100644 --- a/recognition/vision-transformer-4696689/dataset.ipynb +++ b/recognition/vision-transformer-4696689/old/dataset.ipynb @@ -36,6 +36,14 @@ "import os" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "97e1d5de", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": 2, @@ -72,6 +80,11 @@ " transform = transforms.Compose([\n", " transforms.PILToTensor()\n", " ])\n", + " augment = transforms.Compose([\n", + " Rescale(256), \n", + " RandomCrop(224), \n", + " ToTensor()\n", + " ])\n", " \"\"\"Loading data into arrays\"\"\"\n", " xtrain, xtrain, xtest, ytest = [], [], [], []\n", " \"\"\"training data\"\"\"\n", @@ -104,6 +117,7 @@ " tensor = transform(img).float()\n", " tensor.require_grad = True\n", " px.append(tensor/255)\n", + " j = (j+1) % 20\n", " if j == 0:\n", " xtest.append(torch.stack(px))\n", " px = []\n", @@ -244,6 +258,26 @@ "def testshape():\n", " return xtest.shape" ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "8979dcd1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1076, 4800, 256])\n", + "torch.Size([450, 4800, 256])\n" + ] + } + ], + "source": [ + "print(xtrain.shape)\n", + "print(xtest.shape)" + ] } ], "metadata": { diff --git a/recognition/vision-transformer-4696689/old/dataset3d.ipynb b/recognition/vision-transformer-4696689/old/dataset3d.ipynb new file mode 100644 index 000000000..11983c0d9 --- /dev/null +++ b/recognition/vision-transformer-4696689/old/dataset3d.ipynb @@ -0,0 +1,319 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "338da719", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so, 6): Library not loaded: @rpath/libpng16.16.dylib\n", + " Referenced from: /Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so\n", + " Reason: Incompatible library version: image.so requires version 56.0.0 or later, but libpng16.16.dylib provides version 54.0.0'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", + " warn(\n" + ] + } + ], + "source": [ + "\"\"\"\n", + "Imports Here\n", + "\"\"\"\n", + "\"\"\"numpy and torch\"\"\"\n", + "import numpy as np\n", + "import torch\n", + "\n", + "\"\"\"PIL\"\"\"\n", + "from PIL import Image\n", + "\n", + "\"\"\"torchvision and utils\"\"\"\n", + "import torchvision.transforms as transforms\n", + "from torch.utils.data import DataLoader, Dataset\n", + "\n", + "\"\"\"os\"\"\"\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "65011ff4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nLoading data from local file\\n'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Loading data from local file\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "206e485b", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"Assumes images have pixel values in range [0,255]\"\"\"\n", + "def getImages(trainDIRs, testDIRS):\n", + " \"\"\"Get image to tensor\"\"\"\n", + " transform = transforms.Compose([\n", + " transforms.PILToTensor()\n", + " ])\n", + " \"\"\"Loading data into arrays\"\"\"\n", + " xtrain, xtrain, xtest, ytest = [], [], [], []\n", + " \"\"\"training data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(trainDIRs):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " j = (j+1) % 20\n", + " if j == 0:\n", + " xtrain.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtrain = torch.stack(xtrain)\n", + " ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " \n", + " \"\"\"testing data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(testDIRs):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " j = (j+1) % 20\n", + " if j == 0:\n", + " xtest.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtest = torch.stack(xtest)\n", + " splitsize = int(xtest.shape[0]/2)\n", + " xval, xtest = xtest.split(splitsize, dim=0)\n", + " yval, ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0)).split(splitsize)\n", + " return xtrain, ytrain, xtest, ytest, xval, yval" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "292100c2", + "metadata": {}, + "outputs": [], + "source": [ + "def createPatches(imgs, patchsize):\n", + " (N, M, C, W, H) = imgs.shape\n", + " (dsize, wsize, hsize) = patchsize\n", + " \"\"\"check for errors with sizing\"\"\"\n", + " if (M % dsize != 0) or (W % wsize != 0) or (H % hsize != 0):\n", + " raise Exception(\"patchsize is not appropriate\")\n", + " imgs = imgs.permute(0, 2, 1, 3, 4) # switch M and C\n", + " size = (N, C, M // dsize, dsize, W // wsize, wsize, H // hsize, hsize)\n", + " perm = (0, 2, 4, 6, 1, 3, 5, 7)\n", + " imgs = imgs.reshape(size).permute(perm).flatten(1, 3).flatten(2, 5)\n", + " return imgs #in format Nimgs, Npatches, patchsize" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "e0897522", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nDataloader\\n'" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Dataloader\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "05c80732", + "metadata": {}, + "outputs": [], + "source": [ + "class DatasetWrapper(Dataset):\n", + " def __init__(self, X, y=None):\n", + " self.X, self.y = X, y\n", + "\n", + " def __len__(self):\n", + " return len(self.X)\n", + "\n", + " def __getitem__(self, idx):\n", + " if self.y is None:\n", + " return self.X[idx]\n", + " else:\n", + " return self.X[idx], self.y[idx]" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "ea41eef5", + "metadata": {}, + "outputs": [], + "source": [ + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "xtrain, ytrain, xtest, ytest, xval, yval = getImages(trainDIRs, testDIRs)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "1f077f43", + "metadata": {}, + "outputs": [], + "source": [ + "#xtrain = createPatches(xtrain, (4,16,16))\n", + "#xtest = createPatches(xtest, (4,16,16))\n", + "xval = createPatches(xval, (4,16,16))" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "a02e05bd", + "metadata": {}, + "outputs": [], + "source": [ + "def trainloader(batchsize=16):\n", + " return DataLoader(DatasetWrapper(xtrain, ytrain), batchsize=batchsize, shuffle=True)\n", + "\n", + "def testloader():\n", + " return DataLoader(DatasetWrapper(xtest, ytest), batchsize=1, shuffle=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "18d6ca10", + "metadata": {}, + "outputs": [], + "source": [ + "def trainshape():\n", + " return xtrain.shape\n", + "\n", + "def testshape():\n", + " return xtest.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "690cd78c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1076, 1200, 1024])\n" + ] + } + ], + "source": [ + "print(xtrain.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "c24aa902", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([225, 1200, 1024])\n" + ] + } + ], + "source": [ + "print(xtest.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "a39f7b82", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([225, 1200, 1024])\n" + ] + } + ], + "source": [ + "print(xval.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9183e53b", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/recognition/vision-transformer-4696689/old/datasetconv.ipynb b/recognition/vision-transformer-4696689/old/datasetconv.ipynb new file mode 100644 index 000000000..715659242 --- /dev/null +++ b/recognition/vision-transformer-4696689/old/datasetconv.ipynb @@ -0,0 +1,365 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "338da719", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so, 6): Library not loaded: @rpath/libpng16.16.dylib\n", + " Referenced from: /Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so\n", + " Reason: Incompatible library version: image.so requires version 56.0.0 or later, but libpng16.16.dylib provides version 54.0.0'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", + " warn(\n" + ] + } + ], + "source": [ + "\"\"\"\n", + "Imports Here\n", + "\"\"\"\n", + "\"\"\"numpy and torch\"\"\"\n", + "import numpy as np\n", + "import torch\n", + "\n", + "\"\"\"PIL\"\"\"\n", + "from PIL import Image\n", + "\n", + "\"\"\"torchvision and utils\"\"\"\n", + "import torchvision.transforms as transforms\n", + "from torch.utils.data import DataLoader, Dataset\n", + "\n", + "\"\"\"os\"\"\"\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "65011ff4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nLoading data from local file\\n'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Loading data from local file\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "206e485b", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"Assumes images have pixel values in range [0,255]\"\"\"\n", + "def getImages(trainDIRs, testDIRS):\n", + " \"\"\"Get image to tensor\"\"\"\n", + " transform = transforms.Compose([\n", + " transforms.PILToTensor()\n", + " ])\n", + " \"\"\"Loading data into arrays\"\"\"\n", + " xtrain, xtrain, xtest, ytest = [], [], [], []\n", + " \"\"\"training data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(trainDIRs):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " j = (j+1) % 20\n", + " if j == 0:\n", + " xtrain.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtrain = torch.stack(xtrain)\n", + " ytrain = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " \n", + " \"\"\"testing data\"\"\"\n", + " size = [0, 0]\n", + " for i, DIR in enumerate(testDIRs):\n", + " px = []\n", + " j = 0\n", + " for filename in sorted(os.listdir(DIR)):\n", + " f = os.path.join(DIR, filename)\n", + " img = Image.open(f)\n", + " tensor = transform(img).float()\n", + " tensor.require_grad = True\n", + " px.append(tensor/255)\n", + " j = (j+1) % 20\n", + " if j == 0:\n", + " xtest.append(torch.stack(px))\n", + " px = []\n", + " size[i] += 1\n", + " xtest = torch.stack(xtest)\n", + " ytest = torch.from_numpy(np.concatenate((np.ones(size[0]), np.zeros(size[1])), axis=0))\n", + " return xtrain, ytrain, xtest, ytest" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e0897522", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nDataloader\\n'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Dataloader\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "05c80732", + "metadata": {}, + "outputs": [], + "source": [ + "class DatasetWrapper(Dataset):\n", + " def __init__(self, X, y=None):\n", + " self.X, self.y = X, y\n", + "\n", + " def __len__(self):\n", + " return len(self.X)\n", + "\n", + " def __getitem__(self, idx):\n", + " if self.y is None:\n", + " return self.X[idx]\n", + " else:\n", + " return self.X[idx], self.y[idx]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ea41eef5", + "metadata": {}, + "outputs": [], + "source": [ + "trainDIRs = ['../../../AD_NC/train/AD/', '../../../AD_NC/train/NC']\n", + "testDIRs = ['../../../AD_NC/test/AD/', '../../../AD_NC/test/NC']\n", + "xtrain, ytrain, xtest, ytest = getImages(trainDIRs, testDIRs)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "a161d76a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1076, 20, 1, 240, 256])\n", + "torch.Size([450, 20, 1, 240, 256])\n", + "torch.Size([450])\n" + ] + } + ], + "source": [ + "print(xtrain.shape)\n", + "print(xtest.shape)\n", + "print(ytest.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "848190bc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([16, 192, 96])\n", + "0.2741\n" + ] + } + ], + "source": [ + "class ConvLayer2(nn.Module):\n", + " def __init__(self):\n", + " super().__init__()\n", + " #pool\n", + " self.pool = nn.MaxPool2d(kernel_size=3, stride=2)\n", + " self.relu = nn.ReLU()\n", + " #first layer\n", + " self.conv11_x = nn.Conv2d(20, 48, kernel_size=(11,11), stride=(4,4), padding=(0,0))\n", + " self.conv11_y = nn.Conv2d(240, 48, kernel_size=(11,3), stride=(4,1), padding=(0,0))\n", + " self.conv11_z = nn.Conv2d(256, 48, kernel_size=(3,11), stride=(1,4), padding=(0,0))\n", + " #second layer\n", + " self.conv5_x = nn.Conv2d(48, 192, kernel_size=(5,5), stride=(2,2), padding=(0,0))\n", + " self.conv5_y = nn.Conv2d(48, 192, kernel_size=(5,3), stride=(2,1), padding=(0,0))\n", + " self.conv5_z = nn.Conv2d(48, 192, kernel_size=(3,5), stride=(1,2), padding=(0,0))\n", + " #projection\n", + " self.l_x = nn.Linear(30, 32)\n", + " self.l_y = nn.Linear(12, 32)\n", + " self.l_z = nn.Linear(10, 32)\n", + "\n", + " def forward(self, imgs):\n", + " #input N, C, L, W, H\n", + " #first layer\n", + " x_x = self.relu(self.pool(self.conv11_x(imgs.flatten(1,2))))\n", + " x_y = self.relu(self.pool(self.conv11_y(imgs.permute(0,1,3,4,2).flatten(1,2))))\n", + " x_z = self.relu(self.pool(self.conv11_z(imgs.permute(0,1,4,2,3).flatten(1,2))))\n", + " #second layer\n", + " x_x = self.relu(self.pool(self.conv5_x(x_x)))\n", + " x_y = self.relu(self.pool(self.conv5_y(x_y)))\n", + " x_z = self.relu(self.pool(self.conv5_z(x_z)))\n", + " #projection\n", + " x_x = self.l_x(x_x.flatten(2,3))\n", + " x_y = self.l_y(x_y.flatten(2,3))\n", + " x_z = self.l_z(x_z.flatten(2,3))\n", + " return torch.cat([x_x, x_y, x_z], dim=2)\n", + "import time\n", + "start = time.time()\n", + "conv=ConvLayer2()\n", + "print(conv(xtrain[0:16,:].permute(0,2,1,3,4)).shape)\n", + "end = time.time()\n", + "print(round(end-start, 4))" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "f295ee82", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.004753589630127\n" + ] + } + ], + "source": [ + "conv_11 = nn.Conv2d(20, 64, kernel_size=(11,11), stride=(4,4), padding=(0,0))\n", + "import time\n", + "total = 0\n", + "for i in range(10):\n", + " start=time.time()\n", + " x = conv_11(xtrain[0:16, :].permute(0,2,1,3,4).flatten(1,2))\n", + " end = time.time()\n", + " total += end-start\n", + "print(total)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "c5e39d11", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1076, 256, 4, 5, 6])\n" + ] + } + ], + "source": [ + "import torch.nn as nn\n", + "class ConvLayer(nn.Module):\n", + " def __init__(self):\n", + " super().__init__()\n", + " self.conv11 = nn.Conv3d(1, 64, kernel_size=(3,11,11), stride=(1,4,4), padding=(1,0,0))\n", + " self.firstpool = nn.MaxPool3d(kernel_size=3, stride=2)\n", + " self.conv5 = nn.Conv3d(64, 256, kernel_size=(3,5,5), stride=(1,2,2), padding=(1,0,0))\n", + " self.secondpool = nn.MaxPool3d(kernel_size=3, stride=2)\n", + "\n", + " def forward(self, imgs):\n", + " x = self.conv11(imgs)\n", + " x = self.firstpool(x)\n", + " x = self.conv5(x)\n", + " x = self.secondpool(x)\n", + " return x\n", + " \n", + "conv = ConvLayer()\n", + "x = conv(xtrain.permute(0,2,1,3,4))\n", + "print(x.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a02e05bd", + "metadata": {}, + "outputs": [], + "source": [ + "def trainloader(batchsize=16):\n", + " return DataLoader(DatasetWrapper(xtrain, ytrain), batchsize=batchsize, shuffle=True)\n", + "\n", + "def testloader():\n", + " return DataLoader(DatasetWrapper(xtest, ytest), batchsize=1, shuffle=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "18d6ca10", + "metadata": {}, + "outputs": [], + "source": [ + "def trainshape():\n", + " return xtrain.shape\n", + "\n", + "def testshape():\n", + " return xtest.shape" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/recognition/vision-transformer-4696689/old/matplots.ipynb b/recognition/vision-transformer-4696689/old/matplots.ipynb new file mode 100644 index 000000000..2fed751f6 --- /dev/null +++ b/recognition/vision-transformer-4696689/old/matplots.ipynb @@ -0,0 +1,88 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "46c2d9b9", + "metadata": {}, + "outputs": [], + "source": [ + "LOSS = [0.72875, 0.70531, 0.66767, 0.61233, 0.53435, 0.49842, 0.43119, 0.45669, 0.38625, 0.35263, 0.36537, 0.32514, 0.26318, 0.2506, 0.24311, 0.18782, 0.17435, 0.13011, 0.14882, 0.17382, 0.10999, 0.13796, 0.07506, 0.06944, 0.06198, 0.03524, 0.07395, 0.09999, 0.04692, 0.03988, 0.0566, 0.02929, 0.01366, 0.01277, 0.01246, 0.01824, 0.04371, 0.0791, 0.04064, 0.04082, 0.01846, 0.00784, 0.00725, 0.00714, 0.0071, 0.00703, 0.00697, 0.00684, 0.00686, 0.00677, 0.00665, 0.00629, 0.00595, 0.01606, 0.11788, 0.21843, 0.02893, 0.01473, 0.04044, 0.02642, 0.02621, 0.00663, 0.00604, 0.00071, 0.00035, 0.00026, 0.00022, 0.0002, 0.00018, 0.00016, 0.00015, 0.00014, 0.00013, 0.00012, 0.00011, 0.0001, 0.0001, 9e-05, 8e-05, 8e-05, 7e-05, 7e-05, 7e-05, 6e-05, 6e-05, 6e-05, 5e-05, 5e-05, 5e-05, 5e-05, 4e-05, 4e-05, 4e-05, 4e-05, 4e-05, 4e-05, 3e-05, 3e-05, 3e-05, 3e-05, 3e-05, 3e-05, 3e-05, 3e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", + "ACC = [50.67, 51.11, 58.67, 63.11, 57.78, 62.67, 63.56, 66.22, 66.22, 67.11, 66.67, 65.78, 67.56, 65.33, 68.0, 68.44, 67.11, 64.89, 64.89, 67.56, 68.0, 69.33, 67.11, 67.56, 68.0, 67.56, 66.22, 71.11, 69.33, 67.11, 66.67, 69.78, 69.33, 69.78, 69.78, 68.0, 66.67, 68.89, 69.78, 69.78, 68.44, 67.56, 67.11, 67.56, 67.56, 67.56, 68.0, 68.0, 68.0, 68.0, 68.0, 67.56, 67.56, 68.0, 66.22, 70.67, 67.56, 66.67, 68.89, 65.33, 66.67, 70.22, 68.0, 69.78, 68.89, 68.0, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6983675d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "steps = range(175)\n", + "plt.plot(steps, LOSS)\n", + "plt.ylabel('LOSS')\n", + "plt.xlabel('epoch')\n", + "plt.show()\n", + "plt.plot(steps, ACC)\n", + "plt.ylabel('ACCURACY')\n", + "plt.xlabel('epoch')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d7c1506", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/recognition/vision-transformer-4696689/model.ipynb b/recognition/vision-transformer-4696689/old/model.ipynb similarity index 78% rename from recognition/vision-transformer-4696689/model.ipynb rename to recognition/vision-transformer-4696689/old/model.ipynb index f686287c6..3263fcf63 100644 --- a/recognition/vision-transformer-4696689/model.ipynb +++ b/recognition/vision-transformer-4696689/old/model.ipynb @@ -70,6 +70,43 @@ " return x" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2a5e050", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Inception module for efficient 7x7 convolution\n", + "\"\"\"\n", + "class Inception(nn.Module):\n", + " def __init__(self, dimin, dimout):\n", + " super().__init__()\n", + " self.branch1 = nn.Sequential(\n", + " nn.Conv2d(dimin, dimout[0], 1, stride=(1,1)),\n", + " nn.Conv2d(dimout[0], dimout[0], 3, stride=(1,1), padding=1),\n", + " nn.Conv2d(dimout[0], dimout[0], 3, stride=(1,1), padding=1)\n", + " )\n", + " self.branch2 = nn.Sequential(\n", + " nn.Conv2d(dimin, dimout[1]), 1, stride=(1,1),\n", + " nn.Conv2d(dimout[1], dimout[1], 3, stride=(1,1), padding=1)\n", + " )\n", + " self.branch3 = nn.Sequential(\n", + " nn.AvgPool2d(3, stride=(1,1), padding=1),\n", + " nn.Conv2d(dimin, dimout[2], 1, stride=(1,1))\n", + " )\n", + " self.branch4 = nn.Sequential(\n", + " nn.Conv2d(dimin, dimout[3], 1, stride=(1,1))\n", + " )\n", + " def forward(self, imgs)\n", + " x1 = self.branch1(imgs)\n", + " x2 = self.branch2(imgs)\n", + " x3 = self.branch3(imgs)\n", + " x4 = self.branch4(imgs)\n", + " return torch.cat([x1, x2, x3, x4], dim=1)" + ] + }, { "cell_type": "code", "execution_count": 44, diff --git a/recognition/vision-transformer-4696689/model.py b/recognition/vision-transformer-4696689/old/model.py similarity index 100% rename from recognition/vision-transformer-4696689/model.py rename to recognition/vision-transformer-4696689/old/model.py diff --git a/recognition/vision-transformer-4696689/old/model2 output b/recognition/vision-transformer-4696689/old/model2 output new file mode 100644 index 000000000..0df3b0d5f --- /dev/null +++ b/recognition/vision-transformer-4696689/old/model2 output @@ -0,0 +1,6 @@ +cuda +training time: 27699.315416812897 +test acc: tensor(0.6800) +[0.72875, 0.70531, 0.66767, 0.61233, 0.53435, 0.49842, 0.43119, 0.45669, 0.38625, 0.35263, 0.36537, 0.32514, 0.26318, 0.2506, 0.24311, 0.18782, 0.17435, 0.13011, 0.14882, 0.17382, 0.10999, 0.13796, 0.07506, 0.06944, 0.06198, 0.03524, 0.07395, 0.09999, 0.04692, 0.03988, 0.0566, 0.02929, 0.01366, 0.01277, 0.01246, 0.01824, 0.04371, 0.0791, 0.04064, 0.04082, 0.01846, 0.00784, 0.00725, 0.00714, 0.0071, 0.00703, 0.00697, 0.00684, 0.00686, 0.00677, 0.00665, 0.00629, 0.00595, 0.01606, 0.11788, 0.21843, 0.02893, 0.01473, 0.04044, 0.02642, 0.02621, 0.00663, 0.00604, 0.00071, 0.00035, 0.00026, 0.00022, 0.0002, 0.00018, 0.00016, 0.00015, 0.00014, 0.00013, 0.00012, 0.00011, 0.0001, 0.0001, 9e-05, 8e-05, 8e-05, 7e-05, 7e-05, 7e-05, 6e-05, 6e-05, 6e-05, 5e-05, 5e-05, 5e-05, 5e-05, 4e-05, 4e-05, 4e-05, 4e-05, 4e-05, 4e-05, 3e-05, 3e-05, 3e-05, 3e-05, 3e-05, 3e-05, 3e-05, 3e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 2e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +[50.67, 51.11, 58.67, 63.11, 57.78, 62.67, 63.56, 66.22, 66.22, 67.11, 66.67, 65.78, 67.56, 65.33, 68.0, 68.44, 67.11, 64.89, 64.89, 67.56, 68.0, 69.33, 67.11, 67.56, 68.0, 67.56, 66.22, 71.11, 69.33, 67.11, 66.67, 69.78, 69.33, 69.78, 69.78, 68.0, 66.67, 68.89, 69.78, 69.78, 68.44, 67.56, 67.11, 67.56, 67.56, 67.56, 68.0, 68.0, 68.0, 68.0, 68.0, 67.56, 67.56, 68.0, 66.22, 70.67, 67.56, 66.67, 68.89, 65.33, 66.67, 70.22, 68.0, 69.78, 68.89, 68.0, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44, 68.44] +[147.563, 146.343, 144.501, 147.546, 144.388, 143.652, 146.672, 144.336, 145.402, 146.032, 144.47, 144.527, 145.94, 145.326, 144.034, 145.458, 146.047, 143.858, 146.212, 144.663, 144.781, 146.169, 143.851, 146.982, 143.694, 145.329, 145.16, 146.066, 144.08, 145.364, 145.876, 143.906, 145.965, 144.99, 144.381, 147.893, 146.199, 144.357, 145.847, 144.55, 144.047, 145.702, 144.852, 143.926, 145.867, 144.55, 144.213, 146.131, 144.313, 144.568, 145.913, 144.292, 147.893, 147.291, 148.067, 148.66, 149.459, 148.164, 148.963, 149.543, 144.27, 145.208, 145.364, 143.899, 146.17, 143.49, 146.005, 144.319, 144.524, 145.954, 143.908, 145.923, 149.609, 148.143, 149.126, 147.25, 143.868, 145.934, 144.889, 144.385, 146.232, 144.071, 145.286, 145.871, 143.787, 145.719, 148.777, 147.816, 149.28, 148.8, 148.009, 149.313, 149.438, 147.923, 148.943, 149.355, 148.399, 148.242, 149.209, 149.388, 148.377, 148.594, 149.603, 148.353, 148.588, 149.617, 148.425, 148.436, 149.528, 148.536, 148.31, 149.578, 148.509, 148.387, 149.569, 148.542, 148.188, 149.53, 148.641, 148.101, 149.468, 148.894, 148.149, 148.935, 149.422, 148.588, 148.187, 149.229, 149.147, 149.19, 148.44, 148.16, 149.419, 148.88, 148.568, 148.514, 148.583, 148.594, 148.789, 148.996, 149.07, 149.142, 148.768, 148.309, 148.454, 148.685, 149.076, 149.272, 148.759, 148.253, 148.44, 149.121, 149.245, 148.525, 148.261, 148.695, 149.247, 149.253, 148.579, 148.307, 149.357, 147.468, 148.775, 147.945, 149.511, 148.644, 148.232, 149.552, 148.53, 148.147, 149.467, 148.824, 148.064, 149.387, 149.3] \ No newline at end of file diff --git a/recognition/vision-transformer-4696689/old/model3d.py b/recognition/vision-transformer-4696689/old/model3d.py new file mode 100644 index 000000000..d842d2e7d --- /dev/null +++ b/recognition/vision-transformer-4696689/old/model3d.py @@ -0,0 +1,114 @@ +""" +Imports Here +""" +import numpy as np +import torch +import torch.nn as nn + +class Attention(nn.Module): + def __init__(self, heads, embed): + super().__init__() + self.heads = heads + self.attn = nn.MultiheadAttention(embed, heads, batch_first=True) + self.Q = nn.Linear(embed, embed, bias=False) + self.K = nn.Linear(embed, embed, bias=False) + self.V = nn.Linear(embed, embed, bias=False) + + def forward(self, x): + Q = self.Q(x) + K = self.K(x) + V = self.V(x) + + attnout, attnweights = self.attn(Q, K, V) + return attnout + +class TransBlock(nn.Module): + def __init__(self, heads, embed, fflsize): + super().__init__() + self.fnorm = nn.LayerNorm(embed) + self.snorm = nn.LayerNorm(embed) + self.attn = Attention(heads, embed) + self.ffl = nn.Sequential( + nn.Linear(embed, fflsize), + nn.GELU(), + nn.Linear(fflsize, embed) + ) + + def forward(self, x): + """ + Switching to pre-MHA LayerNorm is supposed to give better performance, + this is used in other models such as LLMs like GPT. Gradients are meant + to be stabilised. This is different to the original ViT paper. + """ + x = x + self.attn(self.fnorm(x)) + x = x + self.ffl(self.snorm(x)) + return x +""" +Inception module for efficient 7x7 convolution +""" +class Inception(nn.Module): + def __init__(self, dimin, dimout): + super().__init__() + self.branch1 = nn.Sequential( + nn.Conv2d(dimin, dimout[0], 1, stride=(1,1)), + nn.Conv2d(dimout[0], dimout[0], 3, stride=(1,1), padding=1), + nn.Conv2d(dimout[0], dimout[0], 3, stride=(1,1), padding=1) + ) + self.branch2 = nn.Sequential( + nn.Conv2d(dimin, dimout[1], 1, stride=(1,1)), + nn.Conv2d(dimout[1], dimout[1], 3, stride=(1,1), padding=1) + ) + self.branch3 = nn.Sequential( + nn.AvgPool2d(3, stride=(1,1), padding=1), + nn.Conv2d(dimin, dimout[2], 1, stride=(1,1)) + ) + self.branch4 = nn.Sequential( + nn.Conv2d(dimin, dimout[3], 1, stride=(1,1)) + ) + self.maxpool = nn.MaxPool2d(2, 2) + def forward(self, imgs): + x1 = self.branch1(imgs) + x2 = self.branch2(imgs) + x3 = self.branch3(imgs) + x4 = self.branch4(imgs) + return self.maxpool(torch.cat([x1, x2, x3, x4], dim=1)) +""" +Vision Transformer Class to create a vision transformer model +""" +class VisionTransformer(nn.Module): + def __init__(self, classes=2, inputsize=(1,1,1), heads=2, embed=64, fflscale=2, nblocks=1): + super().__init__() + (self.N, self.Np, self.P) = inputsize + """components""" + self.proj = nn.Linear(self.P, embed) + self.clstoken = nn.Parameter(torch.zeros(1, 1, embed)) + self.posembed = self.embedding(self.Np+1, embed) + self.transformer = nn.Sequential( + *((TransBlock(heads, embed, int(fflscale*embed)),)*nblocks) + ) + self.classifier = nn.Sequential( + nn.LayerNorm(embed), + nn.Linear(embed, classes) + ) + + def embedding(self, npatches, embed, freq=10000): #10000 is described in ViT paper + posembed = torch.zeros(npatches, embed) + for i in range(npatches): + for j in range(embed): + if j % 2 == 0: + posembed[i][j] = np.sin(i/(freq**(j/embed))) + else: + posembed[i][j] = np.cos(i/(freq**((j-1)/embed))) + return posembed + + def forward(self, imgs): #assume size checking done by createPatches + """Linear Projection and Positional Embedding""" + tokens = self.proj(imgs) #perform linear projection + clstoken = self.clstoken.repeat(imgs.shape[0], 1, 1) + tokens = torch.cat([clstoken, tokens], dim=1) #concat the class token + x = tokens + self.posembed.repeat(imgs.shape[0], 1, 1) #add positional encoding + """Transformer""" + x = self.transformer(x) + """Classification""" + y = x[:,0] + return self.classifier(y) \ No newline at end of file diff --git a/recognition/vision-transformer-4696689/old/output 2 epochs, lr=1e-4 b/recognition/vision-transformer-4696689/old/output 2 epochs, lr=1e-4 new file mode 100644 index 000000000..e69de29bb diff --git a/recognition/vision-transformer-4696689/old/train.ipynb b/recognition/vision-transformer-4696689/old/train.ipynb new file mode 100644 index 000000000..a6473b90c --- /dev/null +++ b/recognition/vision-transformer-4696689/old/train.ipynb @@ -0,0 +1,315 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 52, + "id": "73ebb771", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so, 6): Library not loaded: @rpath/libpng16.16.dylib\n", + " Referenced from: /Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so\n", + " Reason: Incompatible library version: image.so requires version 56.0.0 or later, but libpng16.16.dylib provides version 54.0.0'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", + " warn(\n" + ] + } + ], + "source": [ + "\"\"\"\n", + "Imports Here\n", + "\"\"\"\n", + "from dataset import trainloader\n", + "from dataset import testloader\n", + "from dataset import trainaccloader\n", + "from dataset import trainshape\n", + "from dataset import testshape" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "df0ea69a", + "metadata": {}, + "outputs": [], + "source": [ + "from model import VisionTransformer\n", + "from model import Attention\n", + "from model import TransBlock\n", + "from model3d import Inception" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "ae8aebe7", + "metadata": {}, + "outputs": [], + "source": [ + "TRAIN_LOSS = []\n", + "TRAIN_ACC = []\n", + "\n", + "def train(model, dataloader, accloader, lossfunc, optimiser, lr=0.1, momentum=0.9, batchsize=16, nepochs=10):\n", + " device = next(model.parameters()).device # check what device the net parameters are on\n", + " \n", + " \"\"\"training\"\"\"\n", + " for i in range(nepochs): # for each epoch\n", + " epoch_loss = 0\n", + " model.train()\n", + " n_batches = 0\n", + " time1 = time.time()\n", + " for (x, y) in dataloader: # for each mini-batch\n", + " optimiser.zero_grad(set_to_none=True)\n", + " loss = lossfunc(model.forward(x), y)\n", + " loss.backward()\n", + " optimiser.step()\n", + " epoch_loss += loss.detach().item()\n", + " n_batches += 1\n", + " time2 = time.time()\n", + " print(\"Done an epoch\", time2-time1)\n", + " epoch_loss /= n_batches\n", + " \n", + " \"\"\"evaluating\"\"\"\n", + " model.eval()\n", + " accuracy = test(model, accloader).detach().item()\n", + "\n", + " \"\"\"get performance\"\"\"\n", + " TRAIN_LOSS.append(epoch_loss)\n", + " TRAIN_ACC.append(accuracy)\n", + "\n", + "def test(model, dataloader):\n", + " with torch.no_grad(): # disable automatic gradient computation for efficiency\n", + " device = next(model.parameters()).device\n", + " \n", + " \"\"\"make predictions\"\"\"\n", + " pcls = []\n", + " items = 0\n", + " time1=time.time()\n", + " for x, y in dataloader:\n", + " x = x.to(device)\n", + " pcls.append(abs(y.cpu()-torch.max(model(x), 1)[1].cpu()))\n", + " items += 1\n", + " time2 = time.time()\n", + " print(\"found accuracy in:\", time2-time1)\n", + "\n", + " \"\"\"get accuracy\"\"\"\n", + " pcls = torch.cat(pcls) # concat predictions on the mini-batches\n", + " accuracy = 1 - (pcls.sum().float() / items)\n", + " print(\"accuracy:\", accuracy)\n", + " return accuracy" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "26cde279", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([16, 1, 20, 240, 256])\n" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "rand = torch.rand((16, 1, 20, 240, 256))\n", + "print(rand.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "f6d1dc89", + "metadata": {}, + "outputs": [], + "source": [ + "class ConvLayer(nn.Module):\n", + " def __init__(self):\n", + " super().__init__()\n", + " self.conv11 = nn.Conv3d(1, 64, kernel_size=(3,11,11), stride=(1,4,4), padding=(1,0,0))\n", + " self.firstpool = nn.MaxPool3d(kernel_size=3, stride=2)\n", + " self.conv5 = nn.Conv3d(64, 256, kernel_size=(3,5,5), stride=(1,2,2), padding=(1,0,0))\n", + " self.secondpool = nn.MaxPool3d(kernel_size=3, stride=2)\n", + " \n", + " def forward(self, imgs):\n", + " x = self.conv11(imgs)\n", + " x = self.firstpool(x)\n", + " x = self.conv5(x)\n", + " x = self.secondpool(x)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "e1bd3d40", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time: 0.8001\n", + "torch.Size([16, 256, 4, 5, 6])\n" + ] + } + ], + "source": [ + "import time\n", + "conv = ConvLayer()\n", + "start = time.time()\n", + "out = conv(rand)\n", + "end = time.time()\n", + "print(\"time:\", round(end-start,4))\n", + "print(out.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75a45973", + "metadata": {}, + "outputs": [], + "source": [ + "batchsize=16\n", + "N, Np, P = trainshape()\n", + "model = VisionTransformer(inputsize=(batchsize, Np, P), embed=128, fflscale=2, nblocks=4)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "7b54a6f0", + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.optim as optim\n", + "\n", + "criterion = nn.CrossEntropyLoss()\n", + "optimiser = optim.AdamW(model.parameters(), lr=1e-4)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "18488555", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done an epoch 346.20038080215454\n", + "found accuracy in: 135.9069368839264\n", + "accuracy: tensor(0.5288)\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [43]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m start \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[0;32m----> 2\u001b[0m \u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrainloader\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbatchsize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbatchsize\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrainaccloader\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcriterion\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moptimiser\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnepochs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m10\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m end \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtraining time: \u001b[39m\u001b[38;5;124m\"\u001b[39m, end\u001b[38;5;241m-\u001b[39mstart)\n", + "Input \u001b[0;32mIn [40]\u001b[0m, in \u001b[0;36mtrain\u001b[0;34m(model, dataloader, accloader, lossfunc, optimiser, lr, momentum, batchsize, nepochs)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m (x, y) \u001b[38;5;129;01min\u001b[39;00m dataloader: \u001b[38;5;66;03m# for each mini-batch\u001b[39;00m\n\u001b[1;32m 14\u001b[0m optimiser\u001b[38;5;241m.\u001b[39mzero_grad(set_to_none\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m---> 15\u001b[0m loss \u001b[38;5;241m=\u001b[39m lossfunc(\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mforward\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m, y)\n\u001b[1;32m 16\u001b[0m loss\u001b[38;5;241m.\u001b[39mbackward()\n\u001b[1;32m 17\u001b[0m optimiser\u001b[38;5;241m.\u001b[39mstep()\n", + "File \u001b[0;32m~/Desktop/COMP3710 Project/PatternAnalysis-2023/recognition/vision-transformer-4696689/model.py:84\u001b[0m, in \u001b[0;36mVisionTransformer.forward\u001b[0;34m(self, imgs)\u001b[0m\n\u001b[1;32m 82\u001b[0m x \u001b[38;5;241m=\u001b[39m tokens \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mposembed\u001b[38;5;241m.\u001b[39mrepeat(imgs\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m], \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m1\u001b[39m) \u001b[38;5;66;03m#add positional encoding\u001b[39;00m\n\u001b[1;32m 83\u001b[0m \u001b[38;5;124;03m\"\"\"Transformer\"\"\"\u001b[39;00m\n\u001b[0;32m---> 84\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransformer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 85\u001b[0m \u001b[38;5;124;03m\"\"\"Classification\"\"\"\u001b[39;00m\n\u001b[1;32m 86\u001b[0m y \u001b[38;5;241m=\u001b[39m x[:,\u001b[38;5;241m0\u001b[39m]\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/container.py:217\u001b[0m, in \u001b[0;36mSequential.forward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m):\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m module \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m:\n\u001b[0;32m--> 217\u001b[0m \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mmodule\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28minput\u001b[39m\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/Desktop/COMP3710 Project/PatternAnalysis-2023/recognition/vision-transformer-4696689/model.py:43\u001b[0m, in \u001b[0;36mTransBlock.forward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, x):\n\u001b[1;32m 38\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 39\u001b[0m \u001b[38;5;124;03m Switching to pre-MHA LayerNorm is supposed to give better performance,\u001b[39;00m\n\u001b[1;32m 40\u001b[0m \u001b[38;5;124;03m this is used in other models such as LLMs like GPT. Gradients are meant\u001b[39;00m\n\u001b[1;32m 41\u001b[0m \u001b[38;5;124;03m to be stabilised. This is different to the original ViT paper.\u001b[39;00m\n\u001b[1;32m 42\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m---> 43\u001b[0m x \u001b[38;5;241m=\u001b[39m x \u001b[38;5;241m+\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfnorm\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 44\u001b[0m x \u001b[38;5;241m=\u001b[39m x \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mffl(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msnorm(x))\n\u001b[1;32m 45\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m x\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/Desktop/COMP3710 Project/PatternAnalysis-2023/recognition/vision-transformer-4696689/model.py:22\u001b[0m, in \u001b[0;36mAttention.forward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 19\u001b[0m K \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mK(x)\n\u001b[1;32m 20\u001b[0m V \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mV(x)\n\u001b[0;32m---> 22\u001b[0m attnout, attnweights \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattn\u001b[49m\u001b[43m(\u001b[49m\u001b[43mQ\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mK\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mV\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 23\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m attnout\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/modules/activation.py:1189\u001b[0m, in \u001b[0;36mMultiheadAttention.forward\u001b[0;34m(self, query, key, value, key_padding_mask, need_weights, attn_mask, average_attn_weights, is_causal)\u001b[0m\n\u001b[1;32m 1175\u001b[0m attn_output, attn_output_weights \u001b[38;5;241m=\u001b[39m F\u001b[38;5;241m.\u001b[39mmulti_head_attention_forward(\n\u001b[1;32m 1176\u001b[0m query, key, value, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39membed_dim, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnum_heads,\n\u001b[1;32m 1177\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39min_proj_weight, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39min_proj_bias,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1186\u001b[0m average_attn_weights\u001b[38;5;241m=\u001b[39maverage_attn_weights,\n\u001b[1;32m 1187\u001b[0m is_causal\u001b[38;5;241m=\u001b[39mis_causal)\n\u001b[1;32m 1188\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1189\u001b[0m attn_output, attn_output_weights \u001b[38;5;241m=\u001b[39m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmulti_head_attention_forward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1190\u001b[0m \u001b[43m \u001b[49m\u001b[43mquery\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43membed_dim\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnum_heads\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1191\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43min_proj_weight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43min_proj_bias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1192\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias_k\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias_v\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd_zero_attn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1193\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdropout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mout_proj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mout_proj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1194\u001b[0m \u001b[43m \u001b[49m\u001b[43mtraining\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtraining\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1195\u001b[0m \u001b[43m \u001b[49m\u001b[43mkey_padding_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkey_padding_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1196\u001b[0m \u001b[43m \u001b[49m\u001b[43mneed_weights\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mneed_weights\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1197\u001b[0m \u001b[43m \u001b[49m\u001b[43mattn_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattn_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1198\u001b[0m \u001b[43m \u001b[49m\u001b[43maverage_attn_weights\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maverage_attn_weights\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1199\u001b[0m \u001b[43m \u001b[49m\u001b[43mis_causal\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mis_causal\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1200\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbatch_first \u001b[38;5;129;01mand\u001b[39;00m is_batched:\n\u001b[1;32m 1201\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m attn_output\u001b[38;5;241m.\u001b[39mtranspose(\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m0\u001b[39m), attn_output_weights\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/nn/functional.py:5313\u001b[0m, in \u001b[0;36mmulti_head_attention_forward\u001b[0;34m(query, key, value, embed_dim_to_check, num_heads, in_proj_weight, in_proj_bias, bias_k, bias_v, add_zero_attn, dropout_p, out_proj_weight, out_proj_bias, training, key_padding_mask, need_weights, attn_mask, use_separate_proj_weight, q_proj_weight, k_proj_weight, v_proj_weight, static_k, static_v, average_attn_weights, is_causal)\u001b[0m\n\u001b[1;32m 5311\u001b[0m attn_output_weights \u001b[38;5;241m=\u001b[39m attn_output_weights\u001b[38;5;241m.\u001b[39mview(bsz, num_heads, tgt_len, src_len)\n\u001b[1;32m 5312\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m average_attn_weights:\n\u001b[0;32m-> 5313\u001b[0m attn_output_weights \u001b[38;5;241m=\u001b[39m \u001b[43mattn_output_weights\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmean\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdim\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 5315\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_batched:\n\u001b[1;32m 5316\u001b[0m \u001b[38;5;66;03m# squeeze the output if input was unbatched\u001b[39;00m\n\u001b[1;32m 5317\u001b[0m attn_output \u001b[38;5;241m=\u001b[39m attn_output\u001b[38;5;241m.\u001b[39msqueeze(\u001b[38;5;241m1\u001b[39m)\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "start = time.time()\n", + "train(model, trainloader(batchsize=batchsize), trainaccloader(), criterion, optimiser, nepochs=1)\n", + "end = time.time()\n", + "print(\"training time: \", end-start)\n", + "test(model, testloader())" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "bbaac2fc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n", + "[]\n" + ] + } + ], + "source": [ + "print(TRAIN_LOSS)\n", + "print(TRAIN_ACC)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "94178617", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "280706\n" + ] + } + ], + "source": [ + "print(sum(p.numel() for p in model.parameters()))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ccfcbae", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/recognition/vision-transformer-4696689/train.ipynb b/recognition/vision-transformer-4696689/train.ipynb deleted file mode 100644 index 331a7cd74..000000000 --- a/recognition/vision-transformer-4696689/train.ipynb +++ /dev/null @@ -1,220 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "73ebb771", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so, 6): Library not loaded: @rpath/libpng16.16.dylib\n", - " Referenced from: /Users/oliver/opt/anaconda3/lib/python3.9/site-packages/torchvision/image.so\n", - " Reason: Incompatible library version: image.so requires version 56.0.0 or later, but libpng16.16.dylib provides version 54.0.0'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", - " warn(\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "Imports Here\n", - "\"\"\"\n", - "from dataset import trainloader\n", - "from dataset import testloader\n", - "from dataset import trainaccloader\n", - "from dataset import trainshape\n", - "from dataset import testshape" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "df0ea69a", - "metadata": {}, - "outputs": [], - "source": [ - "from model import VisionTransformer\n", - "from model import Attention\n", - "from model import TransBlock" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "ae8aebe7", - "metadata": {}, - "outputs": [], - "source": [ - "TRAIN_LOSS = []\n", - "TRAIN_ACC = []\n", - "\n", - "def train(model, dataloader, accloader, lossfunc, optimiser, lr=0.1, momentum=0.9, batchsize=16, nepochs=10):\n", - " device = next(model.parameters()).device # check what device the net parameters are on\n", - " \n", - " \"\"\"training\"\"\"\n", - " for i in range(nepochs): # for each epoch\n", - " epoch_loss = 0\n", - " model.train()\n", - " n_batches = 0\n", - " time1 = time.time()\n", - " for (x, y) in dataloader: # for each mini-batch\n", - " optimiser.zero_grad()\n", - " loss = lossfunc(model.forward(x), y)\n", - " loss.backward()\n", - " optimiser.step()\n", - " epoch_loss += loss\n", - " n_batches += 1\n", - " time2 = time.time()\n", - " print(\"Done an epoch\", time2-time1)\n", - " epoch_loss /= n_batches\n", - " \n", - " \"\"\"evaluating\"\"\"\n", - " model.eval()\n", - " accuracy = test(model, accloader)\n", - "\n", - " \"\"\"get performance\"\"\"\n", - " TRAIN_LOSS.append(epoch_loss.item())\n", - " TRAIN_ACC.append(accuracy)\n", - "\n", - "def test(model, dataloader):\n", - " with torch.no_grad(): # disable automatic gradient computation for efficiency\n", - " device = next(model.parameters()).device\n", - " \n", - " \"\"\"make predictions\"\"\"\n", - " pcls = []\n", - " items = 0\n", - " time1=time.time()\n", - " for x, y in dataloader:\n", - " x = x.to(device)\n", - " pcls.append(abs(y.cpu()-torch.max(model(x), 1)[1].cpu()))\n", - " items += 1\n", - " time2 = time.time()\n", - " print(\"found accuracy in:\", time2-time1)\n", - "\n", - " \"\"\"get accuracy\"\"\"\n", - " pcls = torch.cat(pcls) # concat predictions on the mini-batches\n", - " accuracy = 1 - (pcls.sum().float() / items)\n", - " print(\"accuracy:\", accuracy)\n", - " return accuracy" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "75a45973", - "metadata": {}, - "outputs": [], - "source": [ - "batchsize=16\n", - "N, Np, P = trainshape()\n", - "model = VisionTransformer(inputsize=(batchsize, Np, P), embed=128, fflscale=2, nblocks=4)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "7b54a6f0", - "metadata": {}, - "outputs": [], - "source": [ - "import time\n", - "import torch\n", - "import torch.nn as nn\n", - "import torch.optim as optim\n", - "\n", - "criterion = nn.CrossEntropyLoss()\n", - "optimiser = optim.AdamW(model.parameters(), lr=1e-4)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "18488555", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "loop time: 3.66955304145813\n", - "loop time: 4.265578031539917\n", - "loop time: 5.169572830200195\n", - "loop time: 4.732528924942017\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Input \u001b[0;32mIn [33]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrainloader\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbatchsize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbatchsize\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrainaccloader\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcriterion\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moptimiser\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnepochs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m10\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m test(model, testloader())\n", - "Input \u001b[0;32mIn [30]\u001b[0m, in \u001b[0;36mtrain\u001b[0;34m(model, dataloader, accloader, lossfunc, optimiser, lr, momentum, batchsize, nepochs)\u001b[0m\n\u001b[1;32m 15\u001b[0m optimiser\u001b[38;5;241m.\u001b[39mzero_grad()\n\u001b[1;32m 16\u001b[0m loss \u001b[38;5;241m=\u001b[39m lossfunc(model\u001b[38;5;241m.\u001b[39mforward(x), y)\n\u001b[0;32m---> 17\u001b[0m \u001b[43mloss\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 18\u001b[0m optimiser\u001b[38;5;241m.\u001b[39mstep()\n\u001b[1;32m 19\u001b[0m epoch_loss \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m loss\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/_tensor.py:487\u001b[0m, in \u001b[0;36mTensor.backward\u001b[0;34m(self, gradient, retain_graph, create_graph, inputs)\u001b[0m\n\u001b[1;32m 477\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m has_torch_function_unary(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 478\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m handle_torch_function(\n\u001b[1;32m 479\u001b[0m Tensor\u001b[38;5;241m.\u001b[39mbackward,\n\u001b[1;32m 480\u001b[0m (\u001b[38;5;28mself\u001b[39m,),\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 485\u001b[0m inputs\u001b[38;5;241m=\u001b[39minputs,\n\u001b[1;32m 486\u001b[0m )\n\u001b[0;32m--> 487\u001b[0m \u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mautograd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 488\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgradient\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minputs\u001b[49m\n\u001b[1;32m 489\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/autograd/__init__.py:200\u001b[0m, in \u001b[0;36mbackward\u001b[0;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)\u001b[0m\n\u001b[1;32m 195\u001b[0m retain_graph \u001b[38;5;241m=\u001b[39m create_graph\n\u001b[1;32m 197\u001b[0m \u001b[38;5;66;03m# The reason we repeat same the comment below is that\u001b[39;00m\n\u001b[1;32m 198\u001b[0m \u001b[38;5;66;03m# some Python versions print out the first line of a multi-line function\u001b[39;00m\n\u001b[1;32m 199\u001b[0m \u001b[38;5;66;03m# calls in the traceback and some print out the last line\u001b[39;00m\n\u001b[0;32m--> 200\u001b[0m \u001b[43mVariable\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_execution_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_backward\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Calls into the C++ engine to run the backward pass\u001b[39;49;00m\n\u001b[1;32m 201\u001b[0m \u001b[43m \u001b[49m\u001b[43mtensors\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgrad_tensors_\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 202\u001b[0m \u001b[43m \u001b[49m\u001b[43mallow_unreachable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maccumulate_grad\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "start = time.time()\n", - "train(model, trainloader(batchsize=batchsize), trainaccloader(), criterion, optimiser, nepochs=10)\n", - "end = time.time()\n", - "print(\"training time: \" end-start)\n", - "test(model, testloader())" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "bbaac2fc", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n", - "[]\n" - ] - } - ], - "source": [ - "print(TRAIN_LOSS)\n", - "print(TRAIN_ACC)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "eb7b77cf", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.9.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/recognition/vision-transformer-4696689/train.py b/recognition/vision-transformer-4696689/train.py index e15f505ca..1c4efef9f 100644 --- a/recognition/vision-transformer-4696689/train.py +++ b/recognition/vision-transformer-4696689/train.py @@ -7,9 +7,10 @@ from dataset import trainshape from dataset import testshape -from model import VisionTransformer -from model import Attention -from model import TransBlock +from modules import VisionTransformer +from modules import Attention +from modules import TransBlock +from modules import ConvLayer import time import torch @@ -23,68 +24,62 @@ """ function to train the model """ -def train(model, dataloader, accloader, lossfunc, optimiser, lr=0.1, momentum=0.9, batchsize=16, nepochs=10): - device = next(model.parameters()).device # check what device the net parameters are on - +def train(model, dataloader, accloader, lossfunc, optimiser, nepochs=10): """training""" for i in range(nepochs): # for each epoch - epoch_loss = 0 + epoch_loss = 0 model.train() n_batches = 0 time1 = time.time() for (x, y) in dataloader: # for each mini-batch - optimiser.zero_grad() + optimiser.zero_grad(set_to_none=True) loss = lossfunc(model.forward(x), y) loss.backward() optimiser.step() - epoch_loss += loss + epoch_loss += loss.detach().item() n_batches += 1 time2 = time.time() - print("Done an epoch", time2-time1) + TRAIN_TIMES.append(round(time2-time1,3)) epoch_loss /= n_batches - + """evaluating""" model.eval() - accuracy = test(model, accloader) + accuracy = test(model, accloader).detach().item() """get performance""" - TRAIN_LOSS.append(epoch_loss.item()) - TRAIN_ACC.append(accuracy) + TRAIN_LOSS.append(round(epoch_loss,5)) + TRAIN_ACC.append(round(accuracy*100,2)) + """ function to test the model """ def test(model, dataloader): with torch.no_grad(): # disable automatic gradient computation for efficiency - device = next(model.parameters()).device - """make predictions""" pcls = [] items = 0 - time1=time.time() for x, y in dataloader: x = x.to(device) pcls.append(abs(y.cpu()-torch.max(model(x), 1)[1].cpu())) items += 1 - time2 = time.time() - print("found accuracy in:", time2-time1) """get accuracy""" pcls = torch.cat(pcls) # concat predictions on the mini-batches accuracy = 1 - (pcls.sum().float() / items) - print("accuracy:", accuracy) return accuracy """model training""" batchsize=16 -N, Np, P = trainshape() -model = VisionTransformer(inputsize=(batchsize, Np, P), embed=128, fflscale=2, nblocks=4) +N, Np, L, W, H = trainshape() +model = VisionTransformer(inputsize=(batchsize, 192, 120), heads=4, embed=360, fflscale=2, nblocks=4) criterion = nn.CrossEntropyLoss() -optimiser = optim.AdamW(model.parameters(), lr=1e-4) +optimiser = optim.AdamW(model.parameters(), lr=3e-4) start = time.time() -train(model, trainloader(batchsize=batchsize), trainaccloader(), criterion, optimiser, nepochs=10) +train(model, trainloader(batchsize=batchsize), valloader(), criterion, optimiser, nepochs=100) end = time.time() -print("training time: " end-start) -test(model, testloader()) +print("training time: ", end-start) +print("test acc: ", test(model, testloader())) print(TRAIN_LOSS) -print(TRAIN_ACC) \ No newline at end of file +print(TRAIN_ACC) +print(TRAIN_TIMES) \ No newline at end of file From 254f5b496a1c579fa74b153e54c6fe64dce431c3 Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 25 Oct 2023 05:01:29 +1000 Subject: [PATCH 16/24] added ability to save model --- recognition/vision-transformer-4696689/train.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/recognition/vision-transformer-4696689/train.py b/recognition/vision-transformer-4696689/train.py index 811dc65f0..91648b977 100644 --- a/recognition/vision-transformer-4696689/train.py +++ b/recognition/vision-transformer-4696689/train.py @@ -87,3 +87,6 @@ def test(model, dataloader): print(TRAIN_LOSS) print(TRAIN_ACC) +"""saving model""" +# model_trained = torch.jit.script(model) +# model_trained.save('model_trained.pt') \ No newline at end of file From 088c5dd82dfe19b92aede7d244aa9a2299d6646f Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 25 Oct 2023 05:41:00 +1000 Subject: [PATCH 17/24] added predict.py, some fixes to train.py --- .../vision-transformer-4696689/predict.py | 43 +++++++++++++++++++ .../vision-transformer-4696689/train.py | 9 +++- 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 recognition/vision-transformer-4696689/predict.py diff --git a/recognition/vision-transformer-4696689/predict.py b/recognition/vision-transformer-4696689/predict.py new file mode 100644 index 000000000..5fd7ffd21 --- /dev/null +++ b/recognition/vision-transformer-4696689/predict.py @@ -0,0 +1,43 @@ +""" +Imports +""" +import torch +from train import test +from dataset import trainloader, valloader, testloader +from numpy import loadtxt +import matplotlib.pyplot as plt + +model = torch.jit.load('model_trained.pt') +model.eval() + +#try load and plot loss curve +try: + loss = loadtxt('loss.txt') + steps = len(loss) + plt.plot(steps, LOSS) + plt.ylabel('LOSS') + plt.xlabel('epoch') + plt.show() +except: + print("No loss!") + + +#try load and plot accuracy curve +try: + loss = loadtxt('acc.txt') + steps = len(loss) + plt.plot(steps, LOSS) + plt.ylabel('ACCURACY') + plt.xlabel('epoch') + plt.show() +except: + print("No accuracy!") + +"""train models on datasets""" +# train_acc = test(model, trainloader) #test on train set +# val_acc = test(model, valloader) #test on validation set +# test_acc = test(model, testloader) #test on test set + +# print("accuracy on training set:", train_acc) +# print("accuracy on validation set:", val_acc) +# print("accuracy on test set:", test_acc) \ No newline at end of file diff --git a/recognition/vision-transformer-4696689/train.py b/recognition/vision-transformer-4696689/train.py index 91648b977..9ce32bc01 100644 --- a/recognition/vision-transformer-4696689/train.py +++ b/recognition/vision-transformer-4696689/train.py @@ -3,7 +3,7 @@ """ from dataset import trainloader from dataset import testloader -from dataset import trainaccloader +from dataset import valloader from dataset import trainshape from dataset import testshape @@ -17,9 +17,12 @@ import torch.nn as nn import torch.optim as optim +from numpy import savetxt + """for results""" TRAIN_LOSS = [] TRAIN_ACC = [] +TRAIN_TIMES = [] """ function to train the model @@ -89,4 +92,6 @@ def test(model, dataloader): """saving model""" # model_trained = torch.jit.script(model) -# model_trained.save('model_trained.pt') \ No newline at end of file +# model_trained.save('model_trained.pt') +savetxt('loss.txt', TRAIN_LOSS) +savetxt('acc.txt', TRAIN_ACC) \ No newline at end of file From 6d4e2b6849fcd13807b46333b6ba98ea006700ca Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 25 Oct 2023 05:44:32 +1000 Subject: [PATCH 18/24] fixed an indentation issue with train.py --- recognition/vision-transformer-4696689/train.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recognition/vision-transformer-4696689/train.py b/recognition/vision-transformer-4696689/train.py index 9ce32bc01..c8f4c21e6 100644 --- a/recognition/vision-transformer-4696689/train.py +++ b/recognition/vision-transformer-4696689/train.py @@ -30,7 +30,7 @@ def train(model, dataloader, accloader, lossfunc, optimiser, nepochs=10): """training""" for i in range(nepochs): # for each epoch - epoch_loss = 0 + epoch_loss = 0 model.train() n_batches = 0 time1 = time.time() @@ -79,7 +79,7 @@ def test(model, dataloader): criterion = nn.CrossEntropyLoss() optimiser = optim.AdamW(model.parameters(), lr=3e-4) start = time.time() -train(model, trainloader(batchsize=batchsize), valloader(), criterion, optimiser, nepochs=100) +train(model, trainloader(batchsize=batchsize), valloader(), criterion, optimiser, nepochs=1) end = time.time() print("training time: ", end-start) print("test acc: ", test(model, testloader())) From 00438c0a3a32ebc896c7596750998e0c3d75d28d Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 25 Oct 2023 06:29:16 +1000 Subject: [PATCH 19/24] added (temporary) README.md --- .../vision-transformer-4696689/README.md | 77 ++++++++++++++++++ .../vision-transformer-4696689/extra/ViT.png | Bin 0 -> 114139 bytes .../vision-transformer-4696689/train.py | 2 +- 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 recognition/vision-transformer-4696689/README.md create mode 100644 recognition/vision-transformer-4696689/extra/ViT.png diff --git a/recognition/vision-transformer-4696689/README.md b/recognition/vision-transformer-4696689/README.md new file mode 100644 index 000000000..9cf85938b --- /dev/null +++ b/recognition/vision-transformer-4696689/README.md @@ -0,0 +1,77 @@ +# ADNI brain data classification with Vision Transformer + +## Summary + +Goal of the project is to classify Alzheimer's disease (normal or AD) of the ADNI +brain data using a Vision Transformer. Each sample consists of 20 slices of 240x256 +greyscale image corresponding to a patient, which is to be classified as either NC +or AD. In later versions, + +## Architecture + +The default Vision Transformer upgraded to include a pre-convolutional module, of +which there is two designs. The convolutional layers result in less, smaller patches +so the model is sped up. It is also supposed to introduced inductive bias into the +model. 3D patches are utilised offering massive boosts to speed. Data augmentation is +done by flipping images to result in 4x as much data which is said to be very important +for transformer models. + +## Training + +Training is done for 100 epochs which was found experimentally to be long enough. +AdamW optimiser is used with a learning rate of 3e-4, this was decreased from 1e-3 +(which did not train well) but also increased from 1e-4. The data is split into train, +validation and test sets. Majority of the data is in train set, and the validation and +test sets are of equal size. + +## Result + +Overall, the test accuracy was 68% which was not too impressive. The test accuracy was +the same as the validation accuracy, the latter of which became stable during training. +This was about the same time the loss had rapidly decreased and became stable also. +This could indicate that the model has adapated very well to the training set and is +not generalising. This was the key motivator for data augmentation. However, it could +also indicate that the learning rate is too small and stuck in a local optima. This +is the key motivator for increasing the learnign rate from 1e-4 to 3e-4. + +## How to use + +There is four files, dataset.py, modules.py, train.py, predict.py. The only files which +need to be run are train.py or predict.py. train.py is responsible for training (and +testing) the module, with the option of saving the model as well as the loss and +validation accuracy of each epoch, for use in predict.py. predict.py is able to load +this data and retest the model on any of the dataloaders (train, validation, test) or +graph the loss/accuracy curves with matplotlib. + +Key point: Inside the dataset.py file, there is a directory address for the images +(local). Make sure that these are pointing in the right direction. + +Key point: The save model section of the train.py file is commented. Make sure to +uncomment to use this functionality + +Key point: The test section of the predict.py file is commented. Make sure to uncomment +to use this functionality. + +## License + +MIT License + +Copyright (c) 2023 Oliver O'Connell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/recognition/vision-transformer-4696689/extra/ViT.png b/recognition/vision-transformer-4696689/extra/ViT.png new file mode 100644 index 0000000000000000000000000000000000000000..4ddbcd3058bb8fff4c46c8c1687c5bdb13a7abdf GIT binary patch literal 114139 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%0DseNnLm{T=FZ}Z)KTCk{v)L7Ns4Mcm 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Μ+ze|i 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 literal 0 HcmV?d00001 diff --git a/recognition/vision-transformer-4696689/train.py b/recognition/vision-transformer-4696689/train.py index c8f4c21e6..f4cd394c0 100644 --- a/recognition/vision-transformer-4696689/train.py +++ b/recognition/vision-transformer-4696689/train.py @@ -79,7 +79,7 @@ def test(model, dataloader): criterion = nn.CrossEntropyLoss() optimiser = optim.AdamW(model.parameters(), lr=3e-4) start = time.time() -train(model, trainloader(batchsize=batchsize), valloader(), criterion, optimiser, nepochs=1) +train(model, trainloader(batchsize=batchsize), valloader(), criterion, optimiser, nepochs=100) end = time.time() print("training time: ", end-start) print("test acc: ", test(model, testloader())) From a50ad20a0c9846da6e51b01c1cfeaf2f356312a5 Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 25 Oct 2023 06:40:08 +1000 Subject: [PATCH 20/24] changes to README.md --- .../vision-transformer-4696689/README.md | 68 +++++++------------ 1 file changed, 26 insertions(+), 42 deletions(-) diff --git a/recognition/vision-transformer-4696689/README.md b/recognition/vision-transformer-4696689/README.md index 9cf85938b..0e3372052 100644 --- a/recognition/vision-transformer-4696689/README.md +++ b/recognition/vision-transformer-4696689/README.md @@ -7,6 +7,27 @@ brain data using a Vision Transformer. Each sample consists of 20 slices of 240x greyscale image corresponding to a patient, which is to be classified as either NC or AD. In later versions, +## How to use + +There is four files, dataset.py, modules.py, train.py, predict.py. The only files which +need to be run are train.py or predict.py. train.py is responsible for training (and +testing) the module, with the option of saving the model as well as the loss and +validation accuracy of each epoch, for use in predict.py. predict.py is able to load +this data and retest the model on any of the dataloaders (train, validation, test) or +graph the loss/accuracy curves with matplotlib. + +Key point: Inside the dataset.py file, there is a directory address for the images +(local). Make sure that these are pointing in the right direction. + +Key point: The save model section of the train.py file is commented. Make sure to +uncomment to use this functionality + +Key point: The test section of the predict.py file is commented. Make sure to uncomment +to use this functionality. + +Key point: Since the dataset is so large, training might need to be done on 4x p100 gpus +(rangpur). + ## Architecture The default Vision Transformer upgraded to include a pre-convolutional module, of @@ -16,6 +37,8 @@ model. 3D patches are utilised offering massive boosts to speed. Data augmentati done by flipping images to result in 4x as much data which is said to be very important for transformer models. +![Basic Transformer Model](extra/ViT.png) + ## Training Training is done for 100 epochs which was found experimentally to be long enough. @@ -26,7 +49,7 @@ test sets are of equal size. ## Result -Overall, the test accuracy was 68% which was not too impressive. The test accuracy was +Overall, the test accuracy was INPUT_FINAL_ACCURACY% which is acceptable. The test accuracy was the same as the validation accuracy, the latter of which became stable during training. This was about the same time the loss had rapidly decreased and became stable also. This could indicate that the model has adapated very well to the training set and is @@ -34,44 +57,5 @@ not generalising. This was the key motivator for data augmentation. However, it also indicate that the learning rate is too small and stuck in a local optima. This is the key motivator for increasing the learnign rate from 1e-4 to 3e-4. -## How to use - -There is four files, dataset.py, modules.py, train.py, predict.py. The only files which -need to be run are train.py or predict.py. train.py is responsible for training (and -testing) the module, with the option of saving the model as well as the loss and -validation accuracy of each epoch, for use in predict.py. predict.py is able to load -this data and retest the model on any of the dataloaders (train, validation, test) or -graph the loss/accuracy curves with matplotlib. - -Key point: Inside the dataset.py file, there is a directory address for the images -(local). Make sure that these are pointing in the right direction. - -Key point: The save model section of the train.py file is commented. Make sure to -uncomment to use this functionality - -Key point: The test section of the predict.py file is commented. Make sure to uncomment -to use this functionality. - -## License - -MIT License - -Copyright (c) 2023 Oliver O'Connell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +![Validation accuracy and epoch](extra/acc.png) +![Loss and epoch](extra/loss.png) \ No newline at end of file From c638588bb1e27f99d299e8a3f0668e5f997f52a3 Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 25 Oct 2023 15:31:34 +1000 Subject: [PATCH 21/24] added training accuracies (older test) --- .../vision-transformer-4696689/README.md | 2 +- .../vision-transformer-4696689/extra/acc.png | Bin 0 -> 205530 bytes .../vision-transformer-4696689/extra/loss.png | Bin 0 -> 161099 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 recognition/vision-transformer-4696689/extra/acc.png create mode 100644 recognition/vision-transformer-4696689/extra/loss.png diff --git a/recognition/vision-transformer-4696689/README.md b/recognition/vision-transformer-4696689/README.md index 0e3372052..1eaaed482 100644 --- a/recognition/vision-transformer-4696689/README.md +++ b/recognition/vision-transformer-4696689/README.md @@ -49,7 +49,7 @@ test sets are of equal size. ## Result -Overall, the test accuracy was INPUT_FINAL_ACCURACY% which is acceptable. The test accuracy was +Overall, the test accuracy was 68.0% which is ok. The test accuracy was the same as the validation accuracy, the latter of which became stable during training. This was about the same time the loss had rapidly decreased and became stable also. This could indicate that the model has adapated very well to the training set and is diff --git a/recognition/vision-transformer-4696689/extra/acc.png b/recognition/vision-transformer-4696689/extra/acc.png new file mode 100644 index 0000000000000000000000000000000000000000..0375c2626a35360e9ae8736000ea165ca7e8eef2 GIT binary patch literal 205530 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

PZ6YIe3vC0_%r`fWFTTW-FO1$tzzqxteIm%TB| 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 literal 0 HcmV?d00001 diff --git a/recognition/vision-transformer-4696689/predict.py b/recognition/vision-transformer-4696689/predict.py index 5fd7ffd21..895f9d74e 100644 --- a/recognition/vision-transformer-4696689/predict.py +++ b/recognition/vision-transformer-4696689/predict.py @@ -17,10 +17,10 @@ plt.plot(steps, LOSS) plt.ylabel('LOSS') plt.xlabel('epoch') + plt.title('Training Loss') plt.show() except: - print("No loss!") - + print("No training loss!") #try load and plot accuracy curve try: @@ -29,9 +29,22 @@ plt.plot(steps, LOSS) plt.ylabel('ACCURACY') plt.xlabel('epoch') + plt.title('Validation Accuracy') plt.show() except: print("No accuracy!") + +#try load and plot train accuracy curve +try: + loss = loadtxt('train.txt') + steps = len(loss) + plt.plot(steps, LOSS) + plt.ylabel('ACCURACY') + plt.xlabel('epoch') + plt.title('Training Accuracy') + plt.show() +except: + print("No training accuracy") """train models on datasets""" # train_acc = test(model, trainloader) #test on train set

F9;qwk`Zj^E#D#41jLnp$S zDC<$euoMazQ~hoN5u0ccn_q1aKBnzD*$DrntR7WHiZN^BLMFviMN@&n9e3YtdMN_x z?I@s0r|ZKG`E^EK5w_|FE~)K@m0dvaSEa7AtVU%6JA^*^`n3f{iUAmpD3EIC;HpIW zd*4c4gq>QX<;g~BGk>Jza(M@h_OJ7P2`@{~EvPWd?vl3A42-~b?+RLsJvH!gLE+l3 zuMbR$H_GZuYxGeAo+i)RSiV%O8g1|&1h<}svyWeX%-$XX(yi$J!@8U9WeZ|INPkZmZCw#IPUKZXCo*eoU>NP@)3EjntVKFcm=K z+!}ROtke0hd0}Jl<52&Bx428OVX_LxIo}aQKg$Eqg)S9WUo^Sy@$m!^@n`Qd`kMqO zTb_fh3Zn32fdH!+dFDE7>zv-_)t|!&&ZC(l{UL#bt(<`+S%VeddwW1zaL()LmpgnA zG_ccJ#;~vFZ>-c;%Yg9}t%OPJ+=s|a7uHSvX?ax9dz2reU?2PB!M)ezwL6Ei2F^lT z(GKkPfnx5k+B#cXG&bDncX67(Y-5MNYPM8PBL_I49hnltmP4slHu9gsA7hx#a_~*)l68=edt-R4C`G1CgmoEp(>Td6CEFI34RCSNX zMlfiHRQfO6W@dIwcZfjwo&XYoPQBNa9o$v31V9><-EzzvQR!F`rpV~3r0c{*fDw>f z!KJx?@6r>quRw5;!{}_*qciu~o!&Yh*l{D=C9ClF055pHW(r`&%*?u|0TETJXam|Q z^kQfqFXy&!ZrB=FMNNZ*8Ble0@QD(i{7X9=+1N-|{QuG7vvI6)zz!Hn0f zk;tq&>J)V#wXyb^xY}Ofy_aLGn{{tzDcIx=guuK(7TukbgfVZ>FtDCFD;fCY)+B$3 z;Nk2V$m%u3aJIYO#)O}o4+vqzF7+XUv+KI(!cysl=FizRe7dif!T2I&T?hlVDF6^7 zEQ--SR4k3^C~f(1SdyVa)b;KUzuMfiXaX(&O>6`nFZXH$*m8RhxCMZ^jeyq@u-VA@ zR6P1ME0taabT21Adt$Iw6nC5Ge*42yXMvw+v8&0<>cwo;_o=@h#z9`gjqoZY*Z7$w zUwadzHYvKlwrJl{ZZ_8$<(b-k)e1Q7A-#m8P~JqF?jn0$D>0;9AJ+#z8hhBZq~R$_ zJDzh@fO3GP@I>We{62G2QgXtIO#hatX7@r>n$B88E^ABDgiMiD?i%OYTgzQlI~R1e zX8fC9vePxox#uor0sO9Kh7!iq{U|{t2PdI=RS-J+2~oLjX|okwVYP@-_}|saK~BKg24Bh)~#UH0x9#YM9OZo2Pz0u5mAww>eDc_fh$aOs^ zSe|r}89;k$Ij=NSh3?Wwp_r0vX!M^ITGpQwf0vuj4!%_#V!yi6aXAne>Fn`>eV4?R z-RKv}fUs>`E55Dd$z1`AIOFZ+PZ5MqAHQy=g~cd=!Vm;g)Y$vQ0xXJ_Rurmm{*1(i zkIzhrXTHI0ncnc-`|mHvzZ2ZsvSh&esBv&oJ;T~r0FnEQp=h2o81OaY&S7Kr<5?rw zeN%`i&ARHxvEg~2mGhc)a&5X>JB-OC(z`<@Eg!a)Uv(u*SR`qKcUZZ~%j^EO$=mZ| z)219Hd9_!Xrz%-nht16&vx`N(fVjzYgWrK8p(szSuE|PtpWi|kces4%=lcUkgAA#q z+_D}}r**o(kqw*DB^kaqQh5-NR7-h8D92Vr66OZp=v7@FSjJZ1De37jNX`g*_Gpz2 zi$}rr$JOG!+-N6%hv!KFyDrcBB_g|WqO}axm1!0w2b7 zMgkS=8+M~#XC~d+xus4hWIVN1=$r~7b3ook+1*h;p6^4>=i^HKbxISXmM%r}G3(K~ z+csOtKLZ=;tTYC0ud`G~yu`3RRCAKMVADLz9Ao{H-yTW_8y^4MW^bL1W<48He@Q41 z>TDN+QBt7iPWrS4fx^X9Dk0Z~2)7RY5|$dtt}!`tusvZ!CgR_N!-s_GhV2YfD1pn> z14tu}C-Yjb@k*L&fz?5H(+JEDx#U~)>mfWOu+lBfhyu){>4Rq_sJ=U%> zxt5!ot9`(Fn3~e6N(*1i*(kN6GR^$!l?~2DDJcGM-SP=pMU!FqwIA_v>eLzVy+e!I zCs*~QXRmQq?#uAVN$8|ut9jA zncC{tC#zGogy@ew_#mZ$iSRSj(=?y398^yiZx%j9E)U4cO-lN`!i_LhqEeJV3M&2d zbnmd~vI-lElbR@25?|Qwsa8@SJ6)N-fpm5jE_vs4A4EKPM4xk!xYV=h>Y*#|?=(#| zeUGT0^3U+svz>EMRz3G&;lS6Hy)jR34VNv|K<>9n}!te!x16hb8o#mZZ!XN-`*d`tHPp0(RVko0Tox{ z_bvXfAx7fHZ^N>C4VC?_sm{bmM_l>HIif#ubYb9}{-IDcU2<~(gUFaI$$dIcn3^Fx zsF7_<=+h4Y;YB%eS^+DKpT|+eVrP2?b|uXd9z^TUrnGf1exM1io$_v=ZX-8yGaCD7 z<+U*p6g8t#ef-r9?pxDu!YN#P$=^%2S@zvO@0~H-6^#iM7GJsh})#X z{1yTx=31xce3O+ z{)@EBOOgFu-ljBqbdbYQZH+P04vxbzULgU)!*j>ffZ#!qd%N#k8_bSBR)?*Z=p8L= z(isXiwfQd^*q&hZopxn^49VT^q5Ksg&l3UHWw4wbUMzy0f#Od-++cr00E*JL8+JbT zO!@2yX;|mylwBfl`Ng`&zq)DmDJ2{-4fIPFMovO0yLfK^Aj=!FNl38I;dVB4}iZ}Az_ft4EdUje#{q6xx(!=_9KwXGkBE90XDI?4`Mq>?{&?6QToV z3tBx5oF^x}#7|1F=PLipz%>9w1kC6Qaqf*z9;&w2%cuQMG1Igzt^2^Gez3JDnz;>cbM@YAV|6W7Y<8*+Kymjz;J;rliT@g{E0z1lCzb;Q8U9l4j7 z`M55QbYa3nOr%)wbTJwG!QG_a`xdJp&Nj-5v0w1Deods7cn2u$^HEEd@cEBR&1(MX zXFLATJxq%J_M%L~UgHB>4q%cr@iEgaO(BoUeU>guI{x`6Da!BjmHmu1{jO-8(+Udd z6B`0q-G#Tya=dSNJrv8xW)ywT*u1rAwbN9LnB0{)kk_!awf)e>J!Z`qhH{ z)j!Gj^5x6h)znrY{>TW7I4&;kao$c1ji%&Bg$Pptuy^$>>~-kLX++BW62NXABic~v zE|g8`PGwSv5$8J#d*|6TO2c<^rQZ*XTm0CVA}YqX9#iLAcNY7_S!VUm7sXz}JmX*6qRCHZc(hFuMC@?Wz!xx{nRZ>}UHM`2>~^Li zqf()bOeSZXvmxIJHqXl=<~VjJqeeK1Ba6HN{~5jd5RLj!eY#4BtgPXIwEQ=sTtyKs zD5NPdm5Psvlt2YNQ^eevr`c} zj&aumdG-E1vHXniG@Z-Xg?dbQU=VuoPy#00`vFM<2mXF)0R#wr#3_59PDLHR{7aYOXDk&>podY7%#TU+rF8v76 zcKflznX&l)dD6-CBHZZ55bDZf*{xX&IS1BA?h4}|?Q3ZYOa~;!GZmT3v!8_XACR!_ zQwtUKoN17|$Y51ER_zbl_aAQMS{8@URy;+^}L-I7O`v3Cm-W1+?*V==KD+m`rr`tF`IHz8ijV(g`(XiCnmO+}p#?~&+A zxmN*KyIk3nX6BGKmoJ<$yry zTNCXJU8YhIuDcQ=jgq=DCa4YAg`#!vIt#_M-lB3=aLJeFB6e1U^2sFnopKl_q=qLT z;wNhlZkx?Br2hZxItey-f?bCS;N|0I_Y7lJ*E|m}eTJi{sMmU{;ZpA3uOFo1YOxV> zS~d-L5vD9+kvZOwI!q!-9xWufKv~*65|R^b+dv}rVnJN#UKB_LcVKu0mFt0)i+1jJ z64!#7?NhXj4vG&d?Txu4n~IMv;3Ei0nc$uTZG#@Hf586{SN>-eZ~0=@utP4vPtA8K zmnQHRIJR+ro5Wo{(tPLc-61bE+}HCtps`dSh28d!2#AGCFs9kkN9e1HzBKYRv!iH- z%5uzuC1`@d_2X($;*ygQhMEvqs-`1h1S8fplvBsix%OR0h|zW)P3RTkS*$yWxuI`1 z#&RB-`#aw*F%(^jQAzH(Y7g^h+za@ht0teV9?&qQ)K?G_8i`yFWSmi8!u5)OyceXzAipmD|cpl7!ir9`_cHggXv9*A~V{w{Noyll;wT)J+c>+{)#W zNeud?6F+_4f?>Q;ZVJI>r78c1U2|kVaH@=-X`_hk)$<`qZ1UPSQqje3aE!xnd z&J*5H9}LL)5O+y-69aHuB%jWdwQNNRc1;7&_Nfe{4#v>{D`5HCrp8ae`fS(wvq3T> z*qu@{AOvK73-RG9bZ@!_Xx$n_y*W5>pQQGFPjq=G zoKkd4jW?VH6FYJ^NVy#x^ECo7zj{vkaV)G^BD<%7)YK4+XtlVrj#I#G>%6?PxR&Bw ztff54#cspr@y6q{v|S>MZy$i-z*j6dBw!LcTiuJ@!l1I&2Ta&fFK_P^;DntH{_|R z8Km&MO&?I9QDUau!;`~_UNg-GJ2Msc=PEE8t310ZW^$e5Ng6z? zytVLu=FbD~B$1S^2D2Cl_gP}AR@FQYKGNhd=d_-U0DEiZO>G7Zqq zJ`gc3=%o_nbWgN3S*3)NuXCV4PI&ED`Sj^P(pq&5jhN`@=zFtyd7g89eSIB8B00GE z&HIC@r#J7pwB^}vK%V#yVfU`*AJs@= zCjL;XbZ8e*;P`Jb&zn-k2LkgT{gZXz>ZS;CYw&F>7Ms@9VU=1Q6c{K}^F>Qbt2&R< zhtvW^Bo{{!77#THM}ke?P}?wYg*{rOa?=R#ERpS(+D9d!ec}9iu|Nc09}J4eo@h`i z?LX;`UL5FE>Y^1XK3a-mrRfMPK|h%NSya%~u74hQq;~sFqXMm+H4WU>^0L>R`q#4F zy!n;17G@_(eO4_kE#|ej4`aa+v+C2@tMXSlYdhuVIfneBJjR<+%3&5qba!={a*|kV zrI-ovuKQ3nC^HMui??HgP4F}F@nK)#2Kmhe?Yyzz(Hk${X93;+CHd8xKV;?}affw(6L*k1ALCnBwM_&Mh+WYn)}WhW zdfq-w6tN+TX=X32hc@UTp3RjN5R!OE{hbt6^7^%euA>$CZ*ml8!{*I5QlHITdyzO3 zmt;=9VU0N+o-9bUb`6 zT=)o9;{G8!3=w&O(!|Gq>d#6N`GPKr;lA*2#@3wHWPdHp{|-xLHOK`UPZ|{7icN36 z!@H^rE{D26qzg|L;l@oR=8}9@LMbm-e26xmeM9iwA_+-1tkiy2$Z?sbR@y==#mR|p z6DjA&QS`$VWzHFN+@lxX4Ne_qtOve3PoS^z;uxo%K&9Q;dCnfWu&4#j`vtE%^E=i5&=R7@#38@w8x;IYks zDX;xvZMKZ3M2Om}EvUBY2!I1&YFsht%S1b&PuD1 zc%`F>aK!~h*;sR}6u&Q8Ri{U-OrH1~e@enbq6li()r@n+Z9{e`>8 zqgK6pd+DSk+io^*2N#5t`Y5r%BKSZN?h8>FHfUgMyo#yVhc-y#A1VnF5WKgnL8A@K zutJIKeb$Y5kq{Zys00f*Fr^zdY!H3_{(Y&%${SB0$13)L^hWTs$lwVXul0A!qjCQ4&6Zxa_-_h0s>h(l?X z-kHV7*?9~Ucl0*Jqba*KjUA%-el;ey2rA7Y)u3!=>~3Xnj1nK#TP&6vf5|1}?!ec4 z@~CneY=LKGFDxva0p3nfP1Di0$~9q7R`7yh3h&|Tn;=gCYicPO86ra-A9zswXeFt5 z`+dr7pn%@zaZoVbNsu>?JeV=U0V!0*S#hmGC8pJS6jpL#=Ek+*Z zC`Q{FWoCjsh|oS>JZHO7z?TLdIN=xt2hf^%bbF-6Bb8E-?rAP0(_is_WO%YG&)_BIvAp$Z!Bd{qRpb=E+W z;UYRM&n>g7>XVeepU(j~vC@@zeQUiNu3o412aO+nlv1|?iD1=Dzs_&-=uN=UnvRI4 z)q^2@3Ovt)*kEv_RLeUDtW8cBm^#(Icv_A4(E!CeCGK%O=Pck8`o-Bh_}k9T3J5#{ z`hRZchXyO=m*tGcC5G@9Bd*^zzjJ)5VDaTAi%JE?+HD!a>jUfOK_|Q}6wF3T@RP1w z1oXN%lTSP%PTjElYlOD=;!n(1b*77$B65PnZZ_4xqP91Ud#@h;u9ORH=hRonDw@>}=!_6BGMSo}F@P^H|T8U>O6LAPp!Kb%5dQ{UP944{VWxWIfHyGoh*I z7-jN;d|sq}8T%Pg0Ef0`twm5d zAVW1t)Srsyl{1o5qhtu4rbjrW2@JL2Pz) zzG)T}N*f=_KCQhn*N#(&a2duS@Py(Wc%RO>;l|sS=vfT@9Z=w0T?8)04p!0t`ad_d z@OLa%T8YUYviy)QXsgnGL%GiATI3MG~xBJufE;RZD~qLmW`YJ$_z@x7dCOrV}z`Z1o5Sq;OM6)M;0RZa}b20R`V`Fg>qU zD7>p=PF zIcU~+OR`h0Ak9`}twv2y#NnDt+ci`~W?)~sILRtALCmycV1DaZ%75(xyZotggC!mU zUvgDvxD`Siy?*_A6mp>f1>dWOD~`ERo99J-&OGs~4sBraat*fo=ms&tX7@>(6P!c}theXmnLF2Yxj9$w6 zCWYswT|ThIWC z0@}*s10d9c9&(K;eg+!KG4Q;#`|#}3C#@@Ve62X$c(=NoH?c@R@c>elgjvuM+=VLU zVk_^9a5c@L-khbt95L>3>8zt9`~5+A5VZlp_N!1(w6tB_9Jq^+Rd*Pa>aacnuM)S? zkcabQNJ~p!@w$9@SJ079+$QVbgp5h`z4>)ejWk3OLAre$9N*Hjvz714hB;So2DB=p z43Gy(5#oKU^25&(c5c5mH2dY;x;HDivEQQqGN|-WL{@O#{>lojTm0=rlFK4{*Dt#Z zpX8L7YYj7Ayb(?@N@Cs6`Ppk>vtD^f46H%`xTGXG{r@^b${ZMh?A*NAQGWObD0AD| z*~Ru`c(#InMHSp;@sLNy=Yn@PWI>HI-dUt#4Rc3z73Yx2PoF*&=vh8mm!dcO>O!*{ z(lEkf?}I*R-|{-dVA@u#b^^Wl2DWWtM9rcRxUS=>aWuvUQM_rD&0TVoQWDElX8|0N z;P&`V?iEyb%`x|jBmZ+KwFI3CJwK|+>Efw366y7j68-wxtkk>PW~N~b;MmsMTK${@ zx17hG9FRD7^qjUPPlLC{^;xz7<5L=uF2>K@w-7bd?5S;%`7Dfdr^|@4vqlh zi$j-aO5YS2HMmL}Xu4giGEF7W6~dFD^x$NbO?|OBl zg?O}ccl$inx?$V(Ftlh zE5iM!5}mWP_3!$yse}N@qva&xMYQuSttJJg@({@6r8tQ~N7>1=52UGJlF-;QSU$^H zchG;~+vz)yOxo1JJ*OD#W^S|QyS%;+<&G@gDF_vGiMYjpb1@siZx5eoh$a7RbH1X? zuRmFgx=+O!>kR_t?w=pjTZQaxDe+$B3~modl?6j|C1#A;mGccs%xp#GOKSyL zzvhD`gc5cfZ*tpd^ac9bme$MnjqTp3++}PeK?(NQxs9oIWvDEco6_)gJH)fDjVgx0 z-bS=wZ;;|?lG`BQQn2QOH)M(mN`yBRZ^}IOAQaA4G)UY%o=8|=q~Lvhd_GxSzC78< zxMd@y3N7fvcmSa_&an*=vim<6>l&|)M zTGQyqXu79rd7Pjzuyl7v6uQz=IhmY(~BN?k1_|ZC*gD`J`Lo*69t{A1HDMy@$)6FE_y5; z#n@w=T06>EJVN5MDe#72vOXEVG$Qu#SMrL^>+QNvXZRbo%tjxca-1t&9f-{?Tf{Bl zTO1m0lUX~a|3--+WkXL6Pt$m4*<`Mm-)GFDi+D=2<5EM~p=$|FsjYJ#euYc13Ri%E z?#-VUuTN^KGXpgirhlEs*Xo=u;&EgQ`-Tep)*ajiKR{e-vl6r1{>6LQB=(EBok~pV zuV7k}ptAIU0WxTP?{sWZ``8IF7+j9BSP8p(h2F&blH02W6562EZ3vgpJZK=l2b<+} zFfRVap@_dMJLflbOSP@(RA?^e>)tkSjxhvzm5B;Bw=we5`l20I84P1qvLnvV2mXWO zc`rd`A!OEJYR^w(JlDdy3>$RoN4LTG?*3!eG~MW=u+%C-{NqW(w9Md)!oG=|+n4G_ zC&rpjz7*kh#vNa2>g3kZc51D+``N&gdaITT+M%Qai^%I>RpM%raVc1^JJAdMwf#4! zz-)i6J^Ays{g%Ynor6V~89-_JD}L+g>e}c`C2WQ&R>qBzHD;B_t~d1ib~fafEo&Ge zwiM_|-pPS(&;XA9%hr2(rZQw&i4xO3n3?p_IhCN)_sG%V?AZ)LMW!(X$?}iC=FcXv zGjyOyU;s_W1&;?LzAq|&qt;(K8)bjph@SVY%T0($`4b!|MV}QatjbNRiaiajb4Eom zyt{;FA)121(W`e5jyA5m)8eBV2{qZJ!G>f6jKS{mrPhc99ce6C8T{?homTZBXrgWe zRZp4EX;?XR$C5ROaH^~xeho5@Kvd&&)7q{TzR1kXG*fq+a5&IJ zO*`{BUsB%ayqtvT#$_jpflJKihmP5@^tQH|qLGCn1JeQDncG1qel;ds)eSkdS1`P< ze)r6Txsrgq<$I%@IUXK<>eKte7S6`MdcLFB)YiMvFe!`a-H>see9QNBnpJZ0g&Cj0 z1wrR%2}TF5@r0#k{9fEp{tI+z34qOJ!zfd^9Z(0LA(w!*?@_LCvQ|D)ba=MlY+V&R z=2_1w$NmKn`n@dSJgEcCl3iCLW-t{`c~E10nIGAk*bhIpAUG(nxHUE-QMMBeOGsVA z)|^)A#YP#Utr2Dyk2Mo4l2&tLGe> zxAUBw)8#s`A_fBmgj`768;zmJxvaXkMQM$#8dLF+b{pZ>k7nBx3C>6WxwUL%>?pv9 z_B;egXUaLV6GgZ(oP3VA|Hpy!RW8Xg`Crdg#!$_mO}!_adufl~z|nC=A%1MB*7YG6pCN)>+ue`4)Qp1ViJ=Xnk&v+{)QAiMYJW%na_ri<)C5rD=WK6|MTtFCAR%tl?6%Kg60*bZ~PD&_vOhw1c$SZQoQ^WMjxXZAKX-*)IqSTjy6 zRst|0{?5ZI05IP@OOaCK#jq_OK-aepyN$`esX~nrR5PyGz6o|lRVi7hG*M2GnOsMJ zLtJtuM;2EW29l1^z`7ee=7P@U9H8ZsyAvXMe(@~uziKfRIu=DcxVsuj^mFrHr|LS0 zoo?$vS_Kj;4{j}TVS^R>1;$63HN;0>MW0^pPZ&ZJ$!60h#J>Tk)Z$}6b~^(|?K7ZG zSK#eWhg;s`?HdA3YxDp0cei#Y9%;HB6Jwo-D87-^K6``=YM}B#!3S_DHy+Ox*nBSk zFZ*8+>H+JoLzV5vPs3unze7al5cQZokkYv6XL~*Z~+eR{`Ny?6hn7_-2+GJa!ZM*pqR;CD!heBToTYb)g_WE z&4$5u-}tw}g3k~3N=otjzm0c3JGGmKn<)y0mSI*Y{iQ>36`~c6n4R^3fM6dOaTKV` zSH6C|+XjjWm;Ey~M6whcmZ$M0jy2daL!oHA#9=wB?5T6-8C;ytvH8p?jqL$D3nY{m z$Y_AJtOVReAMo*S?)}{`LRWen9Xf!isQIGzMtB1lQdQ&_bhw+K7fUeVGHA+4?9$v7 z|5^2+gu_?BvK61~-;2FY^FnES3uiOm!IVT2=Vy;i3a5Vu;ZG3uS}@_HMVMOP_JBQE z6u2#Q0GmW6&xI;G20czdrK~7L1UgbPyw09#V*TtzwQW#a%l-5^4R_7I1m86e!9JJj{S|KidIg@`nmB;a!``faF;I>vIo86a zn0viOI*DmS(>u5doKE>A0tgYETzNysH3GVzFkaDcUbz!Sdw-X2;-_@*_qR*1>{CZ! zM0?PCYR0p{pcL{|zS=Acq7OAJ$9Jys=^Rq3Krh%SAxW`*BIeuz2v{QbMAZlpb`xuOjt8+&GEo3-QElVdXvy~Bal(^FHgM8Dg z{R!(L0Wtw@Tt{`nFxLl)S6o`CC@j?UNII2_wYD)iPaL@iBB}d0+>-iJV<|uGM$wn$ zLZ{_M!OlchoOSd0+(pV_ugg9bV?l2R6M7rG`c4IIAU6!;xChz?#-_EsMv2>2FOZkO zY@k3Yws5Y1vSiW_O#o*ZUA6q!1tNc*(dWXSvl)+8XUYL^>{t0*lqoGWECKBtzM7TW zB#ckJ!sxR9{y|`ucL{n2OeM^|t!gSB^pfb(tZh?PR`$Qok}a1P&rLiH<|LnzqXGe4 zCpDBf6c^v@ukhB!?7jDt(`zE&+TRWj$`n0g9-X9JC^{=0Ils?=~lX=7Fg%@JQ^zCE9Py3N=}yl4X=M73wo}tAiZCnOY}pT0ItCmmrrA*k2vH zrGRQ4laF(%+Fz<8f_F)69~rZt%Lv=kAuOD==`Cv?9Bc8W`~Qe=d`8U6zxh~PBf=y- z&)WiXV~WwXLLW>b5da|r@F*s!Bzj-B80&?Yaj-U&M-aY;uYT|rRQVi;gz{VF!wuC| zx9wBa%CEK4)lsVTs^%{fA3NLI$6@JG<>y}MXj;*So>J^`e7!(-Sn|}I)6}g?#L506 zAJ5p32in6%coK~M}OW_frdA>$D zdEM~a=0-*MzLiH!JL5|m3B+-yE4^a+*2kM59k`C{1+uGuo~RRzK?ltt{Uml$Ax?>* ziKcv*+X~)zz~1-F<4)UhydBhK&_;ohE1M>4c`UGF_wg zIr+Gj@x(rRG94uR{JmSMOWTLWELBe!8X8`V7+cFubBNFT?jM8U6?xOEfPwlR0qp2r zv@%-E#F1UCDLV0Lt%fibp?QlgK5Bcq;Lu|NveqJNI1lu!nb{3UxTa@nAESjWmY3z3 zjaf{Tl~KYw#<%TYD)uMS)1*-veFUnm3iCUL=eqrFc(Dbx)lQD^6{CkH6k@MEkP~z! zE+BVxpNO!MJtiKe*Kmh&K)uE&V|4ER;a6pT-P-R6{KbWJvGUK=w*DMMJ2_$f0mFhP zBi4aq^!&O!&sh*n7}(ve{psb`CYw5Xc$3qyJX88@$JE82-YwIzprhvia*Hg#v9I>O z6eIJ^cFUsp`oV)NmsD|f#${2U8slD10fO{20FqyU_~R!=+Aa5gYyAA%M=1s90UhjZ zud=_R@TSp21fMK#-8$p1;nM+91ubkuRj>1v)$4AUgE$>DS4)W_zxqvouA;kG%pj~l z#HUNZ{WrW9hI&^%e8%d^;(W7&2q*j0n*-Wj8P+aon2Pqy8*XiieMRan zE+!`RMo#@QO&Mdqg;TUn&=_NY4YFjfM^V=ui;K?*4UBaY zm7hOwu%^{!pEROjjGHOJZWr5mrB=sPA8Lt!T_}EL!Wyi=5>v=*3Ce|CyoWD+@4?)O zI4}LXc$?X$_^DEf3E7q>23V}z9r{EOAa5S;z(b_>TiS}u9&b26tJV(%A*SXMyoT*> z^ivnY`kfN#sg9|P%z-&;tWDB_J^9$}y%hC8x3>AtR&n-;0ROpxTqFdhhEu&GV90bB z-Pu;P&zCDp?YO6RtvjK`Q3fI2UIS{I%Ewc#zcAa4c=QxEG>KogByW;#q zC2^ zF@VSf*o3|`{=EI}ktg;^ERcyruz1%2=h)ob+@WorcRf%8z&9LZ1_^EdAtly~5RJ1* zy*03B=VpqI{)xO#Zk1TL4V3>81P3X`$rVdqnn1}`<}x-lvz2+oe|ohkjqeGFB7iiN zW}dv*Uzz)6&mGYA9(jXsgqMTAMownvw0e}Lpg;{{)BlMPUqdc8Ha5P)S&qjgntNJW zZ8nI_Q&0aX;oLGF=NST`kgE0LAl^3o0){{yQ<+ST+ zY29%kw|9K|ww^vTHZ3xj@5JFOp71uE#_)Q^f0ZBR{o?savDZqlt>Yf=JvRjwZsibO z81r`DX9T^GEiTBwdgk+5b|CI_jsnB|{P`yr?q0GU8Lq!4ownVE%x*tiZewctNjcHp zlGWDMR-jM{4J&_bJ-tmC9#X~`NS)jd5Umil%l==z2AO%@zc~mw0!tsL%xY;1{7KOX zgdIgWa5T^KHI$s#{IXtmz(E{zk$N`9qv*Vx4^y6@zIEn5%u|~|FSfaeYpr#wNq>^7 zaJ0%85&suwFNO%tnp$u#%bv{ho!0i=;JDi<6Nt(hF14YM;iaZ1=FiI%Ud4NA zn5md;l_HU!o4eA@&Fx_7^U=VR?VJzmD-&?ufi-1EFXl*1PZb#^jY;(HG?{tY0dO3> z(NN!)jr3>Qo)M#fg-JWy!!4^&rdwNCCBy1xjSyT?%kl@k=?j%qTp=m#m2gUVA}i$z zQD5S`^j%YmOw2K0UM=q$Qzg`b&@0?4YoUc&GOpeGa zgF*W`IXV7e_3{VSWPJOb(ifGL`T>D~5%SEnCK-l)_QO;npYWwNYc$1x9u*Fb0jh2< z#%6Zbl!yPkb&jL4GN2b3=TE;F8;&cO{7PN|FX3f9oio~&!_`r5D#|*ygW)vxbuPek zvF1uBkYI1dQy0DI72;GwTEeycN({w*cj>#J%WIN#yb6XE*mHZ?o!8f*sN!ilp9QuC zrVt<&mgR8JrKs^jplR0powBn2Gl|9)C%wxYlbFaz31^Kv6}BU&R_vie(r_a14GRl* zRUMgBi}RcObX>7K@N@oV162M<@I#y7UtgOLTbeh|bIK?RNAomFbq2pECk%A{@^_=p z&jm!-lPTLz(zShOB1v*0#lZF12~%!2w1M>zlRaO~|6>wK&G8&#eX=G>m}%*LkNEC$3KT!K>#5nq2m| zWAE%N+nC+g7D&n8{D_~I=WX+-;`7Tq&d84+ACj}!5x_`(TAsx#(lO=y67#1Dpfv{p&BAgeNPt zRR+M5hWb8i3ft{!geC8>IS&<6Gd(NM^n8TRoCMQ9CLZrX&ch`Xsq?>X+1tY}^}kTt z6tLjg6J>=!O^Vg77)1nK{x%Ti`4$FL>%m~Gj|9?osgon$9|#O7Sm+~6e>b?Cyrv@v z!QA-bU}{iqMx&p)d(BpqC<&o&Ew?a{TdB9N4 z556*`EpR-<|OTViw6;#a~IQ&GWmu zcTa+`ivv*m-Nm&6t=!D3aMdi`N%h&Aq~Qbs2nm$%(^S~kJ)E>Q!_z(Rb??n#*4YHu zsuxT+o8pV?r1-z7`%+8KuW z2?{<6=zV99bio;$5liBm%bEAe2>L<1OOWs72rEjK2oESD(CAd9ULbrJP~S)lh8YHi zjQ6}OlEzxblbV_mbZk}$iZwddVFSHC=_fDzG#(j7m+S_1f-icpeHzwv$BI?jgX!rn zy1_Qfb#dMx{>d4*A`)eCr3F2W0=%RoE&NL8xM)VUuHX(E>MR(zN)SFMF|qf;HCEh^ zVCx7018cz=uKbI8CJzfbgePyonhJ$D*hyh@(qLQ_+#> zd;E4l@WT5yc0>hEV{cR}6;up$Jc4iPnx_>(1DLW0d?q);CnL%PbUcjCXj)@3xJC#mqb#2zVOSyM<25GE= zG~dQ1br~T+KkIEAY@VE>(*|p{|Al@o!#0CCJKgcF!8vm2O-yczeaXF>+g0szjs24UN9^wrwnxbXH4{uDI8qa^@blYjeHh_CR# zu1KvF++C7vT~$QN)tpA;uG4k!A(M(bGr*34?F3Y$#VG#~K~KY+hu=X>+v-j_uoD4o zx+I_pe?8M6a@Qy@_UE=bQG)OPt$al(nJBBeLC`4z?f~9E7`90nY&)Q3AQrEQtj(rv z)>i3_WdrjUQ$fBt-&V%OSs=h?%Pl^<&RL?E9STDbj?@z6Cdg?%TMP4h7|H@K-K9Wy zLoDa>Q&RCtZjVx*!`K=&c3^2ksz9Wz&jA=yth$IMFNq9SxTS-V>nUGoGM*={M`_GH zs)um`Ih=I?e9C^bu)u?fHvHW^)%%*DUAqzJAXIaOyO3Qmt77S}N1--b62bo34xA#gnWpcpjh>40bWrtL%%O>%PkqqR|pH=e)40)&V#rX|I4ym z>rtS5oEs?jV|-VrIMV#Axb?M&w{!U8(xU>uOa$Ir>XKy3Lt9p1z9RH%#V+G)fQ8gf zpGhUjT`$nOJk>KWKXG@1Buk0mqiG!o&K-*zY_|zI-dsIsc@LMeErky-eTAPQo|ZQ4 zVSdP$eZ*Aw^#y;!@Fs>f0MWE}qb5M6KOLv>KPkrwoV!IOlTV6d!ex;29 zvrv1VzT8EFjjM?jAB6Fdy>3aYM3_W7qkCUSqNvZ)4xSK*&40Te9xI4y=qQJIy93#q zgJN<|qHHjqOb4mdb*puKM4e-*!*bi<83)4LmrAm`etmCrJNQqc*1v_INHxHiG9*4$ zh+sq$4s;^ivZ-U|MG-7yHz09RO;C)F8qe$gsRdv!S@v3@H=D5^pt_dMc-^$Mg1!_I zmn1x(?irBYAknB@TjsO25@x+ zy@aEyV6S>z)Ls!ytCcvKN`e?&Y+(b5i|JeW=Cy3lQ5gS*zumWSXGS;~1TuZchi?`N zdaTHBd4N)9m)8^>I=xZ+Xa>o}J_zM2uB9_e7#ln)#XfSx4*5qXAMIW9mG1#%LD(2^ zx>QQgCi~YwM*>SOXzj7SxdtjrC?scvys+ zhr&{W8KTM(0c83umGD&~m7Ls7XvUE(kc`aHgjq`zv2I}ACqBIy!+Z3$^A#Y5Irj8{ zaxmmuEH`ki5ZKB7gAeaz9FkrVDQCFlCE8h@aL&)*1O-Q7)QjR{Ih8-xi!fxryYD=d z3P!Mv#E+}`odm^+B^bgU*bib@IV5h;rKh1D@K!=!Om`&@B+wkpiKh$ zlb=wLZOabf@)fhLa(uvi9CgLV5gP(Koa1`{qlTc z__C7i+Zd)amUqqypxuT0zRZCZ`dCX%yucRv8Ki|?8*y&!nhrm-rzCqi1wwpr9NM{s zRbXUjVohU>J%d}7H`-tu10uF7n$U=SP_b3e-tSO?m)SL7bZPyX54vbi@a~D1U^gCI z&klCJc@67=t4g?L0cBSz!50)@fS+TPKx!&Z(4nvRw=@2)kN-!Fx&fTp`~4n}5NR?~ zD&JFFiwH1dAT6en7`|xA5j5qkd=MtQY*F1-VC8cZS_I0T$Owdc9{G{#3|Mr6R<}RO z#p2vlrOr4@3+0R4ate+EQ;-Vg1(Jf^=7D!e4(V2NJGiD}1M&m?r4Ir}8ScqU);EQ4 zPm{|=6lE~6J5JH1-`&P69{T>F{9irKfBmv8OCo&$Jxf*dT_GbB`O|F64S@M0z}Oh& zVb|aD3(i2$KWS~h>AU;tdn6leK!>0yS$eIvQPc(OM@PXcuK<;%DZ0^f>&YK~auUN` zMuACwf6EO9ri`(Tt2l*d0`U%OrjG;^K-jg~C>I+$>mPDL?f<286+%i^QePd!M7qeI zToNpTJtxWLI420f&MjW|XBNu|XkQ)+TKGP5mGy_io!my~2d5kaZ`mtILg{d5tlILb z6nR8<1?E{bH{d&0Fj$%*zLk2S2q0L27kM*Ok~L^vrMvUWG8DB`?(k>9S!EX-QXR@( z#|@abnn+f;KbyHl9D6}rO9EmwSd3ySvKV6ao)XT0LIvyT7e{Em!wI|S%l_>({OhAm zGL*EIlYV}}QtFYd!0jLWs}kn1b6={%@sGLpbZm9 zF3nvjsGQ?%hKFN__j6$N+(n*(3`Hs)#zF9Xj`-7)n)f%X`lG6^jmqymWqD?*QdKJj zasl!8_xDia{OhUybzBeZgp$MZa;lvIM&}U(q;MmOS<{ZCy+AcaP5{wEo&tTcO&>+^ zfI-Dka8>kEuSCXbiF11d)(IcP;N9{{%p4UlZ#N@LwOct+u)2j^S-J z;YN{spBd47%f-}X1Xi7I5!BI&Gt<^lD8grNI^SyCo#BqcHq@urVm^~WqGgN4@8UhSiNDl5kd@=PjAO1KWa7Y);rj-jx{>lFHzo6@kO8^y#JJFlGAI|T{sj3hhe zc(txA@A^Pkr3oHvJ%638tN+&<`L}ZSfHTB|;kKX07&V_if4+tcbw@#T1rSx~&z^0M z^9$UpPP5?vt?LW)YJ(=a*W=`g;o*8V0CF%N&%qIJu44~!+}riCh=Q;QG;2|UzX26>->zL z-)>Pq@}NOM9zBnsI=k3nhK&Y&%P3H8S!VJRH0EoN7B&nK&*1TU?kauOZp$0-3nb6( z%U@KBrNYF?*2l+Z@1)xLd`3R!-o1N&dw(qpP@7A9=Y9UXQbVu|8=8UXnVE{#fRX%x zbj_3&isz0#1nmKi37}Ys@K-8XrjW3203!?}%-#hMO97Rhy{WG*&bTN2m(Ex;Y{~L& zk-YDP7=?O7qx26B?ygd`VnwB688MI5Rjh$1{I|ns^AM3p#4qwf@X#s7&rZ2Lcma|m zK2lSOJDer$sJB(EHXf!oR~*uU7m?597)#8J+WE0z9MuVQke@045nP5}Y=K zNX7h^m{@I}aV&}bkGFCZE)zUv2{Nh({$5~XbqDA$@4xMU8`)6`{RpU;Yk0h!do)E5 zRAT{L3Om%On9VwwC_2we^llT9i$|@!g3=Xs4<(c4~y}PDwQ>(33P-aFSPGUH#XF3^-aSSTeP4d=lh{XrG)t8gVzuH^N zcMnC(^(c2Lb|gtSNH~U!?R0yG`x3USqAZ?R$tm6hNm|Yz{GN&_O~umr^6t@;3eL=P zP`eo1-CuM$hgkYJ@8|}`EvtP0Weh+4v4|5pfmPvpD=GmQRoA7wdcc7j1*W1Q8#3!! zv-bkq)mv_zfZZR^%c-!N8HJt@%QE{!Gzj`cA?7n9s(W9qTW7+3iog5!-4E^Ft%^NP zG+eFssFQ@9;`5312xlnYUup2|=dq-r9LBT*?N~*56cs!<5Th_vc!Aj%Qs-5=fb`9?Jm<;{Z+49%*1q2g-OmEkGhwV{gB56V zic0+68FByds`Hgnw=*=vrD8KE?az7nPSa!p8MIhrvl%j1LO+sZRT+rab#(=VC1wYlG83FO^3ur1Gi;!ArSI`Oyf!onLf|9kgi0a{%_yD z-SaJ9W9cav<*k5#vkI}Jy1cJ*rFG^iyS0TG!kZJCp;N`ncJ7Y|SK7v80PZMh5i}TF z<(;4CYc4E8yzl`vuT{xzhre9l^)RmsTE8v-)2Gh-y>kVEFH;Hb#aTE7!jQjY7VwoS z@dkS{`GB%pcW|2d?&{+TeA82#Q#W=4ALn}}-RJjh3J~x9x|_^q`AD|!S$K3Kz4^_& zcq#!~=3vRbA${=dq^8oKH&RyW&L@4C6_np;zo9l_P&n6AG|{jaioFPoXa)xOOt4pz z0pMK{Kw`AYUw7*_A!G1ehm3daYlsH~o%ZJZ;fZgB%0@r78!6vEL$#B83Vpm?sRX&y z6JWp)PQ3f@N`BFY^|2h-NuZU3w7By;Heh(?p+%@6u!R4g7GdU`sLcvIBg$&ytGwQ* zHr=x`AMUp4-$&(}+UmzRIhBqym;)ATw84=sRri{upPt^h_5x5(_ z@93~qH3`%>((=F{V&5@*EPn8-aso1Wc6@1wcBa3)an34q0>KA)O44UU@jk0_?mYn1 zanoI2*_^Sj^C}Xc4z<4k0oA1u7x$k3rIPL9A}aND>+FPt0n*(dDv9_i0%BZUg!u88 zFP=P+-#%1>Bis_q4IA^YM&^LB=YWg`cQlH#j_{i{z6aATn=&Aa; zx#GNLF?|lOSpSHnj4}A2J@q7tKaAzuT|yI1LCdUfx$4qIPyRXlqqXeL0PSsz)T(BE z33jFu19!+Y#Pit!+Pv{Kfd#S!ppDbY93Hu>I3ddA^MYuPLJ}})PkhH0)@8Yt>W7JU*Mf~w4-SMRjZEQn;lk?o`Ewi?kbA+QM%EWw) zoeI5H{5d*RKA3oMYk&y%_$Mg5R0u73SFqKKKwD!hE7Hs-`peuL)F#Tg1-^28f#9;8H-Oiv`>LyoHdjYMFeVJ)3OU_gRRVjpY_0VB%wlfP9b9(l%gz? zC5kL1siVk}$}%%qlVr^rGbpmoSZA0S^W1Zu-}m?ZKF@E?b3Olb&2_HRr}uKd@AY-R z?iOCN3!#l4DrKxM;R?Mr+uICI36CUG_FL9jq$+62Kdeq?qWQUf@mBud1SvP>7Hw<%pVR332&W6A?uR#D@iPB1KH0 z=cZ2*YS&XJ#^+Rd(nKA!W>cMcq4kHd%H@=q$8I_HsV!+5mqrhh^=%cev$sE>(S# z?w|WOxAt)&ce;cxD6nCGJ+lc$H1&lGv+O_1b5|Qx*Dr@CkTfj_al~}%*a}T-P@kit7+LPC8k>w+JcpvN>bvTDUjio%GAA*Z#-=XDq&{ z$*ix+rB`)te2N2pv2*FYX}9~?p@LDl-{EyOC&PI$mY9g?l74o#-TpU$x-pMp^FM@I z>D|1h^?vToy1?flm=oJ8B9=@B&_ZI3AUES}bI?5+q6Iqi7MKn6W=bu)?Hd|=>J9@1 zZON7kKs#bPu<qJt z4BIEy_3rR1K6FEa;-EwR7F)SjH99vMkMCz)QY98tg`ahFn3!)p`|x{_fB3XCLggux z;{&n5*4q=dx)P?JIDLtPhp@lq{5Fc-d@&>N7rqb&;p?>4lFm>jyXBtEjHbK}TY`BA z4*jcl0{Ao0K?ouwzJ$pta-@TNxTlpmyCKa4&54kVD?{Q8k+^7nn&H~+w>vqd58kp7 z!|&QhKiZ!*NY*^|OW9i4V@^DGD#-DRq19=Z>32B9G{h{oqu-`Kb5Z|Zv`7o6QaL^9 zc*|ZKTS-Y%qypS~GYqXxWKVQbTw=b9=#~2_H|S7JfAQCseB0`ld)pLl;@!?-zXsST!CJU1+ChdC*El|9a)81vMSir zFvd{@PS^374;Ekj!E&<3%sAWZl*Nj?|A1WUxpn_Q@S32{%J%;0q(^B1wrs~Mf959h zYXg01GN_~HdF4czMOx^_no1nk(TMf1*8ntQvj_O$j#rux%m1hWUXIOyftHIFze6W? zr9cuLzM#a5e$!^rc5d%!D=Vv+%Eneb$hE{k@?IE%!h+fZKo)2M2jV3ZJHw`* zdUdYurJcL~@%qQ&*eo@-Z}sev@r>j>!H&&Ay0-cEf_eXZ*aJ|u)@u(>7I(U^u1P`8 zO?iX}(+eOf5XgvrKYYPPQXLWD=~U)ZKd}2R04DU4cR;DRb$#y*3`a={hf3Xha?Q!* zhjI;To`S+8t!lcz+3doAl}feFu9ms_ z#~1H(1_okXrG~0YAO4gUIZ>9zv&*>AY%Ua2wa#@;m@dqOa0|As|Iws5f34E)TMsXa?<5hWS$ZEYngRxC4|t+2ypJmCY~k@DuU{DpbG2B>BA5^XUQU zug|BaQWGx8bq9X?DLq;ANW}FGo$aI%GhXyYS2i_tcX#h~TKnFFd-~d_x`^DEAYQ`O zZjX+U|E}guRcff5T!SIDG4}6$8-CE>A~&kEy`wI_acr|y@yx=X%8AV3Q)X8Hk?ZH! zZyMhA^M`)8zj$e#qgML%)Ag+_oN_+@MVuqxck!uHsfPV>^3U%hDHP!ry^nwvYP0F> zUTe+NyzNr4_nl+mrGR3{)I91fx)*rT-}pT`zGdp(_2wWV<&VsqkZV;7gUbVK4C7yw zm1~)P_pGKvS69+b^_Q?JlQ@{Z0AQD?jWc0F{a|$gdJ|`pHPWvQ^K=K&?(8eto3CvBqi$7F(rU z`y$tLhsy`~hI0dt{^(HsVrqNxF9kUub;7(TBI3hVRT~>#S`^V=JfBkTm&5NkmbZuw zMkN3dA^+B`cb`6edh~G-m6H5fABY%Uvj;Q?6%!|`E4O0Pt-Iqf%7>Lt7SCP1)OKz) zojZ9tl$N>v*OyzjMposp1L6HZY zd}L&_+5Wh}ywd)3a)t>N2yZO>1Jg&RgsB6hZVM!&O_WE#j3+y^B`KxYLjgfj>2?|vcv7?HRebseXB;2BCe5W!JdD1ynk+g!=PD3s7Eca zfcbsdIQr_%KSE|B_BrlHx-GQz^pLb>WPBrd{id)v16$~3=$@hRDHIZ4s! z^}u);h-SA24JFU)uK~IoDJ|@`i5Mdqm{2wuv{IJs4X0xZQ(8J*4o}r)kO}bR2T4SQ4=D@%0H#-K6M;)ydGQi;_H~ zwYM_x!{_vw^F?b(vZkZuA1mbtmP2#?0NUmHD)ZjguU6Oq$)cPrt-$>~&<#7bH$3e2 z49l#%uza!*Rb6DU3>f+!&#PKO-dNaBLs;ylLU!+$YD6IxLhY#ecqrqx8MU8^!Hq-% z7p?F&c?jT%78cMUFCzO7tQ?b|$*m^Bi9LmB7%AejO0GVC!hxF&aopcd7UmamGzvy}YONG_!V!dKaGB0lMeQ&#X@#1JYBD*U)OsawCo-mbdUEI66yt=lu3mOM!#Vgk;y8{y- zvuaJCVp~mseFojoRt@!rn!TiG>B~O7>UBba(0pvA`_N)zF%V zQU;^)8uN$RnjW>M--&+EoL63rQ#Y!Kp=gr}uW)hB=_+9RY}K$#mRpXf}?q zNLOws@?f&VKz(3OArc?4*%rORT>&ln-nF`xk@y9w2gQS&{lg;6d2+1%Oba4y$D2Qv|=y6A39C zm-b(7N#l_dm&FAkeIK+6%t>x1wo~fVM&8_`Rcy2b3RKX{_51(M)Hu0xnEk(>h1+*Q znlHP!>IY=fetR0lZG0;*i}vupotC4M`mVSR4l*Zy^ofWqy7VB3q-R zEC5rWXAU(G`;+x}iPBwJTgj(tp`tpl}8-xGMtIXKTh4+0)!cvwq$H&Q*?B|ug`8z;G@Oq`dmlio*zwNDzARyVqlq17Unp7$ADxCi(#3qRcoRa9hD0WS}L-xI!LA^StpqrsD>X(#NWlP^d@Q;Y}(=?}7%W*e23|2as#reB9#%;vLu-acd(hx35h zY%AdCWmkOx;8hF6O)~Dvl3$J5w;#B5?SS7#GDl?Mp0@|t&iyZ+k!O3}GXHngIz5{F z4jRxiFzL}!Z#`(=yiu({P*6B3vqWEEq5SV~I_k@d@EOgV!(^_gTYDdv0PbzrONQO) zMkb#FCY)+FRdA%ZSEJmlIsR=4HaaG<(Ei^Tltt$do0V}ojq zI<*lXHjF!*-V}l-mJ6BPhCuCktBmy6K`DN?0rD5O$NaB+{z)gH6}X|-NWO(B?`J)?oo%IP6~1ZD2?Cp5zI(bVbidSut}TPNCmZj zKq}0_8^aHg1$#F|`I!H26rYoQge*cI=>3jx`vGkhq++GO6m($^q;tF#3=bPl^XXfr z;T{$*$Ov9_b=}i_f3?KpEp@;_c5gL4QomjJn=EOOb-Q&lCwH5$k!@@CoI1@7b6)^N z1KioVM|U`0i~t6=I-A8SFu%?0Ji+Z}sKrq);cVzhW6Hff&*?=|T*2#8DI3uQd9`ID zdb9hb(XS`2_Ram% zZ-oABjfA!Qc{`zkpNkT%4{`K@sNUFb|Cxpc!-|Gn)8P#KB@Y%E1qjFNt1 zV_4spPyLfaTT*lEUULx-AiT9X{{2lnii9Ap(y9jr`oiwdxFVJWN=c?DT8rl0u3x4y zj4yX&kvje4YXquu`Jlr8_~&6;hqPcnd1K@6_qL;vmfJ`|L@YD-h(t@ausRRL*7wIg z8J!~}i;ZDBNyG}2eew z0{Bv?pcH#0eiLWadm!LyDwW8y)+4*$o^{MSmBgkdR;S{EzMAsvizJ&-!1^dx^C_Nm(Xxz01k zhXM}9QCtZ4vg`%5xUZ4qXQJ=+{pSV$>#i?9<5eVBEeZX}68>$Cv=k;ujXMXZ$B|GGr%7Xw-IVq6;B~x!!ZvI4yUw<55LF$FIGHuVIf^zgLL5E9joVWwoMx z^Meb)$*R|H=-|zR^oM+I1@C(kT<`}7nm?r?hf@D7asOJ70aC@l0I|-!=OYLv#TIF~ zog~1*t?$X@B1$!N zIGW{-p)%wN=`&QNTB)@$^H&Hg4dZ{*ekC>ccw~eZ(~z5%X!=Z>r z*luHsuwr`dJ${-D&JD4CUcnc8(l8-u3;d*BHkgHL>3T|2yqug9st` z2y3ukiQp!*zSPd%kk$J+7sUEErV^p;w00Snl?1vP85Yq{SpzfR|L528Bt0UIiW#^fiC|aCm=d4n-EMd%6dAFH%Z!!XZ27w!4DbL_Id_(vpoN%vt*g*tu z^&z$#yAW7uQuQHgqsubY0>p5NS!A0S#V)ddKS7M5vfHpo@qg-uNYq+(Br=RBbyZt2 zYF@hi6k`3x+OqXV24#rOi;&b$M(AHa(Io6*-=kV-^-t^{a@tId37l?k;-lGz2I*|M zb1EgaF-#-z{(eUA2l@C;l3Rg<*XKy7Q=2Ic!nqnJI6bKV1UxC_qdXeNku_$y*WpQp zDj(k_M&Y5vl7swrhVf8RbNWkew)4{*`P~PVIBlgdDiX;!Y7m$r?2crg$EG$HgkBt_ zAf~9GDwa%@+KIpM=gooaJ5){oRk3P0_Y8^(LC>6ns)?G|b|x}HPqr6CFxvp$H>22v z0HShvr69)FWuAGwGM$?i+7Aev@a4l{!dY1zw{9HCACQzYVV1iwgGm* z;zF#C+#VGIFH2aRtsSUlT!W`Ls!jwba*46+v3!yUbRyDG?KIgtg5;N3D?x98tjw0T%t$?$&mdm9b?v6m@IL)KF4pGbzic_$(;T)vF5BQ4w6}d9dkYcG za_%cOcjd*8kX|h&a_Jvq#q6T^{rpPx>8~hK-GH+>{2RkbE)3p-n37jyUFdt;^HIC@ z5ps45jWkD^M&=|p1ceEa%0R|gcadS~Ca+sLie{Dq>?U}8&Kenh9G+a55HY5+4Xa8j z*h8>-{DhK^vfMc=MBG85%T&)sbJ9Sf+u$yoZ*?S?r^56$Hx>P!@4xnnQt)(*))%{ z7>cXt9<+nXJoU9*Stsx#byWv1-j|Y;JPk-eZ?VCvbQ+LjrCZhqDOi1bS5t6mp9a*Z z)DIncF#h$i4I^Gm?TenBLQgT3rCK~`v&7DEzrlPTd;a=-wL}8Sx(Q9+y1qBHQHL1&5m>BYf`2xob(p%~^3$5CI3k4*2S-Rul^E zIS~dRp$1stL%|MNHC-c5)a1>m47}}|iw|$k^d$lC(vClhUVm>}0~=4%ce4+;P~vD3 zgNCF=Pzhngau1t<57(Uss)PM6mb#ogpq5=xk2CfE{M%+pKpHn^zl5DNsj5v$l491X z06Cy~RYX3StrP4^NikneTyS$4kr2X+FYWV?6Qdj`rDYqVy>BGyi*VA6;CHjtii2gO z_p%C(CKJBCI?Q9S>@|V z^ODSGSeM^HAs!iAtgiW|-O%v6k?|EgkSE#Pv>99FFNaIRFayuHh?9o`A~;HUA*?!R zd87moBRYXUptO52{#1Z@!=AG-cen(O^~gGB%>*(4M0Qb(0!iqD&$I{YULvHfYGw~m z=EV#bAt7dex6g7maH?g@qs~43Vx&Hh*fken*ITo7tIA*P9PJkfe~!})-<&6r<+$qr z!Dhqy=(73&H(Ux+&ws7^?1t=4HBp&rF-lgV2~~lUQLjt^(-$NuV!s?~P{oBkD)~&U zR_pN;4@tUS_H-F(pTuo5sm2Py;lqxLSqcxsMygx}oT||!-SPO4Wly02p^uw3ZL;_% zQc8NY39Dd(DYrOCu#t?xHEg*pNcE8QNx+q;tcWpdWk16)KI6hq&>9$fdXxxGACj)M zK1w#Gy=o}Fc=Umzy`GAXbtE}Jv{Ikb^|ybAn4)Tp()ZyeBKyXnRL9_ntRVAXu`h)B zy0b!mO>=kbda7mKe8%(c>=mGGIUt~%rRnEb+qV@NLv)L(Mi!6NS#jtKj=YOHRiis#{(ulG}~sq zVs5ngPa{0VrO%W|8LD8vA%A|v`cj48*+|oXCf^?)tf#6{EUmHv$3K4~$9qs{KvnH%*~#Svi{2B6pMJR58< z8xQNLPR#SnK}FJPu)^nnBVs*sY4$zw1!RcdVX_Ft+ZDfesqi5gjwqV9G20RuN9L$` zUEKBP@IgLGnFVh~>&LB(7v6f&@0=2=ng0&N{$qK?;9#$Rr>)Ljmp_yyMp0jea#I6Z z;%X>*IPOl!d<0|O)G$_{%`5)K5ungM1%*UK6M3e4`iByN<-7?=>?PN*AL8toeDW&XG=-?Q1$Ixzwo}7 z8OxQ^K+O~Bnmc=IJS0OqG^E1AWA5vuhwC@+b%@cA5ya`3!4(Tmj{IR+h_kLK4z;5N zc@UCGYh`VE2apuV<#%Nq@wzX4N>&e;L_emcJ~i4Ra6TcXu&3C`B+@jDt(*@}5f+CI zN!C_+biF9QKGrze94j?zxDf&oz{&Y7$E{m?>8;%@rVAJ6k+x?j^KkKIEpEicvDt z+APJ(c>H)XFvk{FIQqTSyTCBoj!nF8dTelzAbURLPU7c8oS7lk4^^A|HW6$B({}W`CZdn*o-Rld8iAVM(gk9lGV}g=M|!1xhwX6a zLnTJ#Eb!N;1XA;UY-LRMx_oN7#bsp~=7~4;VOZ%i)$e?I<+Kw;)3t+#?QImT|Imxj zCiN&=aHQnBU8E^ms^sHl3iAeOHinZhp^ZV9ih0_Lu_{q~BFfK!S+cUv)+zj4y`yBt zE?2jyniOta*y_U7mb8Nwh3DUx1Jp>_#N?RW&!mRLVv%~6Qv6{@*4lKj2XN_mKn=`T z)T!jEalf*pGku1SwZDI2Y2R9t-lY9fG4n3sR_IKMM!V+Por!Tm*V=jNVsNn#2}nHY zB6<7*WSis{j*8m;Fi_&^55ZNK3ffVM*-i>d;m%PbSvh>xyal0H#ATBVEEnE=kIx0I zWG3$VV`P|w?Ef@*vnAgSz)<56v&JsTh<7T->?KRn9E(Ub+iZCPR?mC5>7kJbk0 z2<~{g`>AGpyw6nfSaZFJ;#S!MI#cB~Wm$NkqLP)$*_jw``k~UAeuc+GZ$G%f$-m9Q zO0c)v<;%G|V|fjt%vzf-a%*?o?%_J{f(;(BhDXB(!6ln_X)?{EAMH) z-O@wc9VXDWzFF_URr>wd9*Z;fVWhh^Iv3WeN3&LX%lE;f0WhG*V40hh;ak@4JnY4u zAa-u!Tcir;<7tmS=f29+3M3;~kQcj~@8221P2&-&;q;2!b>RIs#ux-`F!*VFNkFzt z8~ouF!Gd|02ePOb#jllt8+GKY1@9b|d|}>rlczOy7W9-#zMG={?cb7v*R%mHbFji^ zuwvni?aKs>mTGxPW^Gq?rJpomQOsvV%4;d%E2GlyfNhcYa>Baxi)+;)iLJmWmx)^) z&m0}WaH&tLo*G>P!j{Wz~-2e7Fr43ExHJ%0OJWu6cx@e>jm!&m-B`oIapPm(C!IwSzZgKOO z2k(f!`K6FOoHOg_^=GjZ^vdz(UGeb?=)Or%{!cqi9oha%?(1o}KT&2L1dP&hag1gIgCm zap6d5J`aVbM$}NfR zmk$V_oq7CQ?0)L}-2O>oUgDFUWVLz1a>>PKPUy8=%=`Q+l@U6E8f&HrYrjP>&B=0a za2=-Hv=S{t*+JH*L{4(n%f5PkZcPt%0Hif(m}?;(O6;Bcrc2$m_q4 z^gpa$ZVWqirF`-_+a**mo&U`M+xGbycGIm9LX!3G-%3Zs#FXaOw9t#Wvwz?urL(_~vxF)xUI*fQT;+VL9+G zE&$?RbX@S_c#~>Z-j+OF!Sav3K{Z*wZD;ZvMMko4Nkdi}!ATfZ7IUYGCZqk!aw*+xbL4*MSGq)wLj;Qe8aC5Lxo z6`O9+zD|emMr8;eyzu%q{^sn(wO{E@oq&dn+ae&4ekw?Eqj{sYt4l39@_>NDmJA@1WLWY{w=pDruBe8+|^tXk}I_tA77jpLJmDhb2 z+$MW{;(N;rPl{3U*R^FBBbRQ;gC9G8O9+ACMKbbsQKomco%Cvr#0qwB^nV&5L*y66 z6ClME?J!j{R&qhGSmlti$xpcPF6%Sw?078M1z+4cEUfO_G<@*nf5`2> zenvU6vurJ<#a4rfzvDrDl2vXUkva0~oZzDqk=SJwC)|^jnf@+S%AOapfB6lRPnN_~ z3|9sgruvV3dLdfN2qo9p&I|<+Ef>dI4;<-fPA%xsvT(_d5yVd1HBfr@D3Kr;(G>E! zh2EhV#xsxJxwf4-M*c010ng$M&RQ=9bLVA0l$phKF!OaZBCOkhHETnm*ka3M%HiPHLdL`%BRyM7#8}%A$sJui}~>)v3Q^qhq9N7k6PV zSbf|z^?6LFuRo&v4)e^`O=G&Mzw0h&vK>(q`ZVtPgA>o2Y^Yfp&fePfK{|HiAL_Z5 zXizFl1;dRx`EEE!(3$aOOndZ`W|V53AxpOh{=*7AL#aL!pAyg_fEHosvbhtji9Cs#2!dbU;`S3va+>eiG^O6FlTb%9TGQzh-WUT&P#&PPh{j}Z^0V5xyC9T3Ne81k#LDx*t{_)iEPlBI>zBgYpJyS5-or+ys z@D7FW&jY5FHP}Sxt;7{rc4+zvzBOW@9jMq%^(NvUKAz#DbpKV*TFyA#t zcd73+Fbr!-X-GVZgD7D1RU8iTX6y{#XmIQ#l^Ed^?<2D(hLG^vA^q_yW6H(If@;2g zGQ{|&?JK6H$gh%9))0Ep^&&lXt%xvwP86>>u1hS3GOIv3tKPT}S=l!De`l7gM6 zTdv@`EXq){m`OT=>%1pnanE@OlXT+dVj)Xree0T~^6}d|#gKI}`-iMkC_Bg|mw0%$ z2$mi${nCs!ebjh5Tj#OwaP_LFNVLaJ9Yb{Y#im7rv-Rj`FCAC6&!sDZ5v; zH07A&c|J<@izWWRk$IP#6bC6eFWOe01Yz}VPk}LJ;B?Q9lHJ(PkTB^g_${R=K9KG% zOO{!N&Q9lmEf-0CRN#^79pko{KJPF00uWFCd?<>_8H%i`vx15z|^bg6X zbZ{xDl9`Pa@tYE5u8lR{1^DcZ!&C2MFY0?7e`#W58k?x~n`b=r;nM&#j_oKH8T<6t{GaF6P2Nsi)#e9K=Y+YawptO2c43gu=Q#$Sw(R#~C!UZ@HOsQ*K1 zDvO<(TKu41c~1K1*onTapEB?{714i68fr;?($*Oyd^R^lx!ntg#SKmO&fC>6Kc_Y= zV!SuCRh)2{sIpF%keV)ad@UXxr!k+Ua4-iY-9J?--)zonQWbQPtx?v<%T&|ymrWq=q zu;HWlLl~z0=F$^xD3D1avS)(0X+;7K;v6fOTI}+p^UI+m)LNXuHWY0Wlno3b^>c9g zH*mBr5x*DT?a){yDE2NM>QSmKR^NcbBZr1Lm4>2hp?tvFOkw!1UF)I4?_W#6@lE& zu6<@(<&q(rQLBw)4ABKT=OAXonzo6s=yIL}sH8;txlwK&RL}MBb?vUmC%ZJP_arE znU@f9L||s}S`TveHQCaZ+0=U8;&Lrp+S+RA4yq)wu32a)mz7w?kg3WG|8!Fn+K86M z#ZugW`G{mhH@(=xSq&S)+UygfXCD|~h1?-gGWqzeE|}6HrCQngoT{+G)a>JtPU$|z zpa&_ZcfupUa+kJpES-;;86YsbM=Cvdm(-%*g$GlnhUip_74Y@4pRD2z#8E=`9ly$C(2uDO=Xkd&mXIvWPg>>Xg-R(?|3IxdLb9g-%7Ps18f)X@{KLyl(na zFW!N*uYWj0aD)-l&6QRDzteVO-%dXnI!xfgoC>!EtG)cwlL~pXN@>wbM~+ z4w2Xaa$S%RiTsP7_Vnx~fNt6P?ik6Mp)R+K??7NqehY&LUdNL_U7vrqiBlM6fGj@E z&fAJra`UPugJwdTw>@C$g(!HI_myvy)c8F1=Y zKPcBh6#nH~|NEouJfH#+j()v)7U}%=!@WeWi6y_|$}y(pNb*v|?{n#^_*~G_eDnDT z$+R96a0yoZJx2u`!nTTJNo{-OC|jTX`^jouqaSsm0}TZdv;oh>LGFGF!|EJv?D4*f3P~`KMbWgWoo}8XA`YbIt{!v4 z+pw4gDI#5W3g34%{tcLcvNzfkj*k4!tfGd~ZCqwRc>ybB|6VByC*O`jtnXxdVDtJD zooYIW-oO@&>Uf$camOh!0+P&T#ibHnhZhZY@}a9tO|$CJ}~G4k4RG&IfF-; zoXjP1(?(45-F(MqsF@J$L*M}zlXXFoZ9G&^z9AVmP&B3L6mGnGBHWDFS&SveutNf* z8K?dHrWrCz8uqJKPZdI}cgAu>cq(pj5LbRo?v5ZnxkLMPyX-y%2QVYGPZN$D*MnGD2reEz(4(QAQ9r#J?PuV&l%w9K~iJ43UUo_3D!KA87Ihjd%pDlS)uQJlA5 z^)=ymtdy4R4%r2Gc&(|5SW( zCO>nMe|kjqa% z`mt)4HC3W8Z2iH=vGvX0Hc?#QJmKFHs!=+ka_N(=YgG8z5dXSoOV@T1iQh2u)sH;} zy7zeuq&9o3bvH9ZKF_9e(jyND7Q*15oV;A5jNpwI{B4R@mv(4j1wUd@L%-eB51aF> zxI|@A3n$lRwSPT*-RnDKsaE=VeSFP$@{MW5pL6l*t_wfCQ|^n&a#}fP)yPO>^>sL> z`1=NUUcjme01`?-(q&bbb$x1dd4cqO!|F((PUJEMqwjsWvAaB+?E{4z^0C)`v~jV{ zR>3MGRo)FDNtWSs>hK;xYl(w-0kqOm7U*W`Cc9ufi*#IQ1j`E6Wrp2QoYfEBH>-an z^@UaDS#OgSzVTC5#l;sMI658EugR9G*NRwKI!g^dyOa2xXu9L{KUifswzAN9ebXE{ zW|hlghjx;7bE}9#>YV;5Q~%Y+x=kuCYWi1PGxZP29{iktZRbyKsvO_7d`pXo{MMF< ze9M+`wivCFzRwFBqyAfL{zIXJB!UFBNvMh|Ma}JL_e1LZa`h#CO!p<$~5OW4B6 zf^9AUl8)GSQ0mFUG?gb=Y08hX&R@e{>v-b5!DDvxn8!`!lVksIPEj|(Ud$RX?7=Wf zBbo99VhweVLrtK<;84Kwcviq@o7d#!BIf$w;{*8{83XzLT?2Cdot55&r4+XN(=y(+ zU&DVbRpjcpIp>RRl>uMl^_Y*J+@WizHOokaMds+c!O7b1gAF-45xNqsGK`W-_s9D_ zdU;qBQE|ZyjF|~nX^ihaW3{7hCK#^ic=hn9pNGe$?*7M_{KwC=7&so*Zi`Tvs6^r4 znuzsrO3e~IKeOT6wTO`4CR+X@AzI-hCKb~j^npA58@pDH-1Z1BqU$|q`F18`qkiCh zWSHsgwk(dJmZUVSU3Sx#YvzCgT*~B%V6F@W$hg(mgp8wi{$PCwD0HcH`YJYm;+Pu7 zekU>LwcVo%a3~ykRZWkW)JuKsy8jgx}-@8YCI?km(9Ac;SJI&ryeuJhfq%r7WB{U+`S>yo%Z2`GaPDF81%-b6>>_VK{|G0Lx_~*3%<@{RQtgf@kRt zAY%t@nr{HI+u&Q6{-0}SwfzZvtx9C<<_uuS<@9Cu?QkF_62968 zqDo}j1(0E}WSV##we!CWNyEb8xvn3NyE>nE(^fZhb=~S$yD#-wY+jl3lN3fv!sjN0 z7W{e5NcT`{hLOdd1Od<|$_`SePxLDfiGB;uPQ7N$3cpw}X|wGaea4$6wyOJ2_$?hQ zoarLZ>PI+JBlelPF?G{3_OVVVaR__8=$Q$tv@{nPTI^q$H6L-A?jI1_)q;+thsxeN+Es#KSlh9&C%HP2K=7+EwDLb zo+SX3$}n$A{DVAHE5iRQBKIox zj*H$l zy#Rn>jQR~#o--l~{t|k3;?Ep_GG^#UU@pGBe7uBRh!2kubR@G}ox1ebq6@aLVOcj} zj_{2!>53T9HcZ{MwrqzrQ>nuPeUrurTvz>24##^oC}zWX-^up8U6C=9(h5+N&;GW||Kn!}+v6;jD7pJCeL>ABY~FZ{vDg-8o#6^t&-|IqdaCVpy)rtrOPPMS z$HP#zyb5)thc;7p7Svq2W2{Fv9zW*!wk+#qaiSn=z^iyiD08_tj%LX#TKa8%CbYZ- zSn;;8xfk@ugRwX7e!!Z#DDX+}X=jp-X&g}Hb7$l>m{e}a_hZiLe z&ZXa|HTkLDdnh2r+I_s?D)gxti9JOVZ1MWED=CDzwtVnJwZh<&*C8mXBJ~!{a$MUm zwEIE<{}$xYehLpYDe#+Kvrz%+RBF`IEh=S3=e3FV7PM0Po=U_Hge7*Q{}##CFuAKo z|555{F?yFPTUFg!b>dvvf>Sx1o{IUG<^MRc|M;0<4mqkIBwIiy@lgz1tI^KMZ*IHmYqWLc}094GOsV0(!JuSDtUuXWzR$lQpzSlq>y=1+cQ@xOva9 zs~Y4O=}rL96uI({*_EZn6BqN;w`2<+g4%_$3GbuyU@lJ=d<+lkyRB0`8(Jia3`=eK zl;UB<5~P*Dtk&l+&bOqyu7C;HIBzlh=9hlL@E9)S4qoDXr#N=1Fg@m7gw}UBI!we; zhv{UUfWFe*LzX*rWWuVrh^M1M$auzr#Q;7cqFKfX^hs@>{8ddE4ZB&iWTLqQfF`4_ zdp4% zr(@S+$#BJXrO(ef#$@ts+Pd3}J^J#nFaMuiTuHc<>c(fg+u|y`)Tj5sEU66QKiCa+ zcbvS$tmMq}h0PEWxjb z@XT4iU!f}Z(`I1^eT}zB1VD7s=7V@B=&6pBX356e7x(2XP8Z|TUWciY>jbAKH)w8u zJHgyVG9IMAUWR0{aZ}rWJc0lG`5+ltZ4DsZ0d92tbtCf24OYAvFA-SN-F})V@8P`e z7MMb4$A37}ry5ja!{=Mr8ye^@_51y7+<-h zQb}p=t$eaY6Pd_{*GuYNG>U-ppPqO5*~=&3lMiA&~! zm)4tiI=l+2QLdSug=48Wykna3t0X259h2fvjguAO6SZPzqvV8p7MCTRg+lGe|=qwMKe7d zjrRPE|6N-F^u-tNzC0Z)u5(pi&IiqP0Ovq>f!Zo?*L4WsD{=#OJ0z!Yrj}@(CnjZk zDu_^E|G`g)N&494^`XADGU=1mdA(WI&lIc8HevKF(X?!iAS_4&S+b*#RN0|CCP0GY zRB(#5$8M8i^EF8EnpSlU?H2@Rk*;mCW z;|5MuZZkXG6t)zaOLmDf&AP7IC-hb*y-x6r9i`f|KkZQI&sVdOjW-3`WjCxxtWQMT zkA(|h5_u8p9(-csu`97u79G#BN1<`IrEBr=Tvj`eJ=3n$Fp&>)sV`#zplrv9SU;lj zt)ntJjX}*XVm37bWN6+*Xe9XU47Afq<9f5h7c@1cu0|ajjkv%@1sx!4lH&+*dti{l z&V#Q0rWz219ygyaXgs>y*lbeJ&5u;ePTqILTJ`Q(#19mG;7aK+TrI~W5 z>z**_M3`wTSp%U5x-LZiOIvsGphdgUdA;m`Rj7_eMf{;*%_(VSmdo~+weJo{B;4id zp9mb+9M!4~6*bf*UwIuTxVwKK_2o#^^S^D)TT=~P0o5#bgrs!#47KEIBzO$sJ{xuH zX8)}J&@WV6SEs$R=U1bd=%|iBMMD^m*O^YvaiRKSP}wP1jKGq_6$xq4u`4gTLkoIB zMW3m-T2ov+x3z*zV$sx5m$LqXz`>iUyal zz3BDEt0Og17~0bx-L&~8DT{qiuzG8X;h?aLqbEdo{wa3)w{x#8;}<)_GYfDv%xlz^ z9O=%nSH(E!_K+dS*2?Y#gnJ&U6+-T=HhtEm_?g8B=Cspf4vXP-xaVHX$5O0d&U`E@ zCw#@O1^TMOq`Zp1uPeRo_QJ*#k9wHu#6H9=P|i)^!DC-k8I&ty0mP_*CaJmiB|foW zOL5K0#lyZ@@fsV}?R@-L@hc0L2mNrXFVMb`(Og(4geZ*vLwID##*UTC4m&fAxv;`& zsrtwFDwKtPN!{15=qS283SefUs?jQ7P<8^m!A=WkwFwonrBdMVJ`~Q*xtvnpuu84#XW6|l+6pT%lETm%qXC(7-Y*L|?{x3IE{pe9z-%TN+ zRhHH{&}ZPqH{6YhX{ogKbOZ3~W(qcGQGlZwLGYg92fKK0WX{nENcO{A@?`J#+D*+q zo^rWus(VB7hxyO~AW)yP?PCNqTgcQda-CQ0khRZD-UmpOgU^mU9upnaHq^fBe)>g_ zsNu0udO;56;*2W_Jz)0Ys3sSM?H!p|hNw;p4HGf+*`;sVWQN@B-SfIV1H|CNg zTc7fM9r~EwdADX9$uDBSrN)_}70R9{`J>RDPhzBXOviNu#MwPAgv-99H6$MT1j=#y-{)~jbuaxx@cQT|#Dm+K zhIRGt7`W7oIp6Dj_ZyIS4n~2hq~N~&da9)6TTSS`eSzJF>w`V>Z8RnDH-3GQc`o}R zr6cjo>67B|-hrx9hbt_`nVY1-&dfkViHg`t$G3@KRQSNXj=N5nRXG^mnv0IcplBZs zzXclkQk9h$>pHzP)8<{O^tv=9yR&O=0qPlTZQ@of0$n!j#1zM5$G=z{=rCQXif4M{ zL|8##?3}dOn6rcqQsW3|?08{n!0~#MCyj!g!K8hUDY3-ZxxV{54sZC~Y%pshW$7A4XOW#EfJH3<95GN8xknA5r8+rBco!~DR*D}<6rhQB2nXcrg zaKJwu%mk;KFX-XTo_B+JMLLq7^h=5Ju~S_IRw}pjvoY2iCt{>9iaujk3S9s-H!7lZ z;Y=yDnH1B7R$01pGh(q-v%#iIZ)$36-_w80_WsK!>csUTj}$lWQpl8O6GrOTjl|Ae z0UUJyXl%RABXxd6*4i{rLu%S95hJg9s^E;!q!96NDbemT&h3hWWWcULIoWJE-`@h2yCCrM+oY_*s zD90IcX6T@(3d5!#$e4kPE&@Am$DzTdyT zzdv}`cF*qJ_w~9C&+B@&KJWM*>mT!7}6T^&l zg^%+u7qHn|{VlR{=Z;sOqvZSEG7kp1nfoOyX_}8}+SZa!u5Su;1^^b=;OPOxhWC%B2T~^EN(G0{G{F5qpGCe~l^C5eW_0oP`V2y`20tYk zGOv#0#Pi5)`25&~On^y(l|S*(l_HkzyVHpmB({N}Sc;3BXxa>&$9$w={dd`4fC(!R z0}%Vt(|`=o^2e5&o1P{3@+wK6h*(|LG8{x#fqv_Gb%dxT&(MY*g0{_?kn_fB#FKc? zcTVbJ1#XlslLDU`2*zimY}1#1AOqR`wUbOCJppugOC$WQ$wsydODNK`SU-HhYkDo+ zr#sJPH|^@#9UG#8MxtE-y3^)U%cxr@>@pw$D;}3*l`6`6KgJ_Z@OMlCsku(FIqY~- zh6OABB8Ruk>pkQzVYuu~7YEMc=dt0%Tns#?H3qH)ppkh-k4Uc-(I=`(im@@hn6Kvh z<3oswS^i9G5a17Q?NS{Dr-=ojjOb}zm351eYd7x~d{kOc`kEMmoqr_rznBG{S_C)J zMN~_D?$}?aU-B2i$&#FJ4R&=^{w%~tm884V6?dwpUH+I$4_Rpg-&1F?I_z?V6hCeg zr*=#DPnFU?dCUJyV%e|Jl4024AF!{>Z{ep?;;46AXeP|E#ptF#Ua}qxt$}+ze)=-k4m$CM^;3a@QjRGiKM}lI&u>W7d*ZZs*jp}5{F!Y zt3Y?ea;WAd`m!JMYOP80&}n&poLBw1k_i9;0tk&Vm8gWj*-jZz4i_bDTTZV4rRt2z zqLEe?H;;PiMCp&s`(u6XF~?;UqJU9}<4W-jZf%DVZ)8};r~I`N((cIZk23dS9j6Kw!XdG+1_FFP2oRF;g;{U-d~APX+qVZB^Sf;C|tPr=7XF$ z>H*%D?@9G~h`vP=W>cl-p9?fcz|_{LuEp9QtQr+xiI!Yxwzm+A zY$h!>vWs(2WA1;^UB?s=Oqk5+K?SA^Y=ZRr}Jxk#xB}7dp(6ok0N^n8qSC z8OA6BlPDuLw4Yo&ik6Q}mc%JWT%;@Duo_Mt9&VIjQYCTzD)j549gLgm8&<$h0YDKD;ewG1d8RV&nbqW!xm{mvzWlYI{ zMniY3PtmzP;-s8z0glw^n=waUDHbrIt*`}n8lp~n@Cf1L6*zJVvMJf_D=E?6_=Tg` zcljHlYEKq(BkUVF-u$|-YudW%dc2%SBklLmVj5SI*b4P9tLj?oLI_CAl-#Hpoo1$X zH>BvmY;g`~mFz{And~6xqb6nky^O(+NoFXayHu^z=^Bm z?8LC5ky#vDNL~}UY_W+y4z09mcl`IQIC*><)LKnT;Os+PEV!P&YqGHu2NzF0w>B4M zf7$sE^(^L_`Q_rGJ+y?u|9U6!`@#!p7n23$?wSlYBv{{rc8|(k?8n>%m$m&v@inUI zSQq4Qdqh!K-GVy`vTy3ezJvd^^!wkB@XQxmF7CqI*Hk|ouHnB=)AL57VP`u9{j)~3 zDNJl=ekSTkfalvdw8hT%|Cmt82)FQ3^fQy%pWq<|t{{I14iUCJc<0RRBeq~<)4x}z zS|9r4_52V|Ij$1o7bw@I+!So2xV-wrg)YM>l-%l~lF3si8^z1*1cDY3-L0D+KL5Ka zPufru2@`d@S7%k_24Z~%4X5z{Cge(&+tLs^eWiufip-0010`S=rpwzBf6*b<}yyG|U`pM;o*A3V6crLcl z<(C22f`r{R$=FuaxrR1t3TkdtxLtPN=01?bZG8- z7*J9v$UTojw)pqw3Z<_!vxYae<(IDS1&?xEF`H*1D2tkwGamn*WMglN z9)0oVmYyW%(5NB);Lu)>7;qGo$DQd}0nBekdjV1(TY`hefMOF+sUTyg;BG*rx_M0L z7Jo4SiW=JnM*CrQxf-etx;nN%CSDAh?EBwCaDZ}Dw6OdKG7rNCq&FkQS}^8|QIycJm*@Sn#ob{_+;zuA2qIKC1%zCO(9 z&}igb_5fDsRvu6{Gt+8Y{)cq>dzZ48>=BA!0Ux;oGl?Do1D_=G@s9&-SH?={G_j1c zTiquQ$)Nw!F}=kd1bAh{K;MU;55P0T_b{^ed*B8PFk=)W0THz{z@h-Ylc@MQdG{Nq z{mrcp*t6;_x8wh-e)njh!AHQ%5)vprBbl8Nc7P_;fB*fi_7J3S^@0@uZij*17>0`g zr#8v6z)9YvPYHU5Er5VibBtwQmf2NZ!H><(s{-#W;47hw08{bocwCS2=i|ULwd2+& zYGwA#ccHf-1Cc<%_;{`X;2{xHKRYV#){l=z{zL%+UK^`nc5{bzkM0)%=1VBROT&iV zRW5uoh``nPpSyz#CA(m9@&9W*FB^qzen_U8+NpcH- zLs!t*k8Ls@3NhSL4CBlaMIQ9yU_-TG0g4mNI==myvm0T1#bbGN74$_RiT&v+c9-yN zYyJOvIvz(@kSxQ!HuS}z#Lfc%-+hGaU7aEzJ_`48O%aO$#8Lyg_;>430rAQXi0LQ* z+q_uRaV6gXTL4*88JwkJhKKSv6V;5^Kj8$he0eSv~KYl~icw*RWugW|L z@Hs{TBBG-2*{R4t0NQw+Zek^vrypFBN0EX6gYauEFrX9pR>?0Ap73i?d zC;+hTwkm)9^Xyz}#*#xXBKk{_#XT=gno}bJ#ZaWcx*gR4#=F8B2kOl& zeToFzDD$Bgm)_lQUH)aM^4TFaHx-GXpM#*;V#dIwUanYu4`STmxmtt8j7dp_z=Gnx zKH1n^bR)=03-KufKCd4NCY~hj=9qS;LD-eB>h&tqO}aK)j0MtVi_Iye>DuNHt22v9pC<3(srL-MGDBgfwo8xdLW_7(J4lr9`@x-1I`$#p3jgsQf$J2sz zsP#})~FBG9(96x0?CpW-*0Gvej`&~ z%bhF1;Dw1&u`dn1L3(>3@dWzQYzSLlw|4jXoL(=c?KKcc-h1`^8j6n^9s)BEK&NCE zq)76LYb#2GUn!t`yT+ibm-zwxLO|cb@Bagw{flfj?FtGSgDC<3H&^q&=(iitHQp@a zE)M>G0Hl8j{c(t0PN1U1$p0x8_&@LbU%`d{OT_Dc5g$h&OzfDeHK_id{DuEA;Rq)I z-(SIC1^nN5@PE&p1`GpilU<1a=NRGtp!@STfEeL^uV5t8WJIhwa>f4xu)AX=(As>w zJ6H$|c^`@aTqtv0A28k%e&63FFugmozr0pGSAwc~8FM0~sU=ag2grWTu9BVrsCFhH ziM0wV%QASW*r3SRRWaK|Gj-N=;n#3BEo=CV&`@8k8Ala)b0Z|N35 zl(+@-w&~T&ZwYaH1+7{)d&^G%2V?p9`BnUtqNQ}nGn(6QMho1LmZw=|RR;(H8CDvh zVvNfURK`RFfaP^a6(rv7C-l9tk-g1foXEO~%}>>L5N?XI^Lg*d)AJ!}-?$yytNzrO zRp`!qavaM*@yC)B{t!N4(iIx4%PvgjO+L=)9jXbYOuAmu2vGwEBk%qsmjQYF;Jr#J zfsCZ$sr}_Em*?X9-d0u_cn^fui{<(nVjrLrDr2%{6;3l17Ex@?mnwQM@xw|wdI6R& zaqXq%mDOnIAZcd)q8b?kf=#X5#|piPGpYhhjI>x$>D8@knX5wX z6?SS2g3Dau^6SP3@(d%p4Jyk~7!1vE;R_kUs{sYv`|r%A>bp(vQ{spf=pDu;k{GEm z9ULZ;LJ$6v$ju}?W11|3IdZfma^>pEnYqLjU_C;qdbfnjZR$5~0=zSy30>vSVIXLm zK3P+f30eXimnv0=cbeW@D611NT=&-FO{!!X0)y9Xu9|^THdUmCbfCs$#`AYyt0?F2aGpISc!Zqsv3xR@6 z?#-C5c4>wL1FAX4t9%DuFX(P0SKo`8j?Cq$G!;&`QXTl{kQ_CRb%|YzjMnnL12(3+ zK`SLVql*j^^-tK%7UpVVm@u&y{OctvI|b~BcNkxV?DeEx#;cnPUjjznkqnLQCrje^ zgGfmnls41LfpVOvS34J>OlZq|UcnlwT-It}1lYFi@~(zU&@kK$$wo;uFvBB&Sl3EA zr@l%)gW3rDCCj%o)mS(}2yJTg;kf8OA(AYE0! zh#NKdM!h-g=YTp_3MVyq4=KzF#i`+FfYEWJu&0cYTUVtv)`7MI1n5%NVCgrZ_-^qL z1s#BWc9~k8B0Wz>|7&D`Y0i+$CV-Hsg>EGz#LT?wyM(XaRXZ^F7-DsNpF(pV+bget z3}#aouS1cqfg%03K%PYpH(<-LP7y6&J>9$eE6$8G0(;u^IKFVdD6jd25#hN(rEE$! zLo$5jI1$Vzk%F3;fxbvK61z7=%(l~9OfK-d#NRxG>gxs)lIxh70B=2lt(AN|j9!M%ssJx^4@(B>Bdp;Ub z_ea1RJ%zujIqcha*K#|NY-)s;&#WE=W~AM}0<4KkaDEI(6D}4~9+;Rfq{Y26iAAV0 zYUH2q;ZyGiNM+~XovUJd=Vu^7Aijj#n(#`zZh_EiyB&y$+A5o(@%3MV1ysd>-AvUZ zK1AZT2S>Iu(W|5Jf44X0j3rvUW{^4Kw`Ex_pQ>_BaL9uO@d^7I^9{o!lth%=u3K#d zJlaXI-dRrFzh9q8yn?Htb969K?)t-jjOK*O2N$L8dP1R9d1eFy9Q> zw^bPcVj)oFW7#*d7y=BWHE#l#?2F)|lcsEWDuoN}scv6rM-)8XWqv@LPuGiCelC!YzsO?JkxVe5jsOpS6Es)&Z zNpMD8IuIid1>ClZ`U~Gaxmc4uh-7hGp?GW8Z_S9wE>g>TfNfXFP(mZs86kU{eS8zk zzlx1=eKVlS67zIH?71NrLPSYoK!|$>ukJ0f4$!jR34b|ZzP#Mep1U+PCcwAILk)js zw<6{NBkPSpgBLZ~iMfVISvFacK?m01BNx)ZCD7G!cHQAg7slIlnDj^sa+%fFHH03Jjv|3VGNABaoIwd&-Ts{MUudLo-&{0+Vb$*^P$?4n3f0O9Lu`E#a8 zH@=bk`vw|SZ2{O`+sr+`CYk=L) zN_ay19Q4SXi1nq|gl>A}?AODBaYdh_kru8Dd!>XZ_@VN|$}3shh|lUx+75Wn1nzzz ztU6mmJ^B<>aWTFfA!$ktbNwf6{I*Y#44&-sy0c$00}Joi%x$VBP}B@i&1dNfNU4qK zo#HPeMnoVGWZ%J8{%D}DGB@bwyqL%aZpVJ%pNWK@x7DbW6AW~(+0%$&sLRNZ@+=lM zra1CMS1>Rb9_<%DiE7iMyB?5}93*rGYp&&lY*zNdTwI#=#a})95NFrN(C~o z7ffXLizPjV-ls<1Ugjwmi$asn?D~FL+RPnMWUPy~>&ulEvIWlAnphYM&ZRL&zT=dKc;BIFNY^h-aY*`Zbm*cYGdYo z>#jyox{U1~#mw|dR}G>rD1u>?ey<mD0P4R_NAI(O3UG#~~RGsF~t=Duu9}%uQuYb5pZZ77aF(mwS!Z-|fXI zEn=80di(NM(kdPP;G-@VP;yGa!BnHwT@2-FycnFYm+N>fUgln#n?@ZgnmyFz zgMVph?o)n1X;^9d`d;0ASYf)=5+4eAS;MtLtPd&j`uNK`ua?CPmR5*cM4(h)`HUSF zpSsM4|HAUpnH^>4bkZ%v_%$+;p+nr=dn}!H=(dlzv=kp9YXU6DCEM^>q7=lQYJwdL&_4Hy_2YM6pj%V+iOJ z{JafL9_LPtM+&g@nYDifc-4#ackY1q<6pjDz0V7l3ZSVp1=H@~sY^IvB{%X@F5;amYS&N7RPrR`puDt2|wG`vtvA1)Iy&eVxlqv-y;kR9T~& zd?}_XJy#Ve$Eg<2h0T!;b*I#&>=K-hbDtUU(+G+*Fbc_z0qCHdD{$AJ#YewjDn?++=}UWPHfwZc3$Q^p&_tZ?F1S_EnM`kGw@G{uB!=NiSsoxd18|Ftco;p6b*u zO{w!7a%sft_Qz@a)u=X>LuZ)5w|y4GAl)4O4OM@EG?}wIo%v*+O^kN*hwiYJHVj+D zs28oD+%5zWqBfcZw$}bNjsx@~+u^5p7<&MX7rIR(Msxd{&N(R;#4s zV%mXLkkq5w*;jq<^|u6nY(2oEmD6_P#z?@9+=J~u3X{%^C-e9-cQu>#glsfN;2pd- zIjBtl`hSovzv-LPsjB9`osiwMjNRmHAh(ecL1|7J^vnMij)W0uI2f6qF%GdM;L|{CDGR45B{(cOO_ND?JOPWjt#K(~Lsy~vHCP-BGB|Xbpy%CP8 z=tsv9?pxL9Zy&4e()XU?-)e3G!p-|fWU{yv0vU)d*BwMbe`)YqAJqFeyCAr##{epbdM!@;Hhe zm4_Q_wPim>H}-OrxDcEIO-Bo;7_9TOf!}Q?ErvPc$MQ0hK=LU-O5B~JDfR3e_sqj} zva^F4fFL(a!7%|ppWrJw%K4B(crh6QjyY+w44L#pjoc$B$yPstGEQ0o=^O{aXacmD zN_W}AoyWN|A-`n!Z~n$@T>9_)?O$PDfe`Bc* zok8JlQe)_9NEwbi=ZW18c$C<_hX9>4r5C&+4D*C|={utBVkg=8OHwR?3{XSn_EX)F znF_D&PPJ!C>^{!eymXwQ_5Jn{hO0PE&QtK|kW;f*YPF{gjACxctY}(e@;wH><_Lk6`B`x2)SU$m2CXyBQpd>v@=tWzsFsr6OhZ~SEEtxf}+=NWlqeBpMd0PK-PHO+Ig&NcVF4t zBydlf7f8=zl_CZ&(7dr^~`;aQ%-)s>1E@=9`#$iCQ@^=PHjp|v&C3yp`Q@AqSvx+MY| zgq+?7zE1!qj^N)LHdBL-6zMLWKuwx<7Ywz1td{rjZ5A^v00IzFc3RP)D&-1SmveZ7 zf)tj+L1lSKNHvDmL=;fT({Hbm(X?g8y^!drgr-X@NwGcIi3#7rKR9^;-=Rs3XsdSP64g2$)kN`}~nBVBi7SdGi0 z0WUrKjr+9ERHfD^;V)Ah0j`_02IpNE8^JIm8p(4D z3#Y(Qq#@BSbE}bu_)r{0oLt{HQvGWIR5af>**U=|s&=WSI!ajCrbw1wze?~2lo|1M z|D@~7lmVSdJBA(OL-qD(pOh!HcnSIx*p&oW(?)>W!}zaW<iPcMOQGH%lOU*FLe<+7p`+O@I$wWkxtfWV_06rk~4JCB3&H0c*7vmnwO za159NELs19maj#&FY=+dEiQK}k27A29Rg=ze-gAE7!|Q%$Q)6{=3v_Rn-A#F$SoYO zd(nV9jZlWGlocf(U>u~|vQx(j9DJIB{dV2GB)F^OF$RDIYZ>6pTAFA@>y`>}4of-^%M`lfKdS)lY#-#-U0miEC zktGLmfr|Nbkc`k@1>V=7>}(GVsCr72LzfHd1CQ3MV#$>J^=Bi3whBC>HB%`CQ$M$C zT;&8<`)>j1|}#^)qshdEI*k8tCl(KZq(0$seD<=U zVg332KZ<2!ZhAo$R&bshe41#qW>M~Qs{4*SGI{kNpOlKkjmn=E>thD>jy#?aFd2Cu z<(2Ft76eZKxc}7sN4pz6iMrj5K&w}7zs7g|iEDYzT-SLeSMmMONqYvAA!$Ajb#ME? zaZXxl)}y=JO(TML(Ud1Xzwy*9&CE*Cgzo;mv=zlSDO(Dp)_aPm$s5Bh{qT3*VBz_^ zzG;0vzf-`%)+Fe`81}rN^Ypt%f~PiLqaWtS$RGhJE(pN-fUOu<0-5LHR>bAM3Ahea z^f{K?fdT!+{6WWs@Y1p~o`^Zg{d$^|K}Zo|ZxYo)ZxQ7prXICQ zZ%Vf@$C`-A2-hbDcU>y5Dl7W(=pO)ExXf^_E;yv`O4#|>kuA+liu*OKywroH?Hni3 zj^H=Pb^0&h^K1f7T?>*gfVDxUbNP4pR=SOlckujv&dC;mTBli~5yrg3Ca$uP04ZMb zr<;iO&z1uHn3JuYxb?7hTmwR%Dw)`ht6RC6PI5HtWSzWW{|d5yBD3SSj5O~so~}mb zBz3xc=dP`x(NcU1tb-9$@L!HNMN)iJW1Q6busT!8{`BFN$Jy5E-!hr>4itQ=gOu|; zNeG*8O#gyhPbT_Nw8=V!i0xmzS8Jz_WA3=&_$Tvqy;JQJ4G!;hE$6A&>RP?+{EVh^ zVdo6y@x5at=x|W8VqaD0mjRF z9{tjKcF$@tZqO*J$rAF}^ImGZ-4wFj+3cgBQv$07{92frokRR4fRs7-!1kHT4Xcp! zX-){ALB=yGr*ScV?$3c#r-holewC@ZWbdN|1SG0YK0oV6&WW#5aQS(Il3!03e(6zI zjH&gD16_@!JdT0l5CN^uD7A^$BS?-BND*CfJL%feXuPPpr4ypi=XB{|3+A`&)d76w z&2##W^!KdD*%}{Y^8><6=m)_z99DZ`pPXVw-22cF^=I-Dz&|7^8mNeVibKvUcgAh& zoOYD;6&bpxR}15%396>F`y^~QwY2*PaI{k_Na-x$u>+gqnr`Kva6wSVSZ6;NfGpyV zj4*o3blz=TR6kYlPeQ~j()_eNanY|<7jd_hc`zc`Huk-;6&>R?yZGao$jNOFPzWb2 z978W1!nKKu?7LIP+91395zaW{#tdzXQ^*Y z#_veS>TOAlaJNp<11ZO#M?&&5@A1J43XZX1t!IMRA9xCgQ@`aEeHRpr7k@@n4n_N} z4}Aga9p!cNhx8z4u%KIOn4vLSn^PYMm@ldBhQWnT;@=SOvAT)Bk{(ID!5U;326>oA zAqQcEaJ&=m_QL8?kIJieAmN4J0XVPCw=11Zs4V<~flTnZs3P9c5anAKtU;abP+&`t zu3rQHW1E*LeL_>Opyk@wjBegDCd^oQ5244|4mW@s%eDLL^t1Vv1T-zF;AZQ3dH3^= zb=^tb?FU`^Qp#fHWPwHP=KsmVb}}dw)tc-I_g}qk@YsEmE$Iv}K`+;BhR@Zn%#t0^ z8Btt%oFIt(p#KoBdpXT0GIXsj>g~DONc_sBMiR;2L$>m({4xGOzA2cz6puYG%_Mb` ziC9sQ^!9TZrhh)DoxvZKs5euU4+6}*uN$5M4i}uls4F^jqjV~qdfX6+TzDGsZoAL- zpp0K2M>O{cdi)X|3ds$AqizIt+o&jb_Von(ZbnA9AK^W~8FA&SLrq$?V9HmArQ8!R zCFw5ZFDQ<{=*(2oGxP^%)?{1fj zS}c7X8SV%u?HQk~N&6|Uv&?TdW)&1Ed8KUC$ z%_sWwIc7FpfMoNb6wqu#4X)dBo(jGs!3tdA;u+rPvKEfD=rEOtVK&7k3ARqVc!et! zo%L74=_|{0xjy-MvhsOwzC(Mt+k#%c%Wz@4hx=qE>0!6VNHRT*HhXWN#x%ty9|~?C zC5fp{K55R7G^VkhWU}GsL)c7loukI#?4E-!k2VE#s*d#YgK-0I8_%8A5)%(-cb0Np z1X<~)LrsWTx*0oTrz)7e!G&?>mT!&(VHf0ipAUwL_rrPJ>cBm%KLKTQ@J}V3R_EA} zylf-DXT7Ax(mS%iG}6QMfM*et;Z=j)V7+o4jjS7&-&JDDyOz)U>Wy5-ZT+Ulx%9kb&^^98^F@IO!!C%5>xmkG z2hgxam-EED#uJ?Q>b4GVBr){`9DcUuEOuP;J|0#k(b?q_e5VGr`p;U(uXBGCL_b9# zIgiGSqbE$lHT6>iMDp%yY~lB;+WGW4-fwac({#z|B%j@UaB%c|6Z5&5YLRLBd5tZD&tv zX|QS%lk!Rzw9aSMZI--9zTzu#uvox3$bG>hNPYxHP+`q-XK!ZgAsi|ImFf=!yYNO| zXtD}?&J$Bt8Tu%|@F?$a^wJs@bj0HD^NbwAC!{n=V;DY|PJur_yJk^6g>tN?0mNrU!|8zUUxOvKg>xt$`|t1X&jt|d`8kBdTfP5v*xPde&As?Rx&P3iqf<`W7dv|FKa*{qPZMhFwzcQk z<4sGOlX~@zbu8F56TRRMV(Z3-yhkf!x)xy1_1;i($0goA2{!z#a_wl7 ztE+T~=11n03Q@i$YgV#D}Pxz)i%)`W)%@gIX@8p4lN*s^@O zXHQgyxzEn6uNK(ck8Q!89I?xr?lf!1ZU2QNK0Jizr=j0%x`NCe;hS95cn9 z_ph2Yto1|iuKfmr(MoYDWlTH#NO-45^aS!2U41dX2KnBQd0B}!Eyv?7tej}Jbo1(ul|e7B9n@VY%)YE~WXH)#~HNe4>J#k<}za3*w-~rmgU}(7n%ntWQrVhR69wL>#_M3 z?h!0M8=haNe@3~=UhC>>n?$|o4oZ)It)od|Mxb)^s#CyYNKQ4oHOcmCc7IRh)n0X- z?62U7kYu0@IQ#8N*pGLFc!hA*_S&sm;gybFSIwPeuHEi4S{Zt?3T$vAml*V@D!u*O z_jAr?v;X`YuOAF(jFK9As$)z16kH`$N`A8yRJg^0Wecs0nfeifPApvW_pMiN>L^QY zeO$LA4SqtXIWMQJGq^Q_imVO(2aB6{*YPY?(s)1;NlJb2ghRj7t2WVkC-3@2sNz2d zHNJ$nVs*LGbJ?q&3zHFU@Fpu1hr9tdANNXmbL+r}-cY$-vfw9o+dXyA?3pt62dkry z%XO8VzV7#sS`DM*M{qw<=J)S8qV+UlTgS}>&joA)bA_@qW;V$mU-c3;R8G7R^{E}~80S9{;LjG3(I>TBMyX7}5>-Z9_uKFpR2sl9hFTt?eN0|zJ+W;dA~3o6fv2%SBIjeasl3LTbmwHy5&rl7rMa;V z<_6+yx<``KX>k0l^c;t~$xq{)1e^|sdKX?zeXR5-qlI#gdnosQlp{75u~3?n)R(52 zjWrPe5n2!nJ!q&ME&Mzi`mj<(_Yzvc?g;5*h8aes^pluf&-`-f(S&E0GWlC?B=iVR ziD#ss7TR7%qa0%q!_1>ibJ4IQ?U?|KzoJ3X$zjmrI`afwf@3tK6u8ZjpW?pbYBXl* zmZK(2W+Hy25xI-(mMwD$lO@Vtgh-ugkueU2o9; z{CAzP&=oU}(UOQHM`mbrLyDs$FBhz>soRuX!`Gq(L&hKFL-l;5>V2Bt^fp$=7Qqu~ zh=VTvrg@84oe`TtdGvS?HtTDMp$tgexGvjfXrA_lyMXPDb^fSIJ3He!dOx>`I}CV~ z&un`|3t#qu-#GS<4;?i>OL#MqdUgRK)+4MlpM8VSM%oj zF`g6b$|v6aGOFr=9TENBIFyC5hFObrem$_W)4pA64-(E4J=O%->-6gKwzX@UXFJZP z+xZY8r9FzR8s530lF0quKZYDe{yJCU{!H%3-SGI3jpXYalO+p3@KUQC72C#i*QkS! z;sSPp(hUcg3?3jFXGxwHf}FgEr1NSkaPoYvi(>V@sGiT>G#%{B30H&raiy5^3*&Wt z6vFxPkJJE+a_e`0IrA+qT8dxYCF!BL~is%w@A8!`Zd2ZFJoG45h#)KsCo0`&NT_)VKsbch8?s3tNqS z7hfgS6Q1WnDbPRN3E%tSk^}x~P$5vIr38qeNbB1yAb~HiD>xpPkML-RYEO5LV|t%Z zuA3{bxCj{7d`@^aBxa5X4~^E&C>U51NexBccU#;m{v#wIhtP3}RM!~1mgjIyy-b-d z?OPG>3pRx!F|RMy)A{nT6NVUxt1=e(W2#M;lS>Bu#jO$A(Ob^&Qf|1Y2I7O43k^^c zFGG&ix<>eZR)Gugn)ABBAURn2Gw7EPk*^s4VLVeNve)6yy43gj#&I}a>F#RH32IzT z+`FSn?2YJ}UuS`;86hfu-&=&rqp=N?Gy!>6l6f4Doc;LnLpRWF?*AtdaOzQx3(zyx zvK7%TntziEYva6w_ANcEBw|eZB=}tm9_8LJsQ7%PT;*h`Jtp z&idyKZRf7nZ{J^hu9=a#@Hx8X2(q5W--kP_k7U;MC8P~WDmAfSM`pjut{g42qtx!3 z&tjC#smJ9j6mt7a#MlR(JIP34xNaSPjt1PlvRBu;u%!6o^pVL0N7}0S>653i8!D^7 zP^?_g8IY@IT9PB5R|3M#tl*tTIP$S}+VkYKJq92tpzc0~Y-ic;wO|^0%V+(D&`v*Z zc4AiBeZ~aUF6qg%-!fU8-pr3XUpKiBjaO;}av;)4{(M)q>f93p$GvNv;a^VJA-b-L z*BNJh87z&v=k+^_jhTzB(VniUf|=+TMt7I!s-^*G;e`AS1Xk89zdRb;zP1gs(TwVWg8b>az@ z<|?qRP$Ry&Plk3=*UEwiYK0;c&-L;E>o^#DVKCf<*G>BH$NPP{2i>uD!r6bl=_=gp zGUe7Xm(O=gWeUu{mQXa9K8xrr3v{mDf*TWjZcB=rpQR*p4f}=Tl(*pb-YiIa)7Npl zT=llwHKB)68dydq0j#Y(LPBgLgGaR)uZE~Xom3=nyQRj>x05Fz<9Lg_P=7 z!kz19HML7LPVP;@;j>WJ%JX3TD%aFCx{o%w%Qi-T099qiI+VmoKRR2K<#B*OxLx=0 zem8%BpMLw5N#`J4ldsTugF^-%k$gk}-_1X-e2zC2Iv&8n8)2#w;uHa2fh(Op-X}*QCc|}EpMGth z|L*GSEQSil%QvJm%WtYlexlGy7kf45#2w(d;CJKrCPHa>Fe7eRb zqGRuwUb&O1sXGYb2H*^GgL*sxFZ$@KGnLCWM`-~&Jv}}D_|X;n%N-s0I+d?vMZd38 zLkJZe59t5AeYcj!$;y@4Z`_LDC`MT#kH`u=p*uu5p*Ozgy}^G-QD&=X>|nru-+>6> zN09N@@4ZVzCAYECx0Tm@GL%|xFreQrL9*J(>j_d2@O7d2;oQ2XtcS#@U?944)AYRH zpS5|%Ru3m4q*t8J#)h5012}s7q&Un&=?c9Ss$k5cvRL{vLh{wl;L{=i&NOaPlLBU+ ztA_7ADrU3InW-3T-7W06+~%HNe74LIly}cLLjMtf49Pl z)H&7Hs;O2DD-5fWwvdv_Vvo)#y<8l9F4Pe|rCh?*jXgW_tccW?gXyGC+R@7#ObrAL z#K|_%{sOlb8CQ-v(BItLgnfdGB9HJQ^5T3chU3ho{!Y?~4E)2E+ z$_X)uL->P7WV5w2lNfJ|ZBk2Vx9IEak2%Dfu`J;_dV`I81OL+>l$IrT<(Qi9YH+#s z_?&9ECirL0@-2U?wqn{A>2hV(YVO>jEbYAyHEp*u_6ylA6qp{WYy=!Zs^i-*a6bKf zlCs-0yxhDH18R2!d}sSNeeD#o%$z6ts6MsN|7PPj(#^GdTuO0a(Y*I!{p6>jx6?!r zfj_$F!feXV67sg=wH2j@{*zLJUB$h|hUGkS!8Nw0YM-a;W!%TQD5P=)HQ2;jU zPwG2*(&W3=H&GADzBVkt?`bhKEop0~ch0JxfTve1@t@a1Xo%ZoK(=B&i#`wy$KDK5 zoZB&3_=!R@`)3G3Br=@_D|(TaVVrfASL1G8WXT*HF@fg8201i;zAR#}vN7I->76Ib zJO%(f?uY8)wfThrf5l@ZQRrS6;d&*2GJhp3{ZM(O4N^?DjAcEsN1ahUgs2;%C6{=W z;SOuJv91QAD$!XjIfsm%p6QoL-BO4#HBqAN6CXA?`hYI5@&DTU@~9-Yw(m4gYIRDb zQcq54Nyi)_OB~V426HUuFfC23M-$OfP;ss#ODl68=u}o}X=Ftv3YkWZlx5DMIFKU( z3L*;c&3V7)NuTwt-si9HpYL_uuH{;8Hv7J=-@c~3uj^7C}yT6JP4P0d|@&pPXe| zYijP&T7$9(h%@b9XGfGcl|`pF;AAzD^gDFfzBpVzT>R{Na8J6sJ$e`3`yfLk^i!FfYremQ2KDqIXc?0{X zRLdfiqsA?HuS)Ni)F(H-4boVT9F<9`ftR4^r$jzpElP6*Bt5N+MpgU|FYqS&_7qk8 zr&KdY&O%u6PNcI6s;#SzExjIW=cMpO>k)^pN5z5z+PxgM98SaXi|UotSy({gh=`)i zC8x$Pk)`(xJ&Ty$)S7Da8z|4+#K&+Q!_P#Ye>1vPrvNc43 zBeL2Esc3wy?3aQOq&DKh&b5dVazS4aTOY=ziliY`Zu&Q$r#{V(&WhlC3V8P1(wmyF z2*;Y4>@;y&!rE%DLqi^%rN9>Il?_N2J1bRgdPRQL&blkAr(F%Z|F(4`gV$JND7`4U zTeg2GYozby!%e2wV4`d(9kOUw2FzLV$+h^jMEk_=C(~@+<#rUvy505H$?^5>%uOqy zb3AX!Ohzoqq=0{~Nq{o%nz&xFyB@xNP5p@u^<-`Bh?mM+iuc`9bgTy?L`BkIwTwcH z5ia%kowV!59bW?U(e9q5Nx^#=f@*;CeEYzCswa>SweoGRHrUnMLLPFIf!mFxN|4Lz zXXRB<58f4&__g$A+t?QRdOtB|5=1Fw&KI^O6)~-1dGyZ)P4^43GhAFsb$o@|GuCGn zHiT`-P-kdo?c1&8viQu4;InB9tuYP;j?TC#Tz4G4G+6=k;kp>K9o65gt_~EIp2EoaFq^oK32d+ci?*5k0`Wk zm4hk1zpkj2{4B+@5;I>w6~vLL!iN<4Zf&SpTF%>!>+^9*ox;?Eb-A>^p0^?Qt2r8N zE9}h$E$eLyZv!O}AxG%|ViZ!tPA$g3m_#s`Y(3A`>@BwokBy^kVeb0p#tj45~sT5u4d< z`8Dm>k`Z5Xo8JJVk8-nQb5DJtNZL;AJV3g0Y#(1!e!AnPxf=F;n+GFS4VtY9(kJ7l z8GFbiqldK*r6Tg;9g;qJH(+;CZI?_*kXv!4ImB*vS)BX(0?%0Q54Rouq)pGse|DNA zPJCkPzrH-aGrY0*eT>e%g^dOE-?nI2e7Avk3}YPZ0zw05$!i`by{K)?>3EOFx%51# z{LqU4WQ_))_(Rj=&gw^}wr(+S2)y|zsquPPHp(vekA>=gBo>PiVYN%61_rjZ7VJ-2wl~MZe7(z0 z^s&MXQ3`&LwR|ADXwA)CtHtKDCS86xNokczoH;djH6lmz`upiRLGUdohI zZvL!N<%u6(k1v4xemRKzfv)qVf94k=fAmpD&Fe#at>I<3te9PH4Ld=BLWe0I{Eio^3ob zs?TsUS0FG1x6T2&sPQEKwXa70LeX@Yl46{4&`!l05LTfGN`#$fpQ{BUFVvBd4JmK= zq+x++Tbr`6GUB4ruq+;krOnW_VmS02crZ*Mvh9g%(Z4SF0nBkMD9!`%^$iIVvJn3%o5A(?dL_?}&%|B$)x zBQViz*L`OVKF4&&IBM2(4dnMvxtzp%o@Z*;@|{6O(n6;s;bq?|hf-!d!`}NPJxWQ_ ze_c7<86VX3JKGukEXmf|z9SR!)ImfXsqdh{)qJWv_~E- zYfg9@D&Koeu&^X-M4^%p&HD8lFW()uqd(HbLQzdoMMSTOXs!0tN+4IEqo=oJw7?Xv zlhckbqI{)PAGXpBSflSQKhPh3Rq^omj#qD99JnTH@0<91bGht>^4(#()T96qQ|I@0w;zZaZA z+1NIUAKAys@d`Mr9|x(j3vM+x8kXyJVY95)Yp#K~IJ}8tre9>98EBjPbJQ+zZN{bzzw_ej@`u3Qxg zsCwj6PM6_Dxx=UWj#xWxWKW9R*`nm^hro0a=$-uAonTvC1z5wmmMVKdPyo3wxg6F7 zFSGCxY8%(pJfIRcH#w)+a5dsU=D2UY(6H?j1C=q0y+SYb+5`Sb1mkzt+J|X_^Y-4} zkf8{whJBr0ko|GJxPNCIbpi76xDXUKX|k7}-g)f?$?L!l_ikuLMZGh-z~f=fdG_%F z)mM$hY#h>1tmhqlTVd=RC@hzfqq19=w|28;ED{K0kc=HL?y^(+B~;I-{+@*LW*oVG z&0lU^Jg6^Yx+V*0bO-esJR@ zbHfXHnd+tw!o2J{w2`S$t4c>zIBYFUfGZ4P1t|QPeV=WLr>Dy+zMIxgkg*|3+&SoK zeHpSp`#xmQ!S31S@`gNPXVr%MANK@P;Utya)Los8K+vAZ(8@EC4sq-=>6Cxj5MNeT zf0cV%(GkMR3UAp?o_uoA5pCkI$+u@X)l_zT3n!%q46#^2nuVfBA`*luLERnyl?%2)K; z!CM%WOHmH53_yqMX6(|moUqC!r{eBVh4#W1%8?vMozSsGv`3h>W-R(00FJ7i$WMWX zOo!!=Il?@S?mEB42ovhZSB($NZF@^GnT{ZEET+fZJ0`^fdCYEWy0YIwc~$oluN>m; zPHlCz5$(fBkIZu-gz(nEyMSUydYGPmJ-*h%*Ktz;EBr5&98KKFL8Q{9tJ!7k)C^Ey zTE_MIgTWTHV+NhIk2UlG%ur)NmRKmRHQcv{HL8TEVAOku4?c<+Pv1lKF|CY!AQh1o zzo~rFLA$kgH|?n~4CcV{>znt>ls;~kAG~7xt}sN>^qr~NAFwF<-!?n8yXnb!N@^MD+-r}#%l3FK|Q%POsMX&)?v4#mOZf~_Z zuHt|DaLhf1!e(WetI08W3GdchKCoi@^o$cbVf96C#jc$J`ZEW;nFbgq##F2X|EM=e z5n=+avT11z*QHrok1VTxRim08wR>HW<6)=EQeJBI_ig6Ye;+n#P&E&4=|Os{wF%Ia zT}N{%VUPVrFbDty8q(M!$isa$0OQMy?abSZw*(n(D&%dEz;4Fb)XoKg++%!qZJFA0 z=&6!T>@b!Sc3v0xquS$571exzDY~%?p?$p+F7rtXd)QlD7r)y_dtJjr`{*3hy=sNj zkFWVExHkv9?E*kRh1RVGJwP_T@A+6q7{%=I$RXs91wS^uub$vxw2rRoN5AbzY@^Px zSn|i=Ej|vLZa%$498yV5A8}957)CM9^hK$I0;MmpL)q#TXCez46R^?*F z7~zB1&HelQYHCZuWhay@TzZF*nQH8-^SHF@5?}Tg=7~=)P}nu(N#bMYN#wedEX4=K zoW}YbUMjU~DQ#ZqwPRsQ%ym@9xlclK9Pd#j-uz2k#0@LoJBm>3kyuhrW4a=!F}(2# z_Aow&8bAsw#_XdF^K&o__5D-Fdn4%vFp3iiE~Q||&Wg#AMNk8+E`2U4c97*3VUgZ%wGbptBixCGXe!Dpy(gXkY@d3j);1(i-#%*Z)RpU*I#Gw0oyXR zQXPg=0Kyktd9>kZMiy)rRV8pKs!#i91|mGz(7g@AV>Qa>Ab%izZ{zS8T6R;jCM2RB z{+#6`WN1F-`*0Pu_aauEHIBw_%cl*ot{Sn7(vctkT8`*dk!%~id4vJq_))=;Wti2j z&kp_=N;ejGiW<5%8^G$l=#DpAIvIhg*N5%RKY|??(bHN20399$%<17_@NJ{7{PTvf z1q_cgUC0jDcRwnvO)noZjpsQwN23Mi7dXq z)N-6|g2L`!J!@rM;w|OueSSFznBphX?^((I;!!z%Uveqo!s4M{4FW!|B0ll>P&o;< zy)Sj*7tf%T_(iP0D*kE^@cF@6z*SN&I%DZ6xy$KSkF)}SUX8rkUk(DMxDIxb5YA35 zHvXD^3dXmA7g_sd?&|+E?q64teo4Q3rq@|X0xFSThW z@FG_GF@OC};~W9b4Rz0F{DOWPo(8>Kvqoi)jrBnn@vu-0vFZ3=e8Vq3^Y^&_XK?ho zO~wi5o?v|9`X{{!Ob%uxdCn4KT;gfZIo&?at05AaDCLbF&Fru>sCm`ZY(OF|E;Hju zQA1Z1w{aFOA)zwA|FRoc3=3a6TCS!yzV zjwXEfZ;SNXISW)MJ696nKHmmZr56UyC#f%;o&Vu;VrS! z4jv4!9P%XC9Zpr`_<+0Gjn#sHUa zIpL((>Q29AY0*+TwQYF5h$iF`qPak!Sd^!z|BqSArJ>E)+h2%De1@3+qK)~gd3Hp# z0>fE|*t0@fcfo)+CNK-;Q&vgI!Q(P=Jz51ElAxctEqW|B&l5K@w>lDO6>m zC=)<0o-y351A?;N4tfapWQ;$3{Z1 z3{+;V3FIo?DR^OjJ}@~>lS^A_rA>9`56nHbKo0N%+7leNR%1jH?xfRcxVH$LJijnr zW+{!w6wWZS{J0iFAFE|2of!>0phj?*{9r}(%)5^HP9GATm6xG%?gluV$ZZwZhqSyK zK2W$4HY$1mW{x!zq77EO{O*M3JNEuIOLMgdd*c{Sfh)^wf%voIBbS`-Q)PFN z&9o`XTK5FR;bB)Yh^D*)ma&D{xQ;}rmq7S)@lGwcpZWIIVk{NqZCDFe`nEW*zo}lR?}{#{t%pi2-~s z(B6SE;$bOdr5kW(B1zHm-<*fkC4|v5!2r-I+C~D$gZrla=A7{xao8UvN58}$7)=+h z6sRv)z;;J0{W&4AlF9eTU*t3%Q;S_?x~zFh=ZrJ^!qJMjO8F$e`uWWRUi0M%WG17;h{4#WE5#wE6JBkAnEF~m%(<1g<=~1Fw8*Y(OrTA^ z-8Q*VS(;9hvjkH~>oP}MGN8c{iQ{j|oZ=U9Eui!o+9k)IC2S_f(3ivylDz@T;b8|V%?vFS?3^i&};hA~m*vpg~J zGcN3MYX6u}R z9g3eVJ8cHw=MY@~s{CVDZ%~|QNL@JO>I=oA$}=1ufp>%G{lW7^*QOI@TY@wM{0tv_2;c zyiQo}j^ zt}oThAjTbIrM0p>S#DVQH(I4-lAkkW0s(V1KsVfEg{3L zg8VsTNv}CDCYq)RFX0X1_|46%qu&_)GDeyv2)?4gsAP~((nD=^bL|4X!K8s>dU@`( z?95S?m)l2HKv)7#phf1q(QWn3RbrR^@+$uI;v4KRZBsz5*#F5o8j%_n&UkwhJqE1ARf$E6tvT3dZEh>*}Gxc0|dz5L-WJpmmpd^cGR zPcxkSd@P>2Z@)Zk*+Em}b&8THm3#9A&1~ka-+V4LCV(YQmKk_Aqtj!r^!L@&a+T2e zHDje5EK@E2*{61MZIgGID~y6*7@#-uVpT`cb6!DU7qYKA`qK^9(+|Uu^g_A2KXCjMs@~rsA`^}ntCJDl}+f6=q>u} zurqGt&arJA@4DEV9u@n{0TuyWc=#A@(71}G#g~CvR|aUX(x;iU^wo0ttFIW`iW26{ zEpoNX!jzdwn54P9nj+~v(C(Pq3y0-GRpR$T$A#9s3g&+Bx-=+SK3|q zY~zskDD-_UuUjxvjkp5TA8jb3Yd0CzRgNNZMnj+VhCH8B!sp7grO=(@!KLuFU3AzT z(?p|_(KFdH2wZZ6ukjAdOlMHm>m7BVmT9QK?P>_AJJQ%X1{bKhxi0$Vp!&9Y6m9&( zngIn%ZsxMd=F(A4FVe1|dLlAr`Dg(9!G9)9$flE=qopOA(!pd9Ym-WOixK^XziTzFTh7hPIuv&herKgIGKO zu4*?PV7yJtR5QJk$7OW{7{Kn%E{>Qo6mX-*VztPiA=T>TZUeJ$;ku`a)$)Ukm#~Gr zZ)dfQ_uV1GdjdnUnvp8nGIm?eH*ODxILjjVYPFI}J3A>qf%T$Ftkq_!#_z0z;63sk z1t78HOFtkvnq2?lNDaE2g&Sf*q!v5dl!uB?A*$it2NuN{98Kv!jp@X|OHp;a z?Ap2FVo4!z)&F~A`kHiP)|(+7Xi%0}(hj|oV5UVr7DGMFodMT-jCBtjfl6dA2j1q#?F&k;Kmh%r9#ofxb<7xLj^M>A{kp=SYZ*N1 z>Tw5MQv23f$}TcI>e|o})-lFceu$qWh1xpXVmdEBsK+`SpDu%_d-$Jm^X!>;!sQzb zU!ZE!a?`Ct&s~MJyc%XA<@W0qG)`2fSo>nJGj6%FL!6M*_hNqU*4b)J@i(tQnEX)} z9gMlS-S+d-SgJi-cDAbY?D|=2;Lfq)MoR4p6}0^@;Bb5_xS@7@1x0{Bf`PTmCG*T`f0HnG=C>O<~%z1&s>@5w99T}2A=V}$^iwgGmN7}Gi#coCWxgG zTRBs|BTyesyk0h>npdKN$d;^nP^#zpkAKW&1z|4~9vF1(gljVlar~AE!04Ew_ZRGk zMvhiG3f%hzox@WU2@5m_2{T>DuqFU@SG%Mg0*N&#f!k~e&bP2tA@S_<+?suf^= zNvz{2be2i0q0Zug{%#SDJHc6E2f^Eu=5>{DBIM9J zCKZw+7rL<}T8smxrxfZ?)$p!1_=#(t+xzz!;{m(Gz2fv&80dHH?SS1d#*-hM&M&bd z&3}h0R!_g_bpvvP`@;&-GLOXLGB%+W1PzKlUb$qAMNaJD-%yuV2xjuQIOK4-h$oy_ zX*?--)GV=^ql0S8zQ3`)F@ccWA2)mpI^&8fOLmtie^~%juVq=l5|_fM7KA9E<$=4{ z>Q}5#D6~?;_bKRb#>%ZlIortrs!`sq0-(kivFn)S;uniMUaw7eEN8((x|6k2 zK6kicP5KGK&lMZj02>}R5Ki;)Ua{Lkn`Gr$u%nR7p6_RX%9<2++QLVun^HDhuS`LW-A7e0PQ-1K+CY9j>DTRUZLs;C&GPA96v`myB|#t^ zP)aB$aRG;vwWP~W%8o$ls+VE>k&ILioU9~eJbIcMh_W5Mn6YnDo$XS&vM zv^VPJ`h?a4h7KVEW|ytB>mG682ly<)=nJ0zvibmeqYLAkA!4c z$lIneC3jhen`78-fCCk+sFg*X@4&W7P3QRglvj=A`Cqyc)KKOmwu#=mex|tGg*P>r zPQi{{1~j<#T66VEso!^)`z}C9{8rZ%RxRMz(F|Rguxw0q$us{;Q}9ti%&prYn&en? z#%6xMbu_b;iMI^G_gZoU!PY4F_lvwgkOOzkYST?V>L08;J7M`#)`sec;~$w%YAjc8 z3!#sd8(vk*t!!JM*z8qIK$i;~P+Z=Y`_8hlKp17l^)N}B7i~Ea(2(toQhV<<=SRaFvj}iO3%49h!m> zk)aZv_LX_7N=GB8fs+P(U@1>CozLAHT9C!T4nd&4H9AX55X+AF@;@|YDKCDwt$_6l zzF4~nO(x`5`)qhQrv$Yxh3>zrA@jQ~X&nkom3h7%ShV`mptK?qe$|A9SwHKY>N(uc z-h1<{eZBTwPI3Sg=AZQpUsU}MuF@Tgt(;^wGnQ9f1};MRvXX^WZ33WJVU0^~*;~M9 z-@%R3wlOPg z?LSGjGk#kV6f%3GyUz|V-o!!5)Lbj4Vua*-7GvyXJ*wi$f8wQh$jGHR%Q}o`U!drg zy`*j1k!NKWqa6$?{#(!_ZHB!C+~@0Am_Fb#cbPaxrvY@&d6&bS!+|P{e3ooWeLzwC z%)HW$J|vrar%`gC)^5}JL~@{JA82@*3OPz{{;BNmRPm~=J=R8jU zB|UwB+MOYupyjFV$}&JHM_vIsX6tD#ES0A$aB-MN`z$IN7~w4WcUrfjVQ|=o%Bc)o z1v(A}Lut9XF;fXa1CL;?Q|8u;J9VPsE;FF$wva*!La+KfUh0 zVsAQ0_8ukQHS`3oP$=vVq*km&{P_n|V|wNGb&`CN07OE+hGq%2uU@N?>|5E%PN1D@ z2T=E{78OT}=)F`1N7P)w6NsaF6x9CZ(p56c*hCzDO~a6?{;5O$4&z4LCI1~4|B@d2 zYH?_D+*?!}VCv160hV_N3+N9z?;xBJK3z4F2XKNCTX1L6OF c*b}Y&G;#IZ?!>B$HNcO}5eMt?LuV8J3zY)$7XSbN literal 0 HcmV?d00001 diff --git a/recognition/vision-transformer-4696689/extra/loss.png b/recognition/vision-transformer-4696689/extra/loss.png new file mode 100644 index 0000000000000000000000000000000000000000..f1d8fbdc02980e804f8c21acad3466f20d1f931d GIT binary patch literal 161099 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%0DeOjGj7LJ% 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 literal 0 HcmV?d00001 From 095b0161b5e3287042be93e19e057af804178c00 Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 25 Oct 2023 15:42:01 +1000 Subject: [PATCH 22/24] updated epochs to reflect older train --- recognition/vision-transformer-4696689/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recognition/vision-transformer-4696689/README.md b/recognition/vision-transformer-4696689/README.md index 1eaaed482..712156b13 100644 --- a/recognition/vision-transformer-4696689/README.md +++ b/recognition/vision-transformer-4696689/README.md @@ -41,7 +41,7 @@ for transformer models. ## Training -Training is done for 100 epochs which was found experimentally to be long enough. +Training is done for 175 epochs which was found experimentally to be long enough. AdamW optimiser is used with a learning rate of 3e-4, this was decreased from 1e-3 (which did not train well) but also increased from 1e-4. The data is split into train, validation and test sets. Majority of the data is in train set, and the validation and From 23da5d7d84059d78ab5b424434920aba7fa15750 Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 25 Oct 2023 15:49:22 +1000 Subject: [PATCH 23/24] fixed bug --- recognition/vision-transformer-4696689/train.py | 1 - 1 file changed, 1 deletion(-) diff --git a/recognition/vision-transformer-4696689/train.py b/recognition/vision-transformer-4696689/train.py index f4cd394c0..ee98fdd6c 100644 --- a/recognition/vision-transformer-4696689/train.py +++ b/recognition/vision-transformer-4696689/train.py @@ -63,7 +63,6 @@ def test(model, dataloader): pcls = [] items = 0 for x, y in dataloader: - x = x.to(device) pcls.append(abs(y.cpu()-torch.max(model(x), 1)[1].cpu())) items += 1 From 09d3de0d0b5810b9561dcbbc13085985cdf720b9 Mon Sep 17 00:00:00 2001 From: oliver Date: Sat, 18 Nov 2023 04:31:38 +1000 Subject: [PATCH 24/24] modified README.md --- .../vision-transformer-4696689/README.md | 24 +++++++++++++++--- .../extra/train.png | Bin 0 -> 448066 bytes .../vision-transformer-4696689/predict.py | 17 +++++++++++-- 3 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 recognition/vision-transformer-4696689/extra/train.png diff --git a/recognition/vision-transformer-4696689/README.md b/recognition/vision-transformer-4696689/README.md index 712156b13..e836a8439 100644 --- a/recognition/vision-transformer-4696689/README.md +++ b/recognition/vision-transformer-4696689/README.md @@ -5,7 +5,7 @@ Goal of the project is to classify Alzheimer's disease (normal or AD) of the ADNI brain data using a Vision Transformer. Each sample consists of 20 slices of 240x256 greyscale image corresponding to a patient, which is to be classified as either NC -or AD. In later versions, +or AD. Experiments were also done with data augmentation. ## How to use @@ -39,14 +39,27 @@ for transformer models. ![Basic Transformer Model](extra/ViT.png) +The standard vision transformer works by inputting embeddings of patches of images, along +with a positional encoding, into a transformer model. Only the encoder is used, and +cross entropy loss is used for the classification. Switching the order of normalisation +allows for better propagation of gradient and training stability. If using this patch based +model it is important to use 3D patches for both speed and performance. The later design +used a CNN to instead reduce the image into channels (similar sized to patches) which are +inputted. This further improves speed without impacting performance. + ## Training -Training is done for 175 epochs which was found experimentally to be long enough. +Training is done for 100 epochs which was found experimentally to be long enough. AdamW optimiser is used with a learning rate of 3e-4, this was decreased from 1e-3 (which did not train well) but also increased from 1e-4. The data is split into train, validation and test sets. Majority of the data is in train set, and the validation and test sets are of equal size. +Hyperparameter tuning was done manually. Learning rate schedulers eg. cyclic, warm up +were found to be ineffective. A learning rate of 1e-3 didn't permit training, but 1e-4 +was too slow and didn't perform as good as the final 3e-4. The 20 slices for each image +correspond to the patient-level split. + ## Result Overall, the test accuracy was 68.0% which is ok. The test accuracy was @@ -57,5 +70,10 @@ not generalising. This was the key motivator for data augmentation. However, it also indicate that the learning rate is too small and stuck in a local optima. This is the key motivator for increasing the learnign rate from 1e-4 to 3e-4. +![Trianing accuracy and epoch](extra/train.png) ![Validation accuracy and epoch](extra/acc.png) -![Loss and epoch](extra/loss.png) \ No newline at end of file +![Training Loss and epoch](extra/loss.png) + +## References + +Dosovitskiy, A. (2021) An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale, Papers with code. Available at: https://paperswithcode.com/paper/an-image-is-worth-16x16-words-transformers-1 (Accessed: 18 November 2023). \ No newline at end of file diff --git a/recognition/vision-transformer-4696689/extra/train.png b/recognition/vision-transformer-4696689/extra/train.png new file mode 100644 index 0000000000000000000000000000000000000000..44ae174f488a2b2da548f8e69098bee77efa810b GIT binary patch literal 448066 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 z%0D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