diff --git a/TD2 Deep Learning.ipynb b/TD2 Deep Learning.ipynb index 6c833bc6d98fe4b49f1dabf3e164d40e72a21e54..21d7c9f92b7b4fa7dc3c1b1d7d0c4e7e762d47de 100644 --- a/TD2 Deep Learning.ipynb +++ b/TD2 Deep Learning.ipynb @@ -33,10 +33,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "330a42f5", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: torch in c:\\users\\basil\\appdata\\local\\programs\\python\\python39\\lib\\site-packages (1.13.1)\n", + "Requirement already satisfied: torchvision in c:\\users\\basil\\appdata\\local\\programs\\python\\python39\\lib\\site-packages (0.14.1)\n", + "Requirement already satisfied: typing-extensions in c:\\users\\basil\\appdata\\local\\programs\\python\\python39\\lib\\site-packages (from torch) (4.4.0)\n", + "Requirement already satisfied: numpy in c:\\users\\basil\\appdata\\local\\programs\\python\\python39\\lib\\site-packages (from torchvision) (1.24.2)\n", + "Requirement already satisfied: requests in c:\\users\\basil\\appdata\\local\\programs\\python\\python39\\lib\\site-packages (from torchvision) (2.28.2)\n", + "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in c:\\users\\basil\\appdata\\local\\programs\\python\\python39\\lib\\site-packages (from torchvision) (9.4.0)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\basil\\appdata\\local\\programs\\python\\python39\\lib\\site-packages (from requests->torchvision) (3.0.1)\n", + "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\basil\\appdata\\local\\programs\\python\\python39\\lib\\site-packages (from requests->torchvision) (3.4)\n", + "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\basil\\appdata\\local\\programs\\python\\python39\\lib\\site-packages (from requests->torchvision) (2022.12.7)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\\users\\basil\\appdata\\local\\programs\\python\\python39\\lib\\site-packages (from requests->torchvision) (1.26.14)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 23.0.1 -> 23.3.1\n", + "[notice] To update, run: python.exe -m pip install --upgrade pip\n" + ] + } + ], "source": [ "%pip install torch torchvision" ] @@ -52,7 +79,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "b1950f0a", "metadata": {}, "outputs": [ @@ -60,34 +87,34 @@ "name": "stdout", "output_type": "stream", "text": [ - "tensor([[-2.0332e-01, 6.5762e-01, -1.2718e+00, -1.0667e+00, 6.3339e-01,\n", - " 3.0044e-01, -9.4605e-02, -4.8752e-01, 2.5361e+00, -9.0793e-01],\n", - " [ 1.8772e+00, 8.5481e-01, -8.4488e-01, 1.5698e+00, -1.6336e+00,\n", - " -1.9409e+00, -4.7927e-01, -9.8437e-01, 8.8057e-01, 1.0159e+00],\n", - " [-2.2458e-01, -1.5407e-01, 9.7949e-01, -1.3478e+00, -8.4752e-01,\n", - " 2.2291e+00, 2.0097e-02, -3.6921e-02, -1.5207e+00, 2.2080e+00],\n", - " [ 1.8335e+00, -1.1116e-01, 1.7158e+00, 4.3745e-01, -1.5080e-02,\n", - " 2.2063e-02, 9.2092e-03, -1.8087e-01, -7.6077e-01, 3.4914e-01],\n", - " [-1.5280e-03, -1.7249e+00, 3.9487e-01, 4.8410e-01, -1.2762e+00,\n", - " 4.3278e-01, 3.5852e-01, -7.2127e-01, 9.7572e-01, -4.2663e-01],\n", - " [-9.6790e-01, 3.1904e-01, 1.9527e+00, 1.5507e-01, -2.6549e-02,\n", - " 3.3455e-02, -1.3134e+00, 1.4105e-01, 1.2060e+00, 4.3760e-01],\n", - " [ 1.3415e-01, 7.1450e-01, -5.9799e-02, -4.5007e-01, -7.7680e-02,\n", - " 4.0893e-01, -1.9673e+00, 8.9624e-01, 6.0989e-01, 3.0245e+00],\n", - " [ 9.0126e-01, 1.1798e+00, -1.6314e-01, 9.8894e-01, -5.0119e-01,\n", - " -1.9976e-01, -7.0183e-01, -8.8300e-01, -1.1321e+00, -8.8728e-01],\n", - " [-3.1896e-01, 5.0318e-02, 1.0354e+00, -3.3261e-01, -8.8974e-01,\n", - " -7.7209e-01, -1.6692e-01, -6.9670e-01, -1.7232e-01, -6.2842e-01],\n", - " [-6.6295e-01, 2.0141e+00, 3.3106e-01, 2.9839e-01, -1.1237e+00,\n", - " -7.8125e-01, -3.0903e-01, 3.5664e-01, -1.9195e-01, -3.4968e-02],\n", - " [-7.5442e-01, 6.8441e-01, -1.6399e+00, -1.5894e+00, 3.3328e-01,\n", - " -5.4040e-01, -2.0520e-01, 1.1902e+00, -4.0546e-01, 5.4631e-01],\n", - " [ 3.5297e-01, 1.8425e-01, -2.6629e-01, 2.6103e-01, -1.6353e-01,\n", - " -1.5099e+00, -2.3602e+00, 1.8305e+00, -6.0727e-01, 7.7936e-01],\n", - " [ 3.3149e-01, -1.0999e+00, -4.7988e-01, -1.2186e+00, 1.6860e+00,\n", - " 3.1453e-01, -1.3638e-01, -3.7778e-01, 1.0254e-01, -9.3037e-02],\n", - " [-8.2793e-01, 1.0470e+00, -1.3539e+00, -6.7968e-01, -1.0165e+00,\n", - " -5.5619e-02, 1.8310e+00, 3.9036e-01, 9.2613e-01, -1.7741e-01]])\n", + "tensor([[-1.0902, 0.1886, 0.0956, 0.7495, 1.9529, -0.7950, 0.4216, 1.3919,\n", + " -0.3284, 0.0346],\n", + " [-0.3226, -0.0072, 0.0932, 0.7789, -1.2242, -0.1766, 1.2256, 0.5490,\n", + " -0.7885, 0.6923],\n", + " [-0.2577, -0.9596, -0.7690, -0.5767, 1.1650, 0.6643, 0.7290, -1.8633,\n", + " 0.9807, -0.3629],\n", + " [ 0.0376, -0.3018, 0.3817, -0.8579, -2.3125, 0.5329, 1.2873, -0.5905,\n", + " 0.4314, -0.4986],\n", + " [-0.9039, -0.0558, 0.5211, -0.6979, 0.1829, 0.0322, -0.3460, -0.0964,\n", + " 0.4202, -1.2026],\n", + " [-1.4587, 2.8036, -0.8897, -0.0859, -0.6595, -0.0327, -0.3958, 0.1590,\n", + " 0.0476, 0.6977],\n", + " [ 1.2699, -0.8194, -0.5117, -0.0241, -0.7664, 1.0635, 2.1939, 0.9186,\n", + " 1.2533, 1.2247],\n", + " [ 0.1576, -0.9675, -0.6578, -0.6715, 0.0365, 0.6020, -0.5412, 1.6209,\n", + " -1.2890, 0.5063],\n", + " [ 0.7611, -1.5081, -0.4759, 0.5031, -0.0371, -0.0562, 0.4586, 1.7052,\n", + " 0.8185, 0.3037],\n", + " [ 0.1259, 0.6677, 1.1315, -0.2461, -1.5836, -0.0198, -2.3148, -0.5098,\n", + " -0.7320, 0.1888],\n", + " [-0.9068, 0.0839, 1.1985, 0.8427, 0.1666, -0.0524, 1.6768, 0.6208,\n", + " -0.7887, -0.4840],\n", + " [-0.5844, 0.5233, -0.7987, 0.9863, 0.8913, -0.8844, 0.6393, 0.1853,\n", + " -0.9386, -0.8977],\n", + " [ 0.7607, 0.6126, 1.0632, -1.4381, 0.2137, -0.1998, 0.5679, -2.3812,\n", + " 0.7909, 0.2826],\n", + " [-0.0982, -1.7178, 0.1952, 1.6488, -0.3212, -0.6776, -0.1554, 0.5879,\n", + " 1.0666, 0.4902]])\n", "AlexNet(\n", " (features): Sequential(\n", " (0): Conv2d(3, 64, kernel_size=(11, 11), stride=(4, 4), padding=(2, 2))\n", @@ -157,7 +184,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "6e18f2fd", "metadata": {}, "outputs": [ @@ -191,7 +218,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "462666a2", "metadata": {}, "outputs": [ @@ -199,21 +226,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to data\\cifar-10-python.tar.gz\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100.0%\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Extracting data\\cifar-10-python.tar.gz to data\n", + "Files already downloaded and verified\n", "Files already downloaded and verified\n" ] } @@ -286,7 +299,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 16, "id": "317bf070", "metadata": {}, "outputs": [ @@ -350,7 +363,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 17, "id": "4b53f229", "metadata": {}, "outputs": [ @@ -358,43 +371,37 @@ "name": "stdout", "output_type": "stream", "text": [ - "Epoch: 0 \tTraining Loss: 44.456879 \tValidation Loss: 40.405201\n", - "Validation loss decreased (inf --> 40.405201). Saving model ...\n", - "Epoch: 1 \tTraining Loss: 37.539734 \tValidation Loss: 34.893430\n", - "Validation loss decreased (40.405201 --> 34.893430). Saving model ...\n", - "Epoch: 2 \tTraining Loss: 32.288289 \tValidation Loss: 30.938065\n", - "Validation loss decreased (34.893430 --> 30.938065). Saving model ...\n", - "Epoch: 3 \tTraining Loss: 29.366940 \tValidation Loss: 27.821222\n", - "Validation loss decreased (30.938065 --> 27.821222). Saving model ...\n", - "Epoch: 4 \tTraining Loss: 27.163584 \tValidation Loss: 26.858292\n", - "Validation loss decreased (27.821222 --> 26.858292). Saving model ...\n", - "Epoch: 5 \tTraining Loss: 25.464075 \tValidation Loss: 24.828610\n", - "Validation loss decreased (26.858292 --> 24.828610). Saving model ...\n", - "Epoch: 6 \tTraining Loss: 24.102266 \tValidation Loss: 24.066201\n", - "Validation loss decreased (24.828610 --> 24.066201). Saving model ...\n", - "Epoch: 7 \tTraining Loss: 22.977551 \tValidation Loss: 23.100200\n", - "Validation loss decreased (24.066201 --> 23.100200). Saving model ...\n", - "Epoch: 8 \tTraining Loss: 22.004219 \tValidation Loss: 25.045447\n", - "Epoch: 9 \tTraining Loss: 21.150548 \tValidation Loss: 22.796602\n", - "Validation loss decreased (23.100200 --> 22.796602). Saving model ...\n", - "Epoch: 10 \tTraining Loss: 20.331048 \tValidation Loss: 22.531555\n", - "Validation loss decreased (22.796602 --> 22.531555). Saving model ...\n", - "Epoch: 11 \tTraining Loss: 19.613238 \tValidation Loss: 22.437164\n", - "Validation loss decreased (22.531555 --> 22.437164). Saving model ...\n", - "Epoch: 12 \tTraining Loss: 18.859432 \tValidation Loss: 21.191249\n", - "Validation loss decreased (22.437164 --> 21.191249). Saving model ...\n", - "Epoch: 13 \tTraining Loss: 18.185451 \tValidation Loss: 20.865803\n", - "Validation loss decreased (21.191249 --> 20.865803). Saving model ...\n", - "Epoch: 14 \tTraining Loss: 17.615607 \tValidation Loss: 20.782799\n", - "Validation loss decreased (20.865803 --> 20.782799). Saving model ...\n", - "Epoch: 15 \tTraining Loss: 16.942239 \tValidation Loss: 21.159325\n", - "Epoch: 16 \tTraining Loss: 16.310783 \tValidation Loss: 21.481381\n", - "Epoch: 17 \tTraining Loss: 15.756336 \tValidation Loss: 20.873583\n", - "Epoch: 18 \tTraining Loss: 15.156594 \tValidation Loss: 21.744170\n", - "Epoch: 19 \tTraining Loss: 14.669365 \tValidation Loss: 21.543261\n", - "Epoch: 20 \tTraining Loss: 14.132257 \tValidation Loss: 21.448154\n", - "Epoch: 21 \tTraining Loss: 13.608869 \tValidation Loss: 22.079492\n", - "Epoch: 22 \tTraining Loss: 13.124700 \tValidation Loss: 22.396737\n" + "Epoch: 0 \tTraining Loss: 43.466371 \tValidation Loss: 39.002364\n", + "Validation loss decreased (inf --> 39.002364). Saving model ...\n", + "Epoch: 1 \tTraining Loss: 34.904849 \tValidation Loss: 32.158776\n", + "Validation loss decreased (39.002364 --> 32.158776). Saving model ...\n", + "Epoch: 2 \tTraining Loss: 30.921587 \tValidation Loss: 29.659928\n", + "Validation loss decreased (32.158776 --> 29.659928). Saving model ...\n", + "Epoch: 3 \tTraining Loss: 28.552421 \tValidation Loss: 27.875916\n", + "Validation loss decreased (29.659928 --> 27.875916). Saving model ...\n", + "Epoch: 4 \tTraining Loss: 26.761862 \tValidation Loss: 26.899799\n", + "Validation loss decreased (27.875916 --> 26.899799). Saving model ...\n", + "Epoch: 5 \tTraining Loss: 25.197664 \tValidation Loss: 25.343835\n", + "Validation loss decreased (26.899799 --> 25.343835). Saving model ...\n", + "Epoch: 6 \tTraining Loss: 23.875928 \tValidation Loss: 24.826429\n", + "Validation loss decreased (25.343835 --> 24.826429). Saving model ...\n", + "Epoch: 7 \tTraining Loss: 22.801298 \tValidation Loss: 23.747245\n", + "Validation loss decreased (24.826429 --> 23.747245). Saving model ...\n", + "Epoch: 8 \tTraining Loss: 21.744182 \tValidation Loss: 22.980112\n", + "Validation loss decreased (23.747245 --> 22.980112). Saving model ...\n", + "Epoch: 9 \tTraining Loss: 20.894626 \tValidation Loss: 23.617148\n", + "Epoch: 10 \tTraining Loss: 20.122914 \tValidation Loss: 22.567898\n", + "Validation loss decreased (22.980112 --> 22.567898). Saving model ...\n", + "Epoch: 11 \tTraining Loss: 19.388523 \tValidation Loss: 22.252618\n", + "Validation loss decreased (22.567898 --> 22.252618). Saving model ...\n", + "Epoch: 12 \tTraining Loss: 18.663162 \tValidation Loss: 22.011314\n", + "Validation loss decreased (22.252618 --> 22.011314). Saving model ...\n", + "Epoch: 13 \tTraining Loss: 18.052861 \tValidation Loss: 21.791003\n", + "Validation loss decreased (22.011314 --> 21.791003). Saving model ...\n", + "Epoch: 14 \tTraining Loss: 17.469482 \tValidation Loss: 21.675218\n", + "Validation loss decreased (21.791003 --> 21.675218). Saving model ...\n", + "Epoch: 15 \tTraining Loss: 16.849947 \tValidation Loss: 22.081622\n", + "Epoch: 16 \tTraining Loss: 16.281122 \tValidation Loss: 21.900523\n" ] }, { @@ -404,9 +411,16 @@ "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[1;32md:\\ECL\\3A\\MOD\\IA\\TD1\\gitlab_repo\\mod_4_6-td2\\TD2 Deep Learning.ipynb Cell 15\u001b[0m line \u001b[0;36m2\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X20sZmlsZQ%3D%3D?line=25'>26</a>\u001b[0m loss \u001b[39m=\u001b[39m criterion(output, target)\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X20sZmlsZQ%3D%3D?line=26'>27</a>\u001b[0m \u001b[39m# Backward pass: compute gradient of the loss with respect to model parameters\u001b[39;00m\n\u001b[1;32m---> <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X20sZmlsZQ%3D%3D?line=27'>28</a>\u001b[0m loss\u001b[39m.\u001b[39;49mbackward()\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X20sZmlsZQ%3D%3D?line=28'>29</a>\u001b[0m \u001b[39m# Perform a single optimization step (parameter update)\u001b[39;00m\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X20sZmlsZQ%3D%3D?line=29'>30</a>\u001b[0m optimizer\u001b[39m.\u001b[39mstep()\n", - "File \u001b[1;32mc:\\Users\\basil\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\torch\\_tensor.py:488\u001b[0m, in \u001b[0;36mTensor.backward\u001b[1;34m(self, gradient, retain_graph, create_graph, inputs)\u001b[0m\n\u001b[0;32m 478\u001b[0m \u001b[39mif\u001b[39;00m has_torch_function_unary(\u001b[39mself\u001b[39m):\n\u001b[0;32m 479\u001b[0m \u001b[39mreturn\u001b[39;00m handle_torch_function(\n\u001b[0;32m 480\u001b[0m Tensor\u001b[39m.\u001b[39mbackward,\n\u001b[0;32m 481\u001b[0m (\u001b[39mself\u001b[39m,),\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 486\u001b[0m inputs\u001b[39m=\u001b[39minputs,\n\u001b[0;32m 487\u001b[0m )\n\u001b[1;32m--> 488\u001b[0m torch\u001b[39m.\u001b[39;49mautograd\u001b[39m.\u001b[39;49mbackward(\n\u001b[0;32m 489\u001b[0m \u001b[39mself\u001b[39;49m, gradient, retain_graph, create_graph, inputs\u001b[39m=\u001b[39;49minputs\n\u001b[0;32m 490\u001b[0m )\n", - "File \u001b[1;32mc:\\Users\\basil\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\torch\\autograd\\__init__.py:197\u001b[0m, in \u001b[0;36mbackward\u001b[1;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)\u001b[0m\n\u001b[0;32m 192\u001b[0m retain_graph \u001b[39m=\u001b[39m create_graph\n\u001b[0;32m 194\u001b[0m \u001b[39m# The reason we repeat same the comment below is that\u001b[39;00m\n\u001b[0;32m 195\u001b[0m \u001b[39m# some Python versions print out the first line of a multi-line function\u001b[39;00m\n\u001b[0;32m 196\u001b[0m \u001b[39m# calls in the traceback and some print out the last line\u001b[39;00m\n\u001b[1;32m--> 197\u001b[0m Variable\u001b[39m.\u001b[39;49m_execution_engine\u001b[39m.\u001b[39;49mrun_backward( \u001b[39m# Calls into the C++ engine to run the backward pass\u001b[39;49;00m\n\u001b[0;32m 198\u001b[0m tensors, grad_tensors_, retain_graph, create_graph, inputs,\n\u001b[0;32m 199\u001b[0m allow_unreachable\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m, accumulate_grad\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m)\n", + "\u001b[1;32md:\\ECL\\3A\\MOD\\IA\\TD1\\gitlab_repo\\mod_4_6-td2\\TD2 Deep Learning.ipynb Cell 15\u001b[0m line \u001b[0;36m1\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X20sZmlsZQ%3D%3D?line=14'>15</a>\u001b[0m \u001b[39m# Train the model\u001b[39;00m\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X20sZmlsZQ%3D%3D?line=15'>16</a>\u001b[0m model\u001b[39m.\u001b[39mtrain()\n\u001b[1;32m---> <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X20sZmlsZQ%3D%3D?line=16'>17</a>\u001b[0m \u001b[39mfor\u001b[39;00m data, target \u001b[39min\u001b[39;00m train_loader:\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X20sZmlsZQ%3D%3D?line=17'>18</a>\u001b[0m \u001b[39m# Move tensors to GPU if CUDA is available\u001b[39;00m\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X20sZmlsZQ%3D%3D?line=18'>19</a>\u001b[0m \u001b[39mif\u001b[39;00m train_on_gpu:\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X20sZmlsZQ%3D%3D?line=19'>20</a>\u001b[0m data, target \u001b[39m=\u001b[39m data\u001b[39m.\u001b[39mcuda(), target\u001b[39m.\u001b[39mcuda()\n", + "File \u001b[1;32mc:\\Users\\basil\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\torch\\utils\\data\\dataloader.py:628\u001b[0m, in \u001b[0;36m_BaseDataLoaderIter.__next__\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 625\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_sampler_iter \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m 626\u001b[0m \u001b[39m# TODO(https://github.com/pytorch/pytorch/issues/76750)\u001b[39;00m\n\u001b[0;32m 627\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_reset() \u001b[39m# type: ignore[call-arg]\u001b[39;00m\n\u001b[1;32m--> 628\u001b[0m data \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_next_data()\n\u001b[0;32m 629\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_num_yielded \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m \u001b[39m1\u001b[39m\n\u001b[0;32m 630\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_dataset_kind \u001b[39m==\u001b[39m _DatasetKind\u001b[39m.\u001b[39mIterable \u001b[39mand\u001b[39;00m \\\n\u001b[0;32m 631\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_IterableDataset_len_called \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39mand\u001b[39;00m \\\n\u001b[0;32m 632\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_num_yielded \u001b[39m>\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_IterableDataset_len_called:\n", + "File \u001b[1;32mc:\\Users\\basil\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\torch\\utils\\data\\dataloader.py:671\u001b[0m, in \u001b[0;36m_SingleProcessDataLoaderIter._next_data\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 669\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_next_data\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[0;32m 670\u001b[0m index \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_next_index() \u001b[39m# may raise StopIteration\u001b[39;00m\n\u001b[1;32m--> 671\u001b[0m data \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_dataset_fetcher\u001b[39m.\u001b[39;49mfetch(index) \u001b[39m# may raise StopIteration\u001b[39;00m\n\u001b[0;32m 672\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_pin_memory:\n\u001b[0;32m 673\u001b[0m data \u001b[39m=\u001b[39m _utils\u001b[39m.\u001b[39mpin_memory\u001b[39m.\u001b[39mpin_memory(data, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_pin_memory_device)\n", + "File \u001b[1;32mc:\\Users\\basil\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\torch\\utils\\data\\_utils\\fetch.py:58\u001b[0m, in \u001b[0;36m_MapDatasetFetcher.fetch\u001b[1;34m(self, possibly_batched_index)\u001b[0m\n\u001b[0;32m 56\u001b[0m data \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdataset\u001b[39m.\u001b[39m__getitems__(possibly_batched_index)\n\u001b[0;32m 57\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m---> 58\u001b[0m data \u001b[39m=\u001b[39m [\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdataset[idx] \u001b[39mfor\u001b[39;00m idx \u001b[39min\u001b[39;00m possibly_batched_index]\n\u001b[0;32m 59\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m 60\u001b[0m data \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdataset[possibly_batched_index]\n", + "File \u001b[1;32mc:\\Users\\basil\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\torch\\utils\\data\\_utils\\fetch.py:58\u001b[0m, in \u001b[0;36m<listcomp>\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 56\u001b[0m data \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdataset\u001b[39m.\u001b[39m__getitems__(possibly_batched_index)\n\u001b[0;32m 57\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m---> 58\u001b[0m data \u001b[39m=\u001b[39m [\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mdataset[idx] \u001b[39mfor\u001b[39;00m idx \u001b[39min\u001b[39;00m possibly_batched_index]\n\u001b[0;32m 59\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m 60\u001b[0m data \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdataset[possibly_batched_index]\n", + "File \u001b[1;32mc:\\Users\\basil\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\torchvision\\datasets\\cifar.py:118\u001b[0m, in \u001b[0;36mCIFAR10.__getitem__\u001b[1;34m(self, index)\u001b[0m\n\u001b[0;32m 115\u001b[0m img \u001b[39m=\u001b[39m Image\u001b[39m.\u001b[39mfromarray(img)\n\u001b[0;32m 117\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtransform \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m--> 118\u001b[0m img \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mtransform(img)\n\u001b[0;32m 120\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtarget_transform \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m 121\u001b[0m target \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtarget_transform(target)\n", + "File \u001b[1;32mc:\\Users\\basil\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\torchvision\\transforms\\transforms.py:95\u001b[0m, in \u001b[0;36mCompose.__call__\u001b[1;34m(self, img)\u001b[0m\n\u001b[0;32m 93\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m, img):\n\u001b[0;32m 94\u001b[0m \u001b[39mfor\u001b[39;00m t \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtransforms:\n\u001b[1;32m---> 95\u001b[0m img \u001b[39m=\u001b[39m t(img)\n\u001b[0;32m 96\u001b[0m \u001b[39mreturn\u001b[39;00m img\n", + "File \u001b[1;32mc:\\Users\\basil\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\torch\\nn\\modules\\module.py:1194\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *input, **kwargs)\u001b[0m\n\u001b[0;32m 1190\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m 1191\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m 1192\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m 1193\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1194\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39m\u001b[39minput\u001b[39m, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n\u001b[0;32m 1195\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[0;32m 1196\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n", + "File \u001b[1;32mc:\\Users\\basil\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\torchvision\\transforms\\transforms.py:270\u001b[0m, in \u001b[0;36mNormalize.forward\u001b[1;34m(self, tensor)\u001b[0m\n\u001b[0;32m 262\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\u001b[39mself\u001b[39m, tensor: Tensor) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m Tensor:\n\u001b[0;32m 263\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"\u001b[39;00m\n\u001b[0;32m 264\u001b[0m \u001b[39m Args:\u001b[39;00m\n\u001b[0;32m 265\u001b[0m \u001b[39m tensor (Tensor): Tensor image to be normalized.\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 268\u001b[0m \u001b[39m Tensor: Normalized Tensor image.\u001b[39;00m\n\u001b[0;32m 269\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 270\u001b[0m \u001b[39mreturn\u001b[39;00m F\u001b[39m.\u001b[39;49mnormalize(tensor, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mmean, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mstd, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49minplace)\n", + "File \u001b[1;32mc:\\Users\\basil\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\torchvision\\transforms\\functional.py:360\u001b[0m, in \u001b[0;36mnormalize\u001b[1;34m(tensor, mean, std, inplace)\u001b[0m\n\u001b[0;32m 357\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39misinstance\u001b[39m(tensor, torch\u001b[39m.\u001b[39mTensor):\n\u001b[0;32m 358\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mTypeError\u001b[39;00m(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mimg should be Tensor Image. Got \u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mtype\u001b[39m(tensor)\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m)\n\u001b[1;32m--> 360\u001b[0m \u001b[39mreturn\u001b[39;00m F_t\u001b[39m.\u001b[39;49mnormalize(tensor, mean\u001b[39m=\u001b[39;49mmean, std\u001b[39m=\u001b[39;49mstd, inplace\u001b[39m=\u001b[39;49minplace)\n", "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] } @@ -502,13 +516,13 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 22, "id": "d39df818", "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] @@ -520,10 +534,11 @@ "source": [ "import matplotlib.pyplot as plt\n", "\n", - "# we stopped the training at epoch 22, so train_loss_list has a length of 23\n", - "last_epoch = 22\n", + "# we stopped the training at epoch 16\n", + "overfit = 15\n", + "last_epoch = 16\n", "\n", - "plt.plot(range(last_epoch+1), train_loss_list)\n", + "plt.plot(range(overfit), train_loss_list[:overfit])\n", "plt.xlabel(\"Epoch\")\n", "plt.xticks(range(last_epoch+1))\n", "plt.ylabel(\"Train Loss\")\n", @@ -541,7 +556,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 10, "id": "e93efdfc", "metadata": {}, "outputs": [ @@ -549,20 +564,20 @@ "name": "stdout", "output_type": "stream", "text": [ - "Test Loss: 21.040502\n", + "Test Loss: 21.245559\n", "\n", - "Test Accuracy of airplane: 69% (696/1000)\n", + "Test Accuracy of airplane: 68% (681/1000)\n", "Test Accuracy of automobile: 79% (798/1000)\n", - "Test Accuracy of bird: 48% (482/1000)\n", - "Test Accuracy of cat: 39% (390/1000)\n", - "Test Accuracy of deer: 54% (545/1000)\n", - "Test Accuracy of dog: 63% (636/1000)\n", - "Test Accuracy of frog: 75% (758/1000)\n", - "Test Accuracy of horse: 63% (630/1000)\n", - "Test Accuracy of ship: 73% (736/1000)\n", - "Test Accuracy of truck: 72% (724/1000)\n", + "Test Accuracy of bird: 40% (407/1000)\n", + "Test Accuracy of cat: 47% (473/1000)\n", + "Test Accuracy of deer: 64% (644/1000)\n", + "Test Accuracy of dog: 52% (529/1000)\n", + "Test Accuracy of frog: 74% (740/1000)\n", + "Test Accuracy of horse: 73% (736/1000)\n", + "Test Accuracy of ship: 73% (731/1000)\n", + "Test Accuracy of truck: 70% (702/1000)\n", "\n", - "Test Accuracy (Overall): 63% (6395/10000)\n" + "Test Accuracy (Overall): 64% (6441/10000)\n" ] } ], @@ -667,9 +682,10 @@ "- After second convolutional layer : $size_{output} = \\frac{(16 + 2*1 - 3) + 1}{2} = 8$ so the size is $32*8*8$\n", "- After third convolutional layer : $size_{output} = \\frac{(8 + 2*1 - 3) + 1}{2} = 4$ so the size is $64*4*4$\n", "***\n", - "We apply a dropout function, which parameter represents the probability to not correct a parameter during the error backpropagation. It seems that a dropout of 0.5 gives the best results :\n", + "We apply a dropout function, with a parameter which represents the probability not to update a parameter during the error backpropagation. It seems that a dropout of 0.5 gives the best results :\n", "- [source1](https://medium.com/@upendravijay2/how-does-dropout-help-to-avoid-overfitting-in-neural-networks-91b90fd86b20#:~:text=A%20good%20value%20for%20dropout,new%20network%20that%20uses%20dropout.) recommends a dropout comprised between 0.5 and 0.8\n", "- [source3](https://arxiv.org/pdf/1207.0580.pdf) seems to recommend a dropout of 0.5\n", + "Therefore we implement a dropout with a value of 0.5.\n", "***" ] }, @@ -682,7 +698,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -745,73 +761,64 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Epoch: 0 \tTraining Loss: 45.826931 \tValidation Loss: 44.174282\n", - "Validation loss decreased (inf --> 44.174282). Saving model ...\n", - "Epoch: 1 \tTraining Loss: 40.520748 \tValidation Loss: 36.159333\n", - "Validation loss decreased (44.174282 --> 36.159333). Saving model ...\n", - "Epoch: 2 \tTraining Loss: 35.712979 \tValidation Loss: 32.427382\n", - "Validation loss decreased (36.159333 --> 32.427382). Saving model ...\n", - "Epoch: 3 \tTraining Loss: 32.764083 \tValidation Loss: 29.844782\n", - "Validation loss decreased (32.427382 --> 29.844782). Saving model ...\n", - "Epoch: 4 \tTraining Loss: 30.879695 \tValidation Loss: 27.948342\n", - "Validation loss decreased (29.844782 --> 27.948342). Saving model ...\n", - "Epoch: 5 \tTraining Loss: 29.150523 \tValidation Loss: 27.071934\n", - "Validation loss decreased (27.948342 --> 27.071934). Saving model ...\n", - "Epoch: 6 \tTraining Loss: 27.658205 \tValidation Loss: 25.440916\n", - "Validation loss decreased (27.071934 --> 25.440916). Saving model ...\n", - "Epoch: 7 \tTraining Loss: 26.286160 \tValidation Loss: 24.876248\n", - "Validation loss decreased (25.440916 --> 24.876248). Saving model ...\n", - "Epoch: 8 \tTraining Loss: 24.907383 \tValidation Loss: 22.678210\n", - "Validation loss decreased (24.876248 --> 22.678210). Saving model ...\n", - "Epoch: 9 \tTraining Loss: 23.764845 \tValidation Loss: 21.806124\n", - "Validation loss decreased (22.678210 --> 21.806124). Saving model ...\n", - "Epoch: 10 \tTraining Loss: 22.622246 \tValidation Loss: 20.644137\n", - "Validation loss decreased (21.806124 --> 20.644137). Saving model ...\n", - "Epoch: 11 \tTraining Loss: 21.655865 \tValidation Loss: 19.787687\n", - "Validation loss decreased (20.644137 --> 19.787687). Saving model ...\n", - "Epoch: 12 \tTraining Loss: 20.642668 \tValidation Loss: 19.097233\n", - "Validation loss decreased (19.787687 --> 19.097233). Saving model ...\n", - "Epoch: 13 \tTraining Loss: 19.765453 \tValidation Loss: 18.346761\n", - "Validation loss decreased (19.097233 --> 18.346761). Saving model ...\n", - "Epoch: 14 \tTraining Loss: 18.887776 \tValidation Loss: 17.968003\n", - "Validation loss decreased (18.346761 --> 17.968003). Saving model ...\n", - "Epoch: 15 \tTraining Loss: 18.183972 \tValidation Loss: 17.411004\n", - "Validation loss decreased (17.968003 --> 17.411004). Saving model ...\n", - "Epoch: 16 \tTraining Loss: 17.510276 \tValidation Loss: 17.365755\n", - "Validation loss decreased (17.411004 --> 17.365755). Saving model ...\n", - "Epoch: 17 \tTraining Loss: 16.788606 \tValidation Loss: 16.609059\n", - "Validation loss decreased (17.365755 --> 16.609059). Saving model ...\n", - "Epoch: 18 \tTraining Loss: 16.158192 \tValidation Loss: 16.423296\n", - "Validation loss decreased (16.609059 --> 16.423296). Saving model ...\n", - "Epoch: 19 \tTraining Loss: 15.521866 \tValidation Loss: 16.143898\n", - "Validation loss decreased (16.423296 --> 16.143898). Saving model ...\n", - "Epoch: 20 \tTraining Loss: 14.844376 \tValidation Loss: 16.076946\n", - "Validation loss decreased (16.143898 --> 16.076946). Saving model ...\n", - "Epoch: 21 \tTraining Loss: 14.292540 \tValidation Loss: 16.009578\n", - "Validation loss decreased (16.076946 --> 16.009578). Saving model ...\n", - "Epoch: 22 \tTraining Loss: 13.765445 \tValidation Loss: 16.065225\n", - "Epoch: 23 \tTraining Loss: 13.127047 \tValidation Loss: 15.611544\n", - "Validation loss decreased (16.009578 --> 15.611544). Saving model ...\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[1;32md:\\ECL\\3A\\MOD\\IA\\TD1\\gitlab_repo\\mod_4_6-td2\\TD2 Deep Learning.ipynb Cell 27\u001b[0m line \u001b[0;36m2\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X61sZmlsZQ%3D%3D?line=25'>26</a>\u001b[0m loss \u001b[39m=\u001b[39m criterion(output, target)\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X61sZmlsZQ%3D%3D?line=26'>27</a>\u001b[0m \u001b[39m# Backward pass: compute gradient of the loss with respect to model parameters\u001b[39;00m\n\u001b[1;32m---> <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X61sZmlsZQ%3D%3D?line=27'>28</a>\u001b[0m loss\u001b[39m.\u001b[39;49mbackward()\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X61sZmlsZQ%3D%3D?line=28'>29</a>\u001b[0m \u001b[39m# Perform a single optimization step (parameter update)\u001b[39;00m\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/ECL/3A/MOD/IA/TD1/gitlab_repo/mod_4_6-td2/TD2%20Deep%20Learning.ipynb#X61sZmlsZQ%3D%3D?line=29'>30</a>\u001b[0m optimizer\u001b[39m.\u001b[39mstep()\n", - "File \u001b[1;32mc:\\Users\\basil\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\torch\\_tensor.py:488\u001b[0m, in \u001b[0;36mTensor.backward\u001b[1;34m(self, gradient, retain_graph, create_graph, inputs)\u001b[0m\n\u001b[0;32m 478\u001b[0m \u001b[39mif\u001b[39;00m has_torch_function_unary(\u001b[39mself\u001b[39m):\n\u001b[0;32m 479\u001b[0m \u001b[39mreturn\u001b[39;00m handle_torch_function(\n\u001b[0;32m 480\u001b[0m Tensor\u001b[39m.\u001b[39mbackward,\n\u001b[0;32m 481\u001b[0m (\u001b[39mself\u001b[39m,),\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 486\u001b[0m inputs\u001b[39m=\u001b[39minputs,\n\u001b[0;32m 487\u001b[0m )\n\u001b[1;32m--> 488\u001b[0m torch\u001b[39m.\u001b[39;49mautograd\u001b[39m.\u001b[39;49mbackward(\n\u001b[0;32m 489\u001b[0m \u001b[39mself\u001b[39;49m, gradient, retain_graph, create_graph, inputs\u001b[39m=\u001b[39;49minputs\n\u001b[0;32m 490\u001b[0m )\n", - "File \u001b[1;32mc:\\Users\\basil\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\torch\\autograd\\__init__.py:197\u001b[0m, in \u001b[0;36mbackward\u001b[1;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)\u001b[0m\n\u001b[0;32m 192\u001b[0m retain_graph \u001b[39m=\u001b[39m create_graph\n\u001b[0;32m 194\u001b[0m \u001b[39m# The reason we repeat same the comment below is that\u001b[39;00m\n\u001b[0;32m 195\u001b[0m \u001b[39m# some Python versions print out the first line of a multi-line function\u001b[39;00m\n\u001b[0;32m 196\u001b[0m \u001b[39m# calls in the traceback and some print out the last line\u001b[39;00m\n\u001b[1;32m--> 197\u001b[0m Variable\u001b[39m.\u001b[39;49m_execution_engine\u001b[39m.\u001b[39;49mrun_backward( \u001b[39m# Calls into the C++ engine to run the backward pass\u001b[39;49;00m\n\u001b[0;32m 198\u001b[0m tensors, grad_tensors_, retain_graph, create_graph, inputs,\n\u001b[0;32m 199\u001b[0m allow_unreachable\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m, accumulate_grad\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m)\n", - "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + "Epoch: 0 \tTraining Loss: 45.957994 \tValidation Loss: 45.453136\n", + "Validation loss decreased (inf --> 45.453136). Saving model ...\n", + "Epoch: 1 \tTraining Loss: 41.204990 \tValidation Loss: 36.171040\n", + "Validation loss decreased (45.453136 --> 36.171040). Saving model ...\n", + "Epoch: 2 \tTraining Loss: 35.501102 \tValidation Loss: 32.933496\n", + "Validation loss decreased (36.171040 --> 32.933496). Saving model ...\n", + "Epoch: 3 \tTraining Loss: 32.841249 \tValidation Loss: 30.118260\n", + "Validation loss decreased (32.933496 --> 30.118260). Saving model ...\n", + "Epoch: 4 \tTraining Loss: 30.851882 \tValidation Loss: 28.085835\n", + "Validation loss decreased (30.118260 --> 28.085835). Saving model ...\n", + "Epoch: 5 \tTraining Loss: 29.164981 \tValidation Loss: 26.311516\n", + "Validation loss decreased (28.085835 --> 26.311516). Saving model ...\n", + "Epoch: 6 \tTraining Loss: 27.612603 \tValidation Loss: 24.930808\n", + "Validation loss decreased (26.311516 --> 24.930808). Saving model ...\n", + "Epoch: 7 \tTraining Loss: 26.152063 \tValidation Loss: 23.870665\n", + "Validation loss decreased (24.930808 --> 23.870665). Saving model ...\n", + "Epoch: 8 \tTraining Loss: 24.808076 \tValidation Loss: 22.573699\n", + "Validation loss decreased (23.870665 --> 22.573699). Saving model ...\n", + "Epoch: 9 \tTraining Loss: 23.563777 \tValidation Loss: 20.767552\n", + "Validation loss decreased (22.573699 --> 20.767552). Saving model ...\n", + "Epoch: 10 \tTraining Loss: 22.301092 \tValidation Loss: 20.177089\n", + "Validation loss decreased (20.767552 --> 20.177089). Saving model ...\n", + "Epoch: 11 \tTraining Loss: 21.413816 \tValidation Loss: 19.422885\n", + "Validation loss decreased (20.177089 --> 19.422885). Saving model ...\n", + "Epoch: 12 \tTraining Loss: 20.356993 \tValidation Loss: 18.999663\n", + "Validation loss decreased (19.422885 --> 18.999663). Saving model ...\n", + "Epoch: 13 \tTraining Loss: 19.352594 \tValidation Loss: 17.884081\n", + "Validation loss decreased (18.999663 --> 17.884081). Saving model ...\n", + "Epoch: 14 \tTraining Loss: 18.529844 \tValidation Loss: 17.269852\n", + "Validation loss decreased (17.884081 --> 17.269852). Saving model ...\n", + "Epoch: 15 \tTraining Loss: 17.687516 \tValidation Loss: 16.816537\n", + "Validation loss decreased (17.269852 --> 16.816537). Saving model ...\n", + "Epoch: 16 \tTraining Loss: 16.958101 \tValidation Loss: 16.552591\n", + "Validation loss decreased (16.816537 --> 16.552591). Saving model ...\n", + "Epoch: 17 \tTraining Loss: 16.270467 \tValidation Loss: 16.126114\n", + "Validation loss decreased (16.552591 --> 16.126114). Saving model ...\n", + "Epoch: 18 \tTraining Loss: 15.676789 \tValidation Loss: 16.180268\n", + "Epoch: 19 \tTraining Loss: 15.014789 \tValidation Loss: 16.113433\n", + "Validation loss decreased (16.126114 --> 16.113433). Saving model ...\n", + "Epoch: 20 \tTraining Loss: 14.352066 \tValidation Loss: 15.588602\n", + "Validation loss decreased (16.113433 --> 15.588602). Saving model ...\n", + "Epoch: 21 \tTraining Loss: 13.847914 \tValidation Loss: 15.765144\n", + "Epoch: 22 \tTraining Loss: 13.369290 \tValidation Loss: 15.462388\n", + "Validation loss decreased (15.588602 --> 15.462388). Saving model ...\n", + "Epoch: 23 \tTraining Loss: 12.790801 \tValidation Loss: 15.474556\n", + "Epoch: 24 \tTraining Loss: 12.315276 \tValidation Loss: 16.384042\n", + "Epoch: 25 \tTraining Loss: 11.817489 \tValidation Loss: 15.977999\n", + "Epoch: 26 \tTraining Loss: 11.399328 \tValidation Loss: 15.734570\n", + "Epoch: 27 \tTraining Loss: 10.892922 \tValidation Loss: 15.807630\n", + "Epoch: 28 \tTraining Loss: 10.461774 \tValidation Loss: 15.664097\n", + "Epoch: 29 \tTraining Loss: 10.159506 \tValidation Loss: 15.932719\n" ] } ], @@ -822,7 +829,7 @@ "optimizer = optim.SGD(model.parameters(), lr=0.01) # specify optimizer\n", "\n", "n_epochs = 30 # number of epochs to train the model\n", - "train_loss_list = [] # list to store loss to visualize\n", + "new_train_loss_list = [] # list to store loss to visualize\n", "valid_loss_min = np.Inf # track change in validation loss\n", "\n", "for epoch in range(n_epochs):\n", @@ -865,7 +872,7 @@ " # Calculate average losses\n", " train_loss = train_loss / len(train_loader)\n", " valid_loss = valid_loss / len(valid_loader)\n", - " train_loss_list.append(train_loss)\n", + " new_train_loss_list.append(train_loss)\n", "\n", " # Print training/validation statistics\n", " print(\n", @@ -887,9 +894,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test Loss: 15.735082\n", + "\n", + "Test Accuracy of airplane: 77% (776/1000)\n", + "Test Accuracy of automobile: 86% (863/1000)\n", + "Test Accuracy of bird: 55% (551/1000)\n", + "Test Accuracy of cat: 64% (648/1000)\n", + "Test Accuracy of deer: 66% (662/1000)\n", + "Test Accuracy of dog: 56% (566/1000)\n", + "Test Accuracy of frog: 84% (849/1000)\n", + "Test Accuracy of horse: 79% (798/1000)\n", + "Test Accuracy of ship: 82% (829/1000)\n", + "Test Accuracy of truck: 84% (840/1000)\n", + "\n", + "Test Accuracy (Overall): 73% (7382/10000)\n" + ] + } + ], "source": [ "model.load_state_dict(torch.load(\"./new_model_cifar.pt\"))\n", "\n", @@ -953,6 +981,47 @@ ")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This second model has an overall accuracy of about 73% which is better than the previous one. We notice that overfit starts happening on epoch 23, which is better than the first model. It means that this new model stops learning at about epoch 23, whereas the first one stops learning at about epoch 14. " + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAACRO0lEQVR4nOzdd1gUV9sG8Ht2gaX3LlVQiigqomLDgoi9a+xEEyv2aKLRWBNr7D2JvTesUaxgwy52AVFjRVCkwwK75/uDj31dAd2FhaE8v+vaK3F2zplnd4flZuacGY4xxkAIIYQQUkEJ+C6AEEIIIaQkUdghhBBCSIVGYYcQQgghFRqFHUIIIYRUaBR2CCGEEFKhUdghhBBCSIVGYYcQQgghFRqFHUIIIYRUaBR2CCGEEFKhUdghMhzHYebMmXyXUWzbtm2Dq6sr1NXVYWhoyHc5AICcnBxMnjwZtra2EAgE6NKlC98lVRqq2h9CQ0PBcRxCQ0NVVlt54eDggMDAwCK1LWvfK4GBgXBwcOC7jHKvefPmaN68eZHaFmd/KioKO5+JiYnBsGHDULVqVWhqakJfXx+NGzfG8uXLkZGRwXd5RAFPnjxBYGAgnJyc8Ndff2HDhg2Frjtz5kxwHCd7aGtrw93dHdOmTUNycrJK69q4cSMWLVqEHj16YMuWLRg/frxK+ycFK87+8Plj3bp1Kq8tPT0dM2fOVDg85YUtjuOwffv2Atdp3LgxOI6Dh4eHCiutnJo3bw6O49CxY8d8z7148QIcx2Hx4sU8VJa/Do7jMHfu3ALX6devHziOg66ubilXV7ao8V1AWXH8+HH07NkTIpEIAwcOhIeHB7KysnDp0iVMmjQJDx8+/OoXZUWQkZEBNbXyvUuEhoZCKpVi+fLlcHZ2VqjN2rVroauri9TUVJw6dQq///47zp07h8uXL4PjOJXUde7cOVSpUgVLly5VSX9EMcXZHz7XoEEDODk5ISMjAxoaGiqpLT09HbNmzQIApf5C1tTUxM6dO9G/f3+55S9evMCVK1egqampkvpIrmPHjuHWrVvw8vLiu5RCaWpqYteuXZg2bZrc8rS0NBw+fJj2CVDYAQA8f/4c3333Hezt7XHu3DlYWVnJnhs1ahSePn2K48eP81hhyZFKpcjKyoKmpmaF+IGIi4sDAKVOV/To0QOmpqYAgOHDh6N79+44ePAgrl69Ch8fnyLXwhhDZmYmtLS0EBcXp9JTap9/bqRwxd0fvqTI+52eng5tbW2Ft6esdu3a4ciRI/jw4YNcnTt37oSFhQWqVauGT58+ldj2KxM7OzukpKRg1qxZOHLkCN/lFKpdu3Y4ePAg7t69C09PT9nyw4cPIysrCwEBATh37hyPFfKPTmMBWLhwIVJTU/HPP//IBZ08zs7OGDt2rOzfOTk5mDNnDpycnCASieDg4ICpU6dCLBbLtXNwcECHDh0QGhqKevXqQUtLCzVr1pQdtj548CBq1qwJTU1NeHl54c6dO3LtAwMDoauri2fPnqFNmzbQ0dGBtbU1Zs+ejS9vVr948WI0atQIJiYm0NLSgpeXF/bv35/vtXAch6CgIOzYsQM1atSASCTCyZMnZc99fm49JSUF48aNg4ODA0QiEczNzdG6dWvcvn1brs99+/bBy8sLWlpaMDU1Rf/+/fHmzZsCX8ubN2/QpUsX6OrqwszMDD/99BMkEkkhn4y8NWvWyGq2trbGqFGjkJiYKPd+z5gxAwBgZmZW5LECLVu2BJAbgoHcYLFs2TLUqFEDmpqasLCwwLBhw/L9Qsn7vENCQmSf9/r168FxHM6fP4+HDx/KDjnn7QNpaWmYOHEibG1tIRKJ4OLigsWLF+f7fAv73DZv3gyO43Dp0iWMGTMGZmZmMDQ0xLBhw5CVlYXExEQMHDgQRkZGMDIywuTJk4u97xw6dAgeHh4QiUSoUaOGbP/53Js3bzBkyBBYW1tDJBLB0dERI0aMQFZWlmydxMREjBs3TvbanZ2dsWDBAkilUoU+p9LaH/IUNGanefPm8PDwwK1bt9CsWTNoa2tj6tSpAICbN2+iTZs2MDU1hZaWFhwdHTF48GAAuUdhzMzMAACzZs2S7ReK1Ne5c2eIRCLs27dPbvnOnTvRq1cvCIXCfG0U/c5ijGHu3LmwsbGBtrY2WrRogYcPHxZYR3E/v89lZWXht99+g5eXFwwMDKCjo4OmTZvi/Pnzcut9fvpow4YNstfj7e2NGzdu5Os3b1/V1NSEh4cHgoODlapLT08P48ePx9GjR/N97xVEkfekbt266Natm1y7mjVrguM43Lt3T7Zsz5494DgOjx8//uZ2fXx84OjoiJ07d8ot37FjBwICAmBsbFxgu2/9DOXJe6+1tLRQv359XLx4scD+xGIxZsyYAWdnZ4hEItja2mLy5Mn59jNeMMKqVKnCqlatqvD6gwYNYgBYjx492OrVq9nAgQMZANalSxe59ezt7ZmLiwuzsrJiM2fOZEuXLmVVqlRhurq6bPv27czOzo7Nnz+fzZ8/nxkYGDBnZ2cmkUjktqOpqcmqVavGBgwYwFatWsU6dOjAALDp06fLbcvGxoaNHDmSrVq1ii1ZsoTVr1+fAWDHjh2TWw8Ac3NzY2ZmZmzWrFls9erV7M6dO7LnZsyYIVu3b9++TENDg02YMIH9/fffbMGCBaxjx45s+/btsnU2bdrEADBvb2+2dOlS9ssvvzAtLS3m4ODAPn36lO+11KhRgw0ePJitXbuWde/enQFga9as+eZ7PmPGDAaA+fn5sZUrV7KgoCAmFAqZt7c3y8rKYowxFhwczLp27coAsLVr17Jt27axu3fvfrPP+Ph4ueXjx49nANjJkycZY4z98MMPTE1Njf34449s3bp17Oeff2Y6Ojpy22Ys9/N2dnZmRkZG7JdffmHr1q1jx44dY9u2bWOurq7MxsaGbdu2jW3bto3FxsYyqVTKWrZsyTiOYz/88ANbtWoV69ixIwPAxo0bp9Dnlvf+165dmwUEBLDVq1ezAQMGMABs8uTJrEmTJqxv375szZo1sn1ny5Ytcn0rs+94enoyKysrNmfOHLZs2TJWtWpVpq2tzT58+CBb782bN8za2pppa2uzcePGsXXr1rHp06czNzc32T6RlpbGatWqxUxMTNjUqVPZunXr2MCBAxnHcWzs2LG87g+RkZEsPj5e9khISGCMMXb+/HkGgJ0/f17WxtfXl1laWjIzMzM2evRotn79enbo0CH2/v17ZmRkxKpXr84WLVrE/vrrL/brr78yNzc3xhhjqampbO3atQwA69q1q2y/+Fp9edvft28f69u3L2vatKnsuYiICAaAhYeHM19fX1ajRg25top+Z02bNo0BYO3atWOrVq1igwcPZtbW1szU1JQNGjRItp4yn9+X3ysFiY+PZ1ZWVmzChAls7dq1bOHChczFxYWpq6vLvp8YY+z58+cMAKtTpw5zdnZmCxYsYAsXLmSmpqbMxsZG7ucxJCSECQQC5uHhwZYsWcJ+/fVXZmBgwGrUqMHs7e2/Wg9jTPY+JiUlMSMjI9axY8d8dSxatEjp92TMmDHMzMxM9u+PHz8yjuOYQCBgq1atki0fNWqU3HoF+byOqVOnMjs7OyaVSmXvqZqaGtu1axcbNGgQ09HRkWuryM8QY4z9/fffDABr1KgRW7FiBRs3bhwzNDRkVatWZb6+vrL1JBIJ8/f3l/3cr1+/ngUFBTE1NTXWuXNnuW3b29vL7U+lodKHnaSkJAYg34dRmLwvlR9++EFu+U8//cQAsHPnzsmW2dvbMwDsypUrsmUhISEMANPS0mL//fefbPn69evzfZHmfUGNHj1atkwqlbL27dszDQ0NuV/S6enpcvVkZWUxDw8P1rJlS7nlAJhAIGAPHz7M99q+/FIyMDBgo0aNKvS9yMrKYubm5szDw4NlZGTIlh87dowBYL/99lu+1zJ79my5PurUqcO8vLwK3QZjjMXFxTENDQ3m7+8vFwZXrVrFALCNGzfKlhUWYAry5S+358+fs/Xr1zORSMQsLCxYWloau3jxIgPAduzYIdf25MmT+Zbnfd55IelzBf0COnToEAPA5s6dK7e8R48ejOM49vTpU9mywj63vLDTpk0b2ZccY4z5+PgwjuPY8OHDZctycnKYjY2N3BcUY8rtOxoaGnJ13b17lwFgK1eulC0bOHAgEwgE7MaNG/neh7wa58yZw3R0dFhUVJTc87/88gsTCoXs5cuX+drmKen94ctH3i/GwsIOALZu3Tq5voKDgxmAAt+DPPHx8QoFgTyfh51jx44xjuNk79OkSZNkf7B9ua8p+p2V9762b99ebl+aOnUqAyD3y0mZz0+R15iTk8PEYrHcsk+fPjELCws2ePBg2bK8X+4mJiayEMoYY4cPH2YA2NGjR2XLateuzaysrFhiYqJs2alTp+Q+06/5/H2cNWsWA8Bu3bolV8fnYUfR92Tfvn0MAHv06BFjjLEjR44wkUjEOnXqxHr37i1rV6tWLda1a9ev1vh5HQ8ePGAA2MWLFxljjK1evZrp6uqytLS0fGFH0Z+hvO/42rVry30+GzZsYADkvku2bdvGBAKBbPt51q1bxwCwy5cvy5bxEXYq/WmsvFk3enp6Cq3/77//AgAmTJggt3zixIkAkG9sj7u7u9y4jwYNGgDIPVViZ2eXb/mzZ8/ybTMoKEj2/3mnErKysnDmzBnZci0tLdn/f/r0CUlJSWjatGmBh159fX3h7u7+jVeaO87h2rVrePv2bYHP37x5E3FxcRg5cqTcWIb27dvD1dW1wHFOw4cPl/t306ZNC3zNnztz5gyysrIwbtw4CAT/22V//PFH6OvrF3s8lYuLC8zMzODo6Ihhw4bB2dkZx48fh7a2Nvbt2wcDAwO0bt0aHz58kD28vLygq6ub7zC7o6Mj2rRpo9B2//33XwiFQowZM0Zu+cSJE8EYw4kTJ+SWf+1zGzJkiNxg6gYNGoAxhiFDhsiWCYVC1KtXL9/7rcy+4+fnBycnJ9m/a9WqBX19fVmfUqkUhw4dQseOHVGvXr187fNq3LdvH5o2bQojIyO599XPzw8SiQQXLlwo8HUCJb8/HDhwAKdPn5Y9duzY8dX1RSIRvv/+e7lleWOEjh07huzs7GLVUxB/f38YGxtj9+7dYIxh9+7d6NOnT4HrKvqdlfe+jh49Wm5fGjduXL4+i/P5FUQoFMoGfkulUiQkJCAnJwf16tUrcD/s3bs3jIyMZP9u2rQpgP99f7579w4REREYNGgQDAwMZOu1bt1aoe++L40dOxZGRkayAeUFUfQ9yas1798XL16Et7c3WrduLTs9lJiYiAcPHsjWVUSNGjVQq1Yt7Nq1C0Duac3OnTsXOH5M0Z+hvO/44cOHyw3MDwwMlHtf816/m5sbXF1d5V5/3rCAL78rS1ulH6Csr68PIHd8iiL+++8/CASCfDM7LC0tYWhoiP/++09u+eeBBoBsB7G1tS1w+ZfjQAQCAapWrSq3rHr16gByz1/nOXbsGObOnYuIiAi586MFzSZydHQs9PV9buHChRg0aBBsbW3h5eWFdu3aYeDAgbJ68l6ri4tLvraurq64dOmS3DJNTU3ZOIU8RkZG3xxMWdh2NDQ0ULVq1XzvubIOHDgAfX19qKurw8bGRu6XeXR0NJKSkmBubl5g27wBsHkUfW+B3NdlbW2dL2i7ubnJnle0b2X2sy/fb2X2nS+3A8h/hvHx8UhOTv7m1Ofo6Gjcu3cv3/6Q58v39XMlvT80a9as0AHKBalSpUq+GVq+vr7o3r07Zs2ahaVLl6J58+bo0qUL+vbtC5FIVKz6AEBdXR09e/bEzp07Ub9+fbx69Qp9+/YtcF1Fv7Py/lutWjW59czMzOSCBVC8z68wW7ZswZ9//oknT57IBcSC9vsv98O8+vL2w8JeC5C73ygy/uZzBgYGGDduHGbMmIE7d+7kez8Axd+TvEHkFy9exLBhw3Dx4kW0aNECzZo1w+jRo/Hs2TM8fvwYUqlUqbADAH379sWff/6J8ePH48qVK7LxY19S9GeosPdRXV093++l6OhoPH78WKX7hCpR2NHXh7W1NR48eKBUO0WnJBc0WPBry9kXg0cVcfHiRXTq1AnNmjXDmjVrYGVlBXV1dWzatCnfgDVA/i/5r+nVqxeaNm2K4OBgnDp1CosWLcKCBQtw8OBBtG3bVuk6C3vNfPvaLzepVApzc/NC/7r/8gdb0fe2KL7WtzL72ef7mLL7jqr2W6lUitatW2Py5MkFPp8X6MuDgj4XjuOwf/9+XL16FUePHkVISAgGDx6MP//8E1evXlXJNU/69u2LdevWYebMmfD09PzmEQtVXUYBUP3nt337dgQGBqJLly6YNGkSzM3NIRQKMW/ePMTExORbX5Xfn4oaO3Ysli5dilmzZmHZsmX5nlfmPWnSpAnOnj2LjIwM3Lp1C7/99hs8PDxgaGiIixcv4vHjx9DV1UWdOnWUqrFPnz6YMmUKfvzxR5iYmMDf31+p9sUhlUpRs2ZNLFmypMDnv/zDq7RV+rADAB06dMCGDRsQHh7+zanG9vb2kEqliI6Olv0FDgDv379HYmIi7O3tVVqbVCrFs2fP5H5QoqKiAEB2FdADBw5AU1MTISEhcn81btq0qdjbt7KywsiRIzFy5EjExcWhbt26+P3339G2bVvZa42MjJQdqswTGRmpsvfi8+18/tdEVlYWnj9/Dj8/P5VspyBOTk44c+YMGjdurPIgY29vjzNnziAlJUXu6M6TJ09kz5c0Ve87ZmZm0NfX/+YfD05OTkhNTS3SZ8fn/qCshg0bomHDhvj999+xc+dO9OvXD7t378YPP/xQ7PDRpEkT2NnZITQ0FAsWLCh0PUW/s/L+Gx0dLfe+xsfH5zsaWJzPryD79+9H1apVcfDgQbn3JW82nbI+fy1fioyMLFKfeUd3Zs6ciUGDBuV7Xpn3pGnTpti0aRN2794NiUSCRo0aQSAQoEmTJrKw06hRI6X/QLSzs0Pjxo0RGhqKESNGFHrdNEV/hj5/Hz//js/Ozsbz58/lprk7OTnh7t27aNWqlUqDtapU+jE7ADB58mTo6Ojghx9+wPv37/M9HxMTg+XLlwPIvZ4BgHzJPi/Ntm/fXuX1rVq1Svb/jDGsWrUK6urqaNWqFYDcv3I4jpObwv3ixQscOnSoyNuUSCRISkqSW2Zubg5ra2vZqY569erB3Nwc69atkzv9ceLECTx+/Fhl74Wfnx80NDSwYsUKub/c/vnnHyQlJZXIe56nV69ekEgkmDNnTr7ncnJyCpymqah27dpBIpHIfb4AsHTpUnAcV6SjZ8pS9b6TdyuMo0eP4ubNm/mez/v8evXqhfDwcISEhORbJzExETk5OYVug8/9QVGfPn3Kd5Shdu3aACD7WckbS1HUfYjjOKxYsQIzZszAgAEDCl1P0e8sPz8/qKurY+XKlXK1F3QUozifX0Hyfql/vt1r164hPDxcqX7yWFlZoXbt2tiyZYvc99jp06fx6NGjIvUJ5I5fMjQ0xOzZs/M9p8x7knd6asGCBahVq5bstHPTpk1x9uxZ3Lx5U+lTWHnmzp2LGTNmYPTo0YWuo+jPUL169WBmZoZ169bJXTZi8+bN+fbbXr164c2bN/jrr7/ybS8jIwNpaWlFej2qQkd2kJtId+7cid69e8PNzU3uCspXrlzBvn37ZPfx8PT0xKBBg7BhwwYkJibC19cX169fx5YtW9ClSxe0aNFCpbVpamri5MmTGDRoEBo0aIATJ07g+PHjmDp1quwUSvv27bFkyRIEBASgb9++iIuLw+rVq+Hs7Cx33QZlpKSkwMbGBj169ICnpyd0dXVx5swZ3LhxA3/++SeA3PO2CxYswPfffw9fX1/06dMH79+/x/Lly+Hg4KCyWyKYmZlhypQpmDVrFgICAtCpUydERkZizZo18Pb2znclWVXy9fXFsGHDMG/ePERERMDf3x/q6uqIjo7Gvn37sHz5cvTo0aNIfXfs2BEtWrTAr7/+ihcvXsDT0xOnTp3C4cOHMW7cOLmxQyWlJPadP/74A6dOnYKvry+GDh0KNzc3vHv3Dvv27cOlS5dgaGiISZMm4ciRI+jQoQMCAwPh5eWFtLQ03L9/H/v378eLFy8KPbXI5/6gqC1btmDNmjXo2rUrnJyckJKSgr/++gv6+vqy8KGlpQV3d3fs2bMH1atXh7GxMTw8PJS61UPnzp3RuXPnr66j6HdW3nWv5s2bhw4dOqBdu3a4c+cOTpw4ke+zKM7nV5AOHTrg4MGD6Nq1K9q3b4/nz59j3bp1cHd3R2pqqsL9fG7evHlo3749mjRpgsGDByMhIQErV65EjRo1ityngYEBxo4dW+BAZWXeE2dnZ1haWiIyMlIulDRr1gw///wzABQ57Pj6+sLX1/er6yj6M6Suro65c+di2LBhaNmyJXr37o3nz59j06ZN+cbsDBgwAHv37sXw4cNx/vx5NG7cGBKJBE+ePMHevXtl1x/jTanO/SrjoqKi2I8//sgcHByYhoYG09PTY40bN2YrV65kmZmZsvWys7PZrFmzmKOjI1NXV2e2trZsypQpcuswlju9rn379vm2AyDflO6CpjLmTReMiYmRXb/AwsKCzZgxQ266IGOM/fPPP6xatWpMJBIxV1dXtmnTJtlU2m9t+/Pn8qaIisViNmnSJObp6cn09PSYjo4O8/T0LPCaOHv27GF16tRhIpGIGRsbs379+rHXr1/LrVPQdR4YYwXWWJhVq1YxV1dXpq6uziwsLNiIESPkruXzeX/KTDVWZN0NGzYwLy8vpqWlxfT09FjNmjXZ5MmT2du3b2XrFPZ5M1bw1HPGGEtJSWHjx49n1tbWTF1dnVWrVo0tWrRIbuovY4V/bnlTz7+c4lzYayvocyjuvlPQNNL//vuPDRw4kJmZmTGRSMSqVq3KRo0aJTd9NSUlhU2ZMoU5OzszDQ0NZmpqyho1asQWL14sd52PwpT2/lDY1POCPtfbt2+zPn36MDs7OyYSiZi5uTnr0KEDu3nzptx6V65cYV5eXkxDQ+ObU7Q/n3r+NQXVpOh3lkQiYbNmzWJWVlZMS0uLNW/enD148KDAz1jRz+9br4ux3EsS/PHHH8ze3p6JRCJWp04dduzYMTZo0CC5aeIFfU9+bTsHDhxgbm5uTCQSMXd3d3bw4MF8fRamsM/206dPzMDAoMA6lNmne/bsyQCwPXv2yJZlZWUxbW1tpqGhIXc5j8J87f34XGHfv4r8DDHG2Jo1a5ijoyMTiUSsXr167MKFC8zX1zffZSyysrLYggULWI0aNZhIJGJGRkbMy8uLzZo1iyUlJcnW42PqOcdYCY7oIsUSGBiI/fv3F/mvEEIIIYTQmB1CCCGEVHAUdgghhBBSoVHYIYQQQkiFRmN2CCGEEFKh0ZEdQgghhFRoFHYIIYQQUqFV+IsKSqVSvH37Fnp6emXyEtaEEEIIyY8xhpSUFFhbW8vdnb0oKnzYefv2Le83ICOEEEJI0bx69Qo2NjbF6qPCh528Gyy+evUK+vr6PFdDCCGEEEUkJyfD1tZW7kbJRVXhw07eqSt9fX0KO4QQQkg5o4ohKDRAmRBCCCEVGoUdQgghhFRoFHYIIYQQUqFV+DE7hBBCyg+JRILs7Gy+yyClQF1dHUKhsFS2RWGHEEII7xhjiI2NRWJiIt+lkFJkaGgIS0vLEr8OHoUdQgghvMsLOubm5tDW1qaLwFZwjDGkp6cjLi4OAGBlZVWi26OwQwghhFcSiUQWdExMTPguh5QSLS0tAEBcXBzMzc1L9JQWDVAmhBDCq7wxOtra2jxXQkpb3mde0uO0KOwQQggpE+jUVeVTWp85hR1CCCGEVGgUdgghhJAS0Lx5c4wbN47vMlTqxYsX4DgOERERCrcpC+8DhR1CCCGkiAIDA8FxXL7H06dPcfDgQcyZM6dY/XMch0OHDqmm2EqMwo6C0rLSEP4qnO8yCCGElDEBAQF49+6d3MPR0RHGxsZfvWN3VlZWKVZZuVHYUUBMQgzMFpmh9bbWyMjO4LscQgghZYhIJIKlpaXcQygU5jt94+DggDlz5mDgwIHQ19fH0KFDkZWVhaCgIFhZWUFTUxP29vaYN2+ebH0A6Nq1KziOk/37S3mnlvbu3YumTZtCS0sL3t7eiIqKwo0bN1CvXj3o6uqibdu2iI+Pl7WTSqWYPXs2bGxsIBKJULt2bZw8eVKu7+vXr6NOnTrQ1NREvXr1cOfOnXzbf/DgAdq2bQtdXV1YWFhgwIAB+PDhQ/HeVBWjsKOAqkZVYa5jjrTsNJx4eoLvcgghpMJjjCE9K6fUH4yxEn1dixcvhqenJ+7cuYPp06djxYoVOHLkCPbu3YvIyEjs2LFDFmpu3LgBANi0aRPevXsn+3dhZsyYgWnTpuH27dtQU1ND3759MXnyZCxfvhwXL17E06dP8dtvv8nWX758Of78808sXrwY9+7dQ5s2bdCpUydER0cDAFJTU9GhQwe4u7vj1q1bmDlzJn766Se5bSYmJqJly5aoU6cObt68iZMnT+L9+/fo1auXCt+14qOLCiqA4zj0qtELi64swt6He9HNrRvfJRFCSIWWkS2B+28hpb7dR7PbQFtDuV+Nx44dg66uruzfbdu2xb59+wpct2XLlpg4caLs3y9fvkS1atXQpEkTcBwHe3t72XNmZmYA/ndLhW/56aef0KZNGwDA2LFj0adPH5w9exaNGzcGAAwZMgSbN2+Wrb948WL8/PPP+O677wAACxYswPnz57Fs2TKsXr0aO3fuhFQqxT///ANNTU3UqFEDr1+/xogRI2R9rFq1CnXq1MEff/whW7Zx40bY2toiKioK1atX/2bdpYGO7CioV43clHo06ijSs9N5roYQQkhZ0aJFC0RERMgeK1asKHTdevXqyf07MDAQERERcHFxwZgxY3Dq1Kki11GrVi3Z/1tYWAAAatasKbcs7/YMycnJePv2rSwI5WncuDEeP34MAHj8+DFq1aoFTU1N2fM+Pj5y69+9exfnz5+Hrq6u7OHq6goAiImJKfJrUTU6sqMgLysvOBo64nnic/wb/S96uPfguyRCCKmwtNSFeDS7DS/bVZaOjg6cnZ0VXvdzdevWxfPnz3HixAmcOXMGvXr1gp+fH/bv3690Herq6rL/z7tY35fLpFKp0v1+TWpqKjp27IgFCxbke66k73elDAo7Cso7lbXg8gLsfbiXwg4hhJQgjuOUPp1UXunr66N3797o3bs3evTogYCAACQkJMDY2Bjq6uqQSCQlsk1ra2tcvnwZvr6+suWXL19G/fr1AQBubm7Ytm0bMjMzZUd3rl69KtdP3bp1ceDAATg4OEBNrex+XnQaSwl5p7KORR1DWlYaz9UQQggp75YsWYJdu3bhyZMniIqKwr59+2BpaQlDQ0MAuTOyzp49i9jYWHz69Eml2540aRIWLFiAPXv2IDIyEr/88gsiIiIwduxYAEDfvn3BcRx+/PFHPHr0CP/++y8WL14s18eoUaOQkJCAPn364MaNG4iJiUFISAi+//77EglpRVVmws78+fPBcZzcNL3mzZvnu1DT8OHDeauxjmUdOBk5ISMnA8ejj/NWByGEkIpBT08PCxcuRL169eDt7Y0XL17g33//hUCQ++v5zz//xOnTp2Fra4s6deqodNtjxozBhAkTMHHiRNSsWRMnT57EkSNHUK1aNQCArq4ujh49ivv376NOnTr49ddf852uyjs6JJFI4O/vj5o1a2LcuHEwNDSUvYaygGMlPc9OATdu3ECvXr2gr6+PFi1aYNmyZQByw0716tUxe/Zs2bra2trQ19dXuO/k5GQYGBggKSlJqXaFmXp2KuZdmodubt1woNeBYvdHCCGVXWZmJp4/fw5HR0e5wbCk4vvaZ6/K39+8x67U1FT069cPf/31F4yMjPI9r62tLXehJlUEluLIO5X1b/S/SBGn8FoLIYQQQr6N97AzatQotG/f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", + "text/plain": [ + "<Figure size 640x480 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "overfit = 15 # epoch from which first model stops learning\n", + "overfit_new = 23 # epoch from which new model stops learning\n", + "last_epoch = 30\n", + "\n", + "plt.plot(range(overfit), train_loss_list[:overfit], label = \"First model\")\n", + "plt.plot(range(overfit_new), new_train_loss_list[:overfit_new], color = \"green\", label = \"New Model\")\n", + "plt.xticks(range(last_epoch))\n", + "plt.xlabel(\"Epoch\")\n", + "plt.ylabel(\"Training Loss\")\n", + "plt.title(\"Comparison of Performance of First Model and New Model\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, { "cell_type": "markdown", "id": "bc381cf4", @@ -970,10 +1039,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "id": "ef623c26", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "model: fp32 \t Size (KB): 2330.519\n" + ] + }, + { + "data": { + "text/plain": [ + "2330519" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "import os\n", "\n", @@ -999,10 +1086,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "id": "c4c65d4b", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "model: int8 \t Size (KB): 659.379\n" + ] + }, + { + "data": { + "text/plain": [ + "659379" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "import torch.quantization\n", "\n", @@ -1011,6 +1116,15 @@ "print_size_of_model(quantized_model, \"int8\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "The model has an initial size of about 2.3 MB, and after quantization, it is down to 659 KB, which means it is about 28% of the initial size.\n", + "***" + ] + }, { "cell_type": "markdown", "id": "7b108e17", @@ -1019,6 +1133,154 @@ "For each class, compare the classification test accuracy of the initial model and the quantized model. Also give the overall test accuracy for both models." ] }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test Loss: 15.735082\t||\tquantized : 15.726470\n", + "\n", + "Test Accuracy of airplane: 77% (776/1000)\t||\tquantized :77% (777/1000)\n", + "Test Accuracy of automobile: 86% (863/1000)\t||\tquantized :86% (863/1000)\n", + "Test Accuracy of bird: 55% (551/1000)\t||\tquantized :55% (550/1000)\n", + "Test Accuracy of cat: 64% (648/1000)\t||\tquantized :65% (650/1000)\n", + "Test Accuracy of deer: 66% (662/1000)\t||\tquantized :66% (664/1000)\n", + "Test Accuracy of dog: 56% (566/1000)\t||\tquantized :57% (573/1000)\n", + "Test Accuracy of frog: 84% (849/1000)\t||\tquantized :84% (848/1000)\n", + "Test Accuracy of horse: 79% (798/1000)\t||\tquantized :79% (797/1000)\n", + "Test Accuracy of ship: 82% (829/1000)\t||\tquantized :82% (828/1000)\n", + "Test Accuracy of truck: 84% (840/1000)\t||\tquantized :83% (839/1000)\n", + "\n", + "Test Accuracy (Overall): 73% (7382/10000)\t||\tquantized : 73% (7389/10000)\n" + ] + } + ], + "source": [ + "model.load_state_dict(torch.load(\"./new_model_cifar.pt\"))\n", + "quantized_model = torch.quantization.quantize_dynamic(model, dtype=torch.qint8)\n", + "\n", + "# track test loss\n", + "test_loss = 0.0\n", + "class_correct = list(0.0 for i in range(10))\n", + "class_total = list(0.0 for i in range(10))\n", + "\n", + "model.eval()\n", + "# iterate over test data\n", + "for data, target in test_loader:\n", + " # move tensors to GPU if CUDA is available\n", + " if train_on_gpu:\n", + " data, target = data.cuda(), target.cuda()\n", + " # forward pass: compute predicted outputs by passing inputs to the model\n", + " output = model(data)\n", + " # calculate the batch loss\n", + " loss = criterion(output, target)\n", + " # update test loss\n", + " test_loss += loss.item() * data.size(0)\n", + " # convert output probabilities to predicted class\n", + " _, pred = torch.max(output, 1)\n", + " # compare predictions to true label\n", + " correct_tensor = pred.eq(target.data.view_as(pred))\n", + " correct = (\n", + " np.squeeze(correct_tensor.numpy())\n", + " if not train_on_gpu\n", + " else np.squeeze(correct_tensor.cpu().numpy())\n", + " )\n", + " # calculate test accuracy for each object class\n", + " for i in range(batch_size):\n", + " label = target.data[i]\n", + " class_correct[label] += correct[i].item()\n", + " class_total[label] += 1\n", + "\n", + "# average test loss\n", + "test_loss = test_loss / len(test_loader)\n", + "\n", + "# Test accuracy of quantized model\n", + "# track test loss\n", + "q_test_loss = 0.0\n", + "q_class_correct = list(0.0 for i in range(10))\n", + "q_class_total = list(0.0 for i in range(10))\n", + "\n", + "quantized_model.eval()\n", + "# iterate over test data\n", + "for data, target in test_loader:\n", + " # move tensors to GPU if CUDA is available\n", + " if train_on_gpu:\n", + " data, target = data.cuda(), target.cuda()\n", + " # forward pass: compute predicted outputs by passing inputs to the model\n", + " output = quantized_model(data)\n", + " # calculate the batch loss\n", + " q_loss = criterion(output, target)\n", + " # update test loss\n", + " q_test_loss += q_loss.item() * data.size(0)\n", + " # convert output probabilities to predicted class\n", + " _, pred = torch.max(output, 1)\n", + " # compare predictions to true label\n", + " correct_tensor = pred.eq(target.data.view_as(pred))\n", + " correct = (\n", + " np.squeeze(correct_tensor.numpy())\n", + " if not train_on_gpu\n", + " else np.squeeze(correct_tensor.cpu().numpy())\n", + " )\n", + " # calculate test accuracy for each object class\n", + " for i in range(batch_size):\n", + " label = target.data[i]\n", + " q_class_correct[label] += correct[i].item()\n", + " q_class_total[label] += 1\n", + "\n", + "# average test loss\n", + "q_test_loss = q_test_loss / len(test_loader)\n", + "\n", + "\n", + "\n", + "print(\"Test Loss: {:.6f}\\t||\\tquantized : {:.6f}\\n\".format(test_loss, q_test_loss))\n", + "\n", + "for i in range(10):\n", + " if class_total[i] > 0:\n", + " print(\n", + " \"Test Accuracy of %5s: %2d%% (%2d/%2d)\\t||\\tquantized :%2d%% (%2d/%2d)\"\n", + " % (\n", + " classes[i],\n", + " 100 * class_correct[i] / class_total[i],\n", + " np.sum(class_correct[i]),\n", + " np.sum(class_total[i]),\n", + " 100 * q_class_correct[i] / q_class_total[i],\n", + " np.sum(q_class_correct[i]),\n", + " np.sum(q_class_total[i])\n", + " )\n", + " )\n", + " else:\n", + " print(\"Test Accuracy of %5s: N/A (no training examples)\" % (classes[i]))\n", + "\n", + "print(\n", + " \"\\nTest Accuracy (Overall): %2d%% (%2d/%2d)\\t||\\tquantized : %2d%% (%2d/%2d)\"\n", + " % (\n", + " 100.0 * np.sum(class_correct) / np.sum(class_total),\n", + " np.sum(class_correct),\n", + " np.sum(class_total),\n", + " 100.0 * np.sum(q_class_correct) / np.sum(q_class_total),\n", + " np.sum(q_class_correct),\n", + " np.sum(q_class_total)\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "Conclusion : \n", + "\n", + "For each class, the test accuracy is very close between the initial model and its quantized version. For each class, the number of correct images classified by the model and its quantized version is very similar, the biggest difference we observe is on the \"dog\" class, where the model classifies correctly 566 images, and the quantized model classifies 573 images. That means that for each class, the quantized model has a test accuracy which is in the worst case 1% different from the initial model.\n", + "\n", + "Overall, the test accuracy is the same, and the quantized model even managed to classify correctly more images than the initial model.\n", + "***" + ] + }, { "cell_type": "markdown", "id": "a0a34b90", diff --git a/hymenoptera_data/train/ants/formica.jpeg b/hymenoptera_data/train/ants/formica.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..af83327233be73099c700fce654749842aad4a9d Binary files /dev/null and b/hymenoptera_data/train/ants/formica.jpeg differ diff --git a/hymenoptera_data/train/ants/imageNotFound.gif b/hymenoptera_data/train/ants/imageNotFound.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdeaae94004e06c6a35d147ec58fb35062076b52 Binary files /dev/null and b/hymenoptera_data/train/ants/imageNotFound.gif differ diff --git a/results/model2_accuracy.PNG b/results/model2_accuracy.PNG new file mode 100644 index 0000000000000000000000000000000000000000..5a3ede4fdfd4d9962bd978d749678aebd6ccbcbc Binary files /dev/null and b/results/model2_accuracy.PNG differ