Skip to content

Instantly share code, notes, and snippets.

@Jong-Sig
Created June 16, 2024 22:25
Show Gist options
  • Select an option

  • Save Jong-Sig/111fa6a9809e7af6b0cab4cd42ab1323 to your computer and use it in GitHub Desktop.

Select an option

Save Jong-Sig/111fa6a9809e7af6b0cab4cd42ab1323 to your computer and use it in GitHub Desktop.
CNN for character recognition on MINST database
Display the source blob
Display the rendered blob
Raw
{"cells":[{"cell_type":"markdown","metadata":{"colab_type":"text","id":"JFdwu2REWOWj"},"source":["# CNN for character recognition on MINST database"]},{"cell_type":"markdown","metadata":{"colab_type":"text","id":"9D-d93NlWOXh"},"source":["Implement a CNN for character recognition on MINST using **pytorch**. Report the performance of the model on three conditions:\n","1. Dropout - with and without dropout\n","2. CNN kernel filter change - two filter sizes of your choice\n","3. Learning rate change or optimizer change - two learning rates or two different optimizers. \n","\n","accuracy should be >= 95%."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"emULEoTSWOXh"},"outputs":[],"source":["import torch\n","import torch.nn as nn\n","import torch.nn.functional as F\n","import torch.optim as optim\n","import torchvision\n","import numpy as np\n","import matplotlib.pyplot as plt\n","import pandas as pd\n","%matplotlib inline"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"j8MgX5gJWOXk"},"outputs":[],"source":["batch_size = 32\n","MNIST_train = torchvision.datasets.MNIST(root='MNIST_data/',\n"," train=True,\n"," transform=torchvision.transforms.ToTensor(),\n"," download=True)\n","MNIST_test = torchvision.datasets.MNIST(root='MNIST_data/',\n"," train=False,\n"," transform=torchvision.transforms.ToTensor(),\n"," download=True)\n","\n","train_loader = torch.utils.data.DataLoader(MNIST_train,batch_size=batch_size, shuffle=True)\n","test_loader = torch.utils.data.DataLoader(MNIST_test,batch_size=batch_size, shuffle=True)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"vFaGlewDWOXn","outputId":"9c68c154-1026-439c-c037-4d7df151f817"},"outputs":[{"data":{"text/plain":["torch.Size([32, 1, 28, 28])"]},"execution_count":4,"metadata":{"tags":[]},"output_type":"execute_result"}],"source":["examples = enumerate(train_loader)\n","batch_idx, (example_data, example_targets) = next(examples)\n","example_data.shape"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"pa9A_hkpWOXr","outputId":"d416463f-2899-476e-df99-91b2f76770eb"},"outputs":[{"name":"stdout","output_type":"stream","text":["Filter size: 2x2, Dimension: 128\n","Filter size: 3x3, Dimension: 32\n"]}],"source":["def train_dim_cal(kernel_size):\n"," ks = kernel_size\n"," conv1 = nn.Conv2d(1, 32, ks)\n"," conv2 = nn.Conv2d(32, 32, ks)\n"," conv3 = nn.Conv2d(32, 32, ks)\n","\n"," bn1 = nn.BatchNorm2d(32)\n"," bn2 = nn.BatchNorm2d(32)\n"," bn3 = nn.BatchNorm2d(32)\n","\n"," pl1=nn.MaxPool2d(kernel_size = 2)\n"," pl2=nn.MaxPool2d(kernel_size = 2)\n"," pl3=nn.MaxPool2d(kernel_size = 2)\n"," \n"," data = torch.zeros((1,1, 28, 28))\n"," data = conv1(data)\n"," data = pl1(data)\n"," data = conv2(data)\n"," data = pl2(data)\n"," data = conv3(data)\n"," data = pl3(data)\n"," train_dim = int(np.prod(data.size()))\n"," print(f\"Filter size: {ks}x{ks}, Dimension: {train_dim}\")\n"," \n","for i in range(2, 4):\n"," train_dim_cal(i)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"GIG2vjNyWOXu"},"outputs":[],"source":["# CNN with 3 convolutional layers / 1 fully-connected layer / with dropout / filter size (3x3): kernel_size = 3\n","class CNN(nn.Module):\n"," def __init__(self, dropout = 0.5, learning_rate = 0.001, epochs = 4, kernel_size = 3, train_dim = 32, num_classes = 10, batch_size = 256):\n"," super(CNN, self).__init__()\n"," \"\"\"params\"\"\"\n"," self.dropout = dropout\n"," self.kernel_size = kernel_size\n"," self.learning_rate = learning_rate\n"," self.epochs = epochs\n"," self.batch_size = batch_size\n"," self.num_classes = num_classes\n"," self.train_dim = train_dim\n"," \n"," \"\"\"loss and accuracy history\"\"\"\n"," self.loss_hist = []\n"," self.accu_hist = []\n"," \n"," \"\"\"data to cuda to save CPU\"\"\"\n"," self.save = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')\n"," \n"," \"\"\"Conv / batches / pool\"\"\"\n"," self.conv1 = nn.Conv2d(1, 32, kernel_size = self.kernel_size)\n"," self.conv2 = nn.Conv2d(32, 32, kernel_size = self.kernel_size)\n"," self.conv3 = nn.Conv2d(32, 32, kernel_size = self.kernel_size)\n"," \n"," self.bn1 = nn.BatchNorm2d(32)\n"," self.bn2 = nn.BatchNorm2d(32)\n"," self.bn3 = nn.BatchNorm2d(32)\n"," \n"," self.pl1=nn.MaxPool2d(kernel_size = 2)\n"," self.pl2=nn.MaxPool2d(kernel_size = 2)\n"," self.pl3=nn.MaxPool2d(kernel_size = 2)\n"," \n"," \"\"\"layers\"\"\"\n"," self.cnn_layers = nn.Sequential(\n"," #layer 1\n"," #Image shape = (1, 28, 28)\n"," # Conv -> (32, 28, 28)\n"," # Pool -> (32, 14, 14)\n"," self.conv1,\n"," self.bn1,\n"," nn.ReLU(),\n"," self.pl1,\n"," nn.Dropout(self.dropout),\n"," \n"," #layer 2\n"," # Image shape = (32, 14, 14)\n"," # Conv -> (32, 14, 14)\n"," # Pool -> (32, 7, 7)\n"," self.conv2,\n"," self.bn2,\n"," nn.ReLU(),\n"," self.pl2,\n"," nn.Dropout(self.dropout),\n"," \n"," #layer 3\n"," # Image shape = (32, 7, 7)\n"," # Conv -> (32, 7, 7)\n"," # Pool -> (32, 4, 4)\n"," self.conv3,\n"," self.bn3,\n"," nn.ReLU(),\n"," self.pl3,\n"," nn.Dropout(self.dropout)\n"," )\n","\n"," # linear -- 10 outputs\n"," self.linear_layers = nn.Sequential(\n"," nn.Linear(self.train_dim, self.num_classes)\n"," )\n"," \n"," #reduce CPU burden\n"," self.to(self.save) \n"," \n"," \"\"\"forward pass\"\"\"\n"," def forward(self, x):\n"," out = x.clone().detach().to(self.save)\n"," out = self.cnn_layers(x)\n"," out = out.view(out.size()[0], -1)\n"," out = self.linear_layers(out)\n"," return out\n"," \n"," \"\"\"optimizer\"\"\"\n"," def optimizer(self):\n"," optimizer = optim.Adam(model.parameters(), lr = self.learning_rate) #change learning rate\n"," return optimizer\n"," \n"," \"\"\"train\"\"\"\n"," def _train(self, train_loader):\n"," self.train()\n"," #loss per epoch\n"," for i in range(self.epochs):\n"," epoch_loss = 0\n"," epoch_accu = []\n","\n"," #getting the training set\n"," for batch_idx, (x_train, y_train) in enumerate(train_loader):\n"," #clear the Gradients\n"," self.optimizer().zero_grad()\n"," \n"," #reduce CPU burden\n"," y_train.to(self.save)\n","\n"," #prediction for training set\n"," output_train = self.forward(x_train)\n"," #define the loss function\n"," criterion = nn.CrossEntropyLoss()\n","\n"," #train loss\n"," train_loss = criterion(output_train, y_train)\n"," epoch_loss += train_loss.item()\n","\n"," #accuracy\n"," y_predict = F.softmax(output_train, dim = 1)\n"," y_predict = torch.argmax(y_predict, dim =1)\n"," no_accu = torch.where(y_predict != y_train, torch.tensor([1.]), torch.tensor([0.]))\n"," accuracy = 1- torch.sum(no_accu)/self.batch_size\n"," epoch_accu.append(accuracy.item())\n","\n"," #updated weights\n"," train_loss.backward() #compute the gradients\n"," self.optimizer().step()\n","\n"," #append data after epoch\n"," self.loss_hist.append(epoch_loss)\n"," self.accu_hist.append(np.mean(epoch_accu))\n","\n"," print('Epoch : ',i+1, '\\t', 'Total loss :', epoch_loss, '\\t', \"Accuracy :\", np.mean(epoch_accu))"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"Ap4Zk0irWOXw","outputId":"a5447ec0-7289-4a44-dd05-143e5a811a4f"},"outputs":[{"data":{"text/plain":["CNN(\n"," (conv1): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1))\n"," (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1))\n"," (conv3): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1))\n"," (bn1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n"," (bn2): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n"," (bn3): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n"," (pl1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n"," (pl2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n"," (pl3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n"," (cnn_layers): Sequential(\n"," (0): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1))\n"," (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n"," (2): ReLU()\n"," (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n"," (4): Dropout(p=0.5, inplace=False)\n"," (5): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1))\n"," (6): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n"," (7): ReLU()\n"," (8): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n"," (9): Dropout(p=0.5, inplace=False)\n"," (10): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1))\n"," (11): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n"," (12): ReLU()\n"," (13): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n"," (14): Dropout(p=0.5, inplace=False)\n"," )\n"," (linear_layers): Sequential(\n"," (0): Linear(in_features=32, out_features=10, bias=True)\n"," )\n",")"]},"execution_count":7,"metadata":{"tags":[]},"output_type":"execute_result"}],"source":["model = CNN(dropout = 0.5, learning_rate = 0.001, epochs = 4, kernel_size = 3, train_dim = 32, num_classes = 10, batch_size = 256)\n","model"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"lJprRiefWOX0","outputId":"a63a1656-45fa-4983-bc91-2b664653b21f"},"outputs":[{"name":"stdout","output_type":"stream","text":["Epoch : 1 \t Total loss : 1963.3481489121914 \t Accuracy : 0.95745\n","Epoch : 2 \t Total loss : 1508.6971922367811 \t Accuracy : 0.9724791666666667\n","Epoch : 3 \t Total loss : 1651.806768015027 \t Accuracy : 0.9733791666666667\n","Epoch : 4 \t Total loss : 1762.9379204958677 \t Accuracy : 0.9735916666666666\n"]}],"source":["#First model\n","\"\"\"1) With Dropout (0.5) / 2) learning rate = 0.001 (Adam optimizer) / 3) kernel_size = 3 (train_dim = 32)\"\"\"\n","model = CNN(dropout = 0.5, learning_rate = 0.001, epochs = 4, kernel_size = 3, train_dim = 32, num_classes = 10, batch_size = 256)\n","model._train(train_loader)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"iQx0IMekWOX2","outputId":"f6dde937-156c-436c-d53f-274128f510fe"},"outputs":[{"data":{"text/html":["<div>\n","<style scoped>\n"," .dataframe tbody tr th:only-of-type {\n"," vertical-align: middle;\n"," }\n","\n"," .dataframe tbody tr th {\n"," vertical-align: top;\n"," }\n","\n"," .dataframe thead th {\n"," text-align: right;\n"," }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n"," <thead>\n"," <tr style=\"text-align: right;\">\n"," <th></th>\n"," <th>Model</th>\n"," <th># Epoch</th>\n"," <th>Total Loss</th>\n"," <th>Accuracy (%)</th>\n"," </tr>\n"," </thead>\n"," <tbody>\n"," <tr>\n"," <th>0</th>\n"," <td>Model 1: Drop(o) / LR = 0.001, FS = 3</td>\n"," <td>1</td>\n"," <td>1963.348149</td>\n"," <td>0.957450</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>Model 1: Drop(o) / LR = 0.001, FS = 3</td>\n"," <td>2</td>\n"," <td>1508.697192</td>\n"," <td>0.972479</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>Model 1: Drop(o) / LR = 0.001, FS = 3</td>\n"," <td>3</td>\n"," <td>1651.806768</td>\n"," <td>0.973379</td>\n"," </tr>\n"," <tr>\n"," <th>3</th>\n"," <td>Model 1: Drop(o) / LR = 0.001, FS = 3</td>\n"," <td>4</td>\n"," <td>1762.937920</td>\n"," <td>0.973592</td>\n"," </tr>\n"," </tbody>\n","</table>\n","</div>"],"text/plain":[" Model # Epoch Total Loss Accuracy (%)\n","0 Model 1: Drop(o) / LR = 0.001, FS = 3 1 1963.348149 0.957450\n","1 Model 1: Drop(o) / LR = 0.001, FS = 3 2 1508.697192 0.972479\n","2 Model 1: Drop(o) / LR = 0.001, FS = 3 3 1651.806768 0.973379\n","3 Model 1: Drop(o) / LR = 0.001, FS = 3 4 1762.937920 0.973592"]},"execution_count":10,"metadata":{"tags":[]},"output_type":"execute_result"}],"source":["#store data for a first model\n","head = [\"Model\",\"# Epoch\", \"Total Loss\", \"Accuracy (%)\"]\n","models = [\"Model 1: Drop(o) / LR = 0.001, FS = 3\", \"Model 1: Drop(o) / LR = 0.001, FS = 3\", \"Model 1: Drop(o) / LR = 0.001, FS = 3\", \"Model 1: Drop(o) / LR = 0.001, FS = 3\"]\n","epochs = [1, 2, 3, 4]\n","accu_model = model.accu_hist\n","loss_model = model.loss_hist\n","model1 = pd.DataFrame(columns = head)\n","model1[\"Model\"] = models\n","model1[\"# Epoch\"] = epochs\n","model1[\"Total Loss\"] = loss_model\n","model1[\"Accuracy (%)\"] = accu_model\n","model1"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"EluPfB1wWOX5","outputId":"d364f222-c96a-43b1-fd2e-9f6f348fc741"},"outputs":[{"name":"stdout","output_type":"stream","text":["Epoch : 1 \t Total loss : 333.91370364429895 \t Accuracy : 0.99459375\n","Epoch : 2 \t Total loss : 142.79218415318246 \t Accuracy : 0.9973229166666666\n","Epoch : 3 \t Total loss : 143.0520956325047 \t Accuracy : 0.9977083333333333\n","Epoch : 4 \t Total loss : 142.27303840622727 \t Accuracy : 0.9980208333333334\n"]}],"source":["#Second model\n","\"\"\"1) Without Dropout (0) / 2) learning rate = 0.001 (Adam optimizer) / 3) kernel_size = 3 (train_dim = 32)\"\"\"\n","model = CNN(dropout = 0, learning_rate = 0.001, epochs = 4, kernel_size = 3, train_dim = 32, num_classes = 10, batch_size = 256)\n","model._train(train_loader)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"FH2E7WmyWOX8","outputId":"6f1fbc83-05b2-4090-a09f-baa5031ab4cc"},"outputs":[{"data":{"text/html":["<div>\n","<style scoped>\n"," .dataframe tbody tr th:only-of-type {\n"," vertical-align: middle;\n"," }\n","\n"," .dataframe tbody tr th {\n"," vertical-align: top;\n"," }\n","\n"," .dataframe thead th {\n"," text-align: right;\n"," }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n"," <thead>\n"," <tr style=\"text-align: right;\">\n"," <th></th>\n"," <th>Model</th>\n"," <th># Epoch</th>\n"," <th>Total Loss</th>\n"," <th>Accuracy (%)</th>\n"," </tr>\n"," </thead>\n"," <tbody>\n"," <tr>\n"," <th>0</th>\n"," <td>Model 2: Drop(x) / LR = 0.001, FS = 3</td>\n"," <td>1</td>\n"," <td>333.913704</td>\n"," <td>0.994594</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>Model 2: Drop(x) / LR = 0.001, FS = 3</td>\n"," <td>2</td>\n"," <td>142.792184</td>\n"," <td>0.997323</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>Model 2: Drop(x) / LR = 0.001, FS = 3</td>\n"," <td>3</td>\n"," <td>143.052096</td>\n"," <td>0.997708</td>\n"," </tr>\n"," <tr>\n"," <th>3</th>\n"," <td>Model 2: Drop(x) / LR = 0.001, FS = 3</td>\n"," <td>4</td>\n"," <td>142.273038</td>\n"," <td>0.998021</td>\n"," </tr>\n"," </tbody>\n","</table>\n","</div>"],"text/plain":[" Model # Epoch Total Loss Accuracy (%)\n","0 Model 2: Drop(x) / LR = 0.001, FS = 3 1 333.913704 0.994594\n","1 Model 2: Drop(x) / LR = 0.001, FS = 3 2 142.792184 0.997323\n","2 Model 2: Drop(x) / LR = 0.001, FS = 3 3 143.052096 0.997708\n","3 Model 2: Drop(x) / LR = 0.001, FS = 3 4 142.273038 0.998021"]},"execution_count":12,"metadata":{"tags":[]},"output_type":"execute_result"}],"source":["#store data for a second model\n","head = [\"Model\",\"# Epoch\", \"Total Loss\", \"Accuracy (%)\"]\n","models = [\"Model 2: Drop(x) / LR = 0.001, FS = 3\", \"Model 2: Drop(x) / LR = 0.001, FS = 3\", \"Model 2: Drop(x) / LR = 0.001, FS = 3\", \"Model 2: Drop(x) / LR = 0.001, FS = 3\"]\n","epochs = [1, 2, 3, 4]\n","accu_model = model.accu_hist\n","loss_model = model.loss_hist\n","model2 = pd.DataFrame(columns = head)\n","model2[\"Model\"] = models\n","model2[\"# Epoch\"] = epochs\n","model2[\"Total Loss\"] = loss_model\n","model2[\"Accuracy (%)\"] = accu_model\n","model2"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"DuA-AHcrWOX_","outputId":"924314a6-8497-45f5-e10e-7b21e03318c3"},"outputs":[{"name":"stdout","output_type":"stream","text":["Epoch : 1 \t Total loss : 3306.260952115059 \t Accuracy : 0.93544375\n","Epoch : 2 \t Total loss : 2218.6359243392944 \t Accuracy : 0.9749729166666666\n","Epoch : 3 \t Total loss : 1641.0938567519188 \t Accuracy : 0.985225\n","Epoch : 4 \t Total loss : 1267.4894086122513 \t Accuracy : 0.989375\n"]}],"source":["#Third model\n","\"\"\"1) Without Dropout (0) / 2) learning rate = 0.00001 (Adam optimizer) / 3) kernel_size = 3 (train_dim = 32)\"\"\"\n","model = CNN(dropout = 0, learning_rate = 0.00001, epochs = 4, kernel_size = 3, train_dim = 32, num_classes = 10, batch_size = 256)\n","model._train(train_loader)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"frIska30WOYC","outputId":"a01e4353-adcf-4f17-c988-138322559530"},"outputs":[{"data":{"text/html":["<div>\n","<style scoped>\n"," .dataframe tbody tr th:only-of-type {\n"," vertical-align: middle;\n"," }\n","\n"," .dataframe tbody tr th {\n"," vertical-align: top;\n"," }\n","\n"," .dataframe thead th {\n"," text-align: right;\n"," }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n"," <thead>\n"," <tr style=\"text-align: right;\">\n"," <th></th>\n"," <th>Model</th>\n"," <th># Epoch</th>\n"," <th>Total Loss</th>\n"," <th>Accuracy (%)</th>\n"," </tr>\n"," </thead>\n"," <tbody>\n"," <tr>\n"," <th>0</th>\n"," <td>Model 3: Drop(x) / LR = 0.00001, FS = 3</td>\n"," <td>1</td>\n"," <td>3306.260952</td>\n"," <td>0.935444</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>Model 3: Drop(x) / LR = 0.00001, FS = 3</td>\n"," <td>2</td>\n"," <td>2218.635924</td>\n"," <td>0.974973</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>Model 3: Drop(x) / LR = 0.00001, FS = 3</td>\n"," <td>3</td>\n"," <td>1641.093857</td>\n"," <td>0.985225</td>\n"," </tr>\n"," <tr>\n"," <th>3</th>\n"," <td>Model 3: Drop(x) / LR = 0.00001, FS = 3</td>\n"," <td>4</td>\n"," <td>1267.489409</td>\n"," <td>0.989375</td>\n"," </tr>\n"," </tbody>\n","</table>\n","</div>"],"text/plain":[" Model # Epoch Total Loss Accuracy (%)\n","0 Model 3: Drop(x) / LR = 0.00001, FS = 3 1 3306.260952 0.935444\n","1 Model 3: Drop(x) / LR = 0.00001, FS = 3 2 2218.635924 0.974973\n","2 Model 3: Drop(x) / LR = 0.00001, FS = 3 3 1641.093857 0.985225\n","3 Model 3: Drop(x) / LR = 0.00001, FS = 3 4 1267.489409 0.989375"]},"execution_count":14,"metadata":{"tags":[]},"output_type":"execute_result"}],"source":["#store data for a third model\n","head = [\"Model\",\"# Epoch\", \"Total Loss\", \"Accuracy (%)\"]\n","models = [\"Model 3: Drop(x) / LR = 0.00001, FS = 3\", \"Model 3: Drop(x) / LR = 0.00001, FS = 3\", \"Model 3: Drop(x) / LR = 0.00001, FS = 3\", \"Model 3: Drop(x) / LR = 0.00001, FS = 3\"]\n","epochs = [1, 2, 3, 4]\n","accu_model = model.accu_hist\n","loss_model = model.loss_hist\n","model3 = pd.DataFrame(columns = head)\n","model3[\"Model\"] = models\n","model3[\"# Epoch\"] = epochs\n","model3[\"Total Loss\"] = loss_model\n","model3[\"Accuracy (%)\"] = accu_model\n","model3"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"WS8hC5H4WOYF","outputId":"abf4bd48-8d45-4c7b-b540-9b7ab011229b"},"outputs":[{"name":"stdout","output_type":"stream","text":["Epoch : 1 \t Total loss : 3643.756354570389 \t Accuracy : 0.9265416666666667\n","Epoch : 2 \t Total loss : 2501.80212444067 \t Accuracy : 0.9699875\n","Epoch : 3 \t Total loss : 1835.150411248207 \t Accuracy : 0.9811333333333333\n","Epoch : 4 \t Total loss : 1380.2550098598003 \t Accuracy : 0.9861395833333333\n"]}],"source":["#Forth modell\n","\"\"\"1) Without Dropout (0) / 2) learning rate = 0.00001 (Adam optimizer) / 3) kernel_size = 2 (train_dim = 128)\"\"\"\n","model = CNN(dropout = 0, learning_rate = 0.00001, epochs = 4, kernel_size = 2, train_dim = 128, num_classes = 10, batch_size = 256)\n","model._train(train_loader)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"fDV-A9LqWOYI","outputId":"a2123ae4-f1b4-48b3-9b7d-74d9d26ba2ba"},"outputs":[{"data":{"text/html":["<div>\n","<style scoped>\n"," .dataframe tbody tr th:only-of-type {\n"," vertical-align: middle;\n"," }\n","\n"," .dataframe tbody tr th {\n"," vertical-align: top;\n"," }\n","\n"," .dataframe thead th {\n"," text-align: right;\n"," }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n"," <thead>\n"," <tr style=\"text-align: right;\">\n"," <th></th>\n"," <th>Model</th>\n"," <th># Epoch</th>\n"," <th>Total Loss</th>\n"," <th>Accuracy (%)</th>\n"," </tr>\n"," </thead>\n"," <tbody>\n"," <tr>\n"," <th>0</th>\n"," <td>Model 4: Drop(x) / LR = 0.00001, FS = 2</td>\n"," <td>1</td>\n"," <td>3643.756355</td>\n"," <td>0.926542</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>Model 4: Drop(x) / LR = 0.00001, FS = 2</td>\n"," <td>2</td>\n"," <td>2501.802124</td>\n"," <td>0.969988</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>Model 4: Drop(x) / LR = 0.00001, FS = 2</td>\n"," <td>3</td>\n"," <td>1835.150411</td>\n"," <td>0.981133</td>\n"," </tr>\n"," <tr>\n"," <th>3</th>\n"," <td>Model 4: Drop(x) / LR = 0.00001, FS = 2</td>\n"," <td>4</td>\n"," <td>1380.255010</td>\n"," <td>0.986140</td>\n"," </tr>\n"," </tbody>\n","</table>\n","</div>"],"text/plain":[" Model # Epoch Total Loss Accuracy (%)\n","0 Model 4: Drop(x) / LR = 0.00001, FS = 2 1 3643.756355 0.926542\n","1 Model 4: Drop(x) / LR = 0.00001, FS = 2 2 2501.802124 0.969988\n","2 Model 4: Drop(x) / LR = 0.00001, FS = 2 3 1835.150411 0.981133\n","3 Model 4: Drop(x) / LR = 0.00001, FS = 2 4 1380.255010 0.986140"]},"execution_count":16,"metadata":{"tags":[]},"output_type":"execute_result"}],"source":["#store data for a forth mode\n","head = [\"Model\",\"# Epoch\", \"Total Loss\", \"Accuracy (%)\"]\n","models = [\"Model 4: Drop(x) / LR = 0.00001, FS = 2\", \"Model 4: Drop(x) / LR = 0.00001, FS = 2\", \"Model 4: Drop(x) / LR = 0.00001, FS = 2\", \"Model 4: Drop(x) / LR = 0.00001, FS = 2\"]\n","epochs = [1, 2, 3, 4]\n","accu_model = model.accu_hist\n","loss_model = model.loss_hist\n","model4 = pd.DataFrame(columns = head)\n","model4[\"Model\"] = models\n","model4[\"# Epoch\"] = epochs\n","model4[\"Total Loss\"] = loss_model\n","model4[\"Accuracy (%)\"] = accu_model\n","model4"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"jYDAU3yJWOYL","outputId":"54feb439-69b6-43dc-887d-c95afee6ee7f"},"outputs":[{"name":"stdout","output_type":"stream","text":["Compare model 1 (with dropout) vs. model 2 (without dropout), all else equal\n","Compare model 2 (learning rate = 0.001) vs. model 3 (learning rate = 0.00001), all else equal\n","Compare model 3 (filter size = 3) vs. model 4 (filter size = 2), all else equal\n"]}],"source":["print(\"Compare model 1 (with dropout) vs. model 2 (without dropout), all else equal\")\n","print(\"Compare model 2 (learning rate = 0.001) vs. model 3 (learning rate = 0.00001), all else equal\")\n","print(\"Compare model 3 (filter size = 3) vs. model 4 (filter size = 2), all else equal\")"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{},"colab_type":"code","id":"82HDomt9WOYN","outputId":"ec52e690-63b6-4f50-9233-a29a539a3c9c"},"outputs":[{"name":"stdout","output_type":"stream","text":["Dropout: without is better than with dropout, Learning Rate: 0.001 is better than 0.00001, Filter size: 3 is better than 2\n"]},{"data":{"text/html":["<div>\n","<style scoped>\n"," .dataframe tbody tr th:only-of-type {\n"," vertical-align: middle;\n"," }\n","\n"," .dataframe tbody tr th {\n"," vertical-align: top;\n"," }\n","\n"," .dataframe thead th {\n"," text-align: right;\n"," }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n"," <thead>\n"," <tr style=\"text-align: right;\">\n"," <th></th>\n"," <th>Model</th>\n"," <th># Epoch</th>\n"," <th>Total Loss</th>\n"," <th>Accuracy (%)</th>\n"," </tr>\n"," </thead>\n"," <tbody>\n"," <tr>\n"," <th>0</th>\n"," <td>Model 1: Drop(o) / LR = 0.001, FS = 3</td>\n"," <td>1</td>\n"," <td>1963.348149</td>\n"," <td>0.957450</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>Model 1: Drop(o) / LR = 0.001, FS = 3</td>\n"," <td>2</td>\n"," <td>1508.697192</td>\n"," <td>0.972479</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>Model 1: Drop(o) / LR = 0.001, FS = 3</td>\n"," <td>3</td>\n"," <td>1651.806768</td>\n"," <td>0.973379</td>\n"," </tr>\n"," <tr>\n"," <th>3</th>\n"," <td>Model 1: Drop(o) / LR = 0.001, FS = 3</td>\n"," <td>4</td>\n"," <td>1762.937920</td>\n"," <td>0.973592</td>\n"," </tr>\n"," <tr>\n"," <th>0</th>\n"," <td>Model 2: Drop(x) / LR = 0.001, FS = 3</td>\n"," <td>1</td>\n"," <td>333.913704</td>\n"," <td>0.994594</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>Model 2: Drop(x) / LR = 0.001, FS = 3</td>\n"," <td>2</td>\n"," <td>142.792184</td>\n"," <td>0.997323</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>Model 2: Drop(x) / LR = 0.001, FS = 3</td>\n"," <td>3</td>\n"," <td>143.052096</td>\n"," <td>0.997708</td>\n"," </tr>\n"," <tr>\n"," <th>3</th>\n"," <td>Model 2: Drop(x) / LR = 0.001, FS = 3</td>\n"," <td>4</td>\n"," <td>142.273038</td>\n"," <td>0.998021</td>\n"," </tr>\n"," <tr>\n"," <th>0</th>\n"," <td>Model 3: Drop(x) / LR = 0.00001, FS = 3</td>\n"," <td>1</td>\n"," <td>3306.260952</td>\n"," <td>0.935444</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>Model 3: Drop(x) / LR = 0.00001, FS = 3</td>\n"," <td>2</td>\n"," <td>2218.635924</td>\n"," <td>0.974973</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>Model 3: Drop(x) / LR = 0.00001, FS = 3</td>\n"," <td>3</td>\n"," <td>1641.093857</td>\n"," <td>0.985225</td>\n"," </tr>\n"," <tr>\n"," <th>3</th>\n"," <td>Model 3: Drop(x) / LR = 0.00001, FS = 3</td>\n"," <td>4</td>\n"," <td>1267.489409</td>\n"," <td>0.989375</td>\n"," </tr>\n"," <tr>\n"," <th>0</th>\n"," <td>Model 4: Drop(x) / LR = 0.00001, FS = 2</td>\n"," <td>1</td>\n"," <td>3643.756355</td>\n"," <td>0.926542</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>Model 4: Drop(x) / LR = 0.00001, FS = 2</td>\n"," <td>2</td>\n"," <td>2501.802124</td>\n"," <td>0.969988</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>Model 4: Drop(x) / LR = 0.00001, FS = 2</td>\n"," <td>3</td>\n"," <td>1835.150411</td>\n"," <td>0.981133</td>\n"," </tr>\n"," <tr>\n"," <th>3</th>\n"," <td>Model 4: Drop(x) / LR = 0.00001, FS = 2</td>\n"," <td>4</td>\n"," <td>1380.255010</td>\n"," <td>0.986140</td>\n"," </tr>\n"," </tbody>\n","</table>\n","</div>"],"text/plain":[" Model # Epoch Total Loss Accuracy (%)\n","0 Model 1: Drop(o) / LR = 0.001, FS = 3 1 1963.348149 0.957450\n","1 Model 1: Drop(o) / LR = 0.001, FS = 3 2 1508.697192 0.972479\n","2 Model 1: Drop(o) / LR = 0.001, FS = 3 3 1651.806768 0.973379\n","3 Model 1: Drop(o) / LR = 0.001, FS = 3 4 1762.937920 0.973592\n","0 Model 2: Drop(x) / LR = 0.001, FS = 3 1 333.913704 0.994594\n","1 Model 2: Drop(x) / LR = 0.001, FS = 3 2 142.792184 0.997323\n","2 Model 2: Drop(x) / LR = 0.001, FS = 3 3 143.052096 0.997708\n","3 Model 2: Drop(x) / LR = 0.001, FS = 3 4 142.273038 0.998021\n","0 Model 3: Drop(x) / LR = 0.00001, FS = 3 1 3306.260952 0.935444\n","1 Model 3: Drop(x) / LR = 0.00001, FS = 3 2 2218.635924 0.974973\n","2 Model 3: Drop(x) / LR = 0.00001, FS = 3 3 1641.093857 0.985225\n","3 Model 3: Drop(x) / LR = 0.00001, FS = 3 4 1267.489409 0.989375\n","0 Model 4: Drop(x) / LR = 0.00001, FS = 2 1 3643.756355 0.926542\n","1 Model 4: Drop(x) / LR = 0.00001, FS = 2 2 2501.802124 0.969988\n","2 Model 4: Drop(x) / LR = 0.00001, FS = 2 3 1835.150411 0.981133\n","3 Model 4: Drop(x) / LR = 0.00001, FS = 2 4 1380.255010 0.986140"]},"execution_count":17,"metadata":{"tags":[]},"output_type":"execute_result"}],"source":["# Full Table\n","print(\"Dropout: without is better than with dropout, Learning Rate: 0.001 is better than 0.00001, Filter size: 3 is better than 2\")\n","pd.concat([model1, model2, model3, model4])"]}],"metadata":{"colab":{"name":"HW3_v2_Sik-3.ipynb","provenance":[]},"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.7.7"}},"nbformat":4,"nbformat_minor":0}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment