{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import torch\n", "from torch import nn\n", "import torch.nn.functional as F\n", "from datasets import load_dataset\n", "import fastcore.all as fc\n", "import matplotlib.pyplot as plt\n", "import matplotlib as mpl\n", "import torchvision.transforms.functional as TF\n", "from torch.utils.data import default_collate, DataLoader\n", "import torch.optim as optim\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [ "exclude" ] }, "outputs": [], "source": [ "%matplotlib inline\n", "plt.rcParams['figure.figsize'] = [2, 2]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [ "exclude" ] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Found cached dataset mnist (/Users/arun/.cache/huggingface/datasets/mnist/mnist/1.0.0/9d494b7f466d6931c64fb39d58bb1249a4d85c9eb9865d9bc20960b999e2a332)\n", "100%|██████████| 2/2 [00:00<00:00, 112.23it/s]\n" ] } ], "source": [ "dataset_nm = 'mnist'\n", "x,y = 'image', 'label'\n", "ds = load_dataset(dataset_nm)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def transform_ds(b):\n", " b[x] = [TF.to_tensor(ele) for ele in b[x]]\n", " return b" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [ "exclude" ] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "dst = ds.with_transform(transform_ds)\n", "plt.imshow(dst['train'][0]['image'].permute(1,2,0));" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "bs = 1024\n", "class DataLoaders:\n", " def __init__(self, train_ds, valid_ds, bs, collate_fn, **kwargs):\n", " self.train = DataLoader(train_ds, batch_size=bs, shuffle=True, collate_fn=collate_fn, **kwargs)\n", " self.valid = DataLoader(valid_ds, batch_size=bs, shuffle=False, collate_fn=collate_fn, **kwargs)\n", "\n", "def collate_fn(b):\n", " collate = default_collate(b)\n", " return (collate[x], collate[y])" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "tags": [ "exclude" ] }, "outputs": [ { "data": { "text/plain": [ "(torch.Size([1024, 1, 28, 28]), torch.Size([1024]))" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dls = DataLoaders(dst['train'], dst['test'], bs=bs, collate_fn=collate_fn)\n", "xb,yb = next(iter(dls.train))\n", "xb.shape, yb.shape" ] }, { "cell_type": "code", "execution_count": 147, "metadata": {}, "outputs": [], "source": [ "class Reshape(nn.Module):\n", " def __init__(self, dim):\n", " super().__init__()\n", " self.dim = dim\n", " \n", " def forward(self, x):\n", " return x.reshape(self.dim)" ] }, { "cell_type": "code", "execution_count": 148, "metadata": {}, "outputs": [], "source": [ "def conv(ni, nf, ks=3, s=2, act=nn.ReLU, norm=None):\n", " layers = [nn.Conv2d(ni, nf, kernel_size=ks, stride=s, padding=ks//2)]\n", " if norm:\n", " layers.append(norm)\n", " if act:\n", " layers.append(act())\n", " return nn.Sequential(*layers)\n", "\n", "def _conv_block(ni, nf, ks=3, s=2, act=nn.ReLU, norm=None):\n", " return nn.Sequential(\n", " conv(ni, nf, ks=ks, s=1, norm=norm, act=act),\n", " conv(nf, nf, ks=ks, s=s, norm=norm, act=act),\n", " )\n", "\n", "class ResBlock(nn.Module):\n", " def __init__(self, ni, nf, s=2, ks=3, act=nn.ReLU, norm=None):\n", " super().__init__()\n", " self.convs = _conv_block(ni, nf, s=s, ks=ks, act=act, norm=norm)\n", " self.idconv = fc.noop if ni==nf else conv(ni, nf, ks=1, s=1, act=None)\n", " self.pool = fc.noop if s==1 else nn.AvgPool2d(2, ceil_mode=True)\n", " self.act = act()\n", " \n", " def forward(self, x):\n", " return self.act(self.convs(x) + self.idconv(self.pool(x)))" ] }, { "cell_type": "code", "execution_count": 149, "metadata": {}, "outputs": [], "source": [ "# def cnn_classifier():\n", "# return nn.Sequential(\n", "# ResBlock(1, 8, norm=nn.BatchNorm2d(8)),\n", "# ResBlock(8, 16, norm=nn.BatchNorm2d(16)),\n", "# ResBlock(16, 32, norm=nn.BatchNorm2d(32)),\n", "# ResBlock(32, 64, norm=nn.BatchNorm2d(64)),\n", "# ResBlock(64, 64, norm=nn.BatchNorm2d(64)),\n", "# conv(64, 10, act=False),\n", "# nn.Flatten(),\n", "# )\n", "\n", "def cnn_classifier():\n", " return nn.Sequential(\n", " ResBlock(1, 8,),\n", " ResBlock(8, 16, ),\n", " ResBlock(16, 32,),\n", " ResBlock(32, 64, ),\n", " ResBlock(64, 64,),\n", " conv(64, 10, act=False),\n", " nn.Flatten(),\n", " )" ] }, { "cell_type": "code", "execution_count": 150, "metadata": {}, "outputs": [], "source": [ "def kaiming_init(m):\n", " if isinstance(m, (nn.Conv1d, nn.Conv2d, nn.Conv3d)):\n", " nn.init.kaiming_normal_(m.weight) " ] }, { "cell_type": "code", "execution_count": 151, "metadata": { "tags": [ "exclude" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "train, epoch:1, loss: 1.3684, accuracy: 0.5153\n", "eval, epoch:1, loss: 0.4238, accuracy: 0.8648\n", "train, epoch:2, loss: 0.2660, accuracy: 0.9162\n", "eval, epoch:2, loss: 0.1468, accuracy: 0.9552\n", "train, epoch:3, loss: 0.1479, accuracy: 0.9545\n", "eval, epoch:3, loss: 0.1101, accuracy: 0.9647\n", "train, epoch:4, loss: 0.1149, accuracy: 0.9650\n", "eval, epoch:4, loss: 0.0997, accuracy: 0.9705\n", "train, epoch:5, loss: 0.2118, accuracy: 0.9399\n", "eval, epoch:5, loss: 0.1625, accuracy: 0.9478\n" ] } ], "source": [ "model = cnn_classifier()\n", "model.apply(kaiming_init)\n", "lr = 0.1\n", "max_lr = 0.3\n", "epochs = 5\n", "opt = optim.AdamW(model.parameters(), lr=lr)\n", "sched = optim.lr_scheduler.OneCycleLR(opt, max_lr, total_steps=len(dls.train), epochs=epochs)\n", "for epoch in range(epochs):\n", " for train in (True, False):\n", " accuracy = 0\n", " total_loss = 0\n", " dl = dls.train if train else dls.valid\n", " for xb,yb in dl:\n", " preds = model(xb)\n", " loss = F.cross_entropy(preds, yb)\n", " if train:\n", " loss.backward()\n", " opt.step()\n", " opt.zero_grad()\n", " with torch.no_grad():\n", " accuracy += (preds.argmax(1).detach().cpu() == yb).float().mean()\n", " total_loss += loss.item()\n", " if train:\n", " sched.step()\n", " accuracy /= len(dl)\n", " total_loss /= len(dl)\n", " print(f\"{'train' if train else 'eval'}, epoch:{epoch+1}, loss: {total_loss:.4f}, accuracy: {accuracy:.4f}\")" ] }, { "cell_type": "code", "execution_count": 152, "metadata": { "tags": [ "exclude" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "eval, epoch:1, loss: 0.1625, accuracy: 0.9478\n", "eval, epoch:2, loss: 0.1625, accuracy: 0.9478\n", "eval, epoch:3, loss: 0.1625, accuracy: 0.9478\n", "eval, epoch:4, loss: 0.1625, accuracy: 0.9478\n", "eval, epoch:5, loss: 0.1625, accuracy: 0.9478\n" ] } ], "source": [ "for epoch in range(epochs):\n", " train = False\n", " accuracy = 0\n", " total_loss = 0\n", " dl = dls.valid\n", " for xb,yb in dl:\n", " preds = model(xb)\n", " loss = F.cross_entropy(preds, yb)\n", " with torch.no_grad():\n", " accuracy += (preds.argmax(1).detach().cpu() == yb).float().mean()\n", " total_loss += loss.item()\n", " accuracy /= len(dl)\n", " total_loss /= len(dl)\n", " print(f\"{'train' if train else 'eval'}, epoch:{epoch+1}, loss: {total_loss:.4f}, accuracy: {accuracy:.4f}\")" ] }, { "cell_type": "code", "execution_count": 153, "metadata": { "tags": [ "exclude" ] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "xbv,ybv = next(iter(dls.train))\n", "logits = model(xbv)\n", "probs = F.softmax(logits, dim=1)\n", "idx = 5\n", "_,axs = plt.subplots(1, idx, figsize=(10, 10))\n", "for actual, pred, im, ax in zip(ybv[:idx], probs[:idx],xbv.permute(0,2,3,1)[:idx], axs.flat):\n", " ax.imshow(im)\n", " ax.set_axis_off()\n", " ax.set_title(f'pred: {pred.argmax(0).item()}, actual:{actual.item()}')\n", " " ] }, { "cell_type": "code", "execution_count": 158, "metadata": { "tags": [ "exclude" ] }, "outputs": [], "source": [ "torch.save(model.state_dict(), 'classifier.pth')" ] }, { "cell_type": "code", "execution_count": 159, "metadata": {}, "outputs": [], "source": [ "loaded_model = cnn_classifier()\n", "loaded_model.load_state_dict(torch.load('classifier.pth'));\n", "loaded_model.eval();" ] }, { "cell_type": "code", "execution_count": 160, "metadata": { "tags": [ "exclude" ] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj8AAAB+CAYAAADLN3DXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAbn0lEQVR4nO3deZgU1dUG8PfMwLAj+y4gwiDiguICLoALEAEFiUYBURTihgtBjRENCp/RqEFAQZSI+xqIiEgMGo3ivqAIDmSGfd8d9m1m+n5/VFO3TjPdFE1PT0/X+3seHs+dU11VPXe6vF13KTHGgIiIiCgoMkr7BIiIiIiSiY0fIiIiChQ2foiIiChQ2PghIiKiQGHjh4iIiAKFjR8iIiIKlFJv/IjIChG5uLTPI1lE5CERea20z6OksD7TB+syvbA+0wfr8uiVeuPnSIjjMRHZGv73uIhICR9zkIh8UZLHiDheOxGZKyJ7wv9tl6xjJ1v4D7pARHZ5/rUo4WMmuz6NiOz2vL/nk3XsZBKRYSKyTER2iMg6ERkrIuVK+JhJq0sRqSMiX4avO9tE5GsROTcZxy4NAbnWZorIw+G/150i8pOI1EjW8ZOF19niJbTxU9IXOwA3AugD4FQApwDoBeCmEj5m0ohIFoAZAF4DUBPAywBmhH9eGudT0vUJAG8bY6p6/i1LwjGT7VTP+xtSGieQhLqcCeB0Y0x1ACfB+YzeUcLHTKZdAG4AUBfOZ/MxADOT9Bk5BK+1CTEKwDkAOgKoDmAggH3JPgleZxPmiK6zh238hG+v3SciC0UkX0ReFJGK4VwXEVkjIveKyAYAL4pIhoj8SUSWhr8x/ENEann2N1BEVoZz9x/hm7sOwBhjzBpjzFoAYwAM8vNCETleRD4JH3eLiLzubeWLyLEi8o6IbA5vM0FE2gB4FkDHcGtyW3jbT0VkiOe1qpUrIuNFZHX4W/BcETnf5/vrAqAcgHHGmP3GmKcACIALfb7+sFKsPo/mfZSF+ixRqVSXxpilxphtB3cFIASgpc/3kfJ1aYzZZ4zJNcaEwu+vCE4jqFbsV/qXSvWJNL/WikhNAMMA/N4Ys9I4fjHGJKTxk2J1eTTvI+XrMl5+7/wMANAdwPEAsgE84Mk1gHMBaAbn28IdcL4xdAbQCEA+gIkAICInApgEp4XdCEBtAE0O7khEzjv4i4qiLYCfPeWfwz/zQwA8Gj5uGwDHAngofNxMAO8DWAmgOYDGAN4yxiwCcDOAr8OtyRo+j/U9gHZwfi9vAJh68A//kJMSmS8i/cPFtgDmG/3Mkfnw/x79SpX6BIBLReRXEckRkVuO4D2Uhfo8aI6IbAhfJJr7PKZfKVOXItJfRHYA2ALnjsFzPt9DmalLEZkP5+7AewCeN8Zs8nlcv1KlPtP9WnsygEIAV4Q/m3kiMtTnMf1KlboEeJ09lDEm5j8AKwDc7Cn3ALA0HHcBcABARU9+EYCLPOWGAArg3NEYCeeXczBXJfz6iw93HuHtiwCc4Cm3AmAAiJ/XR+yrD4CfwnFHAJsBlCtmu0EAvoj42acAhsTaJmL7fDi35ADnD+e1KNv92fv7Cf/sdQAPHen7KyP1eSKcD1UmnNvP6wH0i/N9pVx9hvOdAGQBqAFgAoBfijuvsl6XEefVCsD/AWiQTnXpeU1FAP0AXJeIekzF+kT6X2v7h9/PFACV4HTtbQbQNQ3rktfZYv757Wtc7YlXhn+RB202+lZhMwDTRSTk+VkRgPrh17n7MsbsFpGtPs8BcPrdq3vK1QHsMuF3H4uI1APwFIDzAVSDc9crP5w+FsBKY0zhEZxLrGPdBWAInPdrwudZx8dLI98fwuWdiTgvj5SoT2PMQk/xKxEZD+AKAG8e7rVlpD5hjJkTDg+IyJ0AdsD5BrUgEeeGFKlLL2PMYhHJAfAMgL6H276s1OVB4d/pmyKySETmGWN+PuyL/EuV+kz3a+3e8H9HG2P2ApgvIm/BaaR8lIhzQ4rUJa+zxfPb7XWsJ24KYJ33uBHbrgZwiTGmhudfReP0G6/37ktEKsO5hedXDpzb6QedGv6ZH4+Gz/UU4wzKvAbOLb2D59xUih94VtyHfTeAyp5yg4NBuJ/yXgC/A1DTOLf8tnuOFUsOgFNE1KyKU+D/PfqVKvUZycDf7wkoG/VZnCN5j36kal2Wg3O734+yWpflASR61kyq1Ge6X2vnxzhmoqRKXUbidRb+Gz9DRaSJOAOwRgB4O8a2zwL4i4g0AwARqSsivcO5aQB6hfsoswCMPoJzAIBXAAwXkcYi0gjAXQBeOpgMD6h6KMprq8H5NrNNRBoDuMeT+w7OH9hfRaSKiFQUO411I4AmomdczQPQV0Qqi0hLAIMjjlOI8O1AERmJQ+/mRPMpnNb+HSJSQURuC//8E5+v9ysl6lNEeotITXGcBaffe4YnX6brU0TairN0QaaIVIUzaHQtnFvciZIqdTkk/C3x4BiF+wB87MmX9brscPB3IyKVROReON/Kv/Xz+iOQEvWJNL/WGmOWAvgcwP3ha20bAFfBGcOSKClRl7zOFs/vL/ANAB8CWBb+93CMbcfDGQz4oYjsBPANgLMBwBiTA2BoeH/r4dw+W+N5E+eLyK4Y+34OzpTaBXD69GZBD6o8FsCXUV47CsDpcFqTswC8czBhjCkCcCmc2Smrwud0VTj9CZxvPBtEZEv4Z2Ph9LluhDMd/XXPcWYD+ABAHpxbnfugb38q4gxAGxA+jwNw+lSvBbANztTaPuGfJ1Kq1OfVAJbA6dZ7BcBjxpiXPfkyXZ9w/uf4NpxbsMvgDArsZYwpiPb6OKRKXZ4LYIGI7Abwr/C/EZ58Wa/LCnAGoG6Fc2HtAaCnMWZdtNfHKVXqM62vtWH94HQ3bQ2f55+NMR8X++L4pEpd8jpb3D4O14UrIivgDFL6T8wNS5mINAEw1RjTsbTPJZWxPtMH6zK9sD7TB+sy9ZXKAl0lwRizBs7oc0oDrM/0wbpML6zP9BHkuixTj7cgIiIiOlqH7fYiIiIiSie880NERESBwsYPERERBYqvAc9dM65k31gp+yg0NSEL47EuS1+i6hJgfaYCfjbTBz+b6SVWffLODxEREQUKGz9EREQUKGz8EBERUaCw8UNERESBwsYPERERBQobP0RERBQobPwQERFRoLDxQ0RERIGSNk91JyIiTdq3dePcoZVUbsaFE9x4+PW3qlzmf38s2RMjKmW880NERESBwsYPERERBQobP0RERBQoHPNDRJSmNrev7sb/6/5URDbTjdZ2rqgyTf9bkmdFJc2c206Vl/e2470WXzNJ5cblN3fjlyf1cOP6z36n91lYmLgTTAG880NERESBwsYPERERBQq7vSjlZVa3t+6LduzQubato76uoFZlN85a86vKFS5fmaCzK5syKtvfTe6jp6jceWctdOPPc7JV7l8X266TnnNuU7nFFz3vxpmiv1cVmZCv83p1ZwM3/sflnfU+cpfZQqjI1/6CrsEs+3c+7vYTVW5YLVvPD/Z7U+VGmX5u3HTUVyV0dlRSMncfUOVhvT524wKjPztDayy18X1Pu/HlV/RS2+U/08yNa8xZrnJF+dvc2Ozfr3JSzjYzMuvUPtypuwo3brIFY3y/zi/e+SEiIqJAYeOHiIiIAoWNHyIiIgqUQI752XJjx4Tvs87krxO+z3STWbeuKq8a3MqNT+iZp3InV1/nxq0rLnDj3H0N1XYP1LFjFUKI3i/cNee3qlyhm48TTmPHf2b7/d9rNDH6hofMea7gRrkX/V1lvKN6Qia+MTkDqq238X/eUrlLBvzejTM/5eMX/Chcaz9Hq/fVirrd5VU3qfKUT/aW2DlRyQvNW6jKsy4/243H3Kcvfp9eON6NG2baKfHTW72vdzo2+vGyZ9/kxpWWZqncvnr2ypB7RYxrTYTe7X7jxkWbN/t+nV+880NERESBwsYPERERBUogu72+edA+zThy2l95yYwrd3qTO9242cjgdoFFTj1ffL+9jfpShxdUrkOF2W4cq8tKqbol4gfi62WNqmxX5a3+jpa21uypUdqncMSueMb+vczsfprKFa5ek+zTSWsZn/9U2qdACVSUu8SN29zfSOXWfW6v0Q0zEZe87s/F90KPnw5ELIdRwstZ8M4PERERBQobP0RERBQobPwQERFRoARizM/K0XpqewbsNFnvOB4nJ3HlcgbbKXwt69+kctk3fX+EZ1y2rLnvHDf+zy2Pq1wdz9TJSLuMXYK95y8DVG7rV/YxB1n6iRZKRoGNay/cp3JFWbZtX+m7pSBr21+buvGqZ/W05qUFNePa581fXOvGlXIrRN1uTwtbaXk9nvW9/8HHrHLjd+t00UmO+TmsDNFjKjL43TcwyrVo7sZN3tqocu2jfFRbT7816v5yL38mrvO4bsXFqvzt93aMaNMP9FPjs7b+ENcx/OJfPxEREQUKGz9EREQUKGWu28vbheV3SnnkdqHBdlp15JT1TqPslPVDZl97ZlWfdaOeCjq+0ZdunNNTr2J5+ug0mwYvenr5eZfb30W9zMoqt9fTtXXGC39QueNfsqv5Vlm2TOWqQJfj4e2Y5DPAtQof2K7Ym667Q+XiXT25FeZGzRVdcLrd/8Wbom4Xy/oi2z2XcUDfImf9Hl7I6O+6IYSibFm6Qp3tMgZLb9DXmnHn2FW/H5g0SOUaPsmnz0ezv5ld3XtC439G3W76brtd67t/VrnQAdtdfenLg+I6j8x1epGRlmu/iWs/icA7P0RERBQobPwQERFRoLDxQ0RERIGSkmN+9l9ypht/OkU/ObrA2HEF5YdkRuRsz3+vxu2j7j9Wrjb8jclZqk8Ld/3QwY3HNNT9mN162Cl7S147XuWK8sreFOxCz/gNAJjQeLIbR44iOHfMcDduNlb3yReCUkG8Y3wyKlZUZdPW/m0vvaq6yj3d1z7a5KJKe+I6Xp95g924bk5uXPug1JBZ244tye+erXIPjn7RjSP/VrzjlLJunaJyY77v78Z8PIe2tF/051a8sqOxG789uLsby76fi9scAGC+XxDXeaTSNZ93foiIiChQ2PghIiKiQEmJbq/8Wa1UeUT2m24cORXdW75z3bkq991zdoqk3+6rRPly8hluXDDyS5XzdoPd+bq+/bj0TJQ5686Pvnrv5O3NVbnRJNulciQTa8sd18yNDzStFWPL6LJW/erGhctXxrUPitDhFDc0j+hpqzNbv1Kihx7ZZpYb3/P4QJVr9Xe7am3R4qNfJiFoFkU+UbuE5Y63n++FFzwdY8vo38+n/6q734Pe1ZVRrZob/+8p3ZU4r+tTnlKWys3e2taN5avoXV3phnd+iIiIKFDY+CEiIqJAYeOHiIiIAiVpY34yW7dU5Y2d67rxd+304yBCnudKeJ+kDgB3r+/kxkvP1E/xTvY4H686k+2xu/TWTyj/ut3bbux9DAYA9EL0afep6rwe0fuFZ244RZXlhGPceNM5NVTu/BvsIxbOq56ncidk2XFSbcqXj3o8799HKOJ5JIsK7HLsr+d3ULnp/7aPSWnxzi6Vi3caZxAsH2bjnNbvJfXYPStvt/GACSo3vY8dF/ZyJ13XhRv0U6zJ4R3nc/cNt6hcJuJb/iAa7yMrAGBihzcSun8C0MxOWc/rNjkimYVolrxmxwfVLcX/hyYb7/wQERFRoLDxQ0RERIGStG6vFq+tVuVpDe1tzxCir9Ts7eYCgBUDGntKqbk6sjG6q87bHRM5db8surpO9CfxTsvWTwzeM9O+35oZekXgWF1WeQW2fMGCK6MeL0PsdjUq7lW5f7a0U6MfrqefOP7wtba865r9Knf32m5uvPb241SOXWJHb+I2uxL0i4s7qtyBH2u68Z1Xz1C5wcesirrPy6vYZQ3uHdlM5dpMrOHGRQFeGTpDQhFlE2XLxBs25U1VzvAsfHHSZ79XuYWd7crN5SXy/w02zkzi+acK76rqi6e0UblvOnm7gvW1NpbCKvY6vHWI/TzWeel7tZ0pTKX1mY8e7/wQERFRoLDxQ0RERIGStG6vCY2/VeUCY29nRs7o8t7qjJzRlapdXXl/t0s15532rMp531/kbdyyaMicQaq8pJt9ymsl0bMKdobsgwkHruiqcgveP8GNm7+qV2AuXLPWjavA34q9+yPK3pl0O6/SM4A2enpbvuj7N5WbfOwcW3h3jsq1eXWoGx93X0T3nwnebfhons7Xq7a/vORsN25yS74bN1i/KOo+Zr6sV/B9aZKttGknvaRy9TMruXFe70kql13+ZhvrHpZACRn9Xbd1eXstevLFZ1Tunub683K0Hv7zIFWuvMnOxGy1ZrvKhT6xXWIFER8p74NN5/2tncpVQ/Tu+HSRUcPOnl3U5fmIrP+uLq+5w4tfYfuiK69QZZlgZ2hXnPldXMdKJbzzQ0RERIHCxg8REREFChs/REREFChJG/MT6+nskeNgsmfa1UazUTb6FvN62HE+ke/V+/687w0oO+/Pq9k03Wae18VOgXxs7SUqt+EJO6250gz9XpvgKzcu6UmU1d7+JqJs48GTBqlcnZc2ufGUpv9VuZyBdjpph2W36ddNTv/VUVs8Yf+2L379lqjbVf1prSo3WGPH9vit68KVenmMY3rYuMsT96jcov56xWevCRe86sa3T7xO5Vrd/oMthMr+MhTx8o7/AYBVD57jxk1HfRW5+RGr/mb08TiLnj3L935+2m+vPVVX7Y2xJR2tj0+apsq7nrGjKvtgmMqVxTFAvPNDREREgcLGDxEREQVK0rq9Yk3xPnfe1aqcfXNq3ELbf8mZqryyr4293VxA7OnsJ0+x3SPZI8t+10iFWXrlz5Hz7S8mtE1PW63a1Jbz3mincsf3n5fwc4tHUe4SVd76uyZu3HXKb1Xuo7Z2BetXRjypcsMn69WK05GZm+PGFedG366kuzFbP6W7xFpXvNWNc/vqadvdKu22uT46d+lw271j9qd3t9en/4x4iPLtX0Tddl/jgqi5RCjodoYbj70o+kNOe/yvjyoXPtHAjbO+/h5BU5S/zY1bT79V5W7o9Jkbz36os+99bm1j/3817nq7bEnnSnvUdlUzKrjx/WNfVLnRQy914+rX6P8HFG3Z6vtckol3foiIiChQ2PghIiKiQGHjh4iIiAIlJaa6Rz4FvTTlz7LL8o/I1k8i7lnZ9mUe0XT2NBjnE0vh6jVRc3uya7jxos56vEWfJpfZfazRU6NLk/f9rM6JWOa/rQ1n7GiXnBOiQ0T+zTWc09iN8/voR+LUzIi+7P/qu+w4mCaPHP2U7lTW7B/rVPmRfu3ceESdeSV67FDn01T5j8/Y5QcuqLQr6uuWLG2gytn/Dt44Hy+z3043b3WbfmTU557HW1SGzsVS2ROP+Yu9wN088Wy13Z8unOnG11fXY+4uOHmqzb13kcrNn2bH1TV8MnU+Y7zzQ0RERIHCxg8REREFSkpMdf/mtLdUueVzN7lxrbmJP8Vfz7QTcQ+dsv6jG4dgInK2e+7u9Z1Uzvv0+bK4anNpWDGwmRs3eTR1ur28pP6+qLkXPrxAlY8PwFOlU1VhJfs9bnOR/k5XM8ZXvClD7BOtH3ykffQN00DhshWqPHWqnQ79wC3zVW55Lzvl+bShekp1vYn+ui4KL7S/z/W37le5i9Q06ugVlH1jsLu54rXuj+eo8jEXbrDxYH1NK1yru0MPajVUd51NP8n+P2/sFbVU7l/XP+7GLzb7WOW2DHvfjbtl/FHlGv2t9LrBeOeHiIiIAoWNHyIiIgoUNn6IiIgoUJI25ueMB/X077Nu/MmNxzf6UuVyek504/K99FihWE+Dj5aLNS39SKas155rc/U+2wRtKehQlafbfuMnR5+gcjm326nvfX7TXeW2P9rUjbM+tOOwEvXkbalgl2ovOrONyi25tryNOz8X+Uo3qrac3x2iKde4kSr/2tnWZ9VVdszB7iZ6Gvru+v5+pztO1I9fmNfTPmqksmT5Ps/2FQ6/Tbo67sUVbjy5f3OVu/EYm5tx7+Mq17XhPW5cdVX0/e/tttONf+qoH4cQ8sTrCvV4oL6P2XEh9ZA6U6PLkr119XjVHz1T0fu9pa+1ee96pqKPif77Dv3yPzdu+ovO9dpv62zebU+rXJ3MSm58at+FKpf/Wn03LtywMeqxSwKv3kRERBQobPwQERFRoIgx5rAbdc248vAbHYXWP5RX5TEN7ZRh7/RyQE8/95uLnLLufYp85OrStXrl+T3tpPooNDUhy2CXdF3GsqevXjH0zXFj3Li+59ZopLvW21WWfz1QReUyxN5ADxn/bflTPSuUDq+5WOUi/1682n1zrRsfe7V+nSk44OvYiapLoHTrM5bV005S5Tln2+7DjZ6p6HUzQ2q7WKsxl4Ts2XZZjewbfohrH+nw2cw8MVuVB7072417V9kS1z4zPN+tQ9D1vKzAdltePf5ulWswtvS6utLls5lZv57+wVt2hMuM7JkqtaVorxt3esN2aTaeU6i2q/KzXY4kcnq8lLddzXlP6tW8c/vqlf29enfr78ZFOblRt4tXrPrknR8iIiIKFDZ+iIiIKFDY+CEiIqJASdpU91iW9G+qyh07nWELkT123l5Uv7mIntfaz6f3U9ZTVeV39HLp/UPD3bjeXctUblyzd93YOwYsUqyxXf7pP6RXdtgnhD/yQR+Vyx4xzx7P5xifIKpTbbcqH+MZy3NMKX7lGrW5nSq3uXelGydmEYWyqWihHuv4Qr9ebvz46dVVbsgf3nPj6z1T4o/ElZPsOJ/GpTjGJ10VbdRLsZS7tokbD3izm8q9ftyHbrxw4ASbGKj32TvvUjdevPr0qMfuesL8qLlUwjs/REREFChs/BAREVGgpES3V1GeXh25dh5XSw6CSu9+58Y739W5G1vae65bOzZw41oLtqvtVvSucdTn0eBbvVpwxc/tKqQtd+suNz1hl8oCb1fXj10bqFzR5s1JPpuywczNcePac3VucrnL3Hj9zXPceESdeVH3d+Lbt6vyCVPtVOnCyI0p4QpXr3HjnZdUU7kzXr3GjUe1tdPge1bW11o1RV6vjODb5O3NVVl27y1+wyTgnR8iIiIKFDZ+iIiIKFDY+CEiIqJASYkxP0SRipYsd+ManjhyzE3TeYk/Nsf1HL2NP+ixNTip+O0S5bGtbd3468v0gITQJvt4htAejvE5WnUn2aVCvplkH010Gc6M+pqW0GPnOM6n9IR27lTlBn0WufH47vbRT6OOz1LbXTzE1vsj9eN7FMy4mb1UucWK0lt2hnd+iIiIKFDY+CEiIqJAYbcXESVc8wd0N8elo88pdru1d7RX5T2No3c6tp6w0Y1Dq/VTpRGyq3ubglV+T5OIPLJm2+6siOfCY77n4ey90B7xaIHUeboC7/wQERFRoLDxQ0RERIHCxg8REREFCsf8EFHiGaOL+/cXu1mjJ/w/0TvIT10nosTinR8iIiIKFDZ+iIiIKFDY+CEiIqJAYeOHiIiIAoWNHyIiIgoUNn6IiIgoUNj4ISIiokBh44eIiIgChY0fIiIiChQxESuxEhEREaUz3vkhIiKiQGHjh4iIiAKFjR8iIiIKFDZ+iIiIKFDY+CEiIqJAYeOHiIiIAuX/AW21zFHP4lndAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "with torch.no_grad():\n", " xbv,ybv = next(iter(dls.train))\n", " logits = loaded_model(xbv)\n", " probs = F.softmax(logits, dim=1)\n", " idx = 5\n", " _,axs = plt.subplots(1, idx, figsize=(10, 10))\n", " for actual, pred, im, ax in zip(ybv[:idx], probs[:idx],xbv.permute(0,2,3,1)[:idx], axs.flat):\n", " ax.imshow(im)\n", " ax.set_axis_off()\n", " ax.set_title(f'pred: {pred.argmax(0).item()}, actual:{actual.item()}')\n", " " ] }, { "cell_type": "code", "execution_count": 161, "metadata": { "tags": [ "exclude" ] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "logits = model(xbv)\n", "probs = F.softmax(logits, dim=1)\n", "idx = 5\n", "_,axs = plt.subplots(1, idx, figsize=(10, 10))\n", "for actual, pred, im, ax in zip(ybv[:idx], probs[:idx],xbv.permute(0,2,3,1)[:idx], axs.flat):\n", " ax.imshow(im)\n", " ax.set_axis_off()\n", " ax.set_title(f'pred: {pred.argmax(0).item()}, actual:{actual.item()}')\n", " " ] }, { "cell_type": "code", "execution_count": 164, "metadata": {}, "outputs": [], "source": [ "def predict(img):\n", " with torch.no_grad():\n", " img = img[None,]\n", " pred = loaded_model(img)[0]\n", " pred_probs = F.softmax(pred, dim=0)\n", " pred = [{\"digit\": i, \"prob\": f'{prob*100:.2f}%', 'logits': pred[i]} for i, prob in enumerate(pred_probs)]\n", " pred = sorted(pred, key=lambda ele: ele['digit'], reverse=False)\n", " return pred" ] }, { "cell_type": "code", "execution_count": 167, "metadata": { "tags": [ "exclude" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor(4)\n" ] }, { "data": { "text/plain": [ "[{'digit': 0, 'prob': '0.12%', 'logits': tensor(-1.1319)},\n", " {'digit': 1, 'prob': '0.00%', 'logits': tensor(-4.7852)},\n", " {'digit': 2, 'prob': '2.15%', 'logits': tensor(1.7912)},\n", " {'digit': 3, 'prob': '0.07%', 'logits': tensor(-1.6584)},\n", " {'digit': 4, 'prob': '97.03%', 'logits': tensor(5.5990)},\n", " {'digit': 5, 'prob': '0.01%', 'logits': tensor(-3.5289)},\n", " {'digit': 6, 'prob': '0.00%', 'logits': tensor(-4.4016)},\n", " {'digit': 7, 'prob': '0.09%', 'logits': tensor(-1.3343)},\n", " {'digit': 8, 'prob': '0.07%', 'logits': tensor(-1.6577)},\n", " {'digit': 9, 'prob': '0.45%', 'logits': tensor(0.2194)}]" ] }, "execution_count": 167, "metadata": {}, "output_type": "execute_result" } ], "source": [ "img = xb[1].reshape(1, 28, 28)\n", "print(yb[1])\n", "predict(img)" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "exclude" ] }, "source": [ "#### commit to .py file for deployment" ] }, { "cell_type": "code", "execution_count": 168, "metadata": { "tags": [ "exclude" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[NbConvertApp] Converting notebook mnist_classifier.ipynb to script\n", "[NbConvertApp] Writing 3187 bytes to mnist_classifier.py\n" ] } ], "source": [ "!jupyter nbconvert --to script --TagRemovePreprocessor.remove_cell_tags=\"exclude\" --TemplateExporter.exclude_input_prompt=True mnist_classifier.ipynb\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "python_main", "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.7" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }