Skip to content

Instantly share code, notes, and snippets.

@myselfHimanshu
Created June 14, 2020 04:31
Show Gist options
  • Save myselfHimanshu/82443162b618885628bff4d8a100ed21 to your computer and use it in GitHub Desktop.
Save myselfHimanshu/82443162b618885628bff4d8a100ed21 to your computer and use it in GitHub Desktop.
26th April 2020
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "Q1TXNOvQ9Kaf",
"colab_type": "text"
},
"source": [
"# MNIST CNN model\n",
"\n",
"**FINAL Targets to keep in mind**:\n",
"\n",
"- 99.4% accuracy on test dataset ( should be consistent in last few epochs)\n",
"- less than equal to 15 epochs\n",
"- less than 10k parameters"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fLnLq_nOUee6",
"colab_type": "text"
},
"source": [
"## Connecting drive"
]
},
{
"cell_type": "code",
"metadata": {
"id": "aAq7Lvqqs4F5",
"colab_type": "code",
"outputId": "b22451b7-d0b6-4b00-9314-0b646cdf9589",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 52
}
},
"source": [
"from google.colab import drive\n",
"drive.mount('/content/drive')\n",
"!ls"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n",
"drive sample_data\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "ZbEOo8icuGUh",
"colab_type": "code",
"colab": {}
},
"source": [
"import os\n",
"os.chdir(\"./drive/My Drive/EVA/Session05\")"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "7OTkpFgt9W06",
"colab_type": "text"
},
"source": [
"## Importing Libraries"
]
},
{
"cell_type": "code",
"metadata": {
"id": "0m2JWFliFfKT",
"colab_type": "code",
"colab": {}
},
"source": [
"from __future__ import print_function\n",
"import torch\n",
"import torch.nn as nn\n",
"import torch.nn.functional as F\n",
"import torch.optim as optim\n",
"from torch.optim.lr_scheduler import StepLR\n",
"\n",
"from torchvision import datasets, transforms\n",
"\n",
"from torchsummary import summary\n",
"from tqdm import tqdm\n",
"from torch.utils.tensorboard import SummaryWriter\n",
"\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"plt.rcParams['figure.figsize'] = (10,5)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "RcV-OkCe9lP4",
"colab_type": "text"
},
"source": [
"## GPU for training"
]
},
{
"cell_type": "code",
"metadata": {
"id": "50sHOdY39nRz",
"colab_type": "code",
"outputId": "d5a32857-5c6f-4906-d6fc-09de171136cc",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"import tensorflow as tf\n",
"\n",
"device_name = tf.test.gpu_device_name()\n",
"\n",
"try:\n",
" print(f\"Found GPU at : {device_name}\")\n",
"except:\n",
" print(\"GPU device not found.\")"
],
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": [
"Found GPU at : /device:GPU:0\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "v9GmRJ0a9osJ",
"colab_type": "code",
"outputId": "27f3df28-4288-4711-a078-803f43e6c093",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 52
}
},
"source": [
"import torch\n",
"\n",
"if torch.cuda.is_available():\n",
" device = torch.device(\"cuda\")\n",
" use_cuda = True\n",
" print(f\"Number of GPU's available : {torch.cuda.device_count()}\")\n",
" print(f\"GPU device name : {torch.cuda.get_device_name(0)}\")\n",
"else:\n",
" print(\"No GPU available, using CPU instead\")\n",
" device = torch.device(\"cpu\")\n",
" use_cuda = False"
],
"execution_count": 5,
"outputs": [
{
"output_type": "stream",
"text": [
"Number of GPU's available : 1\n",
"GPU device name : Tesla T4\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "4qulQMZGNMhW",
"colab_type": "code",
"outputId": "1a1ef149-3478-40ae-c18f-4cfd017ec328",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"SEED = 1\n",
"torch.manual_seed(SEED)"
],
"execution_count": 6,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<torch._C.Generator at 0x7f718346be50>"
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "JpEC4MgiYTl-",
"colab_type": "text"
},
"source": [
"## Data Transformation"
]
},
{
"cell_type": "code",
"metadata": {
"id": "6sSd-XajYS_W",
"colab_type": "code",
"colab": {}
},
"source": [
"#training data transformation\n",
"\n",
"train_transforms = transforms.Compose([\n",
" #transforms.ColorJitter(brightness=0.10, contrast=0.1, saturation=0.10, hue=0.1),\n",
" #transforms.RandomRotation((-6,6), fill=(1,)),\n",
" #transforms.RandomAffine(degrees=0, translate=(0.2,0.2)),\n",
" transforms.ToTensor(),\n",
" transforms.Normalize((0.1307,),(0.3081,))\n",
"])\n",
"\n",
"test_transforms = transforms.Compose([\n",
" transforms.ToTensor(),\n",
" transforms.Normalize((0.1307,),(0.3081,)),\n",
"])\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "MHNNLPIB9wbU",
"colab_type": "text"
},
"source": [
"## Downloading MNIST dataset with applied transformation\n",
"\n",
"Things to keep in mind, \n",
"- the dataset is provided by pytorch community.\n",
"- MNIST dataset contains: \n",
" - 60,000 training images\n",
" - 10,000 test images \n",
" - Each image is of size (28x28x1).\n",
"- The values 0.1307 and 0.3081 used for the Normalize() transformation below are the global mean and standard deviation for MNIST dataset."
]
},
{
"cell_type": "code",
"metadata": {
"id": "Bp5eMbQ4-LUp",
"colab_type": "code",
"colab": {}
},
"source": [
"#define some config parameters\n",
"batch_size = 128\n",
"num_epochs = 15\n",
"kernel_size = 3\n",
"pool_size = 2\n",
"\n",
"lr = 0.001\n",
"momentum = 0.9\n",
"\n",
"kwargs = {'num_workers': 4, 'pin_memory': True} if use_cuda else {}"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "EW3MUGF--hgi",
"colab_type": "code",
"colab": {}
},
"source": [
"mnist_trainset = datasets.MNIST(root=\"./data\", train=True, download=True,\n",
" transform=train_transforms)\n",
"\n",
"mnist_testset = datasets.MNIST(root=\"./data\", train=False, download=True,\n",
" transform=test_transforms)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "yogsTcvQZlL_",
"colab_type": "text"
},
"source": [
"## Train and Test Dataloader "
]
},
{
"cell_type": "code",
"metadata": {
"id": "gkMoKQVc-oKS",
"colab_type": "code",
"colab": {}
},
"source": [
"train_loader = torch.utils.data.DataLoader(mnist_trainset,\n",
" batch_size=batch_size, shuffle=True, **kwargs)\n",
"\n",
"test_loader = torch.utils.data.DataLoader(mnist_testset,\n",
" batch_size=batch_size, shuffle=True, **kwargs)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "IjXRQ52I-17Z",
"colab_type": "text"
},
"source": [
"## Visualization of images"
]
},
{
"cell_type": "code",
"metadata": {
"id": "NB81qRMu-6vr",
"colab_type": "code",
"colab": {}
},
"source": [
"examples = iter(train_loader)\n",
"example_data, example_targets = examples.next()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "8M2XDWfz-76k",
"colab_type": "code",
"outputId": "500b8033-cd15-4633-c88c-f91d9d1b962e",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 303
}
},
"source": [
"fig = plt.figure()\n",
"for i in range(60):\n",
" plt.subplot(10,6,i+1)\n",
" plt.axis('off')\n",
" plt.imshow(example_data[i][0].numpy().squeeze(), cmap='gray_r')"
],
"execution_count": 124,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x360 with 60 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "BT8BOx7ejP3o",
"colab_type": "text"
},
"source": [
"## Defining training and testing functions"
]
},
{
"cell_type": "code",
"metadata": {
"id": "L6_Zia8XjPKb",
"colab_type": "code",
"colab": {}
},
"source": [
"from tqdm import tqdm\n",
"\n",
"train_losses = []\n",
"test_losses = []\n",
"train_acc = []\n",
"test_acc = []\n",
"\n",
"def train(model, device, train_loader, optimizer, epoch):\n",
" running_loss = 0.0\n",
" running_correct = 0\n",
"\n",
" model.train()\n",
" pbar = tqdm(train_loader)\n",
" for batch_idx, (data, target) in enumerate(pbar):\n",
" data, target = data.to(device), target.to(device)\n",
" optimizer.zero_grad()\n",
" output = model(data)\n",
" loss = F.nll_loss(output, target)\n",
" \n",
" _, preds = torch.max(output.data, 1)\n",
" loss.backward()\n",
" optimizer.step()\n",
"\n",
" #calculate training running loss\n",
" running_loss += loss.item()\n",
" running_correct += (preds == target).sum().item()\n",
" pbar.set_description(desc= f'loss={loss.item()} batch_id={batch_idx}')\n",
"\n",
" train_losses.append(running_loss/len(mnist_trainset))\n",
" train_acc.append(100. * running_correct/len(mnist_trainset))\n",
" print(\"\\n\")\n",
" print(f\"EPOCH {epoch} \\n TRAIN avg loss: {running_loss/len(mnist_trainset):.4f} train acc: {100. * running_correct/len(mnist_trainset):.4f}\")\n",
"\n",
"def test(model, device, test_loader):\n",
" model.eval()\n",
" test_loss = 0\n",
" correct = 0\n",
" with torch.no_grad():\n",
" for data, target in test_loader:\n",
" data, target = data.to(device), target.to(device)\n",
" output = model(data)\n",
" test_loss += F.nll_loss(output, target, reduction='sum').item() # sum up batch loss\n",
" pred = output.argmax(dim=1, keepdim=True) # get the index of the max log-probability\n",
" correct += pred.eq(target.view_as(pred)).sum().item()\n",
"\n",
" test_loss /= len(test_loader.dataset)\n",
" test_losses.append(test_loss)\n",
" test_acc.append(100.*correct/len(mnist_testset))\n",
"\n",
" print(\"\\n\")\n",
" print(f\" TEST avg loss: {test_loss:.4f} test acc: {100. * correct/len(mnist_testset):.4f}\\n\")"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "KIsxjleoivtO",
"colab_type": "text"
},
"source": [
"## Building the model"
]
},
{
"cell_type": "code",
"metadata": {
"id": "ToQ0qtQSCzOT",
"colab_type": "code",
"colab": {}
},
"source": [
"class Net(nn.Module):\n",
" def __init__(self):\n",
" super(Net, self).__init__()\n",
"\n",
" self.conv1block = nn.Sequential(\n",
" nn.Conv2d(1, 8, 3), #(-1,28,28,1)>(-1,3,3,1,8)>(-1,26,26,8)>3\n",
" nn.BatchNorm2d(8),\n",
" nn.ReLU(),\n",
" nn.Conv2d(8, 8, 3), #(-1,26,26,8)>(-1,3,3,8,8)>(-1,24,24,8)>5\n",
" nn.BatchNorm2d(8),\n",
" nn.ReLU(),\n",
" nn.Conv2d(8, 10, 3), #(-1,24,24,8)>(-1,3,3,8,10)>(-1,22,22,10)>7\n",
" nn.BatchNorm2d(10),\n",
" nn.ReLU(),\n",
" )\n",
"\n",
" self.pool1block = nn.Sequential(\n",
" nn.MaxPool2d(2,2), #(-1,22,22,10)>(-1,11,11,10)>8\n",
" )\n",
"\n",
" self.conv2block = nn.Sequential(\n",
" nn.Conv2d(10, 16, 3), #(-1,11,11,10)>(-1,3,3,10,16)>(-1,9,9,16)>12\n",
" nn.BatchNorm2d(16),\n",
" nn.ReLU(),\n",
" nn.Dropout(0.01),\n",
" nn.Conv2d(16, 16, 3), #(-1,9,9,16)>(-1,3,3,16,16)>(-1,7,7,16)>16\n",
" nn.BatchNorm2d(16),\n",
" nn.ReLU(),\n",
" nn.Dropout(0.01),\n",
" nn.Conv2d(16, 16, 3), #(-1,7,7,16)>(-1,3,3,16,16)>(-1,5,5,16)>20\n",
" nn.BatchNorm2d(16),\n",
" nn.ReLU(),\n",
" nn.Dropout(0.01),\n",
" )\n",
"\n",
" self.avgpool = nn.AvgPool2d(5) #(-1,5,5,16)>(-1,1,1,16)>28\n",
" self.conv3 = nn.Conv2d(16, 10, 1) #(-1,1,1,16)>(-1,1,1,16,10)>(-1,1,1,10)>28 \n",
"\n",
" \n",
" def forward(self, x):\n",
" x = self.conv1block(x)\n",
" x = self.pool1block(x)\n",
" x = self.conv2block(x)\n",
" x = self.avgpool(x)\n",
" x = self.conv3(x)\n",
" x = x.view(-1, 10)\n",
" return F.log_softmax(x)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "_QVewjwMZsxp",
"colab_type": "code",
"outputId": "43fdad4d-8204-4138-dbfe-69639d4b3188",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 712
}
},
"source": [
"model = Net().to(device)\n",
"summary(model, input_size=(1, 28, 28))"
],
"execution_count": 127,
"outputs": [
{
"output_type": "stream",
"text": [
"----------------------------------------------------------------\n",
" Layer (type) Output Shape Param #\n",
"================================================================\n",
" Conv2d-1 [-1, 8, 26, 26] 80\n",
" BatchNorm2d-2 [-1, 8, 26, 26] 16\n",
" ReLU-3 [-1, 8, 26, 26] 0\n",
" Conv2d-4 [-1, 8, 24, 24] 584\n",
" BatchNorm2d-5 [-1, 8, 24, 24] 16\n",
" ReLU-6 [-1, 8, 24, 24] 0\n",
" Conv2d-7 [-1, 10, 22, 22] 730\n",
" BatchNorm2d-8 [-1, 10, 22, 22] 20\n",
" ReLU-9 [-1, 10, 22, 22] 0\n",
" MaxPool2d-10 [-1, 10, 11, 11] 0\n",
" Conv2d-11 [-1, 16, 9, 9] 1,456\n",
" BatchNorm2d-12 [-1, 16, 9, 9] 32\n",
" ReLU-13 [-1, 16, 9, 9] 0\n",
" Dropout-14 [-1, 16, 9, 9] 0\n",
" Conv2d-15 [-1, 16, 7, 7] 2,320\n",
" BatchNorm2d-16 [-1, 16, 7, 7] 32\n",
" ReLU-17 [-1, 16, 7, 7] 0\n",
" Dropout-18 [-1, 16, 7, 7] 0\n",
" Conv2d-19 [-1, 16, 5, 5] 2,320\n",
" BatchNorm2d-20 [-1, 16, 5, 5] 32\n",
" ReLU-21 [-1, 16, 5, 5] 0\n",
" Dropout-22 [-1, 16, 5, 5] 0\n",
" AvgPool2d-23 [-1, 16, 1, 1] 0\n",
" Conv2d-24 [-1, 10, 1, 1] 170\n",
"================================================================\n",
"Total params: 7,808\n",
"Trainable params: 7,808\n",
"Non-trainable params: 0\n",
"----------------------------------------------------------------\n",
"Input size (MB): 0.00\n",
"Forward/backward pass size (MB): 0.43\n",
"Params size (MB): 0.03\n",
"Estimated Total Size (MB): 0.46\n",
"----------------------------------------------------------------\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:50: UserWarning: Implicit dimension choice for log_softmax has been deprecated. Change the call to include dim=X as an argument.\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "_p2cV0exZtZ1",
"colab_type": "code",
"outputId": "6754d430-b6c3-457f-9237-72c2a0bc00fa",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
}
},
"source": [
"#optimizer = optim.Adam(model.parameters(), lr=0.001)\n",
"optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)\n",
"scheduler = StepLR(optimizer, step_size=6, gamma=0.1)\n",
"\n",
"for epoch in range(1, num_epochs+1):\n",
" train(model, device, train_loader, optimizer, epoch)\n",
" scheduler.step()\n",
" test(model, device, test_loader)"
],
"execution_count": 128,
"outputs": [
{
"output_type": "stream",
"text": [
" 0%| | 0/469 [00:00<?, ?it/s]/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:50: UserWarning: Implicit dimension choice for log_softmax has been deprecated. Change the call to include dim=X as an argument.\n",
"loss=0.09906336665153503 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 38.22it/s]\n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 1 \n",
" TRAIN avg loss: 0.0044 train acc: 86.5333\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\r 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.1266 test acc: 96.5700\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.05169391632080078 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 38.13it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 2 \n",
" TRAIN avg loss: 0.0006 train acc: 98.0367\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n",
" 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0599 test acc: 98.4500\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.013596028089523315 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 37.56it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 3 \n",
" TRAIN avg loss: 0.0004 train acc: 98.5683\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n",
" 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0507 test acc: 98.6300\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.030292540788650513 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 36.63it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 4 \n",
" TRAIN avg loss: 0.0003 train acc: 98.7617\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n",
" 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0343 test acc: 98.9800\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.019224276766180992 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 36.54it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 5 \n",
" TRAIN avg loss: 0.0003 train acc: 98.9350\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n",
" 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0355 test acc: 99.0200\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.025129199028015137 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 36.59it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 6 \n",
" TRAIN avg loss: 0.0003 train acc: 99.0367\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n",
" 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0422 test acc: 98.6700\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.023699045181274414 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 36.69it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 7 \n",
" TRAIN avg loss: 0.0002 train acc: 99.3217\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n",
" 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0224 test acc: 99.3700\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.08733534067869186 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 36.85it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 8 \n",
" TRAIN avg loss: 0.0002 train acc: 99.3733\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n",
" 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0219 test acc: 99.4200\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.008677785284817219 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 36.96it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 9 \n",
" TRAIN avg loss: 0.0002 train acc: 99.3800\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n",
" 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0218 test acc: 99.3800\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.048029590398073196 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 38.13it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 10 \n",
" TRAIN avg loss: 0.0002 train acc: 99.4583\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n",
" 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0216 test acc: 99.4100\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.042189255356788635 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 38.28it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 11 \n",
" TRAIN avg loss: 0.0002 train acc: 99.4100\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n",
" 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0214 test acc: 99.4300\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.028240785002708435 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 38.41it/s]\n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 12 \n",
" TRAIN avg loss: 0.0002 train acc: 99.4550\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\r 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0215 test acc: 99.4000\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.02668963372707367 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 38.65it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 13 \n",
" TRAIN avg loss: 0.0002 train acc: 99.4800\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n",
" 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0212 test acc: 99.4200\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.02413591928780079 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 38.67it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 14 \n",
" TRAIN avg loss: 0.0002 train acc: 99.4783\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n",
" 0%| | 0/469 [00:00<?, ?it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0212 test acc: 99.4200\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"loss=0.010947237722575665 batch_id=468: 100%|██████████| 469/469 [00:12<00:00, 38.60it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
"EPOCH 15 \n",
" TRAIN avg loss: 0.0002 train acc: 99.4750\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"\n",
"\n",
" TEST avg loss: 0.0218 test acc: 99.3800\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "1OkVuWWYyBgd",
"colab_type": "code",
"colab": {}
},
"source": [
"epoch_count = range(1, len(train_losses) + 1)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "0mBzSj7mcMnq",
"colab_type": "code",
"outputId": "40e6d00d-05cd-4b3e-f85e-5640b7fed8a1",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 334
}
},
"source": [
"plt.plot(epoch_count, train_losses, 'r--')\n",
"plt.plot(epoch_count, test_losses, 'b-')\n",
"plt.legend(['Train Loss', 'Test Loss'])\n",
"plt.xlabel('Epoch')\n",
"plt.ylabel('Loss')\n",
"plt.show();"
],
"execution_count": 130,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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HQUzCOFs7ty51VBp+sT6ggAzawM8Apzt7sVl2939PnfPdffcklRdXQYNgsxMHdoUERFJtwULFnDUUUdx2GGHkUgkWLFiBQB33nknXbt2pXv37owaNYqPP/6Ye++9l9tuu42ePXsye/bsSr3/rbfeSrdu3ejWrRu33347AP/973859thj6dGjB926dePxxx8HYPz48d9/5pVXXpmW75vOw5qfAe1TnrdLLqsUM2sGPA9c5+6vVnFtu615c+jbN4Sz3/0u6mpERERqJ3fn0ksv5dlnnyUnJ4fHH3+c6667jgceeICbb76Zjz76iOzsbNauXUuLFi244IILaNKkSaWD04IFC3jwwQf5z3/+g7vTp08fjjrqKD788EP22Wcfnn/+eSDcz3PNmjU8/fTTvPvuu5gZa9em52yrdIaz+UAXM+tICGWjgNMq80Izqw88DfzV3Z9IX4m7Jy8Prr8eVq2CvfaKuhoREZGq9fOfw6JFVfuePXuG2yBW1nfffcfbb7/NkCFDANiyZQtt2rQBwj0xTz/9dEaMGMGIESN2qZ5XXnmFE088kcaNGwNw0kknMXv2bPLy8vjFL37B1VdfzXHHHceAAQMoKiqiQYMGnHvuuRx33HEcd9xxu/SZO5K2w5ruXgRcAkwDlgCT3X2xmU0wsxMAzOyHZlYAnAL82cwWJ1/+Y+BIYIyZLUpOPdNV664qGVJjxoxo6xAREamt3J2DDz74+/PO3nrrLaZPnw7A888/z8UXX8zChQv54Q9/WCU3QS9xwAEHsHDhQg455BCuv/56JkyYQFZWFq+99hojR47kueeeIy8vr8o+L1U6e85w96nA1DLLbkiZn0843Fn2dY8Cj6aztqpw6KHQqlU4tHn66VFXIyIiUrV2pocrXbKzs1m9ejXz5s2jb9++bN68mffff5+DDjqI5cuXM3DgQI444ggmTZrExo0badq0KevXr6/0+w8YMIAxY8Ywfvx43J2nn36aRx55hM8//5w999yTM844gxYtWvCXv/yFjRs38s033zBs2DD69+9Pp06d0vKd0xrOaruMDBgyBKZPh+Li8FxERESqTkZGBk888QRjx45l3bp1FBUV8fOf/5wDDjiAM844g3Xr1uHujB07lhYtWnD88cczcuRInn32We666y4GDBiw1fs99NBDPPPMM98/f/XVVxkzZgy9e/cG4Kc//Sm9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vw+vvFK+fcQI2GMPeOcdeO218u0nnwxNmsCbb8KiRZRz6qlhH3r99fCzL+u008L+Pn9+qCFVRgb85Cdhfu7csG+kys6GkSPD/L//DQUFW7c3bgzDh4f5l16ClSu3bt9jj9J/r9Onw5o1W7fn5JSe/zp1Kqxfv3V7mzZw1FFh/h//gG++2bq9fXvo1y/MP/102IdSdewY/jiE0j8qU3XuHP6I3LIFnnqKcg46KJy28d134XdIWYccAj/4Qdg3X3ihfHuvXuEz1q6FGTPKt//wh9ChA3z5JcyaVb69X7+wb33xBcyeXb79yCPDucLLl8Orr5ZvHzQIWrYMP9cFC8q3DxkSfr988EHpaSuphg0LF4UtWRL2z7KOPx7q1w/nLJfdtwBOPDHsY4sWhX8fqTIywr4P4ff+8uVbt9evD8ceG+ZffTWcbpOqcePwewFgzpzyY3o2axa+P4R99+uvt27fc08YMCDMz5wJGzZs3b7XXtC3b5ifMaP091qJNm1K960XXii/77VvH37+EPadsvtep05h/9myJfyfUNYBB4T977vvwpilZR10UFgnau6elgkYCfwl5fmZwN1l1nkbaJfyfBnQCrgbOCNl+f3AyO193mGHHeZ1yubN7m++6f7pp+H52rXuzzzj/uST7pMnu//f/7k/9pj7smWhfcUK9/vuc7/nHve773a/4w73W291f//90P7BB+6//rX7TTe533CD+3XXuY8fH5a7uy9c6H7ppe4XXeT+s5+5n3ee+znnlL7/zJnuP/6x+8iR7ief7H7SSe4nnlha35Qp7scf737cce7HHus+bJj7Mce4r1oV2h991P1HP3IfPNh90CD3gQPdjz7aff360H7PPe5HHOHev797v37uffu6H3542A7u7jff7H7YYe6HHureq5d7z57uvXuXbq9rrnE/+OAwde3qftBB4X1KXHSRe5cuYerc2X3//cPnlzj9dPcOHdz32899333d27d3Hzq0tP3YY9332ce9TRv31q3d9947fNcS/fu7t2rl3rJlmPbc0/2UU0rbu3Vzb9HCvXnz0umss0rb27d3b9rUvUmT0umCC0rbmzZ1b9gwTA0ahOmKK0LbN9+4168fpnr1Sqdf/jK0r1zpnpHhbuYeftWF6eabQ/vSpVsvL5kmTgztixZV3P7ww6F99uyK2596KrRPnVpx+4wZoX3y5IrbX301tN9/f8Xtb78d2m+/veL2Tz4J7b/+dcXtX30V2q++uuL2kn3voovKt2Vnl/5szjyzfHurVqXtI0aUb+/YsbR98ODy7d27l7b37l2+vX//0vauXcu35+VtvW+VbR85srS9RYvy7WefXdqemVm+fezY0PbttxVvu+uuC+2rVlXc/vvfh/Zlyypuv/vuqtn3Xnhh1/a9efOqZ98bN27n970GDbTvVcW+Vw2AfPeKM03aLggws5FAnrv/NPn8TKCPu1+Sss7byXUKks+XAX0IvWmvuvujyeX3Ay+4+xNlPuN84HyAfffd97BPPvkkLd9FpE5yD71M7uGv0JJfXyVtmZmh17K4uPSv39Rfcw0ahL/Si4pCz03qa93DX+DZ2eEv2K++2roNQs9EgwahVye1vcRee4XXb9xYcXubNuHz16+vuL19+1D/11+X/+sfwiDTmZmh96WkVzPV/vuH7bNqVbh7SKqSnlMIvTNlew8yMsLrIfQsbty4dXu9eqF3CkKvWmrPlnv43h06hOeffAKbNm39+gYNQv0QelYKC7dub9w4fH8IvTtFRVu3N20K7dqF+XffLR3LsUTz5qHnCSruVdxzz7D9i4tD71BZrVqFnqmiInjvvfLte+0Vev8KC0N9ZbVpEz5j0yZYtqx8e9u24ZSR//4XPv64fHv79mH/27Ah9NyWtd9+oVd13bryvZoQfjaNGoX95rPPyrd37hx+Bl9+GX7+ZR1wQNg3V60q3ysKocc5MzP0an35Zfn2bt3CPvbZZ+V7Tc1CzxGE71Z2387MDK+H0PNXtle1Xr3w+QBLl5bfNxs0CL2aEH52ZXtdGzcu7XlasqT8vtm0aem/jbfeKt8z1qJF6P2C0OtY9jzrli1L9+3XX6ecnJyw7xYXV9xruffe4VSgzZvDwPJl7bNP6QgLaba9CwLSGc76Aje5eyL5/BoAd/99yjrTkuvMM7Ms4AsgBxifum7qetv6vBpxtaaIiIgI0V2tOR/oYmYdzaw+4QT/sicXTAFGJ+dHAjOTXX1TgFHJqzk7Al2A1xARERGp5dJ2QYC7F5nZJcA0IBN4wN0Xm9kEwnHWKYRzyR5JnvD/FSHAkVxvMuHigSLgYq9tV2qKiIiIVECD0IqIiIhUs8gGoRURERGRnaNwJiIiIhIjCmciIiIiMaJwJiIiIhIjCmciIiIiMaJwJiIiIhIjCmciIiIiMVJrxjkzs9VAXby5ZiuggpuvSQpto+3T9tk+bZ8d0zbaPm2fHauL22g/d8+pqKHWhLO6yszytzWInQTaRtun7bN92j47pm20fdo+O6ZttDUd1hQRERGJEYUzERERkRhROKv57ou6gBpA22j7tH22T9tnx7SNtk/bZ8e0jVLonDMRERGRGFHPmYiIiEiMKJzVUGbW3sxmmdk7ZrbYzC6LuqY4MrNMM3vdzJ6LupY4MrMWZvaEmb1rZkvMrG/UNcWJmV2e/Pf1tpn9n5k1iLqmqJnZA2a2yszeTlm2p5nNMLMPko97RFljlLaxff6Y/Df2ppk9bWYtoqwxahVto5S2X5iZm1mrKGqLC4WzmqsI+IW7dwUOBy42s64R1xRHlwFLoi4ixu4AXnT3HwA90Lb6npm1BcYCue7eDcgERkVbVSw8BOSVWTYeeMnduwAvJZ/XVQ9RfvvMALq5e3fgfeCa6i4qZh6i/DbCzNoDQ4FPq7uguFE4q6HcfYW7L0zObyD8p9o22qrixczaAccCf4m6ljgys+bAkcD9AO5e6O5ro60qdrKAhmaWBTQCPo+4nsi5+7+Br8osHg48nJx/GBhRrUXFSEXbx92nu3tR8umrQLtqLyxGtrEPAdwGjAPq/MnwCme1gJl1AHoB/4m2kti5nfAPvTjqQmKqI7AaeDB56PcvZtY46qLiwt0/A/5E+Ct+BbDO3adHW1Vs7e3uK5LzXwB7R1lMzJ0DvBB1EXFjZsOBz9z9jahriQOFsxrOzJoATwI/d/f1UdcTF2Z2HLDK3RdEXUuMZQGHAve4ey/gv9Ttw1FbSZ43NZwQYvcBGpvZGdFWFX8ehgCo8z0fFTGz6winpDwWdS1xYmaNgGuBG6KuJS4UzmowM6tHCGaPuftTUdcTM/2BE8zsY2ASMMjMHo22pNgpAArcvaTH9QlCWJPgR8BH7r7a3TcDTwH9Iq4prlaaWRuA5OOqiOuJHTMbAxwHnO4aw6qs/Ql/BL2R/J3dDlhoZq0jrSpCCmc1lJkZ4VyhJe5+a9T1xI27X+Pu7dy9A+Ek7pnurl6PFO7+BbDczA5MLhoMvBNhSXHzKXC4mTVK/nsbjC6Y2JYpwOjk/Gjg2QhriR0zyyOcYnGCu38TdT1x4+5vufte7t4h+Tu7ADg0+TuqTlI4q7n6A2cSeoQWJadhURclNc6lwGNm9ibQE/hdxPXERrJH8QlgIfAW4fdlnR/F3Mz+D5gHHGhmBWZ2LnAzMMTMPiD0ON4cZY1R2sb2uRtoCsxI/q6+N9IiI7aNbSQpdIcAERERkRhRz5mIiIhIjCiciYiIiMSIwpmIiIhIjCiciYiIiMSIwpmIiIhIjCiciUidYGZbUoadWWRmVXY3BDPrYGZvV9X7iUjdlhV1ASIi1eRbd+8ZdREiIjuinjMRqdPM7GMz+4OZvWVmr5lZ5+TyDmY208zeNLOXzGzf5PK9zexpM3sjOZXc0inTzP7XzBab2XQzaxjZlxKRGk3hTETqioZlDmuemtK2zt0PIYzkfnty2V3Aw+7enXCj6juTy+8E/uXuPQj3Il2cXN4FmOjuBwNrgZPT/H1EpJbSHQJEpE4ws43u3qSC5R8Dg9z9QzOrB3zh7i3N7EugjbtvTi5f4e6tzGw10M7dv0t5jw7ADHfvknx+NVDP3X+T/m8mIrWNes5ERMC3Mb8zvkuZ34LO6RWRXaRwJiICp6Y8zkvOzwVGJedPB2Yn518CLgQws0wza15dRYpI3aC/7ESkrmhoZotSnr/o7iXDaexhZm8Ser9+klx2KfCgmV0FrAbOTi6/DLjPzM4l9JBdCKxIe/UiUmfonDMRqdOS55zluvuXUdciIgI6rCkiIiISK+o5ExEREYkR9ZyJiIiIxIjCmYiIiEiMKJyJiIiIxIjCmYiIiEiMKJyJiIiIxIjCmYiIiEiM/H/2WKJ4aOXRIAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 720x360 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "y5jHvR9V2SXH",
"colab_type": "text"
},
"source": [
"- smoothest"
]
},
{
"cell_type": "code",
"metadata": {
"id": "mFTiHHm5v4nX",
"colab_type": "code",
"outputId": "809b8efd-bbcd-4aa3-b8dd-8df06c1379cf",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 334
}
},
"source": [
"plt.plot(epoch_count[2:], train_acc[2:], 'r--')\n",
"plt.plot(epoch_count[2:], test_acc[2:], 'b-')\n",
"plt.legend(['Train Acc', 'Test Acc'])\n",
"plt.xlabel('Epoch')\n",
"plt.ylabel('Accuracy')\n",
"plt.show();"
],
"execution_count": 131,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAmcAAAE9CAYAAABOT8UdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdd3hUVf7H8fdJ6F2QXgRRAQtFIkoVsKxgo+haULGsBRUp67roLv5cK66Kvdd1VVCKiAUrRV1GlKZUQQElgoAonUDK+f3xzZAEAqTMzJ1JPq/nyZPk3pl7TyaQfHLK9zjvPSIiIiISH5KCboCIiIiI5FA4ExEREYkjCmciIiIicUThTERERCSOKJyJiIiIxBGFMxEREZE4UiboBkTSoYce6ps2bRp0M0REREQOas6cOb9572vvfbxEhbOmTZsye/bsoJshIiIiclDOuZ/yO65hTREREZE4onAmIiIiEkcUzkRERETiSImac5af9PR0UlNTSUtLC7opCadChQo0atSIsmXLBt0UERGRUqPEh7PU1FSqVq1K06ZNcc4F3ZyE4b1n48aNpKam0qxZs6CbIyIiUmqU+GHNtLQ0atWqpWBWSM45atWqpR5HERGRGCvx4QxQMCsivW4iIiKxVyrCWVA2btxI27Ztadu2LfXq1aNhw4Z7Pt+9e/cBnzt79mxuuummQt9z/vz5OOf48MMPi9psERERCVCJn3MWpFq1ajF//nwA7rjjDqpUqcLNN9+853xGRgZlyuT/LUhJSSElJaXQ9xwzZgxdunRhzJgxnHHGGUVruIiIiARG4SzGLr/8cipUqMC8efPo3LkzF154IUOGDCEtLY2KFSvy8ssv06JFC6ZPn86DDz7Ie++9xx133MHPP//MihUr+Pnnnxk6dGi+vWree8aNG8cnn3xC165dSUtLo0KFCgDcf//9vPbaayQlJdGrVy9GjRrFDz/8wHXXXceGDRtITk5m3LhxNG/ePNYviYiIFIX38NVXsHw57N4Nycn2duSR0LGjPWbiRHAu51xSEjRrBi1bQlYW/O9/diz3+QYNoH59yMiAH3/Mez45GapXh6pVITMTNm/Oey4pCcqWtfdSZApnAUhNTWXmzJkkJyezZcsWvvjiC8qUKcOnn37KbbfdxoQJE/Z5ztKlS5k2bRpbt26lRYsWDBo0aJ8SFzNnzqRZs2Y0b96c7t278/7779O/f3+mTJnCO++8w6xZs6hUqRK///47AAMGDGDEiBH07duXtLQ0srKyYvL1i4hIAXkPa9fCkiU5b40bw4gRdr5XLwtIuV15ZU44O/98C2G5DRkCjzwCaWnQrdu+9/znP+Guu2DjRgtxe7v/frjlFli1Co44Yt/zTz4J118P334L7dvnhLbkZChTBp59Fi64AGbPhosvhnLl7K1sWXt/773QtSvMnQt33533XNmyMHSotWvBAhg3bt/z558PdetasJwzJ++5cuXghBOgcmX47TdYt27f+9esGXi4LH3hrHv3fY/9+c/2D2nHDujde9/zl19ub7/9Buedl/fc9OmFbsL5559PcnIyAJs3b2bgwIEsX74c5xzp6en5PufMM8+kfPnylC9fnjp16rBu3ToaNWqU5zFjxozhwgsvBODCCy/k1VdfpX///nz66adcccUVVKpUCYCaNWuydetWfvnlF/r27Quwp4dNREQCkJkJK1da+Nq2DS66yI536mS9Y2HVqkG/fvaxc/DuuxZEKla0a2RmQpUqOY+fPz/neFaWva9b186VLw+ffrrv+SOPzLnXG2/knA8/5oQT7HytWhby9n7+iSfa+dq14e9/zzmemWm9cYcfbucrV7bwtns3pKfnvA8Ho61bc3oF09NzHnPJJXZ+0SILkXs76ST7Gj/7DK69dt/zS5dCixbw6qvw17/uez41FRo2PPD3K8pKXziLA5UrV97z8ciRI+nRowdvv/02q1atont+4REoX778no+Tk5PJyMjIcz4zM5MJEybwzjvvcM899+ypU7Z169aofA0iIlIEu3ZZj1OLFvb5qFEWgJYts3NgwSIczq66CgYMgFat7K1+fQtlYV27Hvh+xx23/3PJyXDKKfs/X7FiTjvyU6OG9cLtT4MGcM89+z/fqhWMGbP/8yefbL1j+3PhhdYDl5mZN+DVqGHn//xn6Nw5b/BLT7eeR4CzzoJGjfYNh+HnB6j0hbMD9XRVqnTg84ceWqSesgPZvHkzDbMT+iuvvFLk63z22We0bt2ajz76aM+xgQMH8vbbb3Paaadx5513MmDAgD3DmjVr1qRRo0ZMmjSJPn36sGvXLjIzM/f0romISAT8738weXLOkOSKFXZ8xw7ruQJo0gT+9CcLKy1b2vuwv/wl9m1OJM7ZUGl+i+tq1Dhw0DrqKHuLQ6UvnMWZW265hYEDB3L33Xdz5plnFvk6Y8aM2TNEGda/f3+efvpppkyZwvz580lJSaFcuXL07t2be++9l//+979ce+213H777ZQtW5Zx48ZxeLi7WUREDm7zZpg3L++csMWLLZQ1bWpDkg8/bCGgbVvriWrVyuaSQc7cMZFcnA//AykBUlJS/OzZs/McW7JkCa1y/xUihaLXTyQB7NwJq1fHbS9AwsvKgp9+yhvAbroJWreGN9+04TWwuV7h4cf/+z+bW7Vzp00030/ZJCndnHNzvPf71M3SvxYRkUS1c6etfLv/fpuc/d13NsxzySU2Kfvcc+Gww4JuZeJJTbX5WPXrW69Y5872WofVqWOvbevW0KMHfPyxBbKGDfPOBwObtyVSSCpEIiKSaHbuhEcftZ6ZYcPg6KPhqadsldtvv9kKvSFDbFitXTu44w4rKyD5S0+Hzz+3IcY2bWzC+BNP2LmmTWHQIHj+efjySysvsW4dnH22na9TB047zSaWa8s7iRD1nImIJJrx463WU48eMHasrWoLq13bSgwsXw7vvAOTJsGdd9qqvebNbfhz+XJb5bdXrcRSJS0NKlSwIcvw61KmDHTpAv/+t/WMARxyCDz0ULBtlVJH4UxEJN6lpcELL1hdqCuusEnlTZseuIzCkUfCzTfb2/r1VtEd4LXX4LbbbBXbmWdaCDnjjJzzJVVmJnzzDXzwgb2lp1uR1KQkq8VVvz6ceqrV9hIJmMKZiEi8SkuDF1+E++6DX36xyudXXGE9PAerb5VbnTo5H990k82PeucdK2D6+usWzNavt56k3butSnpJ8vjj8K9/2ZBkUpJVz+/Xz3rNkpLghhuCbqFIHgpnIiLxaNIkuPFGC2Vdulg18x49in/dypWhTx97y8iAmTNt9WF4l5CePe14nz7Wq9ayZeLMpcrKsi1/pkyx3rE33rB9JOvXt17C3r1tfljNmkG3VOSAtCAgijZu3Ejbtm1p27Yt9erVo2HDhns+371790GfP336dGbOnHnAx/Tp04eTTjopUk0WkSDt2gVbttjHVarY0OWnn9pk9Z49Ix+SypSxvRXDW9x4byEmMxNuvdUWGrRoYb138eynn2yLvfr1bWuh//s/C2q//WbnzzsP/vMfqyavYCYJQD1nUVSrVi3mz58PwB133EGVKlW4+eabC/z86dOnU6VKFTp16pTv+U2bNjFnzhyqVKnCihUrVEBWJFHt3g0vvWQbPp93HowebdvqnHJKbHutnLNQduut1mM3ebINf2Zm2vn16+1cnz42P+sAZSLS022O/cqVtlvRypU5b1lZtiiyXTs4/nhbq1DgihPeW8mQDz6w4Nivnz35/fetV6x3b6u2X7t2sV8OkaAonMXYnDlzGD58ONu2bePQQw/llVdeoX79+jz22GM888wzlClThqOPPppRo0bxzDPPkJyczGuvvcbjjz9O173mmEycOJGzzz6bunXrMnbsWG677TYAfvjhB6677jo2bNhAcnIy48aNo3nz5tx///289tprJCUl0atXL0aNGhXESyAiYbt3wyuv2P6DP/9sc6HCO4UEPZTYsKGVkBg0KOfY4sW2UvSll8iqWJm13S5gZfvzWHlYd1b+WjFPCEtNzcl0YGXDmjSxzkCAt96C557LOdeyZU5Ya9fOiunn2Xln8mSbIzdligVHgOuvt3BWp46Vt0jSYJCUDApnMeS9Z/DgwbzzzjvUrl2bN998k3/84x+89NJLjBo1ipUrV1K+fHk2bdpEjRo1uO666w7Y2zZmzBhuv/126tatS//+/feEswEDBjBixAj69u1LWloaWVlZTJkyhXfeeYdZs2bt2V9TJCiZmbBpk9VNLdWGD4cnn7SCsc89B6efHnwoy+a9jQrm7fXqzsoOf7ByyU5+WluO3R+VhZztfGlQJ51mjTPp2rUCzZpZEGvWzN4aNcpbJN97G42cN8+mic2bB1On2mLSsGZ1tnF81yq0awftXptBu9QZ1D+jo/WOnXGGDWOGldJglpEBa9daT2UiqFfPtrGWAytV4WzoUKvNGElt28IjjxTssbt27WLhwoWcdtppAGRmZlI/+4dL69atGTBgAH369KFPnz4Hvda6detYvnw5Xbp0wTlH2bJlWbhwIYcddhi//PLLnn02K2RP8v3000+54oor9mxsXlPzLiTGdu+G6dNh4kSb675unVV76NHDplP16JF3UWGJlJ5uc586doRjjrGVk2edZcNwAYSyLVvyDjfmDmKrVsG2bXkfX6sWNGuWRNtOlenbDJo19TRzq2jaoxmHHQYVBlxo3+Bdx8Jh50LrPtC+fb5fm3MW3po2hb59ge3bYdo01o3/gnlTfmXe+gbM+609c+f1Y8KEJOAh4CHqfQnt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\n",
"text/plain": [
"<Figure size 720x360 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1dhW9q7R2Rso",
"colab_type": "text"
},
"source": [
"- 99.43\n",
"- the most epic network\n",
"- might apply early stopping"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rlOUUtff7XAO",
"colab_type": "text"
},
"source": [
""
]
},
{
"cell_type": "code",
"metadata": {
"id": "rE2rt48SzGCq",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
}
],
"metadata": {
"colab": {
"name": "MNIST_model_03.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"accelerator": "GPU"
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment