From eafe86039c6a802f5abdd316ec446d3d8c094725 Mon Sep 17 00:00:00 2001 From: fxl <1475486684@qq.com> Date: Thu, 5 Dec 2024 20:49:13 +0800 Subject: [PATCH] "refactor-clear-confusion" --- ..._model_deployment_exercise_solutions.ipynb | 11564 ++++++++-------- 1 file changed, 5782 insertions(+), 5782 deletions(-) diff --git a/extras/solutions/09_pytorch_model_deployment_exercise_solutions.ipynb b/extras/solutions/09_pytorch_model_deployment_exercise_solutions.ipynb index f24aa357..b97c1019 100644 --- a/extras/solutions/09_pytorch_model_deployment_exercise_solutions.ipynb +++ b/extras/solutions/09_pytorch_model_deployment_exercise_solutions.ipynb @@ -1,5969 +1,5969 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "view-in-github" - }, - "source": [ - "\"Open" - ] + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "view-in-github" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zNqPNlYylluR" + }, + "source": [ + "# 09. PyTorch Model Deployment Exercise Solutions\n", + "\n", + "Welcome to the 09. PyTorch Model Deployment exercise solutions.\n", + "\n", + "Your objective is to write code to satisify each of the exercises below.\n", + "\n", + "Some starter code has been provided to make sure you have all the resources you need.\n", + "\n", + "> **Note:** There may be more than one solution to each of the exercises.\n", + "\n", + "## Resources\n", + "\n", + "1. These exercises/solutions are based on [section 09. PyTorch Model Deployment](https://www.learnpytorch.io/09_pytorch_model_deployment/) of the Learn PyTorch for Deep Learning course by Zero to Mastery.\n", + "2. See a live [walkthrough of the solutions (errors and all) on YouTube](https://youtu.be/jOX5ZCkWO-0) (but try the exercises yourself first!).\n", + "3. See [all solutions on the course GitHub](https://github.com/mrdbourke/pytorch-deep-learning/tree/main/extras/solutions).\n", + "\n", + "> **Note:** The first section of this notebook is dedicated to getting various helper functions and datasets used for the exercises. The exercises start at the heading \"Exercise 1: ...\"." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sf8ab9cyHTzU" + }, + "source": [ + "### Get various imports and helper functions\n", + "\n", + "The code in the following cells prepares imports and data for the exercises below. They are taken from [09. PyTorch Model Deployment](https://www.learnpytorch.io/09_pytorch_model_deployment/). " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "ChRaHUSJ8DYZ", + "outputId": "0a27f03f-33ea-4721-e4ec-858b8dc255b1" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "zNqPNlYylluR" - }, - "source": [ - "# 09. PyTorch Model Deployment Exercise Solutions\n", - "\n", - "Welcome to the 09. PyTorch Model Deployment exercise solutions.\n", - "\n", - "Your objective is to write code to satisify each of the exercises below.\n", - "\n", - "Some starter code has been provided to make sure you have all the resources you need.\n", - "\n", - "> **Note:** There may be more than one solution to each of the exercises.\n", - "\n", - "## Resources\n", - "\n", - "1. These exercises/solutions are based on [section 09. PyTorch Model Deployment](https://www.learnpytorch.io/09_pytorch_model_deployment/) of the Learn PyTorch for Deep Learning course by Zero to Mastery.\n", - "2. See a live [walkthrough of the solutions (errors and all) on YouTube](https://youtu.be/jOX5ZCkWO-0) (but try the exercises yourself first!).\n", - "3. See [all solutions on the course GitHub](https://github.com/mrdbourke/pytorch-deep-learning/tree/main/extras/solutions).\n", - "\n", - "> **Note:** The first section of this notebook is dedicated to getting various helper functions and datasets used for the exercises. The exercises start at the heading \"Exercise 1: ...\"." - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "torch version: 1.12.1+cu113\n", + "torchvision version: 0.13.1+cu113\n" + ] + } + ], + "source": [ + "# For this notebook to run with updated APIs, we need torch 1.12+ and torchvision 0.13+\n", + "try:\n", + " import torch\n", + " import torchvision\n", + " assert int(torch.__version__.split(\".\")[1]) >= 12, \"torch version should be 1.12+\"\n", + " assert int(torchvision.__version__.split(\".\")[1]) >= 13, \"torchvision version should be 0.13+\"\n", + " print(f\"torch version: {torch.__version__}\")\n", + " print(f\"torchvision version: {torchvision.__version__}\")\n", + "except:\n", + " print(f\"[INFO] torch/torchvision versions not as required, installing nightly versions.\")\n", + " !pip3 install -U torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113\n", + " import torch\n", + " import torchvision\n", + " print(f\"torch version: {torch.__version__}\")\n", + " print(f\"torchvision version: {torchvision.__version__}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "Y5H5P8EjCNGK" + }, + "outputs": [], + "source": [ + "# Continue with regular imports\n", + "import matplotlib.pyplot as plt\n", + "import torch\n", + "import torchvision\n", + "\n", + "from torch import nn\n", + "from torchvision import transforms\n", + "\n", + "# Try to get torchinfo, install it if it doesn't work\n", + "try:\n", + " from torchinfo import summary\n", + "except:\n", + " print(\"[INFO] Couldn't find torchinfo... installing it.\")\n", + " !pip install -q torchinfo\n", + " from torchinfo import summary\n", + "\n", + "# Try to import the going_modular directory, download it from GitHub if it doesn't work\n", + "try:\n", + " from going_modular.going_modular import data_setup, engine\n", + " from helper_functions import download_data, set_seeds, plot_loss_curves\n", + "except:\n", + " # Get the going_modular scripts\n", + " print(\"[INFO] Couldn't find going_modular or helper_functions scripts... downloading them from GitHub.\")\n", + " !git clone https://github.com/mrdbourke/pytorch-deep-learning\n", + " !mv pytorch-deep-learning/going_modular .\n", + " !mv pytorch-deep-learning/helper_functions.py . # get the helper_functions.py script\n", + " !rm -rf pytorch-deep-learning\n", + " from going_modular.going_modular import data_setup, engine\n", + " from helper_functions import download_data, set_seeds, plot_loss_curves" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 36 }, + "id": "bE1AAH_uCjiP", + "outputId": "8337aa8d-9a46-41ad-9f96-658e857fcf57" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "sf8ab9cyHTzU" + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" }, - "source": [ - "### Get various imports and helper functions\n", - "\n", - "The code in the following cells prepares imports and data for the exercises below. They are taken from [09. PyTorch Model Deployment](https://www.learnpytorch.io/09_pytorch_model_deployment/). " + "text/plain": [ + "'cuda'" ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", + "device" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GmS5yuvxCpLp" + }, + "source": [ + "### Get data\n", + "\n", + "Want to download the data we've been using in PyTorch Model Deployment: https://www.learnpytorch.io/09_pytorch_model_deployment/#1-getting-data" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "dm772wqgCzN9", + "outputId": "ca47901f-5786-4d76-d768-58ad8349704c" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "ChRaHUSJ8DYZ", - "outputId": "0a27f03f-33ea-4721-e4ec-858b8dc255b1" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch version: 1.12.1+cu113\n", - "torchvision version: 0.13.1+cu113\n" - ] - } - ], - "source": [ - "# For this notebook to run with updated APIs, we need torch 1.12+ and torchvision 0.13+\n", - "try:\n", - " import torch\n", - " import torchvision\n", - " assert int(torch.__version__.split(\".\")[1]) >= 12, \"torch version should be 1.12+\"\n", - " assert int(torchvision.__version__.split(\".\")[1]) >= 13, \"torchvision version should be 0.13+\"\n", - " print(f\"torch version: {torch.__version__}\")\n", - " print(f\"torchvision version: {torchvision.__version__}\")\n", - "except:\n", - " print(f\"[INFO] torch/torchvision versions not as required, installing nightly versions.\")\n", - " !pip3 install -U torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113\n", - " import torch\n", - " import torchvision\n", - " print(f\"torch version: {torch.__version__}\")\n", - " print(f\"torchvision version: {torchvision.__version__}\")\n" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "[INFO] data/pizza_steak_sushi_20_percent directory exists, skipping download.\n" + ] }, { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "id": "Y5H5P8EjCNGK" - }, - "outputs": [], - "source": [ - "# Continue with regular imports\n", - "import matplotlib.pyplot as plt\n", - "import torch\n", - "import torchvision\n", - "\n", - "from torch import nn\n", - "from torchvision import transforms\n", - "\n", - "# Try to get torchinfo, install it if it doesn't work\n", - "try:\n", - " from torchinfo import summary\n", - "except:\n", - " print(\"[INFO] Couldn't find torchinfo... installing it.\")\n", - " !pip install -q torchinfo\n", - " from torchinfo import summary\n", - "\n", - "# Try to import the going_modular directory, download it from GitHub if it doesn't work\n", - "try:\n", - " from going_modular.going_modular import data_setup, engine\n", - " from helper_functions import download_data, set_seeds, plot_loss_curves\n", - "except:\n", - " # Get the going_modular scripts\n", - " print(\"[INFO] Couldn't find going_modular or helper_functions scripts... downloading them from GitHub.\")\n", - " !git clone https://github.com/mrdbourke/pytorch-deep-learning\n", - " !mv pytorch-deep-learning/going_modular .\n", - " !mv pytorch-deep-learning/helper_functions.py . # get the helper_functions.py script\n", - " !rm -rf pytorch-deep-learning\n", - " from going_modular.going_modular import data_setup, engine\n", - " from helper_functions import download_data, set_seeds, plot_loss_curves" + "data": { + "text/plain": [ + "PosixPath('data/pizza_steak_sushi_20_percent')" ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Download pizza, steak, sushi images from GitHub\n", + "image_path = download_data(source=\"https://github.com/mrdbourke/pytorch-deep-learning/raw/main/data/pizza_steak_sushi_20_percent.zip\",\n", + " destination=\"pizza_steak_sushi_20_percent\")\n", + "image_path" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "r1ML2c-dCzCi" + }, + "outputs": [], + "source": [ + "# Setup directory paths to train and test images\n", + "train_dir = image_path / \"train\"\n", + "test_dir = image_path / \"test\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nNBZ_2h_Cy86" + }, + "source": [ + "### Preprocess data\n", + "\n", + "Turn images into tensors using same code as PyTorch Paper Replicating section 2.1 and 2.2: https://www.learnpytorch.io/08_pytorch_paper_replicating/#21-prepare-transforms-for-images" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "mU0T4gP3DJdF", + "outputId": "00d58b26-a6cb-4c3f-b774-2414c36bbce9" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 36 - }, - "id": "bE1AAH_uCjiP", - "outputId": "8337aa8d-9a46-41ad-9f96-658e857fcf57" - }, - "outputs": [ - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "'cuda'" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", - "device" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "Manually created transforms: Compose(\n", + " Resize(size=(224, 224), interpolation=bilinear, max_size=None, antialias=None)\n", + " ToTensor()\n", + ")\n" + ] + } + ], + "source": [ + "# Create image size (from Table 3 in the ViT paper) \n", + "IMG_SIZE = 224\n", + "\n", + "# Create transform pipeline manually\n", + "manual_transforms = transforms.Compose([\n", + " transforms.Resize((IMG_SIZE, IMG_SIZE)),\n", + " transforms.ToTensor(),\n", + "]) \n", + "print(f\"Manually created transforms: {manual_transforms}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "W4vWgIprDJau", + "outputId": "10423c3f-dc63-4e76-cd80-db5c6915662a" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "GmS5yuvxCpLp" - }, - "source": [ - "### Get data\n", - "\n", - "Want to download the data we've been using in PyTorch Model Deployment: https://www.learnpytorch.io/09_pytorch_model_deployment/#1-getting-data" + "data": { + "text/plain": [ + "(,\n", + " ,\n", + " ['pizza', 'steak', 'sushi'])" ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Set the batch size\n", + "BATCH_SIZE = 32 # this is lower than the ViT paper but it's because we're starting small\n", + "\n", + "# Create data loaders\n", + "train_dataloader, test_dataloader, class_names = data_setup.create_dataloaders(\n", + " train_dir=train_dir,\n", + " test_dir=test_dir,\n", + " transform=manual_transforms, # use manually created transforms\n", + " batch_size=BATCH_SIZE\n", + ")\n", + "\n", + "train_dataloader, test_dataloader, class_names" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "u7eLIFHyDJRr", + "outputId": "dfa3408c-0ef4-45ae-c5c7-88f8f92d0beb" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "dm772wqgCzN9", - "outputId": "ca47901f-5786-4d76-d768-58ad8349704c" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[INFO] data/pizza_steak_sushi_20_percent directory exists, skipping download.\n" - ] - }, - { - "data": { - "text/plain": [ - "PosixPath('data/pizza_steak_sushi_20_percent')" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Download pizza, steak, sushi images from GitHub\n", - "image_path = download_data(source=\"https://github.com/mrdbourke/pytorch-deep-learning/raw/main/data/pizza_steak_sushi_20_percent.zip\",\n", - " destination=\"pizza_steak_sushi_20_percent\")\n", - "image_path" + "data": { + "text/plain": [ + "(torch.Size([3, 224, 224]), tensor(2))" ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get a batch of images\n", + "image_batch, label_batch = next(iter(train_dataloader))\n", + "\n", + "# Get a single image from the batch\n", + "image, label = image_batch[0], label_batch[0]\n", + "\n", + "# View the batch shapes\n", + "image.shape, label" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 264 }, + "id": "2yyNHCmCDbSR", + "outputId": "a3d16804-3449-4105-e7e6-7da79bc495c2" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "id": "r1ML2c-dCzCi" - }, - "outputs": [], - "source": [ - "# Setup directory paths to train and test images\n", - "train_dir = image_path / \"train\"\n", - "test_dir = image_path / \"test\"" + "data": { + "image/png": "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", + "text/plain": [ + "
" ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Plot image with matplotlib\n", + "plt.imshow(image.permute(1, 2, 0)) # rearrange image dimensions to suit matplotlib [color_channels, height, width] -> [height, width, color_channels]\n", + "plt.title(class_names[label])\n", + "plt.axis(False);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nwmoMhW8IqSu" + }, + "source": [ + "## Exercise 1. Make and time predictions with both feature extractor models on the test dataset using the GPU (`device=\"cuda\"`). \n", + "\n", + "* Compare the model's prediction times on GPU vs CPU - does this close the gap between them? As in, does making predictions on the GPU make the ViT feature extractor prediction times closer to the EffNetB2 feature extractor prediction times?\n", + "* You'll find code to do these steps in [section 5. Making predictions with our trained models and timing them](https://www.learnpytorch.io/09_pytorch_model_deployment/#5-making-predictions-with-our-trained-models-and-timing-them) and [section 6. Comparing model results, prediction times and size](https://www.learnpytorch.io/09_pytorch_model_deployment/#6-comparing-model-results-prediction-times-and-size)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "P8DX4FnUe0lp" + }, + "source": [ + "### Train two models on Pizza, Steak, Sushi data\n", + "\n", + "Need:\n", + "* Trained EffNetB2 feature extractor \n", + "* Trained ViT feature extractor" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "W9gGOufOfD5l" + }, + "source": [ + "### EffNetB2 \n", + "\n", + "See function creation source here: https://www.learnpytorch.io/09_pytorch_model_deployment/#31-creating-a-function-to-make-an-effnetb2-feature-extractor" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "UR-P1QaBfFoZ" + }, + "outputs": [], + "source": [ + "def create_effnetb2_model(num_classes:int=3, \n", + " seed:int=42):\n", + " \"\"\"Creates an EfficientNetB2 feature extractor model and transforms.\n", + "\n", + " Args:\n", + " num_classes (int, optional): number of classes in the classifier head. \n", + " Defaults to 3.\n", + " seed (int, optional): random seed value. Defaults to 42.\n", + "\n", + " Returns:\n", + " model (torch.nn.Module): EffNetB2 feature extractor model. \n", + " transforms (torchvision.transforms): EffNetB2 image transforms.\n", + " \"\"\"\n", + " # 1, 2, 3. Create EffNetB2 pretrained weights, transforms and model\n", + " weights = torchvision.models.EfficientNet_B2_Weights.DEFAULT\n", + " transforms = weights.transforms()\n", + " model = torchvision.models.efficientnet_b2(weights=weights)\n", + "\n", + " # 4. Freeze all layers in base model\n", + " for param in model.parameters():\n", + " param.requires_grad = False\n", + "\n", + " # 5. Change classifier head with random seed for reproducibility\n", + " torch.manual_seed(seed)\n", + " model.classifier = nn.Sequential(\n", + " nn.Dropout(p=0.3, inplace=True),\n", + " nn.Linear(in_features=1408, out_features=num_classes),\n", + " )\n", + " \n", + " return model, transforms" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "PcLxlyFrfUGJ", + "outputId": "47bf699d-c300-43e5-e26d-680e5518eb91" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "nNBZ_2h_Cy86" - }, - "source": [ - "### Preprocess data\n", - "\n", - "Turn images into tensors using same code as PyTorch Paper Replicating section 2.1 and 2.2: https://www.learnpytorch.io/08_pytorch_paper_replicating/#21-prepare-transforms-for-images" + "data": { + "text/plain": [ + "ImageClassification(\n", + " crop_size=[288]\n", + " resize_size=[288]\n", + " mean=[0.485, 0.456, 0.406]\n", + " std=[0.229, 0.224, 0.225]\n", + " interpolation=InterpolationMode.BICUBIC\n", + ")" ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "effnetb2, effnetb2_transforms = create_effnetb2_model()\n", + "# effnetb2\n", + "effnetb2_transforms" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "b8LqE-XMgZM6", + "outputId": "1f5b9547-8ce2-4b99-f4aa-8e90f0c7fb3d" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "mU0T4gP3DJdF", - "outputId": "00d58b26-a6cb-4c3f-b774-2414c36bbce9" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Manually created transforms: Compose(\n", - " Resize(size=(224, 224), interpolation=bilinear, max_size=None, antialias=None)\n", - " ToTensor()\n", - ")\n" - ] - } - ], - "source": [ - "# Create image size (from Table 3 in the ViT paper) \n", - "IMG_SIZE = 224\n", - "\n", - "# Create transform pipeline manually\n", - "manual_transforms = transforms.Compose([\n", - " transforms.Resize((IMG_SIZE, IMG_SIZE)),\n", - " transforms.ToTensor(),\n", - "]) \n", - "print(f\"Manually created transforms: {manual_transforms}\")" + "data": { + "text/plain": [ + "(PosixPath('data/pizza_steak_sushi_20_percent/train'),\n", + " PosixPath('data/pizza_steak_sushi_20_percent/test'))" ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_dir, test_dir" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "IWMbHg7pf24Y", + "outputId": "39d2b3f8-7796-4723-9e02-293ca9c395f6" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "W4vWgIprDJau", - "outputId": "10423c3f-dc63-4e76-cd80-db5c6915662a" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(,\n", - " ,\n", - " ['pizza', 'steak', 'sushi'])" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Set the batch size\n", - "BATCH_SIZE = 32 # this is lower than the ViT paper but it's because we're starting small\n", - "\n", - "# Create data loaders\n", - "train_dataloader, test_dataloader, class_names = data_setup.create_dataloaders(\n", - " train_dir=train_dir,\n", - " test_dir=test_dir,\n", - " transform=manual_transforms, # use manually created transforms\n", - " batch_size=BATCH_SIZE\n", - ")\n", - "\n", - "train_dataloader, test_dataloader, class_names" + "data": { + "text/plain": [ + "(15, 5, ['pizza', 'steak', 'sushi'])" ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create dataloaders for EffNetB2 \n", + "from going_modular.going_modular import data_setup\n", + "\n", + "BATCH_SIZE = 32\n", + "train_dataloader_effnetb2, test_dataloader_effnetb2, class_names = data_setup.create_dataloaders(train_dir=train_dir,\n", + " test_dir=test_dir,\n", + " transform=effnetb2_transforms,\n", + " batch_size=BATCH_SIZE)\n", + "\n", + "len(train_dataloader_effnetb2), len(test_dataloader_effnetb2), class_names" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 227, + "referenced_widgets": [ + "198a73324ffa4478afc64c011df8368c", + "d9c166e1d7d9461eb3d9fe0fa2ced5b1", + "8025ad7772fb40f69b2fddfd7eab62e6", + "984c980048f24b2cbfb45df1dc3c9bd7", + "583f6c14fb3b4125a7c4486782fe7a2f", + "254d130afee243edb15dba9198e14f95", + "350d659062d34f90b0a61aca7f07b108", + "6f375d622ce84f95959f1ec00ab5b4fb", + "1b7118878ac04c4ab3a5555f59aade61", + "f7ddad2e2e604fd8b0240683f54ad8a3", + "afdc91f716ec416db36ef586ce623942" + ] }, + "id": "POcQESk6gulj", + "outputId": "2181b910-47c7-4e19-b574-607f400ef0bb" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "u7eLIFHyDJRr", - "outputId": "dfa3408c-0ef4-45ae-c5c7-88f8f92d0beb" + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "198a73324ffa4478afc64c011df8368c", + "version_major": 2, + "version_minor": 0 }, - "outputs": [ - { - "data": { - "text/plain": [ - "(torch.Size([3, 224, 224]), tensor(2))" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Get a batch of images\n", - "image_batch, label_batch = next(iter(train_dataloader))\n", - "\n", - "# Get a single image from the batch\n", - "image, label = image_batch[0], label_batch[0]\n", - "\n", - "# View the batch shapes\n", - "image.shape, label" + "text/plain": [ + " 0%| | 0/10 [00:00" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Plot image with matplotlib\n", - "plt.imshow(image.permute(1, 2, 0)) # rearrange image dimensions to suit matplotlib [color_channels, height, width] -> [height, width, color_channels]\n", - "plt.title(class_names[label])\n", - "plt.axis(False);" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 1 | train_loss: 0.9856 | train_acc: 0.5604 | test_loss: 0.7408 | test_acc: 0.9347\n", + "Epoch: 2 | train_loss: 0.7175 | train_acc: 0.8438 | test_loss: 0.5869 | test_acc: 0.9409\n", + "Epoch: 3 | train_loss: 0.5876 | train_acc: 0.8917 | test_loss: 0.4909 | test_acc: 0.9500\n", + "Epoch: 4 | train_loss: 0.4474 | train_acc: 0.9062 | test_loss: 0.4355 | test_acc: 0.9409\n", + "Epoch: 5 | train_loss: 0.4290 | train_acc: 0.9104 | test_loss: 0.3915 | test_acc: 0.9443\n", + "Epoch: 6 | train_loss: 0.4381 | train_acc: 0.8896 | test_loss: 0.3512 | test_acc: 0.9688\n", + "Epoch: 7 | train_loss: 0.4245 | train_acc: 0.8771 | test_loss: 0.3268 | test_acc: 0.9563\n", + "Epoch: 8 | train_loss: 0.3897 | train_acc: 0.8958 | test_loss: 0.3457 | test_acc: 0.9381\n", + "Epoch: 9 | train_loss: 0.3749 | train_acc: 0.8812 | test_loss: 0.3129 | test_acc: 0.9131\n", + "Epoch: 10 | train_loss: 0.3757 | train_acc: 0.8604 | test_loss: 0.2813 | test_acc: 0.9688\n" + ] + } + ], + "source": [ + "# Train EffNetB2 feature extractor\n", + "from going_modular.going_modular import engine\n", + "\n", + "optimizer = torch.optim.Adam(params=effnetb2.parameters(), lr=1e-3)\n", + "\n", + "loss_fn = torch.nn.CrossEntropyLoss()\n", + "\n", + "set_seeds()\n", + "effnetb2_results = engine.train(model=effnetb2,\n", + " train_dataloader=train_dataloader_effnetb2,\n", + " test_dataloader=test_dataloader_effnetb2,\n", + " epochs=10,\n", + " optimizer=optimizer,\n", + " loss_fn=loss_fn,\n", + " device=device)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "dE5GngR5igju" + }, + "outputs": [], + "source": [ + "# With label_smoothing=0.1\n", + "# Epoch: 1 | train_loss: 1.0005 | train_acc: 0.5708 | test_loss: 0.7872 | test_acc: 0.9347\n", + "# Epoch: 2 | train_loss: 0.7704 | train_acc: 0.8500 | test_loss: 0.6603 | test_acc: 0.9409\n", + "# Epoch: 3 | train_loss: 0.6679 | train_acc: 0.8896 | test_loss: 0.5883 | test_acc: 0.9500\n", + "# Epoch: 4 | train_loss: 0.5608 | train_acc: 0.9146 | test_loss: 0.5522 | test_acc: 0.9318\n", + "# Epoch: 5 | train_loss: 0.5528 | train_acc: 0.9125 | test_loss: 0.5239 | test_acc: 0.9352\n", + "# Epoch: 6 | train_loss: 0.5718 | train_acc: 0.8875 | test_loss: 0.4973 | test_acc: 0.9597\n", + "# Epoch: 7 | train_loss: 0.5609 | train_acc: 0.8854 | test_loss: 0.4864 | test_acc: 0.9472\n", + "# Epoch: 8 | train_loss: 0.5457 | train_acc: 0.8958 | test_loss: 0.5050 | test_acc: 0.9318\n", + "# Epoch: 9 | train_loss: 0.5338 | train_acc: 0.8896 | test_loss: 0.4809 | test_acc: 0.9193\n", + "# Epoch: 10 | train_loss: 0.5417 | train_acc: 0.8500 | test_loss: 0.4654 | test_acc: 0.9625\n", + "\n", + "# Without label_smoothing=0.1\n", + "# Epoch: 1 | train_loss: 0.9856 | train_acc: 0.5604 | test_loss: 0.7408 | test_acc: 0.9347\n", + "# Epoch: 2 | train_loss: 0.7175 | train_acc: 0.8438 | test_loss: 0.5869 | test_acc: 0.9409\n", + "# Epoch: 3 | train_loss: 0.5876 | train_acc: 0.8917 | test_loss: 0.4909 | test_acc: 0.9500\n", + "# Epoch: 4 | train_loss: 0.4474 | train_acc: 0.9062 | test_loss: 0.4355 | test_acc: 0.9409\n", + "# Epoch: 5 | train_loss: 0.4290 | train_acc: 0.9104 | test_loss: 0.3915 | test_acc: 0.9443\n", + "# Epoch: 6 | train_loss: 0.4381 | train_acc: 0.8896 | test_loss: 0.3512 | test_acc: 0.9688\n", + "# Epoch: 7 | train_loss: 0.4245 | train_acc: 0.8771 | test_loss: 0.3268 | test_acc: 0.9563\n", + "# Epoch: 8 | train_loss: 0.3897 | train_acc: 0.8958 | test_loss: 0.3457 | test_acc: 0.9381\n", + "# Epoch: 9 | train_loss: 0.3749 | train_acc: 0.8812 | test_loss: 0.3129 | test_acc: 0.9131\n", + "# Epoch: 10 | train_loss: 0.3757 | train_acc: 0.8604 | test_loss: 0.2813 | test_acc: 0.9688" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 458 }, + "id": "g73VUMNfi8yO", + "outputId": "d57b3bb4-5d56-4ddf-f415-6e6612811e57" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "nwmoMhW8IqSu" - }, - "source": [ - "## Exercise 1. Make and time predictions with both feature extractor models on the test dataset using the GPU (`device=\"cuda\"`). \n", - "\n", - "* Compare the model's prediction times on GPU vs CPU - does this close the gap between them? As in, does making predictions on the GPU make the ViT feature extractor prediction times closer to the EffNetB2 feature extractor prediction times?\n", - "* You'll find code to do these steps in [section 5. Making predictions with our trained models and timing them](https://www.learnpytorch.io/09_pytorch_model_deployment/#5-making-predictions-with-our-trained-models-and-timing-them) and [section 6. Comparing model results, prediction times and size](https://www.learnpytorch.io/09_pytorch_model_deployment/#6-comparing-model-results-prediction-times-and-size)." + "data": { + "image/png": "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IiL+p1bb81trp1lrk621yfHx8bV5ahERr3Xw4EFefPHFar9v1KhRHDx4sNrvGz9+PB9++GG13yciIiK1pyaC2i6gRaXnzT2viYhIFZwuqJWWlp7xfV999RUNGza8UGWJiIiIi2qiPf/nwH3GmPeAfsAha+2eGjiuiEite/zf61i/+3CNHrNz0wb84aoup90+ZcoUNm/eTI8ePQgODiYsLIzo6GjS0tLYuHEj1157LTt37qSwsJBf/OIXTJ48GYBWrVqRmppKfn4+I0eOZODAgSxatIhmzZrx2WefUa9evbPW9u233/Lggw9SWlpKnz59eOmllwgNDWXKlCl8/vnnBAUFccUVV/D000/zwQcf8PjjjxMYGEhUVBQLFiyosZ+RiIiInOisQc0Y8y4wFIgzxmQCfwCCAay1LwNfAaOADKAAmHChihUR8UdPPfUUa9euZeXKlcybN4+f/exnrF279thaZNOnTycmJoajR4/Sp08fbrjhBmJjY084xqZNm3j33Xd55ZVXuPnmm/noo48YO3bsGc9bWFjI+PHj+fbbb+nQoQO33347L730EuPGjeOTTz4hLS0NY8yx6ZVTp05l9uzZNGvW7JymXIqIiEjVnTWoWWtvPct2C9xbYxWJiLjoTCNftaVv374nLBj93HPP8cknnwCwc+dONm3a9JOg1rp1a3r06AFA79692bZt21nPk56eTuvWrenQoQMAd9xxBy+88AL33XcfYWFhTJw4kdGjRzN69GgABgwYwPjx47n55pu5/vrra+JbFRERkdOo1WYiNamkrJxl2w+4XYaISI2LiIg49vW8efP45ptv+OGHH1i1ahU9e/Y85YLSoaGhx74ODAw86/1tZxIUFMSSJUu48cYb+eKLLxgxwllK8+WXX+aJJ55g586d9O7dm/3795/zOURELpjiAjiif5/kAstcBiU/vR7XJJ8Nam8t3s4NLy1iZ26B26WIiJyXyMhI8vLyTrnt0KFDREdHEx4eTlpaGosXL66x83bs2JFt27aRkZEBwMyZMxkyZAj5+fkcOnSIUaNG8be//Y1Vq1YBsHnzZvr168fUqVOJj49n586dZzq8iEjtKi2CxS/Bs13hL23g5YHw9aOwZb6zTaSm7FsHb1wFsx++oKepiWYirhjSwWnvn5Kexe39W7lbjIjIeYiNjWXAgAF07dqVevXq0ahRo2Pb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", + "text/plain": [ + "
" ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from helper_functions import plot_loss_curves\n", + "\n", + "plot_loss_curves(effnetb2_results)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jk25LUPyioIe" + }, + "source": [ + "### Preparing and training ViT feature extractor" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "1Bp3kSv8i1B1" + }, + "outputs": [], + "source": [ + "def create_vit_model(num_classes:int=3, \n", + " seed:int=42):\n", + " \"\"\"Creates a ViT-B/16 feature extractor model and transforms.\n", + "\n", + " Args:\n", + " num_classes (int, optional): number of target classes. Defaults to 3.\n", + " seed (int, optional): random seed value for output layer. Defaults to 42.\n", + "\n", + " Returns:\n", + " model (torch.nn.Module): ViT-B/16 feature extractor model. \n", + " transforms (torchvision.transforms): ViT-B/16 image transforms.\n", + " \"\"\"\n", + " # Create ViT_B_16 pretrained weights, transforms and model\n", + " weights = torchvision.models.ViT_B_16_Weights.DEFAULT\n", + " transforms = weights.transforms()\n", + " model = torchvision.models.vit_b_16(weights=weights)\n", + "\n", + " # Freeze all layers in model\n", + " for param in model.parameters():\n", + " param.requires_grad = False\n", + "\n", + " # Change classifier head to suit our needs (this will be trainable)\n", + " torch.manual_seed(seed)\n", + " model.heads = nn.Sequential(nn.Linear(in_features=768, # keep this the same as original model\n", + " out_features=num_classes)) # update to reflect target number of classes\n", + " \n", + " return model, transforms" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "LNbhVc0BjR5X", + "outputId": "cff89102-6e62-4666-b22f-bf660eac5a65" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "P8DX4FnUe0lp" - }, - "source": [ - "### Train two models on Pizza, Steak, Sushi data\n", - "\n", - "Need:\n", - "* Trained EffNetB2 feature extractor \n", - "* Trained ViT feature extractor" + "data": { + "text/plain": [ + "ImageClassification(\n", + " crop_size=[224]\n", + " resize_size=[256]\n", + " mean=[0.485, 0.456, 0.406]\n", + " std=[0.229, 0.224, 0.225]\n", + " interpolation=InterpolationMode.BILINEAR\n", + ")" ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vit, vit_transforms = create_vit_model()\n", + "# vit\n", + "vit_transforms" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "yKqlWhjcjcGh", + "outputId": "5258c1ca-31f2-4404-c837-ddd1ccd045f7" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "W9gGOufOfD5l" - }, - "source": [ - "### EffNetB2 \n", - "\n", - "See function creation source here: https://www.learnpytorch.io/09_pytorch_model_deployment/#31-creating-a-function-to-make-an-effnetb2-feature-extractor" + "data": { + "text/plain": [ + "(15, 5, ['pizza', 'steak', 'sushi'])" ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create dataloaders for ViT\n", + "from going_modular.going_modular import data_setup\n", + "\n", + "BATCH_SIZE = 32\n", + "train_dataloader_vit, test_dataloader_vit, class_names = data_setup.create_dataloaders(train_dir=train_dir,\n", + " test_dir=test_dir,\n", + " transform=vit_transforms,\n", + " batch_size=BATCH_SIZE)\n", + "\n", + "len(train_dataloader_vit), len(test_dataloader_vit), class_names" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 227, + "referenced_widgets": [ + "aedc4452fd6c4e369c3b9a97f2dc7f4a", + "d80e97a6b93f4c2fb10f1dd68ef7d593", + "3e5d069cc92e4043bf5910b929fc33c5", + "fbe8e188bfb04a6686661761dc6d81d2", + "c104170bf4694edf925f9a1fbabe3f0c", + "3dc2eed246ea4996ad7671f71eb47394", + "187c5d5bf68643fbbe754554c5ed9143", + "f91d279664c74d53bc460d05f0af5d39", + "a3b71aabdf9e42fc9517aa924b114531", + "d2e3fd807351478abeb4fd9440310999", + "9a69b9bbcca740d6811e51bbf2c7e0c7" + ] }, + "id": "G28CNZNzjpoR", + "outputId": "970b0956-a0b1-4975-d796-16df917cadaf" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "id": "UR-P1QaBfFoZ" + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "aedc4452fd6c4e369c3b9a97f2dc7f4a", + "version_major": 2, + "version_minor": 0 }, - "outputs": [], - "source": [ - "def create_effnetb2_model(num_classes:int=3, \n", - " seed:int=42):\n", - " \"\"\"Creates an EfficientNetB2 feature extractor model and transforms.\n", - "\n", - " Args:\n", - " num_classes (int, optional): number of classes in the classifier head. \n", - " Defaults to 3.\n", - " seed (int, optional): random seed value. Defaults to 42.\n", - "\n", - " Returns:\n", - " model (torch.nn.Module): EffNetB2 feature extractor model. \n", - " transforms (torchvision.transforms): EffNetB2 image transforms.\n", - " \"\"\"\n", - " # 1, 2, 3. Create EffNetB2 pretrained weights, transforms and model\n", - " weights = torchvision.models.EfficientNet_B2_Weights.DEFAULT\n", - " transforms = weights.transforms()\n", - " model = torchvision.models.efficientnet_b2(weights=weights)\n", - "\n", - " # 4. Freeze all layers in base model\n", - " for param in model.parameters():\n", - " param.requires_grad = False\n", - "\n", - " # 5. Change classifier head with random seed for reproducibility\n", - " torch.manual_seed(seed)\n", - " model.classifier = nn.Sequential(\n", - " nn.Dropout(p=0.3, inplace=True),\n", - " nn.Linear(in_features=1408, out_features=num_classes),\n", - " )\n", - " \n", - " return model, transforms" + "text/plain": [ + " 0%| | 0/10 [00:00" ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_loss_curves(vit_results)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aDdDMVm8j5gm" + }, + "source": [ + "### Get all the images from the test path\n", + "\n", + "Want to make predictions acrosss the test dataset images and time them on GPU to see if they're faster on GPU or CPU..." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "OlTkRkdyj8Fp", + "outputId": "21c5c064-4a9f-4286-d409-e4b6498b72ff" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "IWMbHg7pf24Y", - "outputId": "39d2b3f8-7796-4723-9e02-293ca9c395f6" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(15, 5, ['pizza', 'steak', 'sushi'])" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Create dataloaders for EffNetB2 \n", - "from going_modular.going_modular import data_setup\n", - "\n", - "BATCH_SIZE = 32\n", - "train_dataloader_effnetb2, test_dataloader_effnetb2, class_names = data_setup.create_dataloaders(train_dir=train_dir,\n", - " test_dir=test_dir,\n", - " transform=effnetb2_transforms,\n", - " batch_size=BATCH_SIZE)\n", - "\n", - "len(train_dataloader_effnetb2), len(test_dataloader_effnetb2), class_names" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 227, - "referenced_widgets": [ - "198a73324ffa4478afc64c011df8368c", - "d9c166e1d7d9461eb3d9fe0fa2ced5b1", - "8025ad7772fb40f69b2fddfd7eab62e6", - "984c980048f24b2cbfb45df1dc3c9bd7", - "583f6c14fb3b4125a7c4486782fe7a2f", - "254d130afee243edb15dba9198e14f95", - "350d659062d34f90b0a61aca7f07b108", - "6f375d622ce84f95959f1ec00ab5b4fb", - "1b7118878ac04c4ab3a5555f59aade61", - "f7ddad2e2e604fd8b0240683f54ad8a3", - "afdc91f716ec416db36ef586ce623942" - ] - }, - "id": "POcQESk6gulj", - "outputId": "2181b910-47c7-4e19-b574-607f400ef0bb" - }, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "198a73324ffa4478afc64c011df8368c", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0/10 [00:00" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from helper_functions import plot_loss_curves\n", - "\n", - "plot_loss_curves(effnetb2_results)" + "data": { + "text/plain": [ + "['pizza', 'steak', 'sushi']" ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "class_names" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 36 }, + "id": "l6I_Dz5Ak8TW", + "outputId": "4106f906-7809-425d-91ec-8421982f50b2" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "jk25LUPyioIe" + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" }, - "source": [ - "### Preparing and training ViT feature extractor" + "text/plain": [ + "'cuda'" ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"cuda\" if torch.cuda.is_available() else \"cpu\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ZT_GTmmTezW7" + }, + "outputs": [], + "source": [ + "import pathlib\n", + "import torch\n", + "\n", + "from PIL import Image\n", + "from timeit import default_timer as timer \n", + "from tqdm.auto import tqdm\n", + "from typing import List, Dict\n", + "\n", + "# 1. Create a function to return a list of dictionaries with sample, truth label, prediction, prediction probability and prediction time\n", + "def pred_and_store(paths: List[pathlib.Path], \n", + " model: torch.nn.Module,\n", + " transform: torchvision.transforms, \n", + " class_names: List[str], \n", + " device: str = \"cuda\" if torch.cuda.is_available() else \"cpu\") -> List[Dict]:\n", + " \n", + " # 2. Create an empty list to store prediction dictionaires\n", + " pred_list = []\n", + " \n", + " # 3. Loop through target paths\n", + " for path in tqdm(paths):\n", + " \n", + " # 4. Create empty dictionary to store prediction information for each sample\n", + " pred_dict = {}\n", + "\n", + " # 5. Get the sample path and ground truth class name\n", + " pred_dict[\"image_path\"] = path\n", + " class_name = path.parent.stem\n", + " pred_dict[\"class_name\"] = class_name\n", + " \n", + " # 6. Start the prediction timer\n", + " start_time = timer()\n", + " \n", + " # 7. Open image path\n", + " img = Image.open(path)\n", + " \n", + " # 8. Transform the image, add batch dimension and put image on target device\n", + " transformed_image = transform(img).unsqueeze(0).to(device) \n", + " \n", + " # 9. Prepare model for inference by sending it to target device and turning on eval() mode\n", + " model = model.to(device)\n", + " model.eval()\n", + " \n", + " # 10. Get prediction probability, predicition label and prediction class\n", + " with torch.inference_mode():\n", + " pred_logit = model(transformed_image) # perform inference on target sample \n", + " pred_prob = torch.softmax(pred_logit, dim=1) # turn logits into prediction probabilities\n", + " pred_label = torch.argmax(pred_prob, dim=1) # turn prediction probabilities into prediction label\n", + " pred_class = class_names[pred_label.cpu()] # hardcode prediction class to be on CPU\n", + "\n", + " # 11. Make sure things in the dictionary are on CPU (required for inspecting predictions later on) \n", + " pred_dict[\"pred_prob\"] = round(pred_prob.max().cpu().item(), 4)\n", + " pred_dict[\"pred_class\"] = pred_class\n", + " \n", + " # 12. End the timer and calculate time per pred\n", + " end_time = timer()\n", + " pred_dict[\"time_for_pred\"] = round(end_time-start_time, 4)\n", + "\n", + " # 13. Does the pred match the true label?\n", + " pred_dict[\"correct\"] = class_name == pred_class\n", + "\n", + " # 14. Add the dictionary to the list of preds\n", + " pred_list.append(pred_dict)\n", + " \n", + " # 15. Return list of prediction dictionaries\n", + " return pred_list" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "xORYjBaRlV-G", + "outputId": "c88c6ed0-6fb7-4470-c4fa-2b2639735c60" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "id": "1Bp3kSv8i1B1" - }, - "outputs": [], - "source": [ - "def create_vit_model(num_classes:int=3, \n", - " seed:int=42):\n", - " \"\"\"Creates a ViT-B/16 feature extractor model and transforms.\n", - "\n", - " Args:\n", - " num_classes (int, optional): number of target classes. Defaults to 3.\n", - " seed (int, optional): random seed value for output layer. Defaults to 42.\n", - "\n", - " Returns:\n", - " model (torch.nn.Module): ViT-B/16 feature extractor model. \n", - " transforms (torchvision.transforms): ViT-B/16 image transforms.\n", - " \"\"\"\n", - " # Create ViT_B_16 pretrained weights, transforms and model\n", - " weights = torchvision.models.ViT_B_16_Weights.DEFAULT\n", - " transforms = weights.transforms()\n", - " model = torchvision.models.vit_b_16(weights=weights)\n", - "\n", - " # Freeze all layers in model\n", - " for param in model.parameters():\n", - " param.requires_grad = False\n", - "\n", - " # Change classifier head to suit our needs (this will be trainable)\n", - " torch.manual_seed(seed)\n", - " model.heads = nn.Sequential(nn.Linear(in_features=768, # keep this the same as original model\n", - " out_features=num_classes)) # update to reflect target number of classes\n", - " \n", - " return model, transforms" + "data": { + "text/plain": [ + "ImageClassification(\n", + " crop_size=[288]\n", + " resize_size=[288]\n", + " mean=[0.485, 0.456, 0.406]\n", + " std=[0.229, 0.224, 0.225]\n", + " interpolation=InterpolationMode.BICUBIC\n", + ")" ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "effnetb2_transforms" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "btrxf2A3lg8i" + }, + "source": [ + "### Make and time predictions on CPU" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "1e97fcc5d26e4a8dbef0d4f341f39f46", + "3b4eb48ac44e4cdc9310fa04adae8e00", + "6b4a4941520f4181bff6cd8394cb039f", + "ef9785a565e24c559819d32c72aa3a82", + "16f48f6e2af44c45a6c8bf7c62feb80e", + "f90632431c9e4de7b359b868810c5a7d", + "ab373d07afb942819cd636173630ba58", + "a051a4276dc34b12815cd37518213d81", + "e7bfad97ff2f4042800d5938f5d05113", + "a9c96bdd52a64bd187368d93885efdfb", + "3b703b1d4ce24f949fbc49870af349bf" + ] }, + "id": "pmDd_YZ7VSrL", + "outputId": "729ce303-0fad-4332-e421-29efe8f00192" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "LNbhVc0BjR5X", - "outputId": "cff89102-6e62-4666-b22f-bf660eac5a65" + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1e97fcc5d26e4a8dbef0d4f341f39f46", + "version_major": 2, + "version_minor": 0 }, - "outputs": [ - { - "data": { - "text/plain": [ - "ImageClassification(\n", - " crop_size=[224]\n", - " resize_size=[256]\n", - " mean=[0.485, 0.456, 0.406]\n", - " std=[0.229, 0.224, 0.225]\n", - " interpolation=InterpolationMode.BILINEAR\n", - ")" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vit, vit_transforms = create_vit_model()\n", - "# vit\n", - "vit_transforms" + "text/plain": [ + " 0%| | 0/150 [00:00" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_loss_curves(vit_results)" + "text/plain": [ + " 0%| | 0/150 [00:00\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
effnetb2_cpuvit_cpueffnetb2_gpuvit_gpu
00.2328740.5389530.0362630.019143
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + " \n", + " " ], - "source": [ - "from pathlib import Path\n", - "test_image_paths = list(Path(test_dir).glob(\"*/*.jpg\"))\n", - "len(test_image_paths)" + "text/plain": [ + " effnetb2_cpu vit_cpu effnetb2_gpu vit_gpu\n", + "0 0.232874 0.538953 0.036263 0.019143" ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "effnetb2_gpu_pred_time = get_mean_pred_time(effnetb2_preds_on_gpu)\n", + "vit_cpu_pred_time = get_mean_pred_time(vit_preds_on_cpu)\n", + "vit_gpu_pred_time = get_mean_pred_time(vit_preds_on_gpu)\n", + "\n", + "pred_times = {\"effnetb2_cpu\": effnetb2_cpu_pred_time,\n", + " \"vit_cpu\": vit_cpu_pred_time,\n", + " \"effnetb2_gpu\": effnetb2_gpu_pred_time,\n", + " \"vit_gpu\": vit_gpu_pred_time}\n", + "\n", + "pred_times_df = pd.DataFrame(pred_times, index=[0])\n", + "pred_times_df" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xt7IzAngnPh_" + }, + "source": [ + "It looks like the predictions on the GPU are much faster than the CPU overall.\n", + "\n", + "And it looks like the ViT model is faster than EffNetB2 on the GPU as well.\n", + "\n", + "So potentially if we had access to a GPU in deployment, a ViT model would be better due to having lower latency (prediction time) as well as better performance.\n", + "\n", + "But if we're focused on deploying to CPU, EffNetB2 wins because of good performance + faster inference time." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MBWnDZao9w_5" + }, + "source": [ + "## Exercise 2. The ViT feature extractor seems to have more learning capacity (due to more parameters) than EffNetB2, how does it go on the larger 20% split of the entire Food101 dataset?\n", + "\n", + "* Train a ViT feature extractor on the 20% Food101 dataset for 5 epochs, just like we did with EffNetB2 in section [10. Creating FoodVision Big](https://www.learnpytorch.io/09_pytorch_model_deployment/#10-creating-foodvision-big).\n", + "\n", + "Want to download and split whole Food101 dataset into 20% dataset.\n", + "\n", + "E.g. instead of training on all ~100,000 images in Food101, only train and test on ~20,000 (to save time experimenting)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AdtXlrposFRt" + }, + "source": [ + "### Create ViT feature extractor for Food101\n", + "\n", + "Need to get a ViT model capable of fitting on Food101 data (freeze the base layers and update the output layers to work with 101 classes)." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "TZsxj0F3qYZj", + "outputId": "4f4a702e-908c-4bf3-d492-9eede2ec5101" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "MFs4wubEksKd", - "outputId": "6765bd64-9283-492e-e9eb-6af889ffb9a5" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[PosixPath('data/pizza_steak_sushi_20_percent/test/sushi/715227.jpg'),\n", - " PosixPath('data/pizza_steak_sushi_20_percent/test/sushi/3401466.jpg'),\n", - " PosixPath('data/pizza_steak_sushi_20_percent/test/sushi/2948087.jpg'),\n", - " PosixPath('data/pizza_steak_sushi_20_percent/test/sushi/1203702.jpg'),\n", - " PosixPath('data/pizza_steak_sushi_20_percent/test/sushi/511818.jpg')]" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test_image_paths[:5]" + "data": { + "text/plain": [ + "======================================================================================================================================================\n", + "Layer (type (var_name)) Input Shape Output Shape Param # Trainable\n", + "======================================================================================================================================================\n", + "VisionTransformer (VisionTransformer) [1, 3, 224, 224] [1, 101] 768 Partial\n", + "├─Conv2d (conv_proj) [1, 3, 224, 224] [1, 768, 14, 14] (590,592) False\n", + "├─Encoder (encoder) [1, 197, 768] [1, 197, 768] 151,296 False\n", + "│ └─Dropout (dropout) [1, 197, 768] [1, 197, 768] -- --\n", + "│ └─Sequential (layers) [1, 197, 768] [1, 197, 768] -- False\n", + "│ │ └─EncoderBlock (encoder_layer_0) [1, 197, 768] [1, 197, 768] (7,087,872) False\n", + "│ │ └─EncoderBlock (encoder_layer_1) [1, 197, 768] [1, 197, 768] (7,087,872) False\n", + "│ │ └─EncoderBlock (encoder_layer_2) [1, 197, 768] [1, 197, 768] (7,087,872) False\n", + "│ │ └─EncoderBlock (encoder_layer_3) [1, 197, 768] [1, 197, 768] (7,087,872) False\n", + "│ │ └─EncoderBlock (encoder_layer_4) [1, 197, 768] [1, 197, 768] (7,087,872) False\n", + "│ │ └─EncoderBlock (encoder_layer_5) [1, 197, 768] [1, 197, 768] (7,087,872) False\n", + "│ │ └─EncoderBlock (encoder_layer_6) [1, 197, 768] [1, 197, 768] (7,087,872) False\n", + "│ │ └─EncoderBlock (encoder_layer_7) [1, 197, 768] [1, 197, 768] (7,087,872) False\n", + "│ │ └─EncoderBlock (encoder_layer_8) [1, 197, 768] [1, 197, 768] (7,087,872) False\n", + "│ │ └─EncoderBlock (encoder_layer_9) [1, 197, 768] [1, 197, 768] (7,087,872) False\n", + "│ │ └─EncoderBlock (encoder_layer_10) [1, 197, 768] [1, 197, 768] (7,087,872) False\n", + "│ │ └─EncoderBlock (encoder_layer_11) [1, 197, 768] [1, 197, 768] (7,087,872) False\n", + "│ └─LayerNorm (ln) [1, 197, 768] [1, 197, 768] (1,536) False\n", + "├─Sequential (heads) [1, 768] [1, 101] -- True\n", + "│ └─Linear (0) [1, 768] [1, 101] 77,669 True\n", + "======================================================================================================================================================\n", + "Total params: 85,876,325\n", + "Trainable params: 77,669\n", + "Non-trainable params: 85,798,656\n", + "Total mult-adds (M): 172.54\n", + "======================================================================================================================================================\n", + "Input size (MB): 0.60\n", + "Forward/backward pass size (MB): 104.09\n", + "Params size (MB): 257.85\n", + "Estimated Total Size (MB): 362.54\n", + "======================================================================================================================================================" ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create another ViT feature model instance\n", + "vit_food101_20_percent, vit_transforms = create_vit_model(num_classes=101)\n", + "\n", + "# Print ViT model summary (uncomment for full output) \n", + "from torchinfo import summary\n", + "summary(vit_food101_20_percent, \n", + " input_size=(1, 3, 224, 224),\n", + " col_names=[\"input_size\", \"output_size\", \"num_params\", \"trainable\"],\n", + " col_width=20,\n", + " row_settings=[\"var_names\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yfhMWkQur5EI" + }, + "source": [ + "### Create Food101 data transforms \n", + "\n", + "Because of the large amount of data, going to use data augmentation to (hopefully) prevent overfitting.\n", + "\n", + "See here: https://www.learnpytorch.io/04_pytorch_custom_datasets/#81-how-to-deal-with-overfitting" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "6pyYhCpsn8bI", + "outputId": "09ac890d-90e1-43c0-96c0-5265a96bb56d" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "AoZQAC1ZfGBO" - }, - "source": [ - "### Get function for making predictions and timing them\n", - "\n", - "See the source here: https://www.learnpytorch.io/09_pytorch_model_deployment/#51-creating-a-function-to-make-predictions-across-the-test-dataset" + "data": { + "text/plain": [ + "Compose(\n", + " TrivialAugmentWide(num_magnitude_bins=31, interpolation=InterpolationMode.NEAREST, fill=None)\n", + " ImageClassification(\n", + " crop_size=[224]\n", + " resize_size=[256]\n", + " mean=[0.485, 0.456, 0.406]\n", + " std=[0.229, 0.224, 0.225]\n", + " interpolation=InterpolationMode.BILINEAR\n", + ")\n", + ")" ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create Food101 training data transforms (only perform data augmentation on the training images)\n", + "food101_train_transforms = torchvision.transforms.Compose([\n", + " torchvision.transforms.TrivialAugmentWide(),\n", + " vit_transforms,\n", + "])\n", + "\n", + "food101_train_transforms" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "id": "NFXVZNCzVYgV" + }, + "outputs": [], + "source": [ + "from torchvision import datasets\n", + "\n", + "# Setup data directory\n", + "from pathlib import Path\n", + "data_dir = Path(\"data\")\n", + "\n", + "# Get training data (~750 images x 101 food classes)\n", + "train_data = datasets.Food101(root=data_dir, # path to download data to\n", + " split=\"train\", # dataset split to get\n", + " transform=food101_train_transforms, # perform data augmentation on training data\n", + " download=True) # want to download?\n", + "\n", + "# Get testing data (~250 images x 101 food classes)\n", + "test_data = datasets.Food101(root=data_dir,\n", + " split=\"test\",\n", + " transform=vit_transforms, # perform normal ViT transforms on test data\n", + " download=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "kmuPigfPoOl5", + "outputId": "20dd7ada-4b6e-49fa-f663-9e9fc556268f" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "DdbrRRfKk4FZ", - "outputId": "9c7eb41b-45aa-4327-82dc-9991d7226368" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['pizza', 'steak', 'sushi']" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "class_names" + "data": { + "text/plain": [ + "['apple_pie',\n", + " 'baby_back_ribs',\n", + " 'baklava',\n", + " 'beef_carpaccio',\n", + " 'beef_tartare',\n", + " 'beet_salad',\n", + " 'beignets',\n", + " 'bibimbap',\n", + " 'bread_pudding',\n", + " 'breakfast_burrito']" ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get Food101 class names\n", + "food101_class_names = train_data.classes\n", + "\n", + "# View the first 10\n", + "food101_class_names[:10]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9XRxmce1rt1O" + }, + "source": [ + "### Create Food101 20% data splits\n", + "\n", + "Want to split whole Food101 dataset into: \n", + "* Train set: 20% of whole original Food101 train dataset\n", + "* Test set: 20% of whole original Food101 test dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "id": "SSJrk250olsV" + }, + "outputs": [], + "source": [ + "def split_dataset(dataset:torchvision.datasets, split_size:float=0.2, seed:int=42):\n", + " \"\"\"Randomly splits a given dataset into two proportions based on split_size and seed.\n", + "\n", + " Args:\n", + " dataset (torchvision.datasets): A PyTorch Dataset, typically one from torchvision.datasets.\n", + " split_size (float, optional): How much of the dataset should be split? \n", + " E.g. split_size=0.2 means there will be a 20% split and an 80% split. Defaults to 0.2.\n", + " seed (int, optional): Seed for random generator. Defaults to 42.\n", + "\n", + " Returns:\n", + " tuple: (random_split_1, random_split_2) where random_split_1 is of size split_size*len(dataset) and \n", + " random_split_2 is of size (1-split_size)*len(dataset).\n", + " \"\"\"\n", + " # Create split lengths based on original dataset length\n", + " length_1 = int(len(dataset) * split_size) # desired length\n", + " length_2 = len(dataset) - length_1 # remaining length\n", + " \n", + " # Print out info\n", + " print(f\"[INFO] Splitting dataset of length {len(dataset)} into splits of size: {length_1} ({int(split_size*100)}%), {length_2} ({int((1-split_size)*100)}%)\")\n", + " \n", + " # Create splits with given random seed\n", + " random_split_1, random_split_2 = torch.utils.data.random_split(dataset, \n", + " lengths=[length_1, length_2],\n", + " generator=torch.manual_seed(seed)) # set the random seed for reproducible splits\n", + " return random_split_1, random_split_2" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "yve-zgQDpFci", + "outputId": "bfaf02cd-2847-42d3-80c5-6dfd4f657c51" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 36 - }, - "id": "l6I_Dz5Ak8TW", - "outputId": "4106f906-7809-425d-91ec-8421982f50b2" - }, - "outputs": [ - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "'cuda'" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\"cuda\" if torch.cuda.is_available() else \"cpu\"" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "[INFO] Splitting dataset of length 75750 into splits of size: 15150 (20%), 60600 (80%)\n", + "[INFO] Splitting dataset of length 25250 into splits of size: 5050 (20%), 20200 (80%)\n" + ] }, { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "id": "ZT_GTmmTezW7" - }, - "outputs": [], - "source": [ - "import pathlib\n", - "import torch\n", - "\n", - "from PIL import Image\n", - "from timeit import default_timer as timer \n", - "from tqdm.auto import tqdm\n", - "from typing import List, Dict\n", - "\n", - "# 1. Create a function to return a list of dictionaries with sample, truth label, prediction, prediction probability and prediction time\n", - "def pred_and_store(paths: List[pathlib.Path], \n", - " model: torch.nn.Module,\n", - " transform: torchvision.transforms, \n", - " class_names: List[str], \n", - " device: str = \"cuda\" if torch.cuda.is_available() else \"cpu\") -> List[Dict]:\n", - " \n", - " # 2. Create an empty list to store prediction dictionaires\n", - " pred_list = []\n", - " \n", - " # 3. Loop through target paths\n", - " for path in tqdm(paths):\n", - " \n", - " # 4. Create empty dictionary to store prediction information for each sample\n", - " pred_dict = {}\n", - "\n", - " # 5. Get the sample path and ground truth class name\n", - " pred_dict[\"image_path\"] = path\n", - " class_name = path.parent.stem\n", - " pred_dict[\"class_name\"] = class_name\n", - " \n", - " # 6. Start the prediction timer\n", - " start_time = timer()\n", - " \n", - " # 7. Open image path\n", - " img = Image.open(path)\n", - " \n", - " # 8. Transform the image, add batch dimension and put image on target device\n", - " transformed_image = transform(img).unsqueeze(0).to(device) \n", - " \n", - " # 9. Prepare model for inference by sending it to target device and turning on eval() mode\n", - " model = model.to(device)\n", - " model.eval()\n", - " \n", - " # 10. Get prediction probability, predicition label and prediction class\n", - " with torch.inference_mode():\n", - " pred_logit = model(transformed_image) # perform inference on target sample \n", - " pred_prob = torch.softmax(pred_logit, dim=1) # turn logits into prediction probabilities\n", - " pred_label = torch.argmax(pred_prob, dim=1) # turn prediction probabilities into prediction label\n", - " pred_class = class_names[pred_label.cpu()] # hardcode prediction class to be on CPU\n", - "\n", - " # 11. Make sure things in the dictionary are on CPU (required for inspecting predictions later on) \n", - " pred_dict[\"pred_prob\"] = round(pred_prob.unsqueeze(0).max().cpu().item(), 4)\n", - " pred_dict[\"pred_class\"] = pred_class\n", - " \n", - " # 12. End the timer and calculate time per pred\n", - " end_time = timer()\n", - " pred_dict[\"time_for_pred\"] = round(end_time-start_time, 4)\n", - "\n", - " # 13. Does the pred match the true label?\n", - " pred_dict[\"correct\"] = class_name == pred_class\n", - "\n", - " # 14. Add the dictionary to the list of preds\n", - " pred_list.append(pred_dict)\n", - " \n", - " # 15. Return list of prediction dictionaries\n", - " return pred_list" + "data": { + "text/plain": [ + "(15150, 5050)" ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create training 20% split of Food101\n", + "train_data_food101_20_percent, _ = split_dataset(dataset=train_data,\n", + " split_size=0.2)\n", + "\n", + "# Create testing 20% split of Food101\n", + "test_data_food101_20_percent, _ = split_dataset(dataset=test_data,\n", + " split_size=0.2)\n", + "\n", + "len(train_data_food101_20_percent), len(test_data_food101_20_percent)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vUv8YLfnrqoZ" + }, + "source": [ + "### Create DataLoaders for Food101 20 percent data" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "tXThBOJfpROq", + "outputId": "47f541c0-278e-4579-fc97-e14de76a5a9c" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "xORYjBaRlV-G", - "outputId": "c88c6ed0-6fb7-4470-c4fa-2b2639735c60" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "ImageClassification(\n", - " crop_size=[288]\n", - " resize_size=[288]\n", - " mean=[0.485, 0.456, 0.406]\n", - " std=[0.229, 0.224, 0.225]\n", - " interpolation=InterpolationMode.BICUBIC\n", - ")" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "effnetb2_transforms" + "data": { + "text/plain": [ + "(474, 158)" ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Turn torch Datasets into DataLoaders\n", + "from torch.utils.data import DataLoader\n", + "\n", + "BATCH_SIZE = 32\n", + "NUM_WORKERS = 2\n", + "train_dataloader_food101 = DataLoader(train_data_food101_20_percent,\n", + " batch_size=BATCH_SIZE,\n", + " shuffle=True,\n", + " num_workers=NUM_WORKERS)\n", + "\n", + "test_dataloader_food101 = DataLoader(test_data_food101_20_percent,\n", + " batch_size=BATCH_SIZE,\n", + " shuffle=False,\n", + " num_workers=NUM_WORKERS)\n", + "\n", + "len(train_dataloader_food101), len(test_dataloader_food101)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3ED6j6HgqMYy" + }, + "source": [ + "### Train ViT feature extractor on 20% of Food101 data\n", + "\n", + "**Note:** The cell below may take 15 mins to run on Google Colab (due to ~15,000 training images and ~5000 testing images)." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 138, + "referenced_widgets": [ + "1650ba7f3c7a4bab89245cadb89937aa", + "e2efe6b3123e489988806acd74d20f0a", + "aed7142a2eee4822b96b65e38f703a97", + "41cbdb7ebcc8475981b9183190470fbf", + "3bb210096b4a43a7abcaf4ed911d6e00", + "1578fb055b2b409a9a66b07471aa21c3", + "98988f14959f4ca49d7af3d9b5929a0c", + "67080ebd1ca04cf7bdc642a9ea3b0697", + "9c2aa13be594439f97e7fea01fbb0afb", + "4cb5a209da54421082b58fa407bc26e9", + "5c7f60cde457493fa6d8f914accb00c1" + ] }, + "id": "d08a7xh1qPGd", + "outputId": "63f439b6-4a4a-46d7-8ca5-0f90a3a9697a" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "btrxf2A3lg8i" + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1650ba7f3c7a4bab89245cadb89937aa", + "version_major": 2, + "version_minor": 0 }, - "source": [ - "### Make and time predictions on CPU" + "text/plain": [ + " 0%| | 0/5 [00:00\n", + "Traceback (most recent call last):\n", + " File \"/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\", line 1510, in __del__\n", + " self._shutdown_workers()\n", + " File \"/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\", line 1493, in _shutdown_workers\n", + " if w.is_alive():\n", + " File \"/usr/lib/python3.7/multiprocessing/process.py\", line 151, in is_alive\n", + " assert self._parent_pid == os.getpid(), 'can only test a child process'\n", + "AssertionError: can only test a child process\n", + "Exception ignored in: \n", + "Traceback (most recent call last):\n", + " File \"/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\", line 1510, in __del__\n", + " self._shutdown_workers()\n", + " File \"/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\", line 1493, in _shutdown_workers\n", + " if w.is_alive():\n", + " File \"/usr/lib/python3.7/multiprocessing/process.py\", line 151, in is_alive\n", + " assert self._parent_pid == os.getpid(), 'can only test a child process'\n", + "AssertionError: can only test a child process\n" + ] + } + ], + "source": [ + "# Loop through test DataLoader (with batch size 1)\n", + "# Make prediction with model\n", + "# Store prediction and prediction probability to dictionary\n", + "# Append dictionary to list\n", + "# Inspect list\n", + "\n", + "# Easy way: set up batch size of 1 of test data loader - from Sali1997s\n", + "# Create batch size of 1 (predict on 1 image at a time)\n", + "test_dataloader_food101_batch_size_1 = DataLoader(test_data_food101_20_percent,\n", + " batch_size=1,\n", + " shuffle=False,\n", + " num_workers=NUM_WORKERS)\n", + "\n", + "# Prepare model (do this outside the loop)\n", + "vit_food101_20_percent = vit_food101_20_percent.to(device)\n", + "vit_food101_20_percent.eval()\n", + "\n", + "# Loop through test DataLoader with batch size 1 and make predictions on each image\n", + "# store predictions and truth values to a dictionary and then append dictionary to list for inspection later\n", + "vit_food101_pred_list = []\n", + "for X, y in tqdm(test_dataloader_food101_batch_size_1):\n", + " # Send data to target device\n", + " X, y = X.to(device), y.to(device)\n", + " \n", + " # Create empty prediction dictionary (each sample gets a dictionary)\n", + " pred_dict = {} \n", + "\n", + " # Make predictions\n", + " with torch.inference_mode():\n", + " pred_probs = torch.softmax(vit_food101_20_percent(X), dim=1)\n", + " pred_labels = torch.argmax(pred_probs, dim=1)\n", + " pred_dict[\"pred_prob\"] = torch.max(pred_probs).cpu().numpy()\n", + " pred_dict[\"pred_label\"] = pred_labels.cpu().numpy()[0]\n", + " pred_dict[\"label\"] = y.cpu().numpy()[0]\n", + " \n", + " vit_food101_pred_list.append(pred_dict)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "aggsGHYF2Wrv", + "outputId": "e89209d6-4d74-46a7-a068-344615623344" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 81, - "referenced_widgets": [ - "95eacc9dbddd4a56a882071b1b96a73d", - "21362da1989e4a4aa4c84dbac552115f", - "41b025a486c64cd390339bcfe21fd62a", - "8fe414cbc5a7495180415c0754c526ec", - "3f2f13e0559a4fafb4d759970be46bd6", - "694e8f3018e6426ebe598917a920a3e8", - "dfe279159de44764b1f52f7ba6c161af", - "e55a11a7724e475a8249e578083cd3de", - "20235d0a25b942cbbe3a43b0e79b084e", - "54ca6b2cd1ac478cb3aa9e09eb87e413", - "32fc7b9eff2f463a9e28b3aa7369500f", - "b891ed053df248d1865c95eeaf13fff1", - "23223f72b27f4f85bc580f5732ae97c0", - "d86109f9c9e643a3bcf15486c305f635", - "e857367fa306441ca7ca9579e906e066", - "ba94ef6625db42208129c71d5f77f950", - "87046b1dec5f4189b52f517d5aed0614", - "696eb95e9f224eefa80e8d34841ac798", - "3f1d000380fd4a2e9cd823acf803883e", - "272fd9fb794347ab855f544acc3a720c", - "a70381f756144655b998a514ae83bd38", - "d88fef0654ba494c840cef7f23c86651" - ] - }, - "id": "qBAGto93lpe4", - "outputId": "fa9d41f5-2121-4d6c-ede8-fd2ffb1ebe94" - }, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "95eacc9dbddd4a56a882071b1b96a73d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0/150 [00:00\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pred_probpred_labellabelis_correctpred_classlabel_class
00.79484357272Truepancakespancakes
10.61369125757Truehummushummus
20.192828738080Truepulled_pork_sandwichpulled_pork_sandwich
30.581697645151Trueguacamoleguacamole
40.8230461511Truebaby_back_ribsbaby_back_ribs
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + " \n", + " " + ], + "text/plain": [ + " pred_prob pred_label label is_correct pred_class \\\n", + "0 0.7948435 72 72 True pancakes \n", + "1 0.6136912 57 57 True hummus \n", + "2 0.19282873 80 80 True pulled_pork_sandwich \n", + "3 0.58169764 51 51 True guacamole \n", + "4 0.82304615 1 1 True baby_back_ribs \n", + "\n", + " label_class \n", + "0 pancakes \n", + "1 hummus \n", + "2 pulled_pork_sandwich \n", + "3 guacamole \n", + "4 baby_back_ribs " ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create DataFrame with various columns\n", + "pred_df_20_percent = pd.DataFrame(vit_food101_pred_list)\n", + "\n", + "# Create a column for if the prediction is correct\n", + "pred_df_20_percent[\"is_correct\"] = pred_df_20_percent[\"pred_label\"] == pred_df_20_percent[\"label\"]\n", + "\n", + "# Create class name columns (e.g. pred_label=72 -> pred_class=\"pancakes\")\n", + "pred_df_20_percent[\"pred_class\"] = pred_df_20_percent[\"pred_label\"].apply(lambda x: food101_class_names[x])\n", + "pred_df_20_percent[\"label_class\"] = pred_df_20_percent[\"label\"].apply(lambda x: food101_class_names[x])\n", + "pred_df_20_percent.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 363 }, + "id": "2M3SUAsg2NRj", + "outputId": "faa3253c-663e-40fe-f937-857a6e4954da" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "5eUw-OM6mNei", - "outputId": "97b3aa32-5f49-4833-cf20-9cfe19e3bc62" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.23287399999999997" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pred_probpred_labellabelis_correctpred_classlabel_class
31070.98356385232Falsegyozadumplings
13060.94270467144Falsepaellafried_rice
28480.9298615418Falsefrench_onion_soupbread_pudding
7080.90341496912Falsebreakfast_burritocannoli
17260.8848796843Falseonion_ringsfried_calamari
34360.87869584558Falsefrozen_yogurtice_cream
22870.858544473828Falsefish_and_chipscroque_madame
32090.84964484936Falsebreakfast_burritofalafel
18720.849399037937Falseprime_ribfilet_mignon
13380.84500131551Falsecevicheguacamole
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " ], - "source": [ - "import pandas as pd\n", - "\n", - "def get_mean_pred_time(input):\n", - " df = pd.DataFrame(input)\n", - " return df.time_for_pred.mean()\n", - "\n", - "effnetb2_cpu_pred_time = get_mean_pred_time(effnetb2_preds_on_cpu)\n", - "effnetb2_cpu_pred_time" + "text/plain": [ + " pred_prob pred_label label is_correct pred_class \\\n", + "3107 0.9835638 52 32 False gyoza \n", + "1306 0.9427046 71 44 False paella \n", + "2848 0.9298615 41 8 False french_onion_soup \n", + "708 0.90341496 9 12 False breakfast_burrito \n", + "1726 0.884879 68 43 False onion_rings \n", + "3436 0.8786958 45 58 False frozen_yogurt \n", + "2287 0.85854447 38 28 False fish_and_chips \n", + "3209 0.84964484 9 36 False breakfast_burrito \n", + "1872 0.84939903 79 37 False prime_rib \n", + "1338 0.8450013 15 51 False ceviche \n", + "\n", + " label_class \n", + "3107 dumplings \n", + "1306 fried_rice \n", + "2848 bread_pudding \n", + "708 cannoli \n", + "1726 fried_calamari \n", + "3436 ice_cream \n", + "2287 croque_madame \n", + "3209 falafel \n", + "1872 filet_mignon \n", + "1338 guacamole " ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get top 10 samples that are \"most wrong\", e.g. highest pred_prob but wrong prediction - why??\n", + "pred_df_20_percent[pred_df_20_percent[\"is_correct\"] == False].sort_values(\"pred_prob\", ascending=False)[:10]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xx6wDwHZ45r_" + }, + "source": [ + "Comparing the \"pred_class\" to the \"label_class\" the model is often wrong on samples that are visually similar.\n", + "\n", + "For example, gyoza and dumplings look quite the same.\n", + "\n", + "The same as paella and fried rice.\n", + "\n", + "And onion rings and fried calamari.\n", + "\n", + "The model is getting confused on similar looking classes and thus predictions are in the right \"space\" but not necessarily correct compared to the ground truth." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LH-vHr3m9_oH" + }, + "source": [ + "## Exercise 4. Evaluate the ViT feature extractor across the whole Food101 test dataset rather than just the 20% version, how does it perform?\n", + "* Does it beat the original Food101 paper's best result of 56.4% accuracy?" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "k-oDd365w4A1", + "outputId": "6bfad8ba-a61c-43a5-fa17-d1c4ec5481aa" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 32, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 81 - }, - "id": "_Bnjfb4ymyLP", - "outputId": "daa59808-446a-4f85-b8fa-21d71c36c12c" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
effnetb2_cpuvit_cpueffnetb2_gpuvit_gpu
00.2328740.5389530.0362630.019143
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " effnetb2_cpu vit_cpu effnetb2_gpu vit_gpu\n", - "0 0.232874 0.538953 0.036263 0.019143" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "effnetb2_gpu_pred_time = get_mean_pred_time(effnetb2_preds_on_gpu)\n", - "vit_cpu_pred_time = get_mean_pred_time(vit_preds_on_cpu)\n", - "vit_gpu_pred_time = get_mean_pred_time(vit_preds_on_gpu)\n", - "\n", - "pred_times = {\"effnetb2_cpu\": effnetb2_cpu_pred_time,\n", - " \"vit_cpu\": vit_cpu_pred_time,\n", - " \"effnetb2_gpu\": effnetb2_gpu_pred_time,\n", - " \"vit_gpu\": vit_gpu_pred_time}\n", - "\n", - "pred_times_df = pd.DataFrame(pred_times, index=[0])\n", - "pred_times_df" + "data": { + "text/plain": [ + "25250" ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Check length of Food101 test data\n", + "len(test_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "czLfR8Pjw9gb", + "outputId": "9916f6a5-1107-42f9-d582-19d84bf67da4" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "xt7IzAngnPh_" - }, - "source": [ - "It looks like the predictions on the GPU are much faster than the CPU overall.\n", - "\n", - "And it looks like the ViT model is faster than EffNetB2 on the GPU as well.\n", - "\n", - "So potentially if we had access to a GPU in deployment, a ViT model would be better due to having lower latency (prediction time) as well as better performance.\n", - "\n", - "But if we're focused on deploying to CPU, EffNetB2 wins because of good performance + faster inference time." + "data": { + "text/plain": [ + "25250" ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Turn Food101 test data into DataLoader\n", + "# Easy way: set up batch size of 1 of test data loader - from Sali1997s\n", + "# Create batch size of 1 (predict on 1 image at a time)\n", + "test_dataloader_food101_all_data_batch_size_1 = DataLoader(test_data,\n", + " batch_size=1,\n", + " shuffle=False,\n", + " num_workers=NUM_WORKERS)\n", + "\n", + "len(test_dataloader_food101_all_data_batch_size_1)" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "b972c74283244c4580489025f2306921", + "62c29ae67a5c4f658f74f94caf75abd8", + "fdaf41692b1b4205bbe2b8570051062f", + "80e05c26a564402da7e3b52fddc8845f", + "5b5b28d04c76476fb2bfa4a23bd241cb", + "d2686785dee340b489781070fd0e4ab8", + "5d717bf09ecb441e8e61e57d92a623df", + "eb61d02241d3438fbf44a3e629adfcb6", + "ba54748f87e840ba9a3fcc8b2f30c135", + "26bcaf624dd24d68aa15aef3a0866d2d", + "c7bbdad837be48179a660a2aea18005d" + ] }, + "id": "dWxceTz3VmeB", + "outputId": "64b278ab-60e3-40ab-c02d-380a7ab19ce5" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "MBWnDZao9w_5" + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b972c74283244c4580489025f2306921", + "version_major": 2, + "version_minor": 0 }, - "source": [ - "## Exercise 2. The ViT feature extractor seems to have more learning capacity (due to more parameters) than EffNetB2, how does it go on the larger 20% split of the entire Food101 dataset?\n", - "\n", - "* Train a ViT feature extractor on the 20% Food101 dataset for 5 epochs, just like we did with EffNetB2 in section [10. Creating FoodVision Big](https://www.learnpytorch.io/09_pytorch_model_deployment/#10-creating-foodvision-big).\n", - "\n", - "Want to download and split whole Food101 dataset into 20% dataset.\n", - "\n", - "E.g. instead of training on all ~100,000 images in Food101, only train and test on ~20,000 (to save time experimenting)." + "text/plain": [ + " 0%| | 0/25250 [00:00\n", - "Traceback (most recent call last):\n", - " File \"/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\", line 1510, in __del__\n", - " self._shutdown_workers()\n", - " File \"/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\", line 1493, in _shutdown_workers\n", - " if w.is_alive():\n", - " File \"/usr/lib/python3.7/multiprocessing/process.py\", line 151, in is_alive\n", - " assert self._parent_pid == os.getpid(), 'can only test a child process'\n", - "AssertionError: can only test a child process\n", - "Exception ignored in: \n", - "Traceback (most recent call last):\n", - " File \"/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\", line 1510, in __del__\n", - " self._shutdown_workers()\n", - " File \"/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py\", line 1493, in _shutdown_workers\n", - " if w.is_alive():\n", - " File \"/usr/lib/python3.7/multiprocessing/process.py\", line 151, in is_alive\n", - " assert self._parent_pid == os.getpid(), 'can only test a child process'\n", - "AssertionError: can only test a child process\n" - ] - } - ], - "source": [ - "# Loop through test DataLoader (with batch size 1)\n", - "# Make prediction with model\n", - "# Store prediction and prediction probability to dictionary\n", - "# Append dictionary to list\n", - "# Inspect list\n", - "\n", - "# Easy way: set up batch size of 1 of test data loader - from Sali1997s\n", - "# Create batch size of 1 (predict on 1 image at a time)\n", - "test_dataloader_food101_batch_size_1 = DataLoader(test_data_food101_20_percent,\n", - " batch_size=1,\n", - " shuffle=False,\n", - " num_workers=NUM_WORKERS)\n", - "\n", - "# Prepare model (do this outside the loop)\n", - "vit_food101_20_percent = vit_food101_20_percent.to(device)\n", - "vit_food101_20_percent.eval()\n", - "\n", - "# Loop through test DataLoader with batch size 1 and make predictions on each image\n", - "# store predictions and truth values to a dictionary and then append dictionary to list for inspection later\n", - "vit_food101_pred_list = []\n", - "for X, y in tqdm(test_dataloader_food101_batch_size_1):\n", - " # Send data to target device\n", - " X, y = X.to(device), y.to(device)\n", - " \n", - " # Create empty prediction dictionary (each sample gets a dictionary)\n", - " pred_dict = {} \n", - "\n", - " # Make predictions\n", - " with torch.inference_mode():\n", - " pred_probs = torch.softmax(vit_food101_20_percent(X), dim=1)\n", - " pred_labels = torch.argmax(pred_probs, dim=1)\n", - " pred_dict[\"pred_prob\"] = torch.max(pred_probs).cpu().numpy()\n", - " pred_dict[\"pred_label\"] = pred_labels.cpu().numpy()[0]\n", - " pred_dict[\"label\"] = y.cpu().numpy()[0]\n", - " \n", - " vit_food101_pred_list.append(pred_dict)" - ] + "34b0ac29e4744ec5866c3cf31c2cab57": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "aggsGHYF2Wrv", - "outputId": "e89209d6-4d74-46a7-a068-344615623344" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['apple_pie', 'baby_back_ribs', 'baklava', 'beef_carpaccio', 'beef_tartare']" - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "food101_class_names[:5]" - ] + "350d659062d34f90b0a61aca7f07b108": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 206 - }, - "id": "oF2kZZTG0KNo", - "outputId": "d8ea3694-7b41-4d4c-a1fa-980b6589e269" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
pred_probpred_labellabelis_correctpred_classlabel_class
00.79484357272Truepancakespancakes
10.61369125757Truehummushummus
20.192828738080Truepulled_pork_sandwichpulled_pork_sandwich
30.581697645151Trueguacamoleguacamole
40.8230461511Truebaby_back_ribsbaby_back_ribs
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " pred_prob pred_label label is_correct pred_class \\\n", - "0 0.7948435 72 72 True pancakes \n", - "1 0.6136912 57 57 True hummus \n", - "2 0.19282873 80 80 True pulled_pork_sandwich \n", - "3 0.58169764 51 51 True guacamole \n", - "4 0.82304615 1 1 True baby_back_ribs \n", - "\n", - " label_class \n", - "0 pancakes \n", - "1 hummus \n", - "2 pulled_pork_sandwich \n", - "3 guacamole \n", - "4 baby_back_ribs " - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Create DataFrame with various columns\n", - "pred_df_20_percent = pd.DataFrame(vit_food101_pred_list)\n", - "\n", - "# Create a column for if the prediction is correct\n", - "pred_df_20_percent[\"is_correct\"] = pred_df_20_percent[\"pred_label\"] == pred_df_20_percent[\"label\"]\n", - "\n", - "# Create class name columns (e.g. pred_label=72 -> pred_class=\"pancakes\")\n", - "pred_df_20_percent[\"pred_class\"] = pred_df_20_percent[\"pred_label\"].apply(lambda x: food101_class_names[x])\n", - "pred_df_20_percent[\"label_class\"] = pred_df_20_percent[\"label\"].apply(lambda x: food101_class_names[x])\n", - "pred_df_20_percent.head()" - ] + "3b4eb48ac44e4cdc9310fa04adae8e00": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f90632431c9e4de7b359b868810c5a7d", + "placeholder": "​", + "style": "IPY_MODEL_ab373d07afb942819cd636173630ba58", + "value": "100%" + } }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 363 - }, - "id": "2M3SUAsg2NRj", - "outputId": "faa3253c-663e-40fe-f937-857a6e4954da" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
pred_probpred_labellabelis_correctpred_classlabel_class
31070.98356385232Falsegyozadumplings
13060.94270467144Falsepaellafried_rice
28480.9298615418Falsefrench_onion_soupbread_pudding
7080.90341496912Falsebreakfast_burritocannoli
17260.8848796843Falseonion_ringsfried_calamari
34360.87869584558Falsefrozen_yogurtice_cream
22870.858544473828Falsefish_and_chipscroque_madame
32090.84964484936Falsebreakfast_burritofalafel
18720.849399037937Falseprime_ribfilet_mignon
13380.84500131551Falsecevicheguacamole
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " pred_prob pred_label label is_correct pred_class \\\n", - "3107 0.9835638 52 32 False gyoza \n", - "1306 0.9427046 71 44 False paella \n", - "2848 0.9298615 41 8 False french_onion_soup \n", - "708 0.90341496 9 12 False breakfast_burrito \n", - "1726 0.884879 68 43 False onion_rings \n", - "3436 0.8786958 45 58 False frozen_yogurt \n", - "2287 0.85854447 38 28 False fish_and_chips \n", - "3209 0.84964484 9 36 False breakfast_burrito \n", - "1872 0.84939903 79 37 False prime_rib \n", - "1338 0.8450013 15 51 False ceviche \n", - "\n", - " label_class \n", - "3107 dumplings \n", - "1306 fried_rice \n", - "2848 bread_pudding \n", - "708 cannoli \n", - "1726 fried_calamari \n", - "3436 ice_cream \n", - "2287 croque_madame \n", - "3209 falafel \n", - "1872 filet_mignon \n", - "1338 guacamole " - ] - }, - "execution_count": 73, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Get top 10 samples that are \"most wrong\", e.g. highest pred_prob but wrong prediction - why??\n", - "pred_df_20_percent[pred_df_20_percent[\"is_correct\"] == False].sort_values(\"pred_prob\", ascending=False)[:10]" - ] + "3b703b1d4ce24f949fbc49870af349bf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "markdown", - "metadata": { - "id": "xx6wDwHZ45r_" - }, - "source": [ - "Comparing the \"pred_class\" to the \"label_class\" the model is often wrong on samples that are visually similar.\n", - "\n", - "For example, gyoza and dumplings look quite the same.\n", - "\n", - "The same as paella and fried rice.\n", - "\n", - "And onion rings and fried calamari.\n", - "\n", - "The model is getting confused on similar looking classes and thus predictions are in the right \"space\" but not necessarily correct compared to the ground truth." - ] + "3bb210096b4a43a7abcaf4ed911d6e00": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "markdown", - "metadata": { - "id": "LH-vHr3m9_oH" - }, - "source": [ - "## Exercise 4. Evaluate the ViT feature extractor across the whole Food101 test dataset rather than just the 20% version, how does it perform?\n", - "* Does it beat the original Food101 paper's best result of 56.4% accuracy?" - ] + "3cafb6d12ee149e3acedbfa568346e33": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "k-oDd365w4A1", - "outputId": "6bfad8ba-a61c-43a5-fa17-d1c4ec5481aa" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "25250" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } + "3dc2eed246ea4996ad7671f71eb47394": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3e5d069cc92e4043bf5910b929fc33c5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f91d279664c74d53bc460d05f0af5d39", + "max": 10, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a3b71aabdf9e42fc9517aa924b114531", + "value": 10 + } + }, + "3f1d000380fd4a2e9cd823acf803883e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3f2f13e0559a4fafb4d759970be46bd6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "41b025a486c64cd390339bcfe21fd62a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e55a11a7724e475a8249e578083cd3de", + "max": 150, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_20235d0a25b942cbbe3a43b0e79b084e", + "value": 150 + } + }, + "41cbdb7ebcc8475981b9183190470fbf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4cb5a209da54421082b58fa407bc26e9", + "placeholder": "​", + "style": "IPY_MODEL_5c7f60cde457493fa6d8f914accb00c1", + "value": " 5/5 [15:31<00:00, 183.71s/it]" + } + }, + "4a57bee54360480f98bd88aaa8549d0b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c1364b3347f24575a7726165e145a054", + "placeholder": "​", + "style": "IPY_MODEL_8cc7a775f8e142a6b45317cd705c036a", + "value": "100%" + } + }, + "4a79c15365174feea8dc1658133756c5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4cb5a209da54421082b58fa407bc26e9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "52c543fb5696491f955f285bc4187b8d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "543117542e0c470c8b38b177669e3dd0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "54ca6b2cd1ac478cb3aa9e09eb87e413": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "583f6c14fb3b4125a7c4486782fe7a2f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5b5b28d04c76476fb2bfa4a23bd241cb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5c7f60cde457493fa6d8f914accb00c1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5d717bf09ecb441e8e61e57d92a623df": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "607c1f043b7346edb799452c68c9e7b1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "62c29ae67a5c4f658f74f94caf75abd8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d2686785dee340b489781070fd0e4ab8", + "placeholder": "​", + "style": "IPY_MODEL_5d717bf09ecb441e8e61e57d92a623df", + "value": "100%" + } + }, + "656d68087a7b4e2397ae787e863ee428": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "67080ebd1ca04cf7bdc642a9ea3b0697": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "694e8f3018e6426ebe598917a920a3e8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "696eb95e9f224eefa80e8d34841ac798": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6b4a4941520f4181bff6cd8394cb039f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a051a4276dc34b12815cd37518213d81", + "max": 150, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e7bfad97ff2f4042800d5938f5d05113", + "value": 150 + } + }, + "6f375d622ce84f95959f1ec00ab5b4fb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "76a9c2e5ee364f6ab19cf7ddcd1ef310": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8025ad7772fb40f69b2fddfd7eab62e6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6f375d622ce84f95959f1ec00ab5b4fb", + "max": 10, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1b7118878ac04c4ab3a5555f59aade61", + "value": 10 + } + }, + "80e05c26a564402da7e3b52fddc8845f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_26bcaf624dd24d68aa15aef3a0866d2d", + "placeholder": "​", + "style": "IPY_MODEL_c7bbdad837be48179a660a2aea18005d", + "value": " 25250/25250 [05:38<00:00, 77.53it/s]" + } + }, + "87046b1dec5f4189b52f517d5aed0614": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8cc7a775f8e142a6b45317cd705c036a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8fe414cbc5a7495180415c0754c526ec": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_54ca6b2cd1ac478cb3aa9e09eb87e413", + "placeholder": "​", + "style": "IPY_MODEL_32fc7b9eff2f463a9e28b3aa7369500f", + "value": " 150/150 [00:05<00:00, 37.37it/s]" + } + }, + "95eacc9dbddd4a56a882071b1b96a73d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_21362da1989e4a4aa4c84dbac552115f", + "IPY_MODEL_41b025a486c64cd390339bcfe21fd62a", + "IPY_MODEL_8fe414cbc5a7495180415c0754c526ec" ], - "source": [ - "# Check length of Food101 test data\n", - "len(test_data)" - ] + "layout": "IPY_MODEL_3f2f13e0559a4fafb4d759970be46bd6" + } }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "czLfR8Pjw9gb", - "outputId": "9916f6a5-1107-42f9-d582-19d84bf67da4" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "25250" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } + "984c980048f24b2cbfb45df1dc3c9bd7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f7ddad2e2e604fd8b0240683f54ad8a3", + "placeholder": "​", + "style": "IPY_MODEL_afdc91f716ec416db36ef586ce623942", + "value": " 10/10 [01:10<00:00, 5.99s/it]" + } + }, + "98988f14959f4ca49d7af3d9b5929a0c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9a69b9bbcca740d6811e51bbf2c7e0c7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9c2aa13be594439f97e7fea01fbb0afb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a051a4276dc34b12815cd37518213d81": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a152e63878824439bb7f4fc916e80f5b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_52c543fb5696491f955f285bc4187b8d", + "placeholder": "​", + "style": "IPY_MODEL_f908c3aa76b9414795e0a7345ffaa7ca", + "value": " 5050/5050 [01:07<00:00, 40.17it/s]" + } + }, + "a3b71aabdf9e42fc9517aa924b114531": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a70381f756144655b998a514ae83bd38": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a8bab731fc1b41ffb526072144e661cf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4a79c15365174feea8dc1658133756c5", + "max": 150, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3cafb6d12ee149e3acedbfa568346e33", + "value": 150 + } + }, + "a9c96bdd52a64bd187368d93885efdfb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ab373d07afb942819cd636173630ba58": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "aed7142a2eee4822b96b65e38f703a97": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_67080ebd1ca04cf7bdc642a9ea3b0697", + "max": 5, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9c2aa13be594439f97e7fea01fbb0afb", + "value": 5 + } + }, + "aedc4452fd6c4e369c3b9a97f2dc7f4a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d80e97a6b93f4c2fb10f1dd68ef7d593", + "IPY_MODEL_3e5d069cc92e4043bf5910b929fc33c5", + "IPY_MODEL_fbe8e188bfb04a6686661761dc6d81d2" ], - "source": [ - "# Turn Food101 test data into DataLoader\n", - "# Easy way: set up batch size of 1 of test data loader - from Sali1997s\n", - "# Create batch size of 1 (predict on 1 image at a time)\n", - "test_dataloader_food101_all_data_batch_size_1 = DataLoader(test_data,\n", - " batch_size=1,\n", - " shuffle=False,\n", - " num_workers=NUM_WORKERS)\n", - "\n", - "len(test_dataloader_food101_all_data_batch_size_1)" - ] + "layout": "IPY_MODEL_c104170bf4694edf925f9a1fbabe3f0c" + } }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 49, - "referenced_widgets": [ - "b972c74283244c4580489025f2306921", - "62c29ae67a5c4f658f74f94caf75abd8", - "fdaf41692b1b4205bbe2b8570051062f", - "80e05c26a564402da7e3b52fddc8845f", - "5b5b28d04c76476fb2bfa4a23bd241cb", - "d2686785dee340b489781070fd0e4ab8", - "5d717bf09ecb441e8e61e57d92a623df", - "eb61d02241d3438fbf44a3e629adfcb6", - "ba54748f87e840ba9a3fcc8b2f30c135", - "26bcaf624dd24d68aa15aef3a0866d2d", - "c7bbdad837be48179a660a2aea18005d" - ] - }, - "id": "dWxceTz3VmeB", - "outputId": "64b278ab-60e3-40ab-c02d-380a7ab19ce5" - }, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b972c74283244c4580489025f2306921", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0/25250 [00:00