Files
lab/ds/25-1/4/04a_asl_augmentation.ipynb
2026-02-13 14:03:28 +03:00

1273 lines
101 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "J1AHrcF83Y-g"
},
"source": [
"<center><a href=\"https://www.nvidia.com/dli\"> <img src=\"images/DLI_Header.png\" alt=\"Header\" style=\"width: 400px;\"/> </a></center>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "bBNeKAyF3Y-h"
},
"source": [
"# 4a. Data Augmentation"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HTHY1Otu3Y-h"
},
"source": [
"So far, we've selected a model architecture that vastly improves the model's performance, as it is designed to recognize important features in the images. The validation accuracy is still lagging behind the training accuracy, which is a sign of overfitting: the model is getting confused by things it has not seen before when it tests against the validation dataset.\n",
"\n",
"In order to teach our model to be more robust when looking at new data, we're going to programmatically increase the size and variance in our dataset. This is known as [*data augmentation*](https://link.springer.com/article/10.1186/s40537-019-0197-0), a useful technique for many deep learning applications.\n",
"\n",
"The increase in size gives the model more images to learn from while training. The increase in variance helps the model ignore unimportant features and select only the features that are truly important in classification, allowing it to generalize better."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "k01AskqI3Y-h"
},
"source": [
"## 4a.1 Objectives"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YCFOyxKS3Y-h"
},
"source": [
"* Augment the ASL dataset\n",
"* Use the augmented data to train an improved model\n",
"* Save the well-trained model to disk for use in deployment"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 6560,
"status": "ok",
"timestamp": 1715241340700,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "ocl26UO63Y-i",
"outputId": "b097ecfc-e330-4c6e-d386-4b2b7cbb55bb"
},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import torch.nn as nn\n",
"import pandas as pd\n",
"import torch\n",
"from torch.optim import Adam\n",
"from torch.utils.data import Dataset, DataLoader\n",
"import torchvision.transforms.v2 as transforms\n",
"import torchvision.transforms.functional as F\n",
"import matplotlib.pyplot as plt\n",
"\n",
"import utils\n",
"\n",
"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
"torch.cuda.is_available()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u-FCWlRg3Y-h"
},
"source": [
"## 4a.2 Preparing the Data"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "JjSagpmG3Y-i"
},
"source": [
"As we're in a new notebook, we will load and process our data again. To do this, execute the following cell:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"executionInfo": {
"elapsed": 3988,
"status": "ok",
"timestamp": 1715241345056,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "jYhhD7yo2WEI"
},
"outputs": [],
"source": [
"IMG_HEIGHT = 28\n",
"IMG_WIDTH = 28\n",
"IMG_CHS = 1\n",
"N_CLASSES = 24\n",
"\n",
"train_df = pd.read_csv(\"data/asl_data/sign_mnist_train.csv\")\n",
"valid_df = pd.read_csv(\"data/asl_data/sign_mnist_valid.csv\")\n",
"\n",
"class MyDataset(Dataset):\n",
" def __init__(self, base_df):\n",
" x_df = base_df.copy()\n",
" y_df = x_df.pop('label')\n",
" x_df = x_df.values / 255 # Normalize values from 0 to 1\n",
" x_df = x_df.reshape(-1, IMG_CHS, IMG_WIDTH, IMG_HEIGHT)\n",
" self.xs = torch.tensor(x_df).float().to(device)\n",
" self.ys = torch.tensor(y_df).to(device)\n",
"\n",
" def __getitem__(self, idx):\n",
" x = self.xs[idx]\n",
" y = self.ys[idx]\n",
" return x, y\n",
"\n",
" def __len__(self):\n",
" return len(self.xs)\n",
"\n",
"n = 32\n",
"train_data = MyDataset(train_df)\n",
"train_loader = DataLoader(train_data, batch_size=n, shuffle=True)\n",
"train_N = len(train_loader.dataset)\n",
"\n",
"valid_data = MyDataset(valid_df)\n",
"valid_loader = DataLoader(valid_data, batch_size=n)\n",
"valid_N = len(valid_loader.dataset)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qwsfoZkE3Y-i"
},
"source": [
"## 4a.3 Model Creation"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ze7Tv-Aj3Y-i"
},
"source": [
"We will also need to create our model again. As we learned in the last lesson, convolutional neural networks use a repeated sequence of layers. Let's take advantage of this pattern to make our own [custom module](https://pytorch.org/tutorials/beginner/examples_nn/two_layer_net_module.html). We can then use this module like a layer in our [Sequential](https://pytorch.org/docs/stable/generated/torch.nn.Sequential.html) model.\n",
"\n",
"To do this, we will extend the [Module](https://pytorch.org/docs/stable/generated/torch.nn.Module.html) class. Then we will define two methods:\n",
"* `__init__`: defines any properties we want our module to have, including our neural network layers. We will effectively be using a model within a model.\n",
"* `forward`: defines how we want the module to process any incoming data from the previous layer it is connected to. Since we are using a `Sequential` model, we can pass the input data into it like we are making a prediction."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"executionInfo": {
"elapsed": 322,
"status": "ok",
"timestamp": 1715241347583,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "_o8Y7C91Bfl8"
},
"outputs": [],
"source": [
"class MyConvBlock(nn.Module):\n",
" def __init__(self, in_ch, out_ch, dropout_p):\n",
" kernel_size = 3\n",
" super().__init__()\n",
"\n",
" self.model = nn.Sequential(\n",
" nn.Conv2d(in_ch, out_ch, kernel_size, stride=1, padding=1),\n",
" nn.BatchNorm2d(out_ch),\n",
" nn.ReLU(),\n",
" nn.Dropout(dropout_p),\n",
" nn.MaxPool2d(2, stride=2)\n",
" )\n",
"\n",
" def forward(self, x):\n",
" return self.model(x)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we've define our custom module, let's see it in action. The below model ia archecturially the same as in the previous lesson. Can you see the connection?"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"executionInfo": {
"elapsed": 2,
"status": "ok",
"timestamp": 1715241351435,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "I0A_7iJvB8Kc"
},
"outputs": [],
"source": [
"flattened_img_size = 75 * 3 * 3\n",
"\n",
"# Input 1 x 28 x 28\n",
"base_model = nn.Sequential(\n",
" MyConvBlock(IMG_CHS, 25, 0), # 25 x 14 x 14\n",
" MyConvBlock(25, 50, 0.2), # 50 x 7 x 7\n",
" MyConvBlock(50, 75, 0), # 75 x 3 x 3\n",
" # Flatten to Dense Layers\n",
" nn.Flatten(),\n",
" nn.Linear(flattened_img_size, 512),\n",
" nn.Dropout(.3),\n",
" nn.ReLU(),\n",
" nn.Linear(512, N_CLASSES)\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When we print the model, not only will it now show the use of our custom module, it will also show the layers within our custom module:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 465,
"status": "ok",
"timestamp": 1715241354080,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "4THc2t0HhNcv",
"outputId": "e25d69a9-e51a-4a90-90df-dc69a586f54b"
},
"outputs": [
{
"data": {
"text/plain": [
"OptimizedModule(\n",
" (_orig_mod): Sequential(\n",
" (0): MyConvBlock(\n",
" (model): Sequential(\n",
" (0): Conv2d(1, 25, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
" (1): BatchNorm2d(25, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (2): ReLU()\n",
" (3): Dropout(p=0, inplace=False)\n",
" (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
" )\n",
" )\n",
" (1): MyConvBlock(\n",
" (model): Sequential(\n",
" (0): Conv2d(25, 50, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
" (1): BatchNorm2d(50, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (2): ReLU()\n",
" (3): Dropout(p=0.2, inplace=False)\n",
" (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
" )\n",
" )\n",
" (2): MyConvBlock(\n",
" (model): Sequential(\n",
" (0): Conv2d(50, 75, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
" (1): BatchNorm2d(75, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (2): ReLU()\n",
" (3): Dropout(p=0, inplace=False)\n",
" (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
" )\n",
" )\n",
" (3): Flatten(start_dim=1, end_dim=-1)\n",
" (4): Linear(in_features=675, out_features=512, bias=True)\n",
" (5): Dropout(p=0.3, inplace=False)\n",
" (6): ReLU()\n",
" (7): Linear(in_features=512, out_features=24, bias=True)\n",
" )\n",
")"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"loss_function = nn.CrossEntropyLoss()\n",
"optimizer = Adam(base_model.parameters())\n",
"\n",
"model = torch.compile(base_model.to(device))\n",
"model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Custom modules are flexible, and we can define any other methods or properties we wish to have. This makes them powerful when data scientists are trying to solve complex problems."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kjBNCzfc3Y-j"
},
"source": [
"## 4a.4 Data Augmentation"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "y8HdHKtM3Y-j"
},
"source": [
"Before defining our training loop, it's time to set up our data augmentation.\n",
"\n",
"We've seen [TorchVision](https://pytorch.org/vision/stable/index.html)'s [Transforms](https://pytorch.org/vision/0.9/transforms.html) before, but in this lesson, we will further explore its data augmentation tools. First, let's get a sample image to test with:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 312,
"status": "ok",
"timestamp": 1715241358482,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "-LT7NvrXhYwB",
"outputId": "4c1c1af4-811b-46d7-fa73-594772907549"
},
"outputs": [
{
"data": {
"text/plain": [
"torch.Size([1, 28, 28])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"row_0 = train_df.head(1)\n",
"y_0 = row_0.pop('label')\n",
"x_0 = row_0.values / 255\n",
"x_0 = x_0.reshape(IMG_CHS, IMG_WIDTH, IMG_HEIGHT)\n",
"x_0 = torch.tensor(x_0)\n",
"x_0.shape"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 447
},
"executionInfo": {
"elapsed": 332,
"status": "ok",
"timestamp": 1715241364072,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "XKFRYIpvkUEF",
"outputId": "fb3f72ab-ce59-4bfc-a54a-0a4d575e497c"
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7fd8e26fa3b0>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"image = F.to_pil_image(x_0)\n",
"plt.imshow(image, cmap='gray')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4a.4.1 [RandomResizeCrop](https://pytorch.org/vision/0.9/transforms.html#torchvision.transforms.RandomResizedCrop)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This transform will randomly resize the input image based on `scale`, and then [crop](https://en.wikipedia.org/wiki/Cropping_(image)) it to a size we specify. In this case, we will crop it to the original image dimensions. To do this, TorchVision needs to know the [aspect ratio](https://en.wikipedia.org/wiki/Aspect_ratio_(image)) of the image it is scaling. Since our height is the same as our width, our aspect `ratio` is 1:1."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"executionInfo": {
"elapsed": 2,
"status": "ok",
"timestamp": 1715241375000,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "qWINTqKypE5J"
},
"outputs": [],
"source": [
"trans = transforms.Compose([\n",
" transforms.RandomResizedCrop((IMG_WIDTH, IMG_HEIGHT), scale=(.7, 1), ratio=(1, 1)),\n",
"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Try running the below cell a few times. It should be different each time."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 447
},
"executionInfo": {
"elapsed": 507,
"status": "ok",
"timestamp": 1715241377237,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "6ZugUNuJpPG2",
"outputId": "52caec17-6a25-4484-c2f4-2aed78b5ffe8"
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7fd8d55ea530>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"new_x_0 = trans(x_0)\n",
"image = F.to_pil_image(new_x_0)\n",
"plt.imshow(image, cmap='gray')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 333,
"status": "ok",
"timestamp": 1715241385987,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "8VQJ1vwKp4nJ",
"outputId": "63521e3a-5a63-48c8-8823-bd60d6814b64"
},
"outputs": [
{
"data": {
"text/plain": [
"torch.Size([1, 28, 28])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"new_x_0.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4a.4.2 [RandomHorizontalFlip](https://pytorch.org/vision/0.9/transforms.html#torchvision.transforms.RandomHorizontalFlip)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Yrmm_inJ3Y-j"
},
"source": [
"We can also randomly flip our images [Horizontally](https://pytorch.org/vision/0.9/transforms.html#torchvision.transforms.RandomHorizontalFlip) or [Vertically](https://pytorch.org/vision/0.9/transforms.html#torchvision.transforms.RandomVerticalFlip). However, for these images, we will only flip them horizontally.\n",
"\n",
"Take a moment to think about why we would want to flip images horizontally, but not vertically. When you have an idea, reveal the text below."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XCLufCeF3Y-j"
},
"source": [
"`# SOLUTION` Fun fact: American Sign Language can be done with either the left or right hand being dominant. However, it is unlikely to see sign language from upside down. This kind of domain-specific reasoning can help make good decisions for your own deep learning applications."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"trans = transforms.Compose([\n",
" transforms.RandomHorizontalFlip()\n",
"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Try running the below cell a few times. Does the image flip about half the time?"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7fd8d4c7cac0>"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"new_x_0 = trans(x_0)\n",
"image = F.to_pil_image(new_x_0)\n",
"plt.imshow(image, cmap='gray')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4a.4.3 [RandomRotation](https://pytorch.org/vision/0.9/transforms.html#torchvision.transforms.RandomRotation)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also randomly rotate the image to add more variability. Just like with with other augmentation techniques, it's easy to accidentally go too far. With ASL, if we rotate too much, our `D`s might look like `G`s and visa versa. Because of this, let's limit it to `30` degrees."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"trans = transforms.Compose([\n",
" transforms.RandomRotation(10)\n",
"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When we run the cell block below, some black pixels may appear. The corners or our image disappear when we rotate, and for almost every pixel we lose, we gain an empty pixel."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7fd8d3b78b50>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAh20lEQVR4nO3de2zV9f3H8Vcp7WlLS7tS6EUKK3hhEygOpesUhqMBusSI4ubtDzAGoitmyJymi4qXJd0PEyUahvtjg5mIt0RgmoVF0Za4AQsoQTJXgVQpoS2z2Ja29ALn+/uD2K1y/Xw4/b5Py/ORnISe8331+znffs95cdrTdxOCIAgEAEDIhlkvAABweaKAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYGK49QK+LRqN6siRI8rIyFBCQoL1cgAAjoIg0PHjx1VQUKBhw879OifuCujIkSMqLCy0XgYA4BLV19dr7Nix57w97gooIyMjtH09++yzXrn09HTnTCQScc4kJyc7Z1JSUpwzw4f7nQY+ucTExFD2c77/dZ2Pz/p89uWzH59MV1eXc0aSUlNTnTM+x2HmzJnOGQweF3o+H7ACWrNmjZ577jk1NjaquLhYL730kmbMmHHBXJjfdvN5spb8Hpw+BeSTCbOAkpKSnDMU0GlhlbdPRpLS0tKcM77HHEPXhZ7PB+SMeeONN7RixQqtXLlSH3/8sYqLizVv3jwdPXp0IHYHABiEBqSAnn/+eS1ZskT33Xefvv/97+vll19WWlqa/vSnPw3E7gAAg1DMC6inp0e7d+9WWVnZf3cybJjKysq0ffv2M7bv7u5WW1tbvwsAYOiLeQF99dVXOnXqlHJzc/tdn5ubq8bGxjO2r6qqUmZmZt+Fd8ABwOXB/KeGlZWVam1t7bvU19dbLwkAEIKYvwsuJydHiYmJampq6nd9U1OT8vLyztg+Eol4vdsLADC4xfwVUHJysqZPn66tW7f2XReNRrV161aVlpbGencAgEFqQH4PaMWKFVq0aJGuv/56zZgxQ6tXr1ZHR4fuu+++gdgdAGAQGpACuvPOO/Wf//xHTz75pBobGzVt2jRt2bLljDcmAAAuXwlBEATWi/hfbW1tyszMDGVfL7zwglduxIgRzhmfCQVhje/xnYTgs694nhrgm/NZn8/ED59zqKamxjkjSZMmTXLOnO1nvBcS1tMPg43/a8qUKaHtq7W1VSNHjjzn7ebvggMAXJ4oIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYGJBp2BZWr17tnPEZKipJaWlpzhmfwZ1JSUnOGZ9hmr5/ENB34Kcrn0GSvsMnfYalhsXnPh07dsxrX+3t7c4Zn8GiPvcpzuYnDzqffvqpc8b1mLe3t+tHP/rRBbeL30cbAGBIo4AAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYGDLTsH0mM/tOc/bJ+UxZ9tlPWBO0fXM+meHD3U9T32nYPjmfY+7jlVdecc7MnDnTa19FRUVeuTD4fm3DEs8T1SUpGo06Z1yP+cVuH99HCgAwZFFAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBxWQ8jDXNoYFj7ivdBjT7C/Dr5HL+0tDTnTGNjo3Oms7PTOZOenu6cAcLCKyAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmhswwUh8+A0wlv+GYPkMu432Aqc/xS0pKCmU/vqLRqHNmxIgRzpkTJ044Z3yOQ5jDSMMcGhvP4v04+JzjAyW+jxQAYMiigAAAJmJeQE899ZQSEhL6XSZNmhTr3QAABrkB+RnQtddeq/fff/+/Oxl+Wf+oCQBwFgPSDMOHD1deXt5AfGoAwBAxID8D2r9/vwoKCjRhwgTde++9OnTo0Dm37e7uVltbW78LAGDoi3kBlZSUaP369dqyZYvWrl2ruro6zZw5U8ePHz/r9lVVVcrMzOy7FBYWxnpJAIA4FPMCKi8v189+9jNNnTpV8+bN01//+le1tLTozTffPOv2lZWVam1t7bvU19fHekkAgDg04O8OyMrK0tVXX60DBw6c9fZIJKJIJDLQywAAxJkB/z2g9vZ2HTx4UPn5+QO9KwDAIBLzAnrkkUdUU1OjL774Qv/4xz902223KTExUXfffXesdwUAGMRi/i24w4cP6+6771Zzc7NGjx6tm266STt27NDo0aNjvSsAwCAW8wJ6/fXXY/0pL4rPL7v6Dg30Gd7pM0jSJ+Nzn3yPQ1hDWX347ic1NdU5c/LkSedMQ0ODcyY5Odk5k5KS4pyRwj2P4llY52sQBM4Z37X5fJ0GaoDp0DtjAACDAgUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBMUEAAABMD/gfpwuIzjNR3mF9YQ0J91jcUh5H67MdnuKMkpaenO2fa29udM19++aVzJjc31znjM8BU8vs6+RzzsIZw+j7WwxpGGibfx4aLi33M8goIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGBiyEzDDmvKcpj7CmvadJiTguP9PvlMVU9LS3POZGVlOWfCmtQtSRkZGc4Zn2PngwnVp/keh2g06pxx/QsAF7s9r4AAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYiNthpH/4wx+Umpp60dunpKQ478Pl8/8vn8GB8TyM1FdYQ0LDPA4+AzV7e3udM9ddd51zJhKJOGd2797tnJGk3Nxc58yUKVOcM2Gdr7778Xms+/BZn+/afB5PPgNMLwavgAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiI22GkrsIcwukzFDI5Odk5k5iY6JxJSkoKJSP5rc9naOyoUaOcM6dOnXLOSNLJkyedM3V1dc6Zmpoa50x2drZzpquryzkjSV9//bVzxmcY6UANufw2n3PVN+dzn8Iaeir5DSMdqH3wCggAYIICAgCYcC6gbdu26ZZbblFBQYESEhK0adOmfrcHQaAnn3xS+fn5Sk1NVVlZmfbv3x+r9QIAhgjnAuro6FBxcbHWrFlz1ttXrVqlF198US+//LJ27typESNGaN68ed7fiwYADE3Ob0IoLy9XeXn5WW8LgkCrV6/W448/rltvvVWS9Morryg3N1ebNm3SXXfddWmrBQAMGTH9GVBdXZ0aGxtVVlbWd11mZqZKSkq0ffv2s2a6u7vV1tbW7wIAGPpiWkCNjY2Szvx78rm5uX23fVtVVZUyMzP7LoWFhbFcEgAgTpm/C66yslKtra19l/r6euslAQBCENMCysvLkyQ1NTX1u76pqanvtm+LRCIaOXJkvwsAYOiLaQEVFRUpLy9PW7du7buura1NO3fuVGlpaSx3BQAY5JzfBdfe3q4DBw70fVxXV6c9e/YoOztb48aN0/Lly/Xb3/5WV111lYqKivTEE0+ooKBACxYsiOW6AQCDnHMB7dq1SzfffHPfxytWrJAkLVq0SOvXr9ejjz6qjo4OLV26VC0tLbrpppu0ZcsWrxlgAIChy7mAZs+efd7BeQkJCXrmmWf0zDPPXNLCXPkM2PMdyhfW4FOf/YR5HFJTU0PJ+PC9Tx0dHc6Zzs7OUDLd3d3OmZycHOeMJBUXFztn2tvbnTPNzc3OmYkTJzpnwhxWHMawT8l/4K4P16GsDCMFAMQ1CggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJ52nYYUlISHCaYOsz7dZ1wus3hg93P2w++/KZqutzHDIzM50zkt9k6+TkZOdMa2urc8Zn2rQktbS0OGdqa2udM2lpac4Zn7X57EeSjh075pzxOR++/PJL58xVV13lnAmTz2PwfH9hIJb78c1Fo1GvfV0Ir4AAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYiNthpGEIc5if775cZWRkOGeuuOIKr335DAn94osvnDM+6/M93l9//XUoGZ9j19vb65zxGWAqSe3t7V45V5999plz5vrrr3fOjBo1yjnj69SpU86ZMIcp+ww+dc1c7P3hFRAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBBAQEATFBAAAATcTuMNCEhQcOGXXw/umz7v/vw4ZPzWZ9PJjk52TnjM+RSko4dO+ac+fzzz0PZT2dnp3NG8hvwmJeX55zxGRLa3d3tnDly5IhzRpLa2tqcM9nZ2c4Zn/tUXV3tnFm4cKFzRvJ7rA8f7v606jMg1Gfoqe++XI8Dw0gBAHGNAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACAibgeRuoyAC/MYaQ+whpG6uPkyZNeuaamJufMoUOHnDOffvqpc+aLL75wzkjS2LFjnTPTpk1zzqSnpztnfIay+g6a9RkSevToUedMWlqac6a+vt4543N/JCk1NdU54zPsM0xhPK9c7D54BQQAMEEBAQBMOBfQtm3bdMstt6igoEAJCQnatGlTv9sXL17c9+2zby7z58+P1XoBAEOEcwF1dHSouLhYa9asOec28+fPV0NDQ9/ltddeu6RFAgCGHuc3IZSXl6u8vPy820QiEa+/EgkAuHwMyM+AqqurNWbMGF1zzTV68MEH1dzcfM5tu7u71dbW1u8CABj6Yl5A8+fP1yuvvKKtW7fq//7v/1RTU6Py8vJz/v3yqqoqZWZm9l0KCwtjvSQAQByK+e8B3XXXXX3/njJliqZOnaqJEyequrpac+bMOWP7yspKrVixou/jtrY2SggALgMD/jbsCRMmKCcnRwcOHDjr7ZFIRCNHjux3AQAMfQNeQIcPH1Zzc7Py8/MHelcAgEHE+Vtw7e3t/V7N1NXVac+ePcrOzlZ2draefvppLVy4UHl5eTp48KAeffRRXXnllZo3b15MFw4AGNycC2jXrl26+eab+z7+5uc3ixYt0tq1a7V37179+c9/VktLiwoKCjR37lw9++yzikQisVs1AGDQcy6g2bNnn3fY3t/+9rdLWtA3hg0bFtowTleJiYnOmbDuy7nebXg+vsMTff5T4fMzPp9hpJ9//rlzRpIaGhqcMzNmzHDO+Hydurq6nDMjRoxwzkhSSkqKc8ZnsKjPINzhw93fO+VzfyS/gcU+jyef/fg8D0l+557r+i52+/h8hgcADHkUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBMUEAAABMx/5PcsTJixAin6bo+0259J+QmJSV55VxlZWU5Z0aNGuWcOddfq72Qzz77zDlTX1/vnKmtrXXO+EwXlqTc3FznTE9Pj3OmpaXFOdPR0eGcSU5Ods5Ifue4z8R3n0xBQUEo+5H8Jk77nHvRaNQ54zvF3uc+uU7QZho2ACCuUUAAABMUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMBG3w0hd+QzY8x1QGNbQRZ/75Dug0IfPMNfs7GznTF5ennPGdXjiN6688krnzF/+8hfnjM+Q0GnTpoWyH0kaOXKkc6axsdE5U15e7pyZPHmyc8ZXWI8n3+ciHz73yfW56GK35xUQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAExQQAAAE3E7jHTYsGFOA/oSEhIGcDU2Tp486Zzp6elxzvgOXExKSgplX/n5+c6Z+vp654wktbS0OGcmTJjgnMnKynLOpKWlOWfa2tqcM5J04sQJ54zP+Tp69GjnjM+Q3mg06pyR/J5XfAaL+jwuent7nTO+fB6DF4NXQAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAEzE7TDShISEAR9G6jM00Dfnkwlz2KAPnwGP3d3dzpnhw91P09TUVOeMJI0aNco5U1hY6JxJSUlxznR1dTlnjh075pyRpM7OTueMz4BVn+Md5mPdh+/gU1c+Q1ml8NZ3MXgFBAAwQQEBAEw4FVBVVZVuuOEGZWRkaMyYMVqwYIFqa2v7bdPV1aWKigqNGjVK6enpWrhwoZqammK6aADA4OdUQDU1NaqoqNCOHTv03nvvqbe3V3PnzlVHR0ffNg8//LDeeecdvfXWW6qpqdGRI0d0++23x3zhAIDBzemnu1u2bOn38fr16zVmzBjt3r1bs2bNUmtrq/74xz9qw4YN+slPfiJJWrdunb73ve9px44d+uEPfxi7lQMABrVL+hlQa2urJCk7O1uStHv3bvX29qqsrKxvm0mTJmncuHHavn37WT9Hd3e32tra+l0AAEOfdwFFo1EtX75cN954oyZPnixJamxsVHJy8hlvx8zNzVVjY+NZP09VVZUyMzP7Lj5vaQUADD7eBVRRUaF9+/bp9ddfv6QFVFZWqrW1te9SX19/SZ8PADA4eP0i6rJly/Tuu+9q27ZtGjt2bN/1eXl56unpUUtLS79XQU1NTcrLyzvr54pEIopEIj7LAAAMYk6vgIIg0LJly7Rx40Z98MEHKioq6nf79OnTlZSUpK1bt/ZdV1tbq0OHDqm0tDQ2KwYADAlOr4AqKiq0YcMGbd68WRkZGX0/18nMzFRqaqoyMzN1//33a8WKFcrOztbIkSP10EMPqbS0lHfAAQD6cSqgtWvXSpJmz57d7/p169Zp8eLFkqQXXnhBw4YN08KFC9Xd3a158+bp97//fUwWCwAYOpwKKAiCC26TkpKiNWvWaM2aNd6Lkk4PHHQZOhjWgFDJbxiiT8aHz8DKnp4er335DBYN6+uUnp7unJGkpKQk54zP0NiLeSx9m8+A0P/9JXEXaWlpzpk77rjDOeM7NNaV7+PP5+sU5uBTH2E9F12M+D5SAIAhiwICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgwusvoobBdRq27z58+Ey79Zmq6/OXYqPRqHPm5MmTzhlfPlOqR44c6ZzxOQ6S39fWZxq2zyTxlpYW50xGRoZzRpJmzpzpnCksLPTalyufx22Y57jP+nyeH+JpqrUvXgEBAExQQAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwEbfDSF35DObzGTwp+Q0OHD7c/VAnJSU5Z3yGXPoOavQZ+Hnq1CnnTEpKinPG92vb2dnpnPE5Dl1dXc4Zn6Gnd9xxh3NGkiZMmOCcSUxMdM74PJbCevz58lmfz+PCl++g3oHAKyAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAm4nYYaXp6ukaMGHHR20ciEed9JCcnO2ckqaCgwCvnqqmpyTnT3NzsnDlx4oRzRpKOHz/unPG5Tz6DRXt6epwzknTs2DHnjM95lJaW5pz5+c9/7pyZMmWKcyZMPkOEfTK+fAaLhsV34G6Yx+9CeAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADARNwOI3XlM4x09OjRXvuKRqPOmVOnTjlnDh8+7Jz5/PPPnTM+Q0Ulqb6+3jnjc+x8B4v6cBmA+43777/fOXP11Vc7Z3yHT/rwGVgZz4M7fc47KbzBnYmJiaHsR/J7LhoovAICAJiggAAAJpwKqKqqSjfccIMyMjI0ZswYLViwQLW1tf22mT17thISEvpdHnjggZguGgAw+DkVUE1NjSoqKrRjxw6999576u3t1dy5c9XR0dFvuyVLlqihoaHvsmrVqpguGgAw+Dm9CWHLli39Pl6/fr3GjBmj3bt3a9asWX3Xp6WlKS8vLzYrBAAMSZf0M6DW1lZJUnZ2dr/rX331VeXk5Gjy5MmqrKxUZ2fnOT9Hd3e32tra+l0AAEOf99uwo9Goli9frhtvvFGTJ0/uu/6ee+7R+PHjVVBQoL179+qxxx5TbW2t3n777bN+nqqqKj399NO+ywAADFLeBVRRUaF9+/bpo48+6nf90qVL+/49ZcoU5efna86cOTp48KAmTpx4xueprKzUihUr+j5ua2tTYWGh77IAAIOEVwEtW7ZM7777rrZt26axY8eed9uSkhJJ0oEDB85aQJFIxOuXSAEAg5tTAQVBoIceekgbN25UdXW1ioqKLpjZs2ePJCk/P99rgQCAocmpgCoqKrRhwwZt3rxZGRkZamxslCRlZmYqNTVVBw8e1IYNG/TTn/5Uo0aN0t69e/Xwww9r1qxZmjp16oDcAQDA4ORUQGvXrpV0+pdN/9e6deu0ePFiJScn6/3339fq1avV0dGhwsJCLVy4UI8//njMFgwAGBqcvwV3PoWFhaqpqbmkBQEALg9xOw177ty5A74P3985Ot/vNZ2Lz1Td6667zjnT3NzsnPGZau0rrMnWvpOZS0tLnTOTJk1yzvhMtg5rMrMU35OtffhOEveZou3zdQrza5uRkRHavi6EYaQAABMUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBMxO0w0jCMHDnSegmXnUWLFoWyH9/hk9OmTQtlX77rC0tYwzHDGnrqM1RUkoYPd3+K9LlPYWXiTXw/CgAAQxYFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBBAQEATMTdLLihMN8I59bT0xPKfnxnrbW3tztn2tranDPxPgsuLPE+C85nJp7PfTp58mQo+wnbhdaYEMTZvTh8+LAKCwutlwEAuET19fUaO3bsOW+PuwKKRqM6cuSIMjIyzvjfR1tbmwoLC1VfX39ZT7LmOJzGcTiN43Aax+G0eDgOQRDo+PHjKigoOO+r/bj7FtywYcPO25jS6T+jcDmfYN/gOJzGcTiN43Aax+E06+OQmZl5wW34RjQAwAQFBAAwMagKKBKJaOXKlYpEItZLMcVxOI3jcBrH4TSOw2mD6TjE3ZsQAACXh0H1CggAMHRQQAAAExQQAMAEBQQAMDFoCmjNmjX67ne/q5SUFJWUlOif//yn9ZJC99RTTykhIaHfZdKkSdbLGnDbtm3TLbfcooKCAiUkJGjTpk39bg+CQE8++aTy8/OVmpqqsrIy7d+/32axA+hCx2Hx4sVnnB/z58+3WewAqaqq0g033KCMjAyNGTNGCxYsUG1tbb9turq6VFFRoVGjRik9PV0LFy5UU1OT0YoHxsUch9mzZ59xPjzwwANGKz67QVFAb7zxhlasWKGVK1fq448/VnFxsebNm6ejR49aLy101157rRoaGvouH330kfWSBlxHR4eKi4u1Zs2as96+atUqvfjii3r55Ze1c+dOjRgxQvPmzVNXV1fIKx1YFzoOkjR//vx+58drr70W4goHXk1NjSoqKrRjxw6999576u3t1dy5c9XR0dG3zcMPP6x33nlHb731lmpqanTkyBHdfvvthquOvYs5DpK0ZMmSfufDqlWrjFZ8DsEgMGPGjKCioqLv41OnTgUFBQVBVVWV4arCt3LlyqC4uNh6GaYkBRs3buz7OBqNBnl5ecFzzz3Xd11LS0sQiUSC1157zWCF4fj2cQiCIFi0aFFw6623mqzHytGjRwNJQU1NTRAEp7/2SUlJwVtvvdW3zWeffRZICrZv3261zAH37eMQBEHw4x//OPjlL39pt6iLEPevgHp6erR7926VlZX1XTds2DCVlZVp+/bthiuzsX//fhUUFGjChAm69957dejQIeslmaqrq1NjY2O/8yMzM1MlJSWX5flRXV2tMWPG6JprrtGDDz6o5uZm6yUNqNbWVklSdna2JGn37t3q7e3tdz5MmjRJ48aNG9Lnw7ePwzdeffVV5eTkaPLkyaqsrFRnZ6fF8s4p7oaRfttXX32lU6dOKTc3t9/1ubm5+ve//220KhslJSVav369rrnmGjU0NOjpp5/WzJkztW/fPmVkZFgvz0RjY6MknfX8+Oa2y8X8+fN1++23q6ioSAcPHtRvfvMblZeXa/v27UpMTLReXsxFo1EtX75cN954oyZPnizp9PmQnJysrKysftsO5fPhbMdBku655x6NHz9eBQUF2rt3rx577DHV1tbq7bffNlxtf3FfQPiv8vLyvn9PnTpVJSUlGj9+vN58803df//9hitDPLjrrrv6/j1lyhRNnTpVEydOVHV1tebMmWO4soFRUVGhffv2XRY/Bz2fcx2HpUuX9v17ypQpys/P15w5c3Tw4EFNnDgx7GWeVdx/Cy4nJ0eJiYlnvIulqalJeXl5RquKD1lZWbr66qt14MAB66WY+eYc4Pw404QJE5STkzMkz49ly5bp3Xff1Ycfftjvz7fk5eWpp6dHLS0t/bYfqufDuY7D2ZSUlEhSXJ0PcV9AycnJmj59urZu3dp3XTQa1datW1VaWmq4Mnvt7e06ePCg8vPzrZdipqioSHl5ef3Oj7a2Nu3cufOyPz8OHz6s5ubmIXV+BEGgZcuWaePGjfrggw9UVFTU7/bp06crKSmp3/lQW1urQ4cODanz4ULH4Wz27NkjSfF1Pli/C+JivP7660EkEgnWr18f/Otf/wqWLl0aZGVlBY2NjdZLC9WvfvWroLq6Oqirqwv+/ve/B2VlZUFOTk5w9OhR66UNqOPHjweffPJJ8MknnwSSgueffz745JNPgi+//DIIgiD43e9+F2RlZQWbN28O9u7dG9x6661BUVFRcOLECeOVx9b5jsPx48eDRx55JNi+fXtQV1cXvP/++8EPfvCD4Kqrrgq6urqslx4zDz74YJCZmRlUV1cHDQ0NfZfOzs6+bR544IFg3LhxwQcffBDs2rUrKC0tDUpLSw1XHXsXOg4HDhwInnnmmWDXrl1BXV1dsHnz5mDChAnBrFmzjFfe36AooCAIgpdeeikYN25ckJycHMyYMSPYsWOH9ZJCd+eddwb5+flBcnJycMUVVwR33nlncODAAetlDbgPP/wwkHTGZdGiRUEQnH4r9hNPPBHk5uYGkUgkmDNnTlBbW2u76AFwvuPQ2dkZzJ07Nxg9enSQlJQUjB8/PliyZMmQ+0/a2e6/pGDdunV925w4cSL4xS9+EXznO98J0tLSgttuuy1oaGiwW/QAuNBxOHToUDBr1qwgOzs7iEQiwZVXXhn8+te/DlpbW20X/i38OQYAgIm4/xkQAGBoooAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYOL/Ae4eSOcCJPIiAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"new_x_0 = trans(x_0)\n",
"image = F.to_pil_image(new_x_0)\n",
"plt.imshow(image, cmap='gray')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4a.4.3 [ColorJitter](https://pytorch.org/vision/0.9/transforms.html#torchvision.transforms.ColorJitter)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `ColorJitter` transform has 4 arguments:\n",
"* [brightness](https://en.wikipedia.org/wiki/Brightness)\n",
"* [contrast](https://en.wikipedia.org/wiki/Contrast_(vision))\n",
"* [saturation](https://en.wikipedia.org/wiki/Colorfulness#Saturation)\n",
"* [hue](https://en.wikipedia.org/wiki/Hue)\n",
"\n",
"\n",
"The latter 2 apply to color images, so we will only use the first 2 for now."
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"brightness = .2 # Change to be from 0 to 1\n",
"contrast = 1 # Change to be from 0 to 1\n",
"\n",
"trans = transforms.Compose([\n",
" transforms.ColorJitter(brightness=brightness, contrast=contrast)\n",
"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Try running the below a few times, but also try changing either `brightness` or `contrast` to `1`. Get any intersting results?"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7fd8b2a2fe80>"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAbRElEQVR4nO3df2xV9f3H8VdBevlhKSu1vb2jsII/2AS6jEltUIajoXQJASUq6h9gHETWmkHnNF1UhC3phgkzmg7+2ehMBNREIJKFRastcWtZqBJCtjW06UYb2jJJ2lsKlI5+vn803H2vFPEe7r3ve2+fj+QkvefHPe/7uUdent7PfTfNOecEAECcjbMuAAAwNhFAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMHGbdQFfNjw8rLNnzyojI0NpaWnW5QAAIuScU39/vwKBgMaNu/F9TsIF0NmzZ5Wfn29dBgDgFnV0dGjGjBk33J5wAZSRkSFJ+vGPf6z09PSYnuurBiYRBAIB6xKSVqK/t52dnREfk+ivCbhmYGBAq1atCv17fiMxC6Camhq99tpr6u7uVmFhod58800tWrTopsdd+7Vbenq6fD5frMqTJE2cODGmz3+rJk+ebF1C0poyZYp1CV/Jy3ub6K8J+LKbfYwSk0kI77zzjiorK7V161Z99tlnKiwsVGlpqc6dOxeL0wEAklBMAmjnzp3asGGDnn76aX3nO9/R7t27NXnyZP3hD3+IxekAAEko6gF05coVNTc3q6Sk5H8nGTdOJSUlamxsvG7/wcFBBYPBsAUAkPqiHkBffPGFrl69qtzc3LD1ubm56u7uvm7/6upqZWZmhhZmwAHA2GD+RdSqqir19fWFlo6ODuuSAABxEPVZcNnZ2Ro/frx6enrC1vf09Mjv91+3v8/ni/lsNwBA4on6HVB6eroWLlyourq60Lrh4WHV1dWpuLg42qcDACSpmHwPqLKyUuvWrdP3v/99LVq0SK+//roGBgb09NNPx+J0AIAkFJMAevzxx/Wf//xHr7zyirq7u/Xd735XR44cuW5iAgBg7IpZJ4SKigpVVFTE6ukxhqTizMjRvpIQC6k4dkgd5rPgAABjEwEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMxa0Yab4nedHHGjBnWJQBAQuEOCABgggACAJgggAAAJgggAIAJAggAYIIAAgCYIIAAACYIIACACQIIAGCCAAIAmCCAAAAmCCAAgAkCCABgImW6YQPJpLOz07oEwBx3QAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEzQjBRxlZ+fb11C1HV0dFiXACQl7oAAACYIIACACQIIAGCCAAIAmCCAAAAmCCAAgAkCCABgggACAJgggAAAJgggAIAJAggAYIIAAgCYoBmpBzNmzLAuATHi5b2NVzPSVGzkirGNOyAAgAkCCABgIuoB9OqrryotLS1smTt3brRPAwBIcjH5DOjee+/VRx999L+T3MZHTQCAcDFJhttuu01+vz8WTw0ASBEx+Qzo9OnTCgQCmj17tp566imdOXPmhvsODg4qGAyGLQCA1Bf1ACoqKlJtba2OHDmiXbt2qb29XQ8++KD6+/tH3b+6ulqZmZmhhammADA2RD2AysrK9Oijj2rBggUqLS3Vn/70J/X29urdd98ddf+qqir19fWFlnh9pwIAYCvmswOmTZumu+++W62traNu9/l88vl8sS4DAJBgYv49oAsXLqitrU15eXmxPhUAIIlEPYCef/55NTQ06F//+pf++te/6uGHH9b48eP1xBNPRPtUAIAkFvVfwXV2duqJJ57Q+fPndccdd+iBBx5QU1OT7rjjjmifCgCQxKIeQPv374/2UyJBMWNxRGdnp3UJQFKiFxwAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATMf+DdEh8qdhUdMaMGZ6O89JYtLGxMeJjvNaXalJxHLxcQ17GIRWa4HIHBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwkbDdsGfMmKGJEydal4ExxktXYi/HJHoH8lTsUh0vjN3Xxx0QAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwnbjDQeaBqIaCguLo74GC/NSBsbGyM+xus17uW4zs5OT+eKFP/djkjkcejv7/9a+3EHBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwMSYbkYKWNm5c2fEx3hpPtnR0RHxMZK3ZqleeKkvkZtwIjLcAQEATBBAAAATEQfQ0aNHtXLlSgUCAaWlpengwYNh251zeuWVV5SXl6dJkyappKREp0+fjla9AIAUEXEADQwMqLCwUDU1NaNu37Fjh9544w3t3r1bx44d05QpU1RaWqrLly/fcrEAgNQR8SSEsrIylZWVjbrNOafXX39dL730klatWiVJeuutt5Sbm6uDBw9q7dq1t1YtACBlRPUzoPb2dnV3d6ukpCS0LjMzU0VFRTf8c8KDg4MKBoNhCwAg9UU1gLq7uyVJubm5Yetzc3ND276surpamZmZoSVe0z8BALbMZ8FVVVWpr68vtHj93gIAILlENYD8fr8kqaenJ2x9T09PaNuX+Xw+TZ06NWwBAKS+qAZQQUGB/H6/6urqQuuCwaCOHTum4uLiaJ4KAJDkIp4Fd+HCBbW2toYet7e368SJE8rKytLMmTO1efNm/epXv9Jdd92lgoICvfzyywoEAlq9enU06wYAJLmIA+j48eN66KGHQo8rKyslSevWrVNtba1eeOEFDQwMaOPGjert7dUDDzygI0eOaOLEidGrGgCQ9CIOoKVLl8o5d8PtaWlp2r59u7Zv335LhcGbVJxFGM/mk52dnXE7V6S81OZ17OI1GSiRxxuxZz4LDgAwNhFAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATETcDRu4FfHqbO21y7KXLtCNjY2ezpXI4tWl2svYefnjlvHsqI6vjzsgAIAJAggAYIIAAgCYIIAAACYIIACACQIIAGCCAAIAmCCAAAAmCCAAgAkCCABgggACAJgggAAAJmhGmsDy8/Pjcp5UbNTo9TV5aUYar8adXmqL5zjE63p99913Iz6msrIyBpXgVnEHBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwATNSOG5YaWXJpxejvHSGDOevIxfvBqYej1PIo95vMYOsccdEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABM0I42T/Pz8uJwnno0xvRzX2NgYl2O8NtP08j4VFxdHfEy8GmomclNRyXsjXKQG7oAAACYIIACAiYgD6OjRo1q5cqUCgYDS0tJ08ODBsO3r169XWlpa2LJixYpo1QsASBERB9DAwIAKCwtVU1Nzw31WrFihrq6u0LJv375bKhIAkHoinoRQVlamsrKyr9zH5/PJ7/d7LgoAkPpi8hlQfX29cnJydM8992jTpk06f/78DfcdHBxUMBgMWwAAqS/qAbRixQq99dZbqqur029+8xs1NDSorKxMV69eHXX/6upqZWZmhpZ4TVcGANiK+veA1q5dG/p5/vz5WrBggebMmaP6+notW7bsuv2rqqpUWVkZehwMBgkhABgDYj4Ne/bs2crOzlZra+uo230+n6ZOnRq2AABSX8wDqLOzU+fPn1deXl6sTwUASCIR/wruwoULYXcz7e3tOnHihLKyspSVlaVt27ZpzZo18vv9amtr0wsvvKA777xTpaWlUS0cAJDcIg6g48eP66GHHgo9vvb5zbp167Rr1y6dPHlSf/zjH9Xb26tAIKDly5frl7/8pXw+X/SqBgAkvYgDaOnSpXLO3XD7n//851sqyCuaGsafl0aX8Tqmqakp4mMkb01CvTQjhXdMUkod9IIDAJgggAAAJgggAIAJAggAYIIAAgCYIIAAACYIIACACQIIAGCCAAIAmCCAAAAmCCAAgAkCCABgggACAJiI+p/khi0v3Zy9dhL30pW4sbHR07niJV5d1b10+E7099YLuo+PbdwBAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEzUsSVlyaXXhpWejnG63HxarDqpbFovJqKxlMqvqaxijsgAIAJAggAYIIAAgCYIIAAACYIIACACQIIAGCCAAIAmCCAAAAmCCAAgAkCCABgggACAJgggAAAJmhGioTnpQmnl2Mk701MI+WloabX1xQvXsYunu8tEg93QAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEzQjNQDL40kEV+J/h4VFxdbl/CVOjo6Ij7GS5PQxx57LOJjvEj05rRjFXdAAAATBBAAwEREAVRdXa377rtPGRkZysnJ0erVq9XS0hK2z+XLl1VeXq7p06fr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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"new_x_0 = trans(x_0)\n",
"image = F.to_pil_image(new_x_0)\n",
"plt.imshow(image, cmap='gray')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4a.3.4 [Compose](https://pytorch.org/vision/0.9/transforms.html#torchvision.transforms.Compose)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Time to bring it all together. We can create a sequence of these random transformations with `Compose`."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"executionInfo": {
"elapsed": 1,
"status": "ok",
"timestamp": 1715241387886,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "ZkXjesFKFH_b"
},
"outputs": [],
"source": [
"random_transforms = transforms.Compose([\n",
" transforms.RandomRotation(5),\n",
" transforms.RandomResizedCrop((IMG_WIDTH, IMG_HEIGHT), scale=(.9, 1), ratio=(1, 1)),\n",
" transforms.RandomHorizontalFlip(),\n",
" transforms.ColorJitter(brightness=.2, contrast=.5)\n",
"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's test it out. With all the different combinations how many varations are there of this one image? Infinite?"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 447
},
"executionInfo": {
"elapsed": 347,
"status": "ok",
"timestamp": 1715241391170,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "ewG_7NAgqEnf",
"outputId": "24142f9f-286f-42ab-9769-bfd38c9defbf"
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7fd8b2a877f0>"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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B4z9Kli92LsuLyccDhvPZGZmGs/YFKzG83En2a3Pz5/bRGNTYBpvuCcBAE4QQAAAJwggAIATBBAAwAkCCADgBAEEAHCCAAIAOEEAAQCcIIAAAE4QQAAAJwggAIATBBAAwIlR/4N0tkzLSG0KK23LHW3KEG225deMzb6zZfPHBz3PM55pb283npGkoaEh45mOjg7jmePHjxvPlJWVGc/Ee+GuX+W58V7c6efj17hx44xn6uvrja7f19enZ5555rLX4xkQAMAJAggA4AQBBABwggACADhBAAEAnCCAAABOEEAAACcIIACAEwQQAMAJAggA4AQBBABwggACADhBAAEAnIjbNuyBgQGjhlibhlzbFmibZl2bRmcbNtuxaYCWpNRU88NncHDQl+1Mnz7deEaSzpw5Yzxz6tQp45m+vj7jGZu12bSPS/41pPvVLG97e/z6ubXhZ5v/woULja7f3d09srUYrwQAgBgggAAAThBAAAAnCCAAgBMEEADACQIIAOAEAQQAcIIAAgA4QQABAJwggAAAThBAAAAnCCAAgBNxW0bqB9syP5xls/9silzT0tKMZwoLC41nJLuS0AkTJhjP2BTANjU1Gc9ce+21xjOSNHHiRKs5U34dD36yuU02bEpFbZneppE+NvAMCADgBAEEAHCCAAIAOEEAAQCcIIAAAE4QQAAAJwggAIATBBAAwAkCCADgBAEEAHCCAAIAOEEAAQCciNsy0qSkJKOyS5tiPtsy0pSUFN+25cd2bG6PZLfP/dp3tkWNWVlZxjPHjx83njl58qTxjF8ll5KUk5NjPNPf3z8KKzlffn6+L9uxZXOMe543Ciu5MD+Po8vhGRAAwAkCCADghHEA7d69W/fee69KSkqUlJSkbdu2RV3ueZ7Wrl2r4uJiZWZmqrKyUkeOHInVegEACcI4gHp6elReXq76+voLXr5hwwa99tpreuONN7Rv3z5lZ2erqqrKt98PAwDGBuM3IVRXV6u6uvqCl3mep1dffVXPP/+87rvvPknSm2++qcLCQm3btk0PPfTQla0WAJAwYvoaUHNzs9ra2lRZWRk5LxgMqqKiQnv27LngTDgcVigUijoBABJfTAOora1NklRYWBh1fmFhYeSy76urq1MwGIycSktLY7kkAECccv4uuNraWnV2dkZOLS0trpcEAPBBTAOoqKhIktTe3h51fnt7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oqIiDQwM6PTp01HXT9Tj4WL74UIqKiokKa6Oh7gPoPT0dM2ePVs7d+6MnDc8PKydO3dq3rx5DlfmXnd3t44ePari4mLXS3GmrKxMRUVFUcdHKBTSvn37rvrj4/jx4+ro6Eio48PzPK1atUpbt27Vp59+qrKysqjLZ8+erbS0tKjjobGxUceOHUuo4+Fy++FCDh48KEnxdTy4fhfESLzzzjteIBDwNm/e7H311VfeypUrvfHjx3ttbW2ul+arX/ziF96uXbu85uZm769//atXWVnp5efneydPnnS9tFHV1dXlffnll96XX37pSfJeeeUV78svv/S++eYbz/M877e//a03fvx4b/v27d6hQ4e8++67zysrK/P6+vocrzy2LrUfurq6vGeeecbbs2eP19zc7H3yySfeD3/4Q++GG27w+vv7XS89Zp588kkvGAx6u3bt8k6cOBE59fb2Rq7zxBNPeJMnT/Y+/fRTb//+/d68efO8efPmOVx17F1uPzQ1NXkvvfSSt3//fq+5udnbvn27N3XqVG/+/PmOVx5tTASQ53ne66+/7k2ePNlLT0/35s6d6+3du9f1knz34IMPesXFxV56erp37bXXeg8++KDX1NTkelmj7rPPPvMknXdatmyZ53ln34r9wgsveIWFhV4gEPAWLlzoNTY2ul30KLjUfujt7fUWLVrkXXPNNV5aWpo3ZcoUb8WKFQn3n7QL3X5J3qZNmyLX6evr8372s595EyZM8LKysrz777/fO3HihLtFj4LL7Ydjx4558+fP9/Ly8rxAIOBdf/313i9/+Uuvs7PT7cK/hz/HAABwIu5fAwIAJCYCCADgBAEEAHCCAAIAOEEAAQCcIIAAAE4QQAAAJwggAIATBBAAwAkCCADgBAEEAHCCAAIAOPH/cw6XLKAyntkAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"new_x_0 = random_transforms(x_0)\n",
"image = F.to_pil_image(new_x_0)\n",
"plt.imshow(image, cmap='gray')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4a.4 Training with Augmentation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our training is mostly the same, but there is one line of change. Before passing our images to our model, we will apply our `random_transforms`. For conveneince, we moved `get_batch_accuracy` to a [utils](./utils.py) file."
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"executionInfo": {
"elapsed": 317,
"status": "ok",
"timestamp": 1715241479297,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "IcgAmvx7rI13"
},
"outputs": [],
"source": [
"def train():\n",
" loss = 0\n",
" accuracy = 0\n",
"\n",
" model.train()\n",
" for x, y in train_loader:\n",
" output = model(random_transforms(x)) # Updated\n",
" optimizer.zero_grad()\n",
" batch_loss = loss_function(output, y)\n",
" batch_loss.backward()\n",
" optimizer.step()\n",
"\n",
" loss += batch_loss.item()\n",
" accuracy += utils.get_batch_accuracy(output, y, train_N)\n",
" print('Train - Loss: {:.4f} Accuracy: {:.4f}'.format(loss, accuracy))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On the other hamd, validation remains the same. There are no random transformations. "
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"executionInfo": {
"elapsed": 382,
"status": "ok",
"timestamp": 1715241482250,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "iXc6lnRAR4qZ"
},
"outputs": [],
"source": [
"def validate():\n",
" loss = 0\n",
" accuracy = 0\n",
"\n",
" model.eval()\n",
" with torch.no_grad():\n",
" for x, y in valid_loader:\n",
" output = model(x)\n",
"\n",
" loss += loss_function(output, y).item()\n",
" accuracy += utils.get_batch_accuracy(output, y, valid_N)\n",
" print('Valid - Loss: {:.4f} Accuracy: {:.4f}'.format(loss, accuracy))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's put data augmentation to the test. "
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 45384,
"status": "ok",
"timestamp": 1715241529445,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "isjOJIVArTLR",
"outputId": "5d4b6a5f-2ad9-4276-d65e-d84b9874ec3b"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch: 0\n",
"Train - Loss: 670.2313 Accuracy: 0.7438\n",
"Valid - Loss: 75.2279 Accuracy: 0.8872\n",
"Epoch: 1\n",
"Train - Loss: 109.5291 Accuracy: 0.9593\n",
"Valid - Loss: 41.4057 Accuracy: 0.9334\n",
"Epoch: 2\n",
"Train - Loss: 59.4407 Accuracy: 0.9778\n",
"Valid - Loss: 36.2884 Accuracy: 0.9375\n",
"Epoch: 3\n",
"Train - Loss: 40.6396 Accuracy: 0.9845\n",
"Valid - Loss: 16.5569 Accuracy: 0.9727\n",
"Epoch: 4\n",
"Train - Loss: 34.1795 Accuracy: 0.9868\n",
"Valid - Loss: 19.7736 Accuracy: 0.9736\n",
"Epoch: 5\n",
"Train - Loss: 28.5871 Accuracy: 0.9900\n",
"Valid - Loss: 20.5128 Accuracy: 0.9664\n",
"Epoch: 6\n",
"Train - Loss: 31.9978 Accuracy: 0.9875\n",
"Valid - Loss: 20.9563 Accuracy: 0.9678\n",
"Epoch: 7\n",
"Train - Loss: 22.5256 Accuracy: 0.9918\n",
"Valid - Loss: 25.0841 Accuracy: 0.9795\n",
"Epoch: 8\n",
"Train - Loss: 22.3729 Accuracy: 0.9918\n",
"Valid - Loss: 27.3220 Accuracy: 0.9619\n",
"Epoch: 9\n",
"Train - Loss: 24.5551 Accuracy: 0.9907\n",
"Valid - Loss: 24.5642 Accuracy: 0.9703\n",
"Epoch: 10\n",
"Train - Loss: 17.3251 Accuracy: 0.9938\n",
"Valid - Loss: 15.5555 Accuracy: 0.9736\n",
"Epoch: 11\n",
"Train - Loss: 16.2262 Accuracy: 0.9946\n",
"Valid - Loss: 10.1601 Accuracy: 0.9827\n",
"Epoch: 12\n",
"Train - Loss: 15.5518 Accuracy: 0.9938\n",
"Valid - Loss: 11.8082 Accuracy: 0.9868\n",
"Epoch: 13\n",
"Train - Loss: 13.4323 Accuracy: 0.9948\n",
"Valid - Loss: 11.7501 Accuracy: 0.9815\n",
"Epoch: 14\n",
"Train - Loss: 15.6761 Accuracy: 0.9938\n",
"Valid - Loss: 16.0197 Accuracy: 0.9742\n",
"Epoch: 15\n",
"Train - Loss: 13.6693 Accuracy: 0.9949\n",
"Valid - Loss: 9.2895 Accuracy: 0.9862\n",
"Epoch: 16\n",
"Train - Loss: 15.9354 Accuracy: 0.9938\n",
"Valid - Loss: 24.0742 Accuracy: 0.9816\n",
"Epoch: 17\n",
"Train - Loss: 8.9981 Accuracy: 0.9965\n",
"Valid - Loss: 8.2308 Accuracy: 0.9881\n",
"Epoch: 18\n",
"Train - Loss: 13.2219 Accuracy: 0.9949\n",
"Valid - Loss: 12.7260 Accuracy: 0.9801\n",
"Epoch: 19\n",
"Train - Loss: 11.3965 Accuracy: 0.9957\n",
"Valid - Loss: 13.8763 Accuracy: 0.9856\n"
]
}
],
"source": [
"epochs = 20\n",
"\n",
"for epoch in range(epochs):\n",
" print('Epoch: {}'.format(epoch))\n",
" train()\n",
" validate()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "h0WoN84J3Y-l"
},
"source": [
"## Discussion of Results"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-EPTunxK3Y-l"
},
"source": [
"You will notice that the validation accuracy is higher, and more consistent. This means that our model is no longer overfitting in the way it was; it generalizes better, making better predictions on new data.\n",
"\n",
"The training accuracy may be lower, and that's ok. Compared to before, the model is being exposed to a much larger variety of data."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "npYY9cvA3Y-l"
},
"source": [
"## Saving the Model"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EW_TgWkN3Y-l"
},
"source": [
"Now that we have a well-trained model, we will want to deploy it to perform inference on new images.\n",
"\n",
"It is common, once we have a trained model that we are happy with to save it to disk. PyTorch has [multiple ways](https://pytorch.org/tutorials/beginner/saving_loading_models.html) to do this, but for now, we will use `torch.save`. We will also need to save the code for our `MyConvBlock` custom module, which we did in [utils.py](./utils.py). In the next notebook, we'll load the model and use it to read new sign language pictures.\n",
"\n",
"PyTorch cannot save a compiled model ([see this post](https://discuss.pytorch.org/t/how-to-save-load-a-model-with-torch-compile/179739)), so we will instead "
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"executionInfo": {
"elapsed": 326,
"status": "ok",
"timestamp": 1715241533765,
"user": {
"displayName": "Danielle Detering US",
"userId": "15432464718872067879"
},
"user_tz": 420
},
"id": "snAS8LalsMv4"
},
"outputs": [],
"source": [
"torch.save(base_model, 'model.pth')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "hfePFALr3Y-l"
},
"source": [
"## Summary"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "7fo5z3M03Y-l"
},
"source": [
"In this section, you used TorchVision to augment a dataset. This resulted in a trained model with less overfitting and excellent validation image results."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TgDmGUB93Y-l"
},
"source": [
"### Clear the Memory\n",
"Before moving on, please execute the following cell to clear up the GPU memory."
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"id": "R6EXCtGr3Y-l"
},
"outputs": [
{
"data": {
"text/plain": [
"{'status': 'ok', 'restart': True}"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import IPython\n",
"app = IPython.Application.instance()\n",
"app.kernel.do_shutdown(True)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8DIV9ZNW3Y-l"
},
"source": [
"## Next"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "E4iefhaq3Y-l"
},
"source": [
"Now that you have a well-trained model saved to disk, you will, in the next section, deploy it to make predictions on not-yet-seen images.\n",
"\n",
"Please continue to the next notebook: [*Model Predictions*](04b_asl_predictions.ipynb)."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "j3I_B1M63Y-l"
},
"source": [
"<center><a href=\"https://www.nvidia.com/dli\"> <img src=\"images/DLI_Header.png\" alt=\"Header\" style=\"width: 400px;\"/> </a></center>"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"gpuType": "T4",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
}
},
"nbformat": 4,
"nbformat_minor": 4
}