{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Deep Learning with PyTorch Step-by-Step: A Beginner's Guide"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Chapter 4"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from IPython.core.display import display, HTML\n",
"display(HTML(\"\"))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"try:\n",
" import google.colab\n",
" import requests\n",
" url = 'https://raw.githubusercontent.com/dvgodoy/PyTorchStepByStep/master/config.py'\n",
" r = requests.get(url, allow_redirects=True)\n",
" open('config.py', 'wb').write(r.content) \n",
"except ModuleNotFoundError:\n",
" pass\n",
"\n",
"from config import *\n",
"config_chapter4()\n",
"# This is needed to render the plots in this chapter\n",
"from plots.chapter4 import *"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import random\n",
"import numpy as np\n",
"from PIL import Image\n",
"\n",
"import torch\n",
"import torch.optim as optim\n",
"import torch.nn as nn\n",
"import torch.nn.functional as F\n",
"\n",
"from torch.utils.data import DataLoader, Dataset, random_split, WeightedRandomSampler, SubsetRandomSampler\n",
"from torchvision.transforms import Compose, ToTensor, Normalize, ToPILImage, RandomHorizontalFlip, Resize\n",
"\n",
"import matplotlib.pyplot as plt\n",
"plt.style.use('fivethirtyeight')\n",
"%matplotlib inline\n",
"\n",
"from data_generation.image_classification import generate_dataset\n",
"from stepbystep.v0 import StepByStep\n",
"from plots.chapter4 import *"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Classifying Images"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Generation"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"images, labels = generate_dataset(img_size=5, n_images=300, binary=True, seed=13)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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LBZ9++23SkhIUOvWrXXw4EGFh4fr9ddfl3TxrZ4/FpkzZ86oWrVqpf7eSycmhoSEKDMz06UN2LFjhxISEtSgQQNZLBa98847OnnyZInff0lYWJiOHz8uScrMzNTgwYPt29SmTRv5+vrqxIkTVx3z0nZcvo1nzpxR9erVXZp7WXA2I1e1a9fOnpGrD+oHDx5Uv3791LhxY4WFhWnGjBk6deqUw3WultHUqVPt2xQRESGbzaZjx465tR2Vhas5FRcX65FHHlFAQIDmzp17xd9LTt7jzr7k6+ur9u3bKysrS2+99Vapv5eMvMvZnHbv3q3Nmzdr9OjRTv1eoz0vVWau7EutWrVS9erVVaVKFQ0cOFBt27bVZ599Vurv/TNn5OfKlWvWrCmr1aq1a9cqOTlZ8+fP16BBg5SYmKhOnTrZr9ewYUMVFhbq0KFDatCggSRp7969V3yr5+jRo25vwMiRI5WYmKg1a9aoatWqeuqpp0o8mB09etR+pOLIkSMym82SLgbz2muvqV27diV+79VOCA8KCpLZbNbevXt15513Srq4fU2aNHF7O7zF2YxctW3bNrfXnTBhgpo1a6Y333xT1atX1+uvv67169c7XOfo0aP2+8cfM5o4caL69u3r9viVkSs52Ww2jR07VidOnNDq1avl7+9/xd9LTt7jyb5UWFh4xaMFZORdzub09ddfy2q12k93OXfunIqKirR//35t2bKlxO812vNSZebJvmQymWSz2Upd9mfOyK0PLFz+CZHdu3crLi7OYXlgYKC6deum559/XufOndO2bdv0ySefePy+b15ensPFZrMpNzdXNWvWVNWqVfX999/bD2tebu7cufr999+VmpqqZcuWqVevXpKkESNGaMaMGfa3DX777Td9/PHHTs2lf//+mjt3rrKzs3XgwAEtXrxYAwcO9Gj7vOlaGUkXn2Dy8vJUVFSkoqIi5eXlefznCfLz8x0yKi4uVm5urqpXr65q1arpwIEDevvtt0us98orryg7O1tHjhzRwoULHTJKSkqyny+Zk5OjDz74wKm5FBcXKy8vTwUFBbLZbMrLyytxcndFcyanCRMm6MCBA1qxYoVuuOEGr4xLTs67Vka//vqr1q5dq9zcXBUVFemLL77Q2rVrPT4hnoxcc62chg8frh9++EHJyclKTk7WiBEj1KVLF/3nP//xaNzK9Lx0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derUSbfccotGjRrlsGz79u3q2bOnIiIi1KBBAw0bNkzHjx93e9KV8UFl5syZio+PV+3atTVr1qwKnYu7Oe3fv1+dOnVSeHi4wsPD1aNHD+3fv9/teVTGnA4fPqyEhAQFBwerdevW2rRpU4XMw92MLvfCCy8oKCjIo20YNWqUZs6c6fb6ZWHcuHFq1aqVatasqWXLllXoXNzN6fDhwwoKClJISIj9MmfOHLfnURlz2r17tzp27Kjg4GB17NhRu3fvrpB5eLIv/f7775o4caIiIyNlsVh03333uT2Pyvh4dz08L61atcphPwoODlZQUJB27drl1jyul5ycLm8FBQXKzMxUZGSkdu3apebNmzssN5vNmjRpkgYPHlxi3ezsbA0fPly7d+/Wnj17VK1aNY0ZM8bZoQ0hMjJS06dPV5cuXSp0Hp7kZDab9e677yojI0NpaWm677779NBDD5XX1MvFyJEj1axZM6Wlpenvf/+7hg4dqt9++61c5+BJRpekp6dr/fr1MpvNZT3dchcTE6N58+aVuF3KmzdyOnz4sI4ePaqjR4/qySefLOspl5sLFy5o4MCB6tu3rzIyMjRgwAANHDhQFy5cKNd5eJrRE088odOnT+u7775Tenp6hRccb7senpf69u1r34eOHj2qF198URERERX++OBN7uTkdHnbt2+foqKiZDKZ9MMPP5S44bp3766EhATVqlWrxLqdO3dWz549VaNGDd14441KTEzUt99+6/QkXZGUlKS4uDiFhoaqbdu2+vDDDx2W22w2TZ48WRaLRa1bt9bmzZvty3JycjR27FhFRUUpOjpaM2fOVFFRkVPjDhw4UJ07d1b16tW9uj2u8iSnoKAghYeHy2QyyWazydfXV+np6WUyz4rI6eDBg/rxxx81depU3XDDDerRo4eaNm2q9evXe337rsaTjC6ZPHmynn32Wfn7+5fZPKdMmaKmTZsqLCxMHTt2VEpKisPyvLw8jRgxQqGhobrjjju0Z88e+7Jjx45pyJAhatCggZo1a6aFCxc6PW5iYqI6duyoqlWrem1b3OGNnMpDReT09ddfq6ioSKNHj1aVKlX06KOPSpK2bNnivQ1zgicZ/fzzz/rkk080f/581alTR76+voqLiyuTefK85L19afny5erfv79MJpPX52mknK5Z3pYuXSqLxaKuXbtq+/btslgseu211/Tss8/KYrEoIyPD6cEuSUlJUZMmTVxezxn169fXJ598IqvVqilTpuiRRx5xeIt2x44dioiI0KFDhzR16lQNGTJEp0+flnTxrQk/Pz/t3LlTW7Zs0ZdffqnFixeXOk6/fv2UlJRUJtvgDm/mZLFYVLduXT355JOaMGFCmcy3InJKTU1VRESEww4SExOj1NTUMtnGP/JWRh988IH8/f3L/NX0bbfdpuTkZKWnp6t3794aPny48vLy7Ms3bNignj17Kj09XX369NGgQYNUUFCg4uJi9e/f337brl+/Xm+88Ya++OKLUseJj4/X6tWry3RbXOHNfSk2Nla33nqrRo8erZMnT5bJfCsip9TUVDVt2tThCbRp06aG2pd27NihsLAwzZo1S5GRkYqPj9e6devKZL48L3mnP1itVqWkpKh///5lMl8j5XTN8jZ48GBZrVbFxcVp48aN2rp1q6Kjo5WZmSmr1aqIiAiXBty7d6/mzJmj5557zt05X1XPnj0VHBwsHx8f9erVS5GRkfr+++/ty2+++WaNHj1a/v7+6tWrlxo2bKhPP/1UJ06c0Oeff65Zs2YpMDDQfr21a9eWOs7KlSs1fvz4MtkGd3gzJ6vVKqvVqrlz56pZs2ZlMt+KyOncuXOqUaOGw/IaNWooNze3TLbxj7yRUW5urp577rlyeXunX79+qlWrlvz8/PTYY48pPz9fP//8s315XFycevToIX9/f40ZM0b5+fnavn27du7cqZMnT2rKlCkKCAhQRESEhg0bdsWMUlJS1KdPnzLfHmd5I6fatWvrq6++0p49e7Rp0ybl5uYqMTGxTOZbETldD/tSVlaW9u3bpxo1amj//v2aM2eORo8erf/9739eny/PS97pDytWrFD79u1dXs9ZRsrJ72oLT58+bT+8mZubq4SEBPs5DeHh4Xrqqac0evRopwdLS0tTnz599MILLyg+Pr7U61z+ABEWFqZt27Y5/fuli4dUFyxYIKvVKunig8zlr3iDg4MdXi2GhYXp+PHjyszMVEFBgaKiouzLbDabQkJCXBq/Ing7J0kKDAzUQw89pAYNGui7777TzTff7LDciDkFBgbq7NmzDv935swZVatWzaW5u8NbGc2aNUv9+vVz6sFr1apV9geI9u3ba82aNS7N+dVXX9WSJUvsrzzPnj2rU6dO2Zdffpv7+PioXr16On78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449ltVo1bdo0jRgxQocPH5YknTx5UkOGDNG0adOUnp6uFi1a6KGHHqqoTfG6CxcuaODAgerbt68yMjI0YMAADRw4UBcuXCj3uXiSkyS1a9dOixYtUt26dct97uXB6PtSdna2hg8frt27d2vPnj2qVq2axowZU1GbUiZGjhypZs2aKS0tTX//+981dOhQ/fbbb+U+D09yMpvNevfdd5WRkaG0tDTdd99919VjnuReTk6Xt3379ikqKkomk0k//PBDiVLQvXt3JSQkqFatWiXWzcrK0k033aTOnTvLZDLp3nvv1Y033qj09HRnh3fa0qVL7Uf4mjdvrnfeeafEdebNm6fIyEjFxsZq1apV9v/Pz8/X3//+d8XExKhRo0YaP368zp8/f80xz507p/Xr12vatGmqVq2a2rdvr65du2rlypVe3TZneJLTf//7X/Xs2VPR0dEKCAjQ5MmTlZKSUiY5JSUlKS4uzn4k9sMPP3RYbrPZNHnyZFksFrVu3VqbN2+2L8vJydHYsWMVFRWl6OhozZw5U0VFRU6NO3DgQHXu3FnVq1f36va44moZBQYGaurUqQoPD5ePj4+6du0qi8WiXbt2SZI+/PBDNWnSRD179lTVqlX11FNPae/evTpw4IDX5zllyhQ1bdpUYWFh6tixo1JSUhyW5+XlacSIEQoNDdUdd9yhPXv22JcdO3ZMQ4YMUYMGDdSsWTMtXLjQqTG//vprFRUVafTo0apSpYoeffRRSdKWLVu8t2FO8iSngIAAjR49Wu3bt5evr2+ZzpN9yb2MOnfurJ49e6pGjRq68cYblZiYqG+//bZM5lkRGR08eFA//vijpk6dqhtuuEE9evRQ06ZNtX79eq9v37V4klNQUJDCw8NlMplks9nk6+tbJs9JkrFyumZ5W7p0qSwWi7p27art27fLYrHotdde07PPPiuLxaKMjIxrTq5FixZq3LixNmzYoKKiIn300UeqUqWKmjZtes11XXXzzTdr5cqVyszM1IIFC/T000/b7wSS9Msvv+jkyZNKTU3VG2+8oSeeeEI///yzJOmZZ57RwYMHlZycrJ07dyorK0tz5swpdZyJEydq4sSJki7e+L6+vmrYsKF9eWxsbLkeefNGTjabTTabzeFn6eKO523169fXJ598IqvVqilTpuiRRx5xeMtix44dioiI0KFDhzR16lQNGTJEp0+flnTxrT4/Pz/t3LlTW7Zs0ZdffqnFixeXOk6/fv2UlJTk9fm7w52MTpw4oUOHDik6OlqSlJqaqpiYGPvywMBA1a9fv0zua7fddpuSk5OVnp6u3r17a/jw4crLy7Mv37Bhg3r27Kn09HT16dNHgwYNUkFBgYqLi9W/f3/FxMQoNTVV69ev1xtvvKEvvvii1HHi4+PtpxmkpqaqadOmMplM9uVNmzat9PvSH3MqT+xL3skoJSVFTZo0KZP5VkRGqampioiIcCjXl/bJ8uLNnCwWi+rWrasnn3xSEyZMKJP5Gimna5a3wYMHy2q1Ki4uThs3btTWrVsVHR2tzMxMWa1WRUREXPMG8fX1Vf/+/ZWYmKhbbrlFiYmJSkpKUmBg4DXXddW9996r+vXry2QyqUOHDrrzzjv1zTffOFxn2rRpqlKlijp06KAuXbro/fffl81m0+LFizVr1izVrFlT1atX18SJE7V27dpSx5k3b57mzZsn6eKRtxo1ajgsr1GjhnJzc72+fVfijZwu3RZ79+7V+fPnNWfOHJlMJqeOPrqqZ8+eCg4Olo+Pj3r16qXIyEh9//339uU333yzRo8eLX9/f/Xq1UsNGzbUp59+qhMnTujzzz/XrFmzFBgYaL/elXJauXKlxo8f7/X5u8PVjAoKCpSYmKgBAwaocePGksr3vtavXz/VqlVLfn5+euyxx5Sfn29/oSNJcXFx6tGjh/z9/TVmzBjl5+dr+/bt2rlzp06ePKkpU6YoICBAERERGjZs2BUzSklJUZ8+fcp9+67EGzmVJ/YlzzPau3ev5syZo+eee65M5lsRGV1v+5LVapXVatXcuXPVrFmzMpmvkXLyu9rC06dP2w9v5ubmKiEhwX7uSXh4uJ566imNHj36GjeHtGnTJj3zzDP66KOP1Lx5c+3atUsDBgzQ6tWrS4SQmZmpdu3a2X8+evToNX//5TZu3KjZs2fr4MGDKi4u1vnz5x0+JRoUFORQGsPCwnT8+HH99ttv+v3339WxY0eH3+fMYc/AwECdPXvW4f/OnDmjatWquTR3d3krp44dO2rq1KkaOnSozpw5o9GjR6t69eqqV69eiete/oQbFhambdu2uTTn5cuXa8GCBfaT7c+dO6eTJ0/alwcHBzscfbmUU2ZmpgoKChQVFWVfZrPZFBIS4tL45c3VjIqLi/XII48oICBAc+fOtf9/afe1s2fPlnpfW7Vqlf0Bon379lqzZo1Lc3711Ve1ZMkS+yvPs2fP6tSpU/bll9/mPj4+qlevno4fPy6TyaRjx47JYrE4bE/79u2vOabR9qUr5eQK9iXXeDujtLQ09enTRy+88ILi4+NLHdOIGV2P+1JgYKAeeughNWjQQN99951uvvlmh+V/ppyuWt5q1qwpq9WqtWvXKjk5WfPnz9egQYOUmJioTp06XXNSl+zZs0fx8fFq0aKFpItvx7Rs2VKbN28uUd7CwsJcLmyX5Ofna+jQoVq4cKHuv/9++fv7a+DAgQ7Xyc7O1rlz5+wF7siRI4qOjlbt2rV1ww03aNu2baWWlatp2LChCgsLdejQITVo0EDSxVdy5fUWirdykqTExEQlJiZKuvh28Isvvljqn0iJj493Oyer1apx48Zp3bp1atOmjXx9fdWhQweH6xw7dkw2m82+oxw5ckT33XefQkJCVKVKFaWlpcnP76p330rFlYxsNpvGjh2rEydOaPXq1fL397cvi46O1vLly+0/nzt3Tunp6aXe1/r27au+ffu6Nd+UlBS9/PLLWrdunaKjo+Xj46Pw8HCHt9Uvz7+4uFhZWVkym83y8/NTeHi4du7c6fK40dHRWrBggUP2P/30k/0+Wda8lZMr2Jdc482MrFarevToocmTJ6t///5XHNOIGUVHRysjI0Nnz561vyW3d+9ee7kpa2W1L106KJOVlVWivP2ZcnLqAwuXfzpk9+7diouLK3GdwsJC5eXlqaioSEVFRcrLy1NhYaGki+e8ffPNN/aP/P/444/65ptvPDrnzWazKS8vz+Fy4cIF5efnq3bt2vLz89PGjRv11VdflVh31qxZunDhglJSUvTpp5+qZ8+e8vHx0dChQ/X000/bPwWblZV1xfN0LhcYGKhu3brp+eef17lz57Rt2zZ98skn6tevn9vb5w5Pc8rLy9O+fftks9mUmZmpcePG6dFHH1VQUJDbcyouLnbIKD8/X7///rtMJpPq1Kkj6eJ5EX98f//XX3/VwoULVVBQoA8++EAHDhxQly5dZDabdeedd2ratGk6c+aMiouLlZ6erq+//tqp+RQUFCgvL0/FxcX27Xf2BG1vcCajCRMm6MCBA1qxYoVuuOEGh2UJCQlKTU3VunXrlJeXpzlz5qhp06YevV136Xa4fD/Kzc2Vn5+f6tSpo8LCQs2ePbvEq8Ndu3Zp/fr1Kiws1Ouvv66AgAC1bt1aLVu2VPXq1TV//nydP39eRUVF2rdvn1NlrkOHDvLx8dHChQuVn5+vRYsWSVKJP3lT1jzNSbr4YvLSOYKX7neXl19XsS858jSjrKwsde/eXYmJiV779GJlyqhhw4aKjY3V7NmzlZeXpw8//FA//fSTunfv7pVtdZanOX311Vf68ccfVVRUpDNnzujpp59WUFCQw1EuV10POblU3k6dOiVfX99Sn8znzp0rs9mspKQkrVq1Smaz2X7os0OHDnrqqac0bNgwhYaGaujQoZowYYLuuusuZ4Yv1bfffiuz2exwueGGGzR79myNGDFC4eHhWr16te677z6H9erWraugoCA1adJEDz/8sF566SX7E9/06dMVGRmpe+65R2FhYerZs6fDOT6XGz9+vMP5H/PmzdP58+fVP8jfNQAAFoZJREFUqFEjjRw5UvPmzSv3k5c9zSkvL08jR45USEiI7r77brVp00bTpk3zaE5r1qxxyKhFixZq0qSJxo4dq86dO6tRo0bat2+f2rZt67Beq1atlJaWpgYNGmjGjBl699137Z+QvbTztGvXThERERo6dKh++eWXUsfv3bu3/dxESXr88cdlNpu1Zs0avfjiizKbzVqxYoVH2+iKa2VktVr1zjvvaM+ePYqKilJISIhCQkLsn4quU6eOFi9erJkzZyoiIkI7duzQW2+95dGckpKSHDLq3r277r77bt1zzz1q1aqVYmNjVbVq1RJvAdx///16//33FRERoZUrV2rJkiXy9/eXr6+vVqxYoT179qh58+aKjIzU448/rjNnzpQ6frt27ezbFxAQoGXLlmnFihUKDw/X0qVLtWzZMgUEBHi0ja7yNCfp4n3YbDYrKytLvXr1ktls9uhv8rEvOfI0o8WLFysjI0OzZ8+2L/P0LePKltFbb72lH374QREREZo+fboWL15sLyflxdOccnJyNHLkSFksFrVo0ULp6elas2aNqlat6vacroecTNnZ2e6/FAQAAEC5+lN9PRYAAIDRUd4AAAAMhPIGAABgIJQ3AAAAA6G8AQAAGAjlDQAAwEAobwAAAAbi1neiePIX96932dnZFT0FO6Pk5Mlfnb/8e+ac9WfOyN3b2p3b2VOVJSej7EcVobJkJJHT1VSWnMjoylzNiCNvAAAA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9eabb3rS8pEjR3To0CHP9oiICM+fg4KCdO6552rfvn2y2Wzau3evoqOjvcYzaNAgn47fEgLVpzPPPFNJSUmSpB49emj+/PmKj49XWVlZnScXffJNoHrUvn17hYSEaPr06bLb7UpJSVFKSoq++OILxcfHex3z5OAaFRWljRs3+lTz0qVL9fLLL8vpdEr65yJz8kpseHi418uAUVFR2rdvn4qLi1VVVeVVj9vt9uppQzp27KgjR454fa+srExnnnmmT7VbFag+nWzZsmWaOnVqg8ekT74JVI/Wrl2rJ598UmvWrFGfPn20ZcsW3XbbbVq5cqV69+7tdczi4mINHDjQ8/c9e/b4VHNubq7mzp2r7du3q7a2VseOHfN6l2hYWJhXaDzRowMHDujo0aMaPHiw189rzMtxLS1QfRo8eLBmzpyptLQ0lZWVKSMjQ506ddK5555b55htaS79Z3jr0qWLnE6n3nvvPeXl5WnhwoW64447lJ6erquuusrrsW63W5MmTdL+/fu1cuVKr/va1q1bp5KSEr322muSpAMHDuiee+7R5MmTNXnyZK+fM2bMGI0ZM+aUA65Pfn6+XnjhBa1evVoJCQkKCgpSTEyM15LryZOutrZWJSUlcjgcstvtiomJ0ebNmy0duyUFqk//duJJevL5O4E++SZQPUpMTGz0MZOTk33+R+YEp9OpzMxMrV69WgMGDFBwcLBSUlK8HrN371653W7P8+SPP/7Qddddp4iICLVr1047d+6U3f6fl5g6EhIStGvXLh05csTzMsLPP//cbKungZ5LGzdu1L59+zR69OgGj0mffBOoHhUUFCg5OdnzH9ZLL71Ul112mdatW1cnvEVFRVnuUWVlpdLS0rR48WJdf/31CgkJ0e233+71GJfLpb///tsT4P744w8lJCSoW7du6tChgzZu3FhvWGnNAjmX0tPTPa8Cbd++Xc8991y9vyKlLc2lRr1h4eR3h/z000/13iA9depU/f7771q2bJk6dOjgtS0nJ0cbNmxQXl6e8vLyFB4eroULF2rChAmNGlx9ampqVFFR4fk6fvy4ysvLZbfb1b17d1VXV2vu3Ll1Eu2WLVuUk5Oj6upqvfLKKwoNDVX//v112WWXqVOnTlq4cKGOHTummpoaFRYWNjokHD9+XBUVFXK73aqurlZFRYVqa2stj88Kf/u0adMmbdu2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\n",
"text/plain": [
"