Created
June 16, 2024 22:25
-
-
Save Jong-Sig/111fa6a9809e7af6b0cab4cd42ab1323 to your computer and use it in GitHub Desktop.
CNN for character recognition on MINST database
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {"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