2025-03-14 17:57:07 +00:00
{
"cells": [
{
"cell_type": "markdown",
"id": "69c73990",
"metadata": {},
"source": [
"# Coursework TensorFlow\n",
"# SPCE0038: Machine Learning with Big-Data"
]
},
{
"cell_type": "markdown",
"id": "67cacfd6",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"id": "1d428273",
"metadata": {},
"source": [
"## Overview\n",
"\n",
"This coursework is provided as a Jupyter notebook, which you will need to complete. \n",
"\n",
"Throughout the notebook you will need to complete code, analytic exercises (if equations are required please typeset your solutions using latex in the markdown cell provided) and descriptive answers. Much of the grading of the coursework will be performed automatically, so it is critical you name your variables as requested."
]
},
{
"cell_type": "markdown",
"id": "90b39499",
"metadata": {},
"source": [
"Before you turn this coursework in, make sure everything runs as expected. First, **restart the kernel** (in the menubar, select Kernel$\\rightarrow$Restart) and then **run all cells** (in the menubar, select Cell$\\rightarrow$Run All).\n",
"\n",
"Make sure you fill in any place that says \"YOUR ANSWER HERE\" or `YOUR CODE HERE` and remove remove the `raise NotImplementedError()` exceptions that are thrown before you have added your answers. Do not add and remove cells but rather provide your answers in the spaces given."
]
},
{
"cell_type": "markdown",
"id": "150e1000",
"metadata": {},
"source": [
"Please also:\n",
"\n",
"- Make sure you use a python environment using the `requirements.txt` files provided by the course.\n",
"- Make sure your notebook executes without errors.\n",
"- Do not add and remove cells but only provide your answers in the spaces given.\n",
"- Do not add or change code in the cells other than the ones marked with `# YOUR CODE HERE`.\n",
"- Do not overwrite or rename any existing variables.\n",
"- Do not install code or packages in the notebooks.\n",
"- Do not import any libraries other than modules from `sklearn` or `tensorflow`.\n",
"- Always label your plots.\n",
"- Answer the questions concisely and show your work/derivations/reasoning."
]
},
{
"cell_type": "markdown",
"id": "f92476d1",
"metadata": {},
"source": [
"**Please rename the notebook filename to include your candidate number in the filename. And please also add your candidate number below:**"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 1,
2025-03-14 17:57:07 +00:00
"id": "3593c649",
"metadata": {},
"outputs": [],
"source": [
"CANDIDATE_NUMBER = \"MCMQ7\""
]
},
{
"cell_type": "markdown",
"id": "322a38c5",
"metadata": {},
"source": [
"You will be able to run some basic tests in the notebook to check the basic operation of your code is as expected. Although do not assume your responses are complete or fully correct just because the basic tests pass."
]
},
{
"cell_type": "markdown",
"id": "9871e0f5",
"metadata": {},
"source": [
"Once you have renamed the notebook file and completed the exercises, please upload the notebook to Moodle.\n"
]
},
{
"cell_type": "markdown",
"id": "d38e1133",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"id": "719f3952",
"metadata": {},
"source": [
"## Dependencies\n",
"\n",
"- Standard course dependencies (e.g. numpy, scikit-learn, etc.)\n",
"- [TensorFlow](https://www.tensorflow.org/)\n",
"- [TensorFlow DataSets](https://www.tensorflow.org/datasets)"
]
},
{
"cell_type": "markdown",
"id": "07758eeb",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"id": "a2231590",
"metadata": {},
"source": [
"Notes for people running the notebook in Google Colab:\n",
"\n",
"- This notebook uses quite a bit of RAM (the solutions run with ~8.5Gb of RAM), which means that if you are very inefficient in your memory usage, it will not fit within Colab's limits of 12Gb. If this is the case, you can try restarting the runtime to free up memory of variables you have created and that you no longer use or write your code in a more efficient way.\n",
"- You can enable a Runtime with GPU acceleration for faster training (Runtime -> Change runtime type)"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 2,
2025-03-14 17:57:07 +00:00
"id": "a32c7c90",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "b1a7b7723a7cd8fac9ab0856025a6d81",
"grade": false,
"grade_id": "cell-418daabc8f9aac61",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
2025-03-20 23:31:24 +00:00
"2025-03-20 22:24:16.798627: I external/local_xla/xla/tsl/cuda/cudart_stub.cc:32] Could not find cuda drivers on your machine, GPU will not be used.\n",
"2025-03-20 22:24:16.801652: I external/local_xla/xla/tsl/cuda/cudart_stub.cc:32] Could not find cuda drivers on your machine, GPU will not be used.\n",
"2025-03-20 22:24:16.811341: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
2025-03-14 17:57:07 +00:00
"WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n",
2025-03-20 23:31:24 +00:00
"E0000 00:00:1742509456.827236 468842 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
"E0000 00:00:1742509456.832323 468842 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
"2025-03-20 22:24:16.848642: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
2025-03-14 17:57:07 +00:00
"To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
]
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"import tensorflow as tf\n",
"import tensorflow_datasets as tfds"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 3,
2025-03-14 17:57:07 +00:00
"id": "fad96611",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "83978659708fbe27b7f96f0c006862a5",
"grade": false,
"grade_id": "cell-0be768f33f772611",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [],
"source": [
"def check_var_defined(var):\n",
" try:\n",
" exec(var)\n",
" except NameError:\n",
" raise NameError(var + \" not defined.\")\n",
" else:\n",
" print(var + \" defined.\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7e45caa0-f9fb-4f83-88df-52d5a5e649d7",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "3fbf8aa9005ee23d0ab5544a5d026671",
"grade": true,
"grade_id": "cell-59343806849c27ff",
"locked": true,
"points": 0,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "0c0e7927",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "71eeea15b0b692ba25c290608f294ae1",
"grade": false,
"grade_id": "cell-9ae5247a66cdf986",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"# Part 1: Data pre-processing\n",
"\n",
"\n",
"In these exercises we will look at the classification of flowers into 5 different classes using convolutional neural networks (CNNs). The implementation of this will be done using TensorFlow (TF).\n",
"\n",
"The dataset can be loaded in using the [Tensorflow Datasets](https://www.tensorflow.org/datasets) package. Below you see how we load in the data and change it from a TF generator object into a list of the images and a list of the targets. "
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 4,
2025-03-14 17:57:07 +00:00
"id": "f9c193a0",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "c2460b788cc541a7382bee075395dbb7",
"grade": false,
"grade_id": "cell-5a158c5e75738fc8",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
2025-03-20 23:31:24 +00:00
"W0000 00:00:1742509459.195582 468842 gpu_device.cc:2344] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.\n",
2025-03-14 17:57:07 +00:00
"Skipping registering GPU devices...\n"
]
}
],
"source": [
"# Load data\n",
"data = tfds.load('tf_flowers', split=[\"train\"], as_supervised=True)"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 5,
2025-03-14 17:57:07 +00:00
"id": "e438b1ef",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "d0e89c00c9c0df44f1b834b9d4391b72",
"grade": false,
"grade_id": "cell-1aefc40e0c7fe096",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
2025-03-20 23:31:24 +00:00
"2025-03-20 22:24:19.295704: I tensorflow/core/kernels/data/tf_record_dataset_op.cc:376] The default buffer size is 262144, which is overridden by the user specified `buffer_size` of 8388608\n",
"2025-03-20 22:24:20.423168: I tensorflow/core/framework/local_rendezvous.cc:405] Local rendezvous is aborting with status: OUT_OF_RANGE: End of sequence\n"
2025-03-14 17:57:07 +00:00
]
}
],
"source": [
"images, targets = zip(*[i for i in data[0]])\n",
"labels = [\"dandelion\", \"daisy\", \"tulips\", \"sunflowers\", \"roses\"]"
]
},
{
"cell_type": "markdown",
"id": "ad3c8560",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "71525d2c752790a621a96df6f831cb50",
"grade": false,
"grade_id": "cell-955200c05b4bfd90",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Plot the first two images and their classes by writing a function `show_image`. Set the title of the images to be the class (use the actual label, not the number) it belongs to._ "
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 6,
2025-03-14 17:57:07 +00:00
"id": "69bf403d",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "044d25f825f21b72888f98026cbb419d",
"grade": true,
"grade_id": "cell-2ad6ec61e28d4327",
"locked": false,
"points": 1,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def show_image(image, target):\n",
" # YOUR CODE HERE\n",
"\n",
" # Plot each image in a separate figure\n",
" plt.figure()\n",
" \n",
" # Plot their classes\n",
" # Set the title of the images to be the class the image belongs to\n",
" label = labels[target]\n",
" \n",
" plt.imshow(image)\n",
" plt.axis(\"off\")\n",
" plt.title(label)\n",
" #raise NotImplementedError()\n",
"\n",
"for i in range(2):\n",
" show_image(images[i], targets[i])"
]
},
{
"cell_type": "markdown",
"id": "c091a6b0",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "39fbb3182de77dc1dfefd62803c45add",
"grade": false,
"grade_id": "cell-b8ee9d31572d4ef8",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"Before we can use the data to train neural networks, we need to pre-process the data such that:\n",
" \n",
"- the images are all the same shape (224,224)\n",
"- the images, originally with values (0, 255), are mapped to have values between (0, 1)\n",
"- the labels are represented as one-hot vectors"
]
},
{
"cell_type": "markdown",
"id": "bb856fda",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "fefdc012c93c2ff67ef9a229628f8c8c",
"grade": false,
"grade_id": "cell-6b5b2f4a3e9c2f2e",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Write a function to rescale and resize the images._"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 7,
2025-03-14 17:57:07 +00:00
"id": "2f2da49d",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "cbefaa1f473a3192c47b509da825bf06",
"grade": false,
"grade_id": "cell-e3182b662219760c",
"locked": false,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def rescale_and_resize(image):\n",
" # YOUR CODE HERE\n",
" \n",
" # Rescale to (0, 1) range\n",
" preprocessed_image = image / 255\n",
" \n",
" # Resize to (224, 244)\n",
" preprocessed_image = tf.image.resize(preprocessed_image, [224, 224])\n",
" \n",
" return preprocessed_image\n",
" #raise NotImplementedError()\n",
"\n",
"show_image(rescale_and_resize(images[0]), targets[0])"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 8,
2025-03-14 17:57:07 +00:00
"id": "5b886c27",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "1c2e2853426a640227d69892a38e8250",
"grade": true,
"grade_id": "cell-cfd89fb8cbcec231",
"locked": true,
"points": 2,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"rescale_and_resize defined.\n"
]
}
],
"source": [
"check_var_defined('rescale_and_resize')"
]
},
{
"cell_type": "markdown",
"id": "053649d0",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "4f93e8f3413c7f585d48368707148246",
"grade": false,
"grade_id": "cell-75388a1741e14c88",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Now use the function to pre-process the data in the variable `images` and save the preprocessed images in an np.ndarray `images_preprocessed`._"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 9,
2025-03-14 17:57:07 +00:00
"id": "a880cd0d",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "9403f9bc6c73d10b1e8066f7d493c251",
"grade": false,
"grade_id": "cell-db4f53cb45712358",
"locked": false,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [],
"source": [
"# YOUR CODE HERE\n",
"images_preprocessed = np.array([rescale_and_resize(img) for img in images])\n",
"#raise NotImplementedError()"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 10,
2025-03-14 17:57:07 +00:00
"id": "f767e9cf",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "ab073c4d8d13a773b25c7593eb989630",
"grade": true,
"grade_id": "cell-3511cf050a781aab",
"locked": true,
"points": 1,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"images_preprocessed defined.\n"
]
}
],
"source": [
"check_var_defined('images_preprocessed')\n",
"assert type(images_preprocessed) == np.ndarray, \"Make sure to store your answer as a np.ndarray\""
]
},
{
"cell_type": "markdown",
"id": "94226e02",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "077387018e16644826fd4e066af0bac9",
"grade": false,
"grade_id": "cell-0825cee2278d9239",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"One approach to represent the image labels so that they can be trainable by a neural network is to represented them as a one-hot vector. \n",
"\n",
"_Write a function `one_hot_encoding` that takes the integer label and returns a one-hot vector of the label._"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 11,
2025-03-14 17:57:07 +00:00
"id": "e40efe42",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "2a20a5b6a598460960720ee49678a575",
"grade": false,
"grade_id": "cell-f8acfd909ba340a6",
"locked": false,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"target: 2, encoding: [0. 0. 1. 0. 0.]\n"
]
}
],
"source": [
"def one_hot_encoding(target):\n",
" # YOUR CODE HERE\n",
" v = np.zeros(len(labels))\n",
" v[target] = 1\n",
" return v\n",
" #raise NotImplementedError()\n",
"\n",
"print(f\"target: {targets[0]}, encoding: {one_hot_encoding(targets[0])}\")"
]
},
{
"cell_type": "markdown",
"id": "8736ec68",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "0adb27dc2f6de0791a6b8c2d3da175ec",
"grade": false,
"grade_id": "cell-48b78919122984cd",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Now use the function `one_hot_encoding` to create an np.ndarray of the one-hot representations of all the labels in `targets` and save them in `targets_preprocessed`._"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 12,
2025-03-14 17:57:07 +00:00
"id": "b91925ad",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "c1b73325cca5ea5c87c016fa8679da87",
"grade": false,
"grade_id": "cell-66f4d1b4865c393b",
"locked": false,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [],
"source": [
"# YOUR CODE HERE\n",
"targets_preprocessed = np.array([one_hot_encoding(t) for t in targets])\n",
"#raise NotImplementedError()"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 13,
2025-03-14 17:57:07 +00:00
"id": "008bf36d",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "77ce70a606155c9bd692ea157f2ba4c5",
"grade": true,
"grade_id": "cell-b7bd3e108b492d1a",
"locked": true,
"points": 1,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"targets_preprocessed defined.\n"
]
}
],
"source": [
"check_var_defined('targets_preprocessed')\n",
"assert type(targets_preprocessed) == np.ndarray, \"Make sure to store your answer as a np.ndarray\""
]
},
{
"cell_type": "markdown",
"id": "93a82e2e",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "41c81734a6061adb3960393c731fbcb8",
"grade": false,
"grade_id": "cell-064a192e04bbe563",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"In this notebook you will train different models and compare them against each other. \n",
"\n",
"Now that the data is pre-processed. We will split the data in three datasets, a train, validation and test set. \n",
"\n",
"_Why do we need these three sets and what do we use them for._"
]
},
{
"cell_type": "markdown",
"id": "a070cee1",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "e411d567e9977776b601d7b2b60e317f",
"grade": true,
"grade_id": "cell-a9728f3a37f9b12d",
"locked": false,
"points": 3,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
"The training dataset is for initially fitting the models to the data.\n",
"\n",
"The test dataset is for performing final, unbiased verification of the model once training is complete.\n",
"\n",
"The validation set is somewhat of a halfway point between the two. It is used for tuning the model while training, for example by detecting overfitting. Overfitting can be detected by measuring the model's error on the validation set per epoch. If the validation error increases between epochs, the model could be overfitting and this can be used to stop the training early before it gets worse."
]
},
{
"cell_type": "markdown",
"id": "ffd06ef7",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "e8ede38fcd2fe8b3353140b6185a939b",
"grade": false,
"grade_id": "cell-5f7c36786ea1ac16",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Now split the data such that we have a train set with 80\\% of the samples and a validation and test set each with 10\\% of the samples. Save the results in `x_train`, `y_train`, `x_val`, `y_val`, `x_test`, and `y_test`._"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 14,
2025-03-14 17:57:07 +00:00
"id": "5fb75b70",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "9cc2c69bb2fa3aa04c24a14b0c7c0c4e",
"grade": false,
"grade_id": "cell-0d2a7323600586f0",
"locked": false,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train samples: 2936, Validation samples: 367, Test samples: 367\n"
]
}
],
"source": [
"tf.keras.utils.set_random_seed(371947)\n",
"# YOUR CODE HERE\n",
"length = len(images_preprocessed)\n",
"x_train, x_val, x_test = np.split(images_preprocessed, [int(length*.8), int(length*.9)])\n",
"y_train, y_val, y_test = np.split(targets_preprocessed, [int(length*.8), int(length*.9)])\n",
"#raise NotImplementedError()\n",
"\n",
"print(f\"Train samples: {len(x_train)}, Validation samples: {len(x_test)}, Test samples: {len(x_val)}\")"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 15,
2025-03-14 17:57:07 +00:00
"id": "caaff270",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "14729a3cfe23681c3c0310bcf17af528",
"grade": true,
"grade_id": "cell-2e10a0d0c102a096",
"locked": true,
"points": 2,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"x_train defined.\n",
"y_train defined.\n",
"x_val defined.\n",
"y_val defined.\n",
"x_test defined.\n",
"y_test defined.\n"
]
}
],
"source": [
"check_var_defined('x_train')\n",
"check_var_defined('y_train')\n",
"\n",
"check_var_defined('x_val')\n",
"check_var_defined('y_val')\n",
"\n",
"check_var_defined('x_test')\n",
"check_var_defined('y_test')"
]
},
{
"cell_type": "markdown",
"id": "cc327e32",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "6274d96a91edd7e1292a5b6355ea3bef",
"grade": false,
"grade_id": "cell-383c6a2fa62bb715",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"WARNING: Before we continue we delete the variable `images_preprocessed` (you don't need that anymore) to manage our RAM consumption. If you want to use that variable again you will have to rerun the cell that creates it."
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 16,
2025-03-14 17:57:07 +00:00
"id": "156ef4a4",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "7aefd78f3a200aeea2cb44ab96d4578a",
"grade": false,
"grade_id": "cell-97bcc5cb67d2816b",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [],
"source": [
"# Freeing up RAM by deleting this variable\n",
"del images_preprocessed"
]
},
{
"cell_type": "markdown",
"id": "cccda08d",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "5c9e2a2efad571fc5c110c912ee46805",
"grade": false,
"grade_id": "cell-30894c26978e5d77",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"# Part 2: Training a basic CNN model \n",
"\n",
"Now that we have pre-processed the data and split it into different parts for training, validation and testing, you can start training some neural networks. "
]
},
{
"cell_type": "markdown",
"id": "7a19e6a8",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "f28ec881e0bb1e54f3f45c022b8774be",
"grade": false,
"grade_id": "cell-bff4b784586115f7",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"Our model will take as input the $224 \\times 224$ rgb (3-channel) images and will give as output a length five vector of which the different elements correspond to the five different classes. \n",
"\n",
"The model will start with convolutional layers followed by a hidden dense layer and then the final dense layer that gives us our output. \n",
"\n",
"_What kind of activation function should we use on the convolutional, dense and output layers and why these specific activation functions? (motivate your answers)_"
]
},
{
"cell_type": "markdown",
"id": "409a0e94",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "77b3bb801e2b3da0731abff4924aec74",
"grade": true,
"grade_id": "cell-50455d0a455cb88d",
"locked": false,
"points": 3,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"A common problem with activation functions is that of vanishing gradients in lower layers, when gradients become very small and cease to be updated in training, or exploding gradients, in which case the training algorithm may not converge. We use different activation functions to avoid this problem. The choice of activation function depends on multiple factors, one of which is whether the data has negative values or not. In our case, it does not - we normalised the data into the range (0, 1)\n",
"\n",
"The convolutional layer should use a ReLU activation function to prevent vanishing gradients, as the function's gradient is never zero for positive values.\n",
"\n",
"The dense layer should also use ReLU, for the same reason as the convolutional layer. It could use Tanh if negative values were present.\n",
"\n",
"The activation function for the output layer depends on the problem type. In our case we are doing multi-class classification, so we should use Softmax to map predictions to probabilities The probabilities for each class will sum to 1."
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "markdown",
"id": "a35b7d12",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "5a5e9aca09fced3bed74485bd77db7d6",
"grade": false,
"grade_id": "cell-bfa3eeeb3542219a",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Create a model using the `tf.keras.models.Sequential()` model and add to that:_\n",
"\n",
"- Input layer: A 2D convolutional layer with 8 filters, a 3x3 kernel and the ReLU activation function. Specify that this layer has an `input_shape` of (224, 224, 3)_ \n",
"- A 2D MaxPool layer with strides 2x2\n",
"\n",
"- A 2D convolutional layer with 16 filters, a 3x3 kernel and a the ReLU activation function\n",
"- A 2D MaxPool layer with strides 2x2\n",
"\n",
"- A 2D convolutional layer with 32 filters, a 3x3 kernel and a the ReLU activation function\n",
"- A 2D MaxPool layer with strides 2x2\n",
"\n",
"- A 2D convolutional layer with 32 filters, a 3x3 kernel and a the ReLU activation function\n",
"- A 2D MaxPool layer with strides 2x2\n",
"\n",
"- A Flatten layer to flatten the filters to a single vector\n",
"- A Dense layer with 32 nodes and your chosen activation\n",
"\n",
"- Output layer: A Dense layer with 5 nodes and your chosen activation\n",
"\n",
"_Store the model in the variable `model_basic`._"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 17,
2025-03-14 17:57:07 +00:00
"id": "b869ea33",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "9260f5cd8f6f4294a65d990d4b4811d8",
"grade": true,
"grade_id": "cell-07bac90b1f60520f",
"locked": false,
"points": 3,
"schema_version": 3,
"solution": true,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/ktyl/.conda/envs/mlbd/lib/python3.11/site-packages/keras/src/layers/convolutional/base_conv.py:107: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
" super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"tf.keras.backend.clear_session()\n",
"tf.keras.utils.set_random_seed(93612)\n",
"\n",
"# YOUR CODE HERE\n",
2025-03-20 23:31:24 +00:00
"model_basic = tf.keras.models.Sequential([\n",
" tf.keras.layers.Conv2D(filters=8, kernel_size=(3,3), activation=\"relu\", input_shape=(224,224,3)),\n",
" tf.keras.layers.MaxPool2D(strides=(2,2)),\n",
" tf.keras.layers.Conv2D(filters=16, kernel_size=(3,3), activation=\"relu\"),\n",
" tf.keras.layers.MaxPool2D(strides=(2,2)),\n",
" tf.keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation=\"relu\"),\n",
" tf.keras.layers.MaxPool2D(strides=(2,2)),\n",
" tf.keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation=\"relu\"),\n",
" tf.keras.layers.MaxPool2D(strides=(2,2)),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(32, activation=\"relu\"),\n",
" tf.keras.layers.Dense(5, activation=\"softmax\")\n",
"])\n",
"\n",
"#raise NotImplementedError()"
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 18,
2025-03-14 17:57:07 +00:00
"id": "dfd1b4b1",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "31e5c487515b6eb896b76f01274fa4e1",
"grade": true,
"grade_id": "cell-6f80d53f202270f5",
"locked": true,
"points": 0,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"model_basic defined.\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"check_var_defined('model_basic')"
]
},
{
"cell_type": "markdown",
"id": "732cd91b",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "0a0467c488cd028d8b4f31654da06172",
"grade": false,
"grade_id": "cell-fb2a62d393542d0d",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"To compile the model we need to specify a loss function. \n",
"\n",
"_What loss function would be appropriate for this multi-class classfication problem?_\n",
"\n",
"_Also, during training we would like to monitor how well our model performs on predicting the targets. What would be a good metric to track? Motivate your answers._ "
]
},
{
"cell_type": "markdown",
"id": "7fcc8c8c",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "2c0d8befa01ec00ced7f85f0e9716399",
"grade": true,
"grade_id": "cell-0cdde96c1310bf02",
"locked": false,
"points": 2,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"Categorical Cross-Entropy (CCE) is an appropriate loss function because we are using one-hot encoding and the softmax looss function. One-hot encoding works well with the softmax activation function as we are comparing probabilities and one-hot produces a multi-dimensional vector.\n",
"\n",
"We can measure categorial accuracy as a metric since the dataset is one-hot encodded and relatively balanced. The metric measures the proportion of predictions matching one-hot labels."
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "markdown",
"id": "99fcaf9a",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "4efc96f0206afd42ee2b8b2b28952a9f",
"grade": false,
"grade_id": "cell-4a033537b6ee9406",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"Now compile the model using the `Adam` optimiser (with a `learning_rate` of 1e-4), your chosen loss, and your chosen metric to track. (Tip: TF has some loss function and metrics implemented in [tf.keras.losses](https://www.tensorflow.org/api_docs/python/tf/keras/losses) and [tf.keras.metrics](https://www.tensorflow.org/api_docs/python/tf/keras/metrics).)"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 19,
2025-03-14 17:57:07 +00:00
"id": "0daef6f2",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "65e0a8df26061b87c55af408082d9018",
"grade": true,
"grade_id": "cell-82f41439014ffdad",
"locked": false,
"points": 1,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [],
"source": [
"# YOUR CODE HERE\n",
2025-03-20 23:31:24 +00:00
"model_basic.compile(loss=\"categorical_crossentropy\",\n",
" optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),\n",
" metrics=[tf.keras.metrics.CategoricalAccuracy()])\n",
"#raise NotImplementedError()"
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 20,
2025-03-14 17:57:07 +00:00
"id": "b3f30c12",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "49c1362aa1b61db1c6ba1e0b660622da",
"grade": true,
"grade_id": "cell-05e3602641ad48ce",
"locked": true,
"points": 0,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"model_basic defined.\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"check_var_defined('model_basic')"
]
},
{
"cell_type": "markdown",
"id": "9414b548",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "1f382259b7899502ac4aac68a8ac4998",
"grade": false,
"grade_id": "cell-a109b929fd00512d",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Now fit the train data for 10 epochs and save the training history in the variable `history_basic`. Also specify the `validation_data` and a `batch_size` of 32._"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 21,
2025-03-14 17:57:07 +00:00
"id": "5f355c96",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "56cd98d186929b568e2f9f81368720a7",
"grade": true,
"grade_id": "cell-33eed7f2f5756706",
"locked": false,
"points": 2,
"schema_version": 3,
"solution": true,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m22s\u001b[0m 216ms/step - categorical_accuracy: 0.3034 - loss: 1.5835 - val_categorical_accuracy: 0.3842 - val_loss: 1.4783\n",
"Epoch 2/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m19s\u001b[0m 201ms/step - categorical_accuracy: 0.4216 - loss: 1.3884 - val_categorical_accuracy: 0.4741 - val_loss: 1.3093\n",
"Epoch 3/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m18s\u001b[0m 199ms/step - categorical_accuracy: 0.4820 - loss: 1.2396 - val_categorical_accuracy: 0.4932 - val_loss: 1.2155\n",
"Epoch 4/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m18s\u001b[0m 199ms/step - categorical_accuracy: 0.5169 - loss: 1.1568 - val_categorical_accuracy: 0.4932 - val_loss: 1.1751\n",
"Epoch 5/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m18s\u001b[0m 198ms/step - categorical_accuracy: 0.5300 - loss: 1.1089 - val_categorical_accuracy: 0.5177 - val_loss: 1.1498\n",
"Epoch 6/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m18s\u001b[0m 198ms/step - categorical_accuracy: 0.5450 - loss: 1.0736 - val_categorical_accuracy: 0.5259 - val_loss: 1.1298\n",
"Epoch 7/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m18s\u001b[0m 199ms/step - categorical_accuracy: 0.5634 - loss: 1.0433 - val_categorical_accuracy: 0.5368 - val_loss: 1.1149\n",
"Epoch 8/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m19s\u001b[0m 206ms/step - categorical_accuracy: 0.5852 - loss: 1.0178 - val_categorical_accuracy: 0.5450 - val_loss: 1.0949\n",
"Epoch 9/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m19s\u001b[0m 206ms/step - categorical_accuracy: 0.5967 - loss: 0.9953 - val_categorical_accuracy: 0.5559 - val_loss: 1.0862\n",
"Epoch 10/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m18s\u001b[0m 199ms/step - categorical_accuracy: 0.6108 - loss: 0.9734 - val_categorical_accuracy: 0.5613 - val_loss: 1.0745\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"tf.keras.utils.set_random_seed(47290)\n",
"# YOUR CODE HERE\n",
2025-03-20 23:31:24 +00:00
"history_basic = model_basic.fit(x_train, y_train, epochs=10,\n",
" validation_data=(x_val, y_val),\n",
" batch_size=32)\n",
"#raise NotImplementedError()"
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 22,
2025-03-14 17:57:07 +00:00
"id": "d123574b",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "df7229f0fa928a3cc4c45fb2f2759d54",
"grade": true,
"grade_id": "cell-ca82ca44cd2514f0",
"locked": true,
"points": 0,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"history_basic defined.\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"check_var_defined('history_basic')"
]
},
{
"cell_type": "markdown",
"id": "8aae7b43",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "ef84465233211abf5df74bdd82bbdead",
"grade": false,
"grade_id": "cell-5e75bbc569fe9852",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Now to see how the model performs, write a function `plot_metrics` that plots the loss for the train and validation set. In the same function also create a separate plot that plots the other metric for the train and validation set._"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 23,
2025-03-14 17:57:07 +00:00
"id": "38bb58e0",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "a5bdb9abb70f3a6d27b0a5a96972a350",
"grade": true,
"grade_id": "cell-61240c7d5919394e",
"locked": false,
"points": 3,
"schema_version": 3,
"solution": true,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAby1JREFUeJzt3Xd00/X+x/Fnmu5JaUsHlJa9KXtPAQERWQoiyrpuQBH1Cj8njotbruJ13Ss4GC5AVJClyJa9N3Qw2jK7d5PfH4FAGR3QNm36epyTc5PvSN6hXvriMw1ms9mMiIiIiJ1wsHUBIiIiIsVJ4UZERETsisKNiIiI2BWFGxEREbErCjciIiJiVxRuRERExK4o3IiIiIhdUbgRERERu6JwIyIiInZF4UbEhkaPHk14ePhN3fvKK69gMBiKt6AKZNWqVRgMBlatWmU9VtifR1RUFAaDgVmzZhVrTeHh4YwePbpY31OkIlK4EbkOg8FQqMeVvxil5DRt2pTq1auT324xHTt2JDAwkJycnFKsrOjWr1/PK6+8QkJCgq1LsZo1axYGg4EtW7bYuhSRYuFo6wJEyqJvvvkmz+uvv/6a5cuXX3O8QYMGt/Q5X3zxBSaT6abufeGFF5g8efItfX55MWLECCZPnsyaNWvo0qXLNeejoqLYsGED48ePx9Hx5v9au5WfR2GtX7+eqVOnMnr0aCpVqpTn3MGDB3Fw0L85RW6Vwo3Iddx///15Xm/cuJHly5dfc/xqaWlpuLu7F/pznJycbqo+AEdHx1v6RV6e3HfffUyZMoU5c+ZcN9zMnTsXs9nMiBEjbulzbuXnURxcXFxs+vki9kL/RBC5Sd26daNx48Zs3bqVLl264O7uzv/93/8B8PPPP9OvXz9CQkJwcXGhVq1avPbaa+Tm5uZ5j6vHeFway/Huu+/y+eefU6tWLVxcXGjdujWbN2/Oc+/1xtwYDAbGjx/PwoULady4MS4uLjRq1Ijff//9mvpXrVpFq1atcHV1pVatWnz22WeFGsczfvx4PD09SUtLu+bc8OHDCQoKsn7PLVu20Lt3b/z9/XFzc6NGjRqMHTs23/e/ntDQULp06cKPP/5Idnb2NefnzJlDrVq1aNu2LdHR0Tz++OPUq1cPNzc3/Pz8uOeee4iKiirwc6435iYhIYHRo0fj4+NDpUqVGDVq1HW7lHbt2sXo0aOpWbMmrq6uBAUFMXbsWM6dO2e95pVXXuHZZ58FoEaNGtbuzUu1XW/MzbFjx7jnnnuoXLky7u7utGvXjt9++y3PNZfGD33//fe88cYbVKtWDVdXV3r06MGRI0cK/N6FtX37dvr27Yu3tzeenp706NGDjRs35rkmOzubqVOnUqdOHVxdXfHz86NTp04sX77cek1cXBxjxoyhWrVquLi4EBwczIABAwr1MxIpjIrxzz6REnLu3Dn69u3Lvffey/33309gYCBgGcPg6enJpEmT8PT05I8//uCll14iKSmJd955p8D3nTNnDsnJyTzyyCMYDAbefvttBg8ezLFjxwpsXVi7di3z58/n8ccfx8vLiw8//JAhQ4YQExODn58fYPkl1adPH4KDg5k6dSq5ubm8+uqrBAQEFFjbsGHD+Pjjj/ntt9+45557rMfT0tL45ZdfGD16NEajkdOnT3P77bcTEBDA5MmTqVSpElFRUcyfP7/Az7ieESNG8PDDD7N06VLuvPNO6/Hdu3ezZ88eXnrpJQA2b97M+vXruffee6lWrRpRUVF88skndOvWjX379hWpZc1sNjNgwADWrl3Lo48+SoMGDViwYAGjRo265trly5dz7NgxxowZQ1BQEHv37uXzzz9n7969bNy4EYPBwODBgzl06BBz587lgw8+wN/fH+CGf+7x8fF06NCBtLQ0nnjiCfz8/Pjqq6+46667+PHHHxk0aFCe6998800cHBx45plnSExM5O2332bEiBH8/fffhf7ON7J37146d+6Mt7c3//znP3FycuKzzz6jW7du/PXXX7Rt2xawBLhp06bx4IMP0qZNG5KSktiyZQvbtm2jV69eAAwZMoS9e/cyYcIEwsPDOX36NMuXLycmJuamB9iL5GEWkQKNGzfOfPX/Xbp27WoGzJ9++uk116elpV1z7JFHHjG7u7ubMzIyrMdGjRplDgsLs76OjIw0A2Y/Pz/z+fPnrcd//vlnM2D+5ZdfrMdefvnla2oCzM7OzuYjR45Yj+3cudMMmD/66CPrsf79+5vd3d3NJ0+etB47fPiw2dHR8Zr3vJrJZDJXrVrVPGTIkDzHv//+ezNgXr16tdlsNpsXLFhgBsybN2/O9/0K6/z582YXFxfz8OHD8xyfPHmyGTAfPHjQbDZf/89+w4YNZsD89ddfW4/9+eefZsD8559/Wo9d/fNYuHChGTC//fbb1mM5OTnmzp07mwHzzJkzrcev97lz587N82diNpvN77zzjhkwR0ZGXnN9WFiYedSoUdbXEydONAPmNWvWWI8lJyeba9SoYQ4PDzfn5ubm+S4NGjQwZ2ZmWq/997//bQbMu3fvvuazrjRz5swCf1YDBw40Ozs7m48ePWo9durUKbOXl5e5S5cu1mMRERHmfv363fB9Lly4YAbM77zzTr41idwKdUuJ3AIXFxfGjBlzzXE3Nzfr8+TkZM6ePUvnzp1JS0vjwIEDBb7vsGHD8PX1tb7u3LkzYOmiKEjPnj2pVauW9XXTpk3x9va23pubm8uKFSsYOHAgISEh1utq165N3759C3x/g8HAPffcw+LFi0lJSbEe/+6776hatSqdOnUCsA6W/fXXX6/blVRUvr6+3HHHHSxatIjU1FTA0rIyb948WrVqRd26dYG8f/bZ2dmcO3eO2rVrU6lSJbZt21akz1y8eDGOjo489thj1mNGo5EJEyZcc+2Vn5uRkcHZs2dp164dQJE/98rPb9OmjfXPFMDT05OHH36YqKgo9u3bl+f6MWPG4OzsbH1dlP9u8pObm8uyZcsYOHAgNWvWtB4PDg7mvvvuY+3atSQlJQGWn/vevXs5fPjwdd/Lzc0NZ2dnVq1axYULF26pLpEbUbgRuQVVq1bN88vkkr179zJo0CB8fHzw9vYmICDAOhg5MTGxwPetXr16nteXgk5hfhlcfe+l+y/de/r0adLT06ldu/Y1113v2PUMGzaM9PR0Fi1aBEBKSgqLFy/mnnvusY7Z6dq1K0OGDGHq1Kn4+/szYMAAZs6cSWZmZqE+43pGjBhBamoqP//8M2CZeRQVFZVnIHF6ejovvfQSoaGhuLi44O/vT0BAAAkJCYX6s79SdHQ0wcHBeHp65jler169a649f/48Tz75JIGBgbi5uREQEECNGjWAwv3Mb/T51/usS7P0oqOj8xy/lf9u8nPmzBnS0tJuWIvJZOL48eMAvPrqqyQkJFC3bl2aNGnCs88+y65du6zXu7i48NZbb7FkyRICAwPp0qULb7/9NnFxcbdUo8iVFG5EbsGV/1q/JCEhga5du7Jz505effVVfvnlF5YvX85bb70FUKipxkaj8brHzfms81Ic9xZWu3btCA8P5/vvvwfgl19+IT09nWHDhlmvMRgM/Pjjj9Yp2idPnmTs2LG0bNkyT4tPUdx55534+PgwZ84cwDI2yWg0cu+991qvmTBhAm+88QZDhw7l+++/Z9myZSxfvhw/P78SneY9dOhQvvjiCx599FHmz5/PsmXLrAO5S3p6+SWl8bMvSJcuXTh69ChffvkljRs35r///S8tWrTgv//9r/WaiRMncujQIaZNm4arqysvvvgiDRo0YPv27aVWp9g3hRuRYrZq1SrOnTvHrFmzePLJJ7nzzjvp2bNnnm4mW6pSpQqurq7XnUVTlJk1Q4cO5ffffycpKYnvvvuO8PBwazfMldq1a8cbb7zBli1bmD17Nnv37mXevHk3VbuLiwt33303y5YtIz4+nh9++IHbbruNoKAg6zU//vgjo0aN4r333uPuu++mV69edOrU6aYWzQsLCyM2NvaaMHbw4ME8ry9cuMDKlSuZPHkyU6dOZdCgQfTq1StPF84lRVlVOiws7JrPAqx
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAeiFJREFUeJzt3Xd4VNXWx/HvpBeSEEglhBRCh0jvRQWlCAg2UC5VURFULpaLVwWx8VovFgRBQVEQ7IIioCBK770JhA4JPZW0mfP+MWQgJkD6pPw+zzMPk33O2WfNhGRW9llnb5NhGAYiIiIiFYiDvQMQERERKWlKgERERKTCUQIkIiIiFY4SIBEREalwlACJiIhIhaMESERERCocJUAiIiJS4SgBEhERkQpHCZCIiIhUOEqApNQYMmQI4eHhBTr2pZdewmQyFW1AFcjy5csxmUwsX77c1pbX78fhw4cxmUx89tlnRRpTeHg4Q4YMKdI+Je+K+2eqMD/vIkVBCZDckMlkytPj6g9PKT7R0dHUqFGD661i065dOwIDA8nMzCzByPJv9erVvPTSS1y8eNHeoeRw8OBBHnnkESIjI3Fzc8Pb25t27drx3nvvcenSpXz399FHHxV5kljRtGzZEpPJxJQpU+wdipQDTvYOQEq/L774ItvXs2bN4rfffsvRXq9evUKdZ/r06VgslgId+8ILLzB27NhCnb+sGDBgAGPHjmXFihV07Ngxx/bDhw+zZs0aRo0ahZNTwX/EC/P9yKvVq1czYcIEhgwZQuXKlbNt27dvHw4O9vkb7ZdffuHee+/F1dWVQYMG0bBhQ9LT01m5ciXPPPMMu3btYtq0afnq86OPPsLPz6/MjGqVtp+p/fv3s2HDBsLDw5k9ezYjRoywd0hSxikBkhv617/+le3rtWvX8ttvv+Vo/6eUlBQ8PDzyfB5nZ+cCxQfg5ORUqA/7suSBBx7gueeeY86cObkmQF999RWGYTBgwIBCnacw34+i4OrqapfzHjp0iP79+xMWFsayZcsIDg62bRs5ciQHDhzgl19+sUtsJSE5ORlPT89S9zP15ZdfEhAQwDvvvMM999zD4cOHS+UlNIvFQnp6Om5ubvYORW5Al8CkSNx88800bNiQTZs20bFjRzw8PPjvf/8LwE8//cQdd9xBtWrVcHV1pWbNmrzyyiuYzeZsffyzJiCrtuTtt99m2rRp1KxZE1dXV1q0aMGGDRuyHZtbvYLJZGLUqFH8+OOPNGzYEFdXVxo0aMCiRYtyxL98+XKaN2+Om5sbNWvW5OOPP85TDcSoUaOoVKkSKSkpObbdf//9BAUF2V7nxo0b6dq1K35+fri7uxMREcGwYcOu239uQkND6dixI99++y0ZGRk5ts+ZM4eaNWvSqlUrjhw5wmOPPUadOnVwd3enatWq3HvvvRw+fPiG58mtRuPixYsMGTIEHx8fKleuzODBg3O9fLV9+3aGDBliu3wUFBTEsGHDOHfunG2fl156iWeeeQaAiIgI26XUrNhyqwGKiYnh3nvvpUqVKnh4eNC6descyUhWPdPXX3/Na6+9RvXq1XFzc6Nz584cOHDghq/7zTffJCkpiU8//TRb8pMlKiqKJ5980vb1zJkzufXWWwkICMDV1ZX69evnuEQTHh7Orl27+PPPP22v8+abb872vo4ePZrQ0FBcXV2JiorijTfeyDECd+7cOQYOHIi3t7ft/d+2bVuuNVjLli2jQ4cOeHp6UrlyZe6880727NmTbZ+s/+O7d+/mgQcewNfXl/bt22fb9k9ffvklLVu2xMPDA19fXzp27MiSJUts2/P6855fc+bM4Z577qFnz574+PgwZ86cXPdbt24dPXr0wNfXF09PT6Kjo3nvvfey7bN3717uu+8+/P39cXd3p06dOjz//PO27deqT7re75nZs2fToEEDXF1dbb9j3n77bdq2bUvVqlVxd3enWbNmfPvtt7nGfb33dfDgwfj5+eX683777bdTp06da79xck2lJ72XMu/cuXN0796d/v37869//YvAwEAAPvvsMypVqsSYMWOoVKkSy5YtY9y4cSQkJPDWW2/dsN85c+aQmJjII488gslk4s033+Suu+4iJibmhqMUK1eu5Pvvv+exxx7Dy8uL999/n7vvvpujR49StWpVALZs2UK3bt0IDg5mwoQJmM1mXn75Zfz9/W8YW79+/Zg8ebLtkkmWlJQUFixYwJAhQ3B0dOT06dPcfvvt+Pv7M3bsWCpXrszhw4f5/vvvb3iO3AwYMICHH36YxYsX07NnT1v7jh072LlzJ+PGjQNgw4YNrF69mv79+1O9enUOHz7MlClTuPnmm9m9e3e+RugMw+DOO+9k5cqVPProo9SrV48ffviBwYMH59j3t99+IyYmhqFDhxIUFGS7ZLRr1y7Wrl2LyWTirrvu4u+//+arr77if//7H35+fgDXfN/j4uJo27YtKSkpPPHEE1StWpXPP/+c3r178+2339K3b99s+//f//0fDg4OPP3008THx/Pmm28yYMAA1q1bd93XuWDBAiIjI2nbtm2e3pcpU6bQoEEDevfujZOTEwsWLOCxxx7DYrEwcuRIACZNmsTjjz9OpUqVbB+0WT8fKSkpdOrUiRMnTvDII49Qo0YNVq9ezXPPPcepU6eYNGkSYB1Z6NWrF+vXr2fEiBHUrVuXn376Kdf3//fff6d79+5ERkby0ksvcenSJT744APatWvH5s2bc3y433vvvdSqVYvXX3/9urVlEyZM4KWXXqJt27a8/PLLuLi4sG7dOpYtW8btt98OFP7nPTfr1q3jwIEDzJw5ExcXF+666y5mz55t+yMry2+//UbPnj0JDg7mySefJCgoiD179vDzzz/bktbt27fToUMHnJ2defjhhwkPD+fgwYMsWLCA1157rUDxLVu2jK+//ppRo0bh5+dne3/fe+89evfuzYABA0hPT2fu3Lnce++9/Pzzz9xxxx2242/0vg4cOJBZs2bl+HmPjY1l2bJljB8/vkBxV3iGSD6NHDnS+Od/nU6dOhmAMXXq1Bz7p6Sk5Gh75JFHDA8PDyM1NdXWNnjwYCMsLMz29aFDhwzAqFq1qnH+/Hlb+08//WQAxoIFC2xt48ePzxETYLi4uBgHDhywtW3bts0AjA8++MDW1qtXL8PDw8M4ceKErW3//v2Gk5NTjj7/yWKxGCEhIcbdd9+drf3rr782AOOvv/4yDMMwfvjhBwMwNmzYcN3+8ur8+fOGq6urcf/992drHzt2rAEY+/btMwwj9/d+zZo1BmDMmjXL1vbHH38YgPHHH3/Y2v75/fjxxx8NwHjzzTdtbZmZmUaHDh0MwJg5c6atPbfzfvXVV9neE8MwjLfeessAjEOHDuXYPywszBg8eLDt69GjRxuAsWLFCltbYmKiERERYYSHhxtmsznba6lXr56RlpZm2/e9994zAGPHjh05zpUlPj7eAIw777zzmvv8U26vtWvXrkZkZGS2tgYNGhidOnXKse8rr7xieHp6Gn///Xe29rFjxxqOjo7G0aNHDcMwjO+++84AjEmTJtn2MZvNxq233prj/W/cuLEREBBgnDt3zta2bds2w8HBwRg0aJCtLevn5p//j67elmX//v2Gg4OD0bdvX9t7ncVisVz3/cjLz/v1jBo1yggNDbWdZ8mSJQZgbNmyxbZPZmamERERYYSFhRkXLly4ZnwdO3Y0vLy8jCNHjlxzn2vFdq3fMw4ODsauXbty7P/P9yI9Pd1o2LChceutt9ra8vK+ms1mo3r16ka/fv2ybX/33XcNk8lkxMTE5Di33JgugUmRcXV1ZejQoTna3d3dbc8TExM5e/YsHTp0ICUlhb17996w3379+uHr62v7ukOHDoD1csiNdOnShZo1a9q+jo6Oxtvb23as2Wzm999/p0+fPlSrVs22X1RUFN27d79h/yaTiXvvvZeFCxeSlJRka583bx4hISG2ywlZBb4///xzrsPY+eXr60uPHj2YP38+ycnJgHWEZu7cuTRv3pzatWsD2d/7jIwMzp07R1RUFJUrV2bz5s35OufChQtxcnLKVnz
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2025-03-14 17:57:07 +00:00
"source": [
"def plot_metrics(history):\n",
" # YOUR CODE HERE\n",
2025-03-20 23:31:24 +00:00
" plt.figure()\n",
" plt.plot(history.history['loss'], label='Training Loss')\n",
" plt.plot(history.history['val_loss'], label='Validation Loss')\n",
" plt.xlabel('Epochs')\n",
" plt.ylabel('Loss')\n",
" plt.title('Training vs. Validation Loss')\n",
" plt.legend()\n",
" \n",
" plt.figure()\n",
" plt.plot(history.history['categorical_accuracy'], label='Categorical Accuracy')\n",
" plt.plot(history.history['val_categorical_accuracy'], label='Validation Categorical Accuracy')\n",
" plt.xlabel('Epochs')\n",
" plt.ylabel('Categorical Accuracy')\n",
" plt.title('Training vs. Validation Categorical Accuracy')\n",
" \n",
" plt.show()\n",
" #raise NotImplementedError()\n",
2025-03-14 17:57:07 +00:00
" \n",
"plot_metrics(history_basic)"
]
},
{
"cell_type": "markdown",
"id": "92bba19a",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "bd1e870f79c2e6d81c41ace194b0ebe4",
"grade": false,
"grade_id": "cell-19742c74e422d586",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Comment on the performance of the model based the tracked loss and metric_"
]
},
{
"cell_type": "markdown",
"id": "7e27cebe",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "8e94b63bf3b595eb26cdf1b881cc8abc",
"grade": true,
"grade_id": "cell-e6ba8b200c4b3147",
"locked": false,
"points": 1,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"The loss decreased over time and the accuracy increased as desired. However in both cases the effect was greater for the training data than for the validation set."
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "markdown",
"id": "1d15de46",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "2e655dbc985e6392b5ddbcc72ca6e229",
"grade": false,
"grade_id": "cell-151e07a3bf171490",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"*What happens if we were to train the model for more epochs? What will happen to the performance of the model?*"
]
},
{
"cell_type": "markdown",
"id": "fc6353ec",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "793762314007eaee2230eb75a100a0c0",
"grade": true,
"grade_id": "cell-9b5a09ea6043f78b",
"locked": false,
"points": 1,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"The difference between the training and validation sets for the loss and accuracy would increase. This would imply overfitting of the model as it becomes increasingly better at predicting samples from the training set than the validation set."
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "markdown",
"id": "af62740d",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "08f400f65ad158d2f87611c7a71ba058",
"grade": false,
"grade_id": "cell-738ce98653d1a570",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"*Write a function `model_predict` that takes the model and some image data and returns the predicted targets (as integers corresponding to the predicted labels).* "
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 24,
2025-03-14 17:57:07 +00:00
"id": "f22e89cb",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "e40d60ca339a73ff568d0961f7e900ff",
"grade": false,
"grade_id": "cell-cfb685b6f75c6006",
"locked": false,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [],
"source": [
"def model_predict(model, x):\n",
" # YOUR CODE HERE\n",
2025-03-20 23:31:24 +00:00
" predicted_targets_one_hot = model.predict(x)\n",
" predicted_targets = np.array([np.where(one_hot==np.max(one_hot))[0][0] for one_hot in predicted_targets_one_hot])\n",
" #raise NotImplementedError()\n",
2025-03-14 17:57:07 +00:00
" return predicted_targets"
]
},
{
"cell_type": "markdown",
"id": "aacd284a",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "f19da898555f0263ef177dc0ed28374e",
"grade": false,
"grade_id": "cell-e8629ecfe3f00676",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Gather the targets of the test set (scalar integer value corresponding to the labels) and save them in `test_targets`._\n",
"\n",
"_Compute the targets for `model_basic` and store them in the variable `test_targets_basic`._"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 25,
2025-03-14 17:57:07 +00:00
"id": "3565c7b9",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "e9a5b17685ffee2ab1de566b7ba2b168",
"grade": false,
"grade_id": "cell-cbe466cfa34d7e4b",
"locked": false,
"schema_version": 3,
"solution": true,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m12/12\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 46ms/step \n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"# YOUR CODE HERE\n",
2025-03-20 23:31:24 +00:00
"test_targets = np.array([np.where(one_hot==1)[0][0] for one_hot in y_test])\n",
"test_targets_basic = np.array(model_predict(model_basic, x_test))\n",
"#raise NotImplementedError()"
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 26,
2025-03-14 17:57:07 +00:00
"id": "a7f97fbb",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "aa0abefb84844c72e579327d68fd75ee",
"grade": true,
"grade_id": "cell-9e9b4d1d290afa50",
"locked": true,
"points": 2,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"test_targets defined.\n",
"test_targets_basic defined.\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"check_var_defined('test_targets')\n",
"check_var_defined('test_targets_basic')\n",
"\n",
"assert test_targets.ndim == 1, \"Make sure you are only predicting the scalar label value not the one hot vectors\"\n",
"assert test_targets_basic.ndim == 1, \"Make sure you are only predicting the scalar label value not the one hot vectors\""
]
},
{
"cell_type": "markdown",
"id": "841af931",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "c3fefe19959c788d51c8741c70763997",
"grade": false,
"grade_id": "cell-a46cb8c0103a4c02",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Calculate the precision and recall averaged over the 5 classes. (Precision and recall for each classes and then avaraged in one score)_"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 27,
2025-03-14 17:57:07 +00:00
"id": "c5047120",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "fa62df2d562bac9c7210862873ba902d",
"grade": false,
"grade_id": "cell-2dc0bd5540e9f26b",
"locked": false,
"schema_version": 3,
"solution": true,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Average Recall: 0.618, Average Precision 0.642\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"def average_recall_precision(y, y_predict):\n",
" # YOUR CODE HERE\n",
2025-03-20 23:31:24 +00:00
"\n",
" precision = 0\n",
" recall = 0\n",
" \n",
" classes = set(y)\n",
" \n",
" for c in classes:\n",
" true_positives = 0\n",
" false_positives = 0\n",
" false_negatives = 0\n",
"\n",
" for truth, prediction in zip(y, y_predict):\n",
"\n",
" # Element is irrelevant for this class\n",
" if truth != c and prediction != c:\n",
" continue\n",
"\n",
" if truth == prediction:\n",
" true_positives += 1\n",
" elif truth == c:\n",
" false_negatives += 1\n",
" elif prediction == c:\n",
" false_positives += 1\n",
"\n",
" \n",
" precision_class = true_positives / (true_positives + false_positives) \n",
" recall_class = true_positives / (true_positives + false_negatives)\n",
" \n",
" precision += precision_class\n",
" recall += recall_class\n",
" \n",
" precision /= len(classes)\n",
" recall /= len(classes)\n",
" \n",
" #raise NotImplementedError()\n",
2025-03-14 17:57:07 +00:00
"\n",
" print(f\"Average Recall: {recall:.3f}, Average Precision {precision:0.3f}\")\n",
" return recall, precision\n",
"\n",
"recall_basic, precision_basic = average_recall_precision(test_targets, test_targets_basic)"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 28,
2025-03-14 17:57:07 +00:00
"id": "5d9aae79",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "8d7838e29e632bcfa1a9ce7da5218100",
"grade": true,
"grade_id": "cell-da4b4b840b2dd7b5",
"locked": true,
"points": 1,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"recall_basic defined.\n",
"precision_basic defined.\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"check_var_defined('recall_basic')\n",
"check_var_defined('precision_basic')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "49508417-b4f1-4880-9554-2015bc064a18",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "244174442f031c3dc061fa1552ae8919",
"grade": true,
"grade_id": "cell-0817deec60dce891",
"locked": true,
"points": 1,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "04eb1d82",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "91c5670a7abf30249e2812eb51b47444",
"grade": false,
"grade_id": "cell-2b085c7cf1510472",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Show the predicted targets in a confusion matrix. Show the predicted labels in percentages (percentage of the samples from true class labeled as predicted class) and add the labels to the axes._"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 29,
2025-03-14 17:57:07 +00:00
"id": "1b4795f7",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "913d7788ac41f1a1a351e0730056d72c",
"grade": true,
"grade_id": "cell-2399b15ba35796cd",
"locked": false,
"points": 2,
"schema_version": 3,
"solution": true,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2025-03-14 17:57:07 +00:00
"source": [
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
"\n",
"def plot_confusion_matrix(y, y_pred, title=\"\"):\n",
" # YOUR CODE HERE\n",
2025-03-20 23:31:24 +00:00
" cm = confusion_matrix(y, y_pred, normalize=\"true\") * 100\n",
" display = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)\n",
" display.plot(cmap=\"Greens\", values_format=\".1f\")\n",
" #raise NotImplementedError()\n",
2025-03-14 17:57:07 +00:00
" plt.title(title)\n",
" plt.show()\n",
"\n",
"plot_confusion_matrix(test_targets, test_targets_basic, \"basic model\")"
]
},
{
"cell_type": "markdown",
"id": "cd514aca",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "879d47a1563a4574537052e39ade0729",
"grade": false,
"grade_id": "cell-42cbefa4adf96a73",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Comment on the recall and precision of the model, as well as the predictions in the confusion matrix._"
]
},
{
"cell_type": "markdown",
"id": "89866352",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "3e2ac185cd5e069336a59850767c5c95",
"grade": true,
"grade_id": "cell-6a7fca3e2bf83f7f",
"locked": false,
"points": 2,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"The average recall and precision are balanced, suggesting the model is equally good at minimising false positives as false negatives. Some information is lost in these averages, as we can see from the confusion matrix that the model performs much better for the sunflowers class as for the others with >92% accuracy. Roses are frequently misidentified as tulips, suggesting the model's precision for roses may be low."
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "markdown",
"id": "3edf45c3",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "5b767c57e15f18abc0089a5e5650afe3",
"grade": false,
"grade_id": "cell-d356a7145292ec49",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"# Part 3: Improving the model\n",
"\n",
"To improve on the model we will include some Dropout layers. \n",
"\n",
"_What do dropout layers do and why might this increase the performance of our models?_"
]
},
{
"cell_type": "markdown",
"id": "b4b05027",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "e91f9ddbac41c7048beebaa26453963a",
"grade": true,
"grade_id": "cell-d51957783a8b8f11",
"locked": false,
"points": 3,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"Dropout layers set a random amount of the training data to zero in each epoch, forcing the model to generalise by providing effectively different training data each time. It becomes harder for the model to fit specifically to instances in the training data because it cannot see all of the training data at once."
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "markdown",
"id": "5c99ebc0",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "dd2566932baca09a6f679c828996194c",
"grade": false,
"grade_id": "cell-7f4c0f0200535322",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"Another method to improve the model is by using a technique called data augmentation. \n",
"\n",
"_Explain the concept data augmentation and explain how it might increase the performance of our model._"
]
},
{
"cell_type": "markdown",
"id": "e73d6db6",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "f11e0ec2ffa6c21658d7bcf6bbd17dec",
"grade": true,
"grade_id": "cell-8490281b269b4500",
"locked": false,
"points": 2,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"Data augmentation is the process of applying small variations to the training data, for example rotating, cropping, flipping training or slightly altering the colours. This similarly limits the model's ability to fit specifically to the training data as it is operating on a modified version, instead of the training data itself, forcing it to generalise."
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "markdown",
"id": "af5368bf",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "b07bc2ef06fc01df17799136bea01510",
"grade": false,
"grade_id": "cell-fac7ac8abd544790",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Use the exact same model as for the `model_basic`, but play around with adding in a data augmentation layer (e.g. [tf.keras.layers.RandomFlip](https://www.tensorflow.org/api_docs/python/tf/keras/layers/RandomFlip) ) and adding in dropout layers (dropout is typically only added in the dense part of the network). Store the new model in the variable `model_dropout` and compile it using the same metrics and loss as before._"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 30,
2025-03-14 17:57:07 +00:00
"id": "cae90829",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "5a19d58043b584bf8350c53034028644",
"grade": true,
"grade_id": "cell-25d3daacfe968aa2",
"locked": false,
"points": 2,
"schema_version": 3,
"solution": true,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/ktyl/.conda/envs/mlbd/lib/python3.11/site-packages/keras/src/layers/convolutional/base_conv.py:107: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
" super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"tf.keras.backend.clear_session()\n",
"tf.keras.utils.set_random_seed(48263)\n",
"\n",
"# YOUR CODE HERE\n",
2025-03-20 23:31:24 +00:00
"model_dropout = tf.keras.models.Sequential([\n",
" tf.keras.layers.RandomZoom(0.1, seed=42),\n",
" tf.keras.layers.RandomRotation(0.1, seed=42),\n",
" tf.keras.layers.RandomFlip(\"horizontal\", seed=42),\n",
" tf.keras.layers.Conv2D(filters=8, kernel_size=(3,3), activation=\"relu\", input_shape=(224,224,3)),\n",
" tf.keras.layers.MaxPool2D(strides=(2,2)),\n",
" tf.keras.layers.Conv2D(filters=16, kernel_size=(3,3), activation=\"relu\"),\n",
" tf.keras.layers.MaxPool2D(strides=(2,2)),\n",
" tf.keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation=\"relu\"),\n",
" tf.keras.layers.MaxPool2D(strides=(2,2)),\n",
" tf.keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation=\"relu\"),\n",
" tf.keras.layers.MaxPool2D(strides=(2,2)),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(32, activation=\"relu\"),\n",
" tf.keras.layers.Dropout(0.5),\n",
" tf.keras.layers.Dense(5, activation=\"softmax\")\n",
"])\n",
"\n",
"#raise NotImplementedError()"
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 31,
2025-03-14 17:57:07 +00:00
"id": "77868aae",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "b072fbdbe92be0f3926ceaf0935a6de0",
"grade": true,
"grade_id": "cell-824a00bec8ece0ac",
"locked": true,
"points": 0,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"model_dropout defined.\n"
]
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1mModel: \"sequential\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ random_zoom (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">RandomZoom</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ random_rotation │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (unbuilt) │\n",
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">RandomRotation</span>) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ random_flip (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">RandomFlip</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ ? │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (unbuilt) │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"</pre>\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ random_zoom (\u001b[38;5;33mRandomZoom\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ random_rotation │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n",
"│ (\u001b[38;5;33mRandomRotation\u001b[0m) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ random_flip (\u001b[38;5;33mRandomFlip\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d (\u001b[38;5;33mConv2D\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_1 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_2 (\u001b[38;5;33mConv2D\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_2 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_3 (\u001b[38;5;33mConv2D\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_3 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense (\u001b[38;5;33mDense\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2025-03-14 17:57:07 +00:00
"source": [
"check_var_defined('model_dropout')\n",
"model_dropout.summary()"
]
},
{
2025-03-20 23:31:24 +00:00
"cell_type": "code",
"execution_count": 32,
"id": "92ec2689",
2025-03-14 17:57:07 +00:00
"metadata": {
"deletable": false,
"nbgrader": {
2025-03-20 23:31:24 +00:00
"cell_type": "code",
"checksum": "c89d459ee4ecefb767369c54929ecfb0",
"grade": true,
"grade_id": "cell-82fcca9814ec3c0e",
"locked": false,
"points": 1,
2025-03-14 17:57:07 +00:00
"schema_version": 3,
2025-03-20 23:31:24 +00:00
"solution": true,
2025-03-14 17:57:07 +00:00
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 258ms/step - categorical_accuracy: 0.2455 - loss: 1.6014 - val_categorical_accuracy: 0.2916 - val_loss: 1.5391\n",
"Epoch 2/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m24s\u001b[0m 264ms/step - categorical_accuracy: 0.3000 - loss: 1.5297 - val_categorical_accuracy: 0.3379 - val_loss: 1.4781\n",
"Epoch 3/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 254ms/step - categorical_accuracy: 0.3400 - loss: 1.4764 - val_categorical_accuracy: 0.3515 - val_loss: 1.4463\n",
"Epoch 4/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 254ms/step - categorical_accuracy: 0.3607 - loss: 1.4422 - val_categorical_accuracy: 0.4278 - val_loss: 1.3648\n",
"Epoch 5/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m24s\u001b[0m 256ms/step - categorical_accuracy: 0.3780 - loss: 1.3957 - val_categorical_accuracy: 0.4741 - val_loss: 1.3091\n",
"Epoch 6/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 252ms/step - categorical_accuracy: 0.4264 - loss: 1.3473 - val_categorical_accuracy: 0.5041 - val_loss: 1.2634\n",
"Epoch 7/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 253ms/step - categorical_accuracy: 0.4359 - loss: 1.3280 - val_categorical_accuracy: 0.4905 - val_loss: 1.2468\n",
"Epoch 8/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 255ms/step - categorical_accuracy: 0.4456 - loss: 1.3061 - val_categorical_accuracy: 0.5259 - val_loss: 1.2070\n",
"Epoch 9/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 253ms/step - categorical_accuracy: 0.4730 - loss: 1.2948 - val_categorical_accuracy: 0.5259 - val_loss: 1.1895\n",
"Epoch 10/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 254ms/step - categorical_accuracy: 0.4730 - loss: 1.2780 - val_categorical_accuracy: 0.5232 - val_loss: 1.1882\n",
"Epoch 11/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 252ms/step - categorical_accuracy: 0.4722 - loss: 1.2699 - val_categorical_accuracy: 0.5668 - val_loss: 1.1537\n",
"Epoch 12/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 253ms/step - categorical_accuracy: 0.5036 - loss: 1.2272 - val_categorical_accuracy: 0.5804 - val_loss: 1.1287\n",
"Epoch 13/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 252ms/step - categorical_accuracy: 0.5042 - loss: 1.2143 - val_categorical_accuracy: 0.5777 - val_loss: 1.1289\n",
"Epoch 14/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 252ms/step - categorical_accuracy: 0.5186 - loss: 1.2249 - val_categorical_accuracy: 0.5858 - val_loss: 1.1071\n",
"Epoch 15/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 252ms/step - categorical_accuracy: 0.5055 - loss: 1.1896 - val_categorical_accuracy: 0.5777 - val_loss: 1.1020\n",
"Epoch 16/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 252ms/step - categorical_accuracy: 0.5239 - loss: 1.1767 - val_categorical_accuracy: 0.5913 - val_loss: 1.0925\n",
"Epoch 17/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 253ms/step - categorical_accuracy: 0.5264 - loss: 1.1780 - val_categorical_accuracy: 0.5804 - val_loss: 1.0838\n",
"Epoch 18/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m24s\u001b[0m 258ms/step - categorical_accuracy: 0.5320 - loss: 1.1648 - val_categorical_accuracy: 0.5967 - val_loss: 1.0745\n",
"Epoch 19/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 253ms/step - categorical_accuracy: 0.5469 - loss: 1.1741 - val_categorical_accuracy: 0.5940 - val_loss: 1.0532\n",
"Epoch 20/20\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 254ms/step - categorical_accuracy: 0.5266 - loss: 1.1739 - val_categorical_accuracy: 0.5967 - val_loss: 1.0518\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
2025-03-20 23:31:24 +00:00
"tf.keras.utils.set_random_seed(103745)\n",
"# YOUR CODE HERE\n",
"model_dropout.compile(loss=\"categorical_crossentropy\",\n",
" optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),\n",
" metrics=[tf.keras.metrics.CategoricalAccuracy()])\n",
"\n",
"history_dropout = model_dropout.fit(x_train, y_train, epochs=20,\n",
" validation_data=(x_val, y_val),\n",
" batch_size=32)\n",
"#raise NotImplementedError()"
2025-03-14 17:57:07 +00:00
]
},
{
2025-03-20 23:31:24 +00:00
"cell_type": "markdown",
"id": "6778a133",
2025-03-14 17:57:07 +00:00
"metadata": {
"deletable": false,
2025-03-20 23:31:24 +00:00
"editable": false,
2025-03-14 17:57:07 +00:00
"nbgrader": {
2025-03-20 23:31:24 +00:00
"cell_type": "markdown",
"checksum": "f825eb30514de109277305d52676cf9d",
"grade": false,
"grade_id": "cell-e6b6f0ea7ef2d37a",
"locked": true,
2025-03-14 17:57:07 +00:00
"schema_version": 3,
2025-03-20 23:31:24 +00:00
"solution": false,
2025-03-14 17:57:07 +00:00
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"_Fit the new model in the same way as before and save the history in `history_dropout`. However, train for 20 epochs instead of 10._"
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 33,
2025-03-14 17:57:07 +00:00
"id": "5048652c",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "35d4e0daf253b3a62a9f19ff3dac107b",
"grade": true,
"grade_id": "cell-df6e944e1dfa0984",
"locked": true,
"points": 0,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"history_dropout defined.\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"check_var_defined('history_dropout')"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 34,
2025-03-14 17:57:07 +00:00
"id": "128cc76b",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "98d15e93390af85cc8b0e007b9dc242a",
"grade": false,
"grade_id": "cell-0ddc85bc444c422c",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdgtJREFUeJzt3Xd4FNUexvHvpveEhJACoffeqzRBaSJNKaKAqCgCyrVc4VoAGyp2RewgXVSaAlKU3lvonRBaQk8ndef+sbASgZCEJJvyfp5nn+xOOfMbhrAvM2fmmAzDMBAREREpJOxsXYCIiIhITlK4ERERkUJF4UZEREQKFYUbERERKVQUbkRERKRQUbgRERGRQkXhRkRERAoVhRsREREpVBRuREREpFBRuBGxoUGDBlG2bNlsrTt27FhMJlPOFlSErFq1CpPJxKpVq6zTMns8Tpw4gclkYsqUKTlaU9myZRk0aFCOtilSFCnciNyCyWTK1OvGL0bJPbVr16Z06dJkNFpMixYtCAgIIDU1NQ8ry7oNGzYwduxYoqKibF2K1ZQpUzCZTGzbts3WpYjkCAdbFyCSH02bNi3d56lTp7J8+fKbplerVu2utvPdd99hNpuzte5rr73GqFGj7mr7BUX//v0ZNWoUa9eupVWrVjfNP3HiBBs3bmT48OE4OGT/n7W7OR6ZtWHDBsaNG8egQYPw8fFJN+/QoUPY2en/nCJ3S+FG5BYeffTRdJ83bdrE8uXLb5r+bwkJCbi5uWV6O46OjtmqD8DBweGuvsgLkkceeYTRo0czc+bMW4abWbNmYRgG/fv3v6vt3M3xyAnOzs423b5IYaH/IohkU5s2bahZsybbt2+nVatWuLm58b///Q+ABQsW0KVLF4KDg3F2dqZChQq89dZbpKWlpWvj3308rvfl+PDDD/n222+pUKECzs7ONGrUiK1bt6Zb91Z9bkwmE8OHD2f+/PnUrFkTZ2dnatSowZ9//nlT/atWraJhw4a4uLhQoUIFvvnmm0z14xk+fDgeHh4kJCTcNK9fv34EBgZa93Pbtm106NCB4sWL4+rqSrly5Rg8eHCG7d9KSEgIrVq14tdffyUlJeWm+TNnzqRChQo0adKE8PBwnn32WapUqYKrqyt+fn48/PDDnDhx4o7buVWfm6ioKAYNGoS3tzc+Pj4MHDjwlpeUdu/ezaBBgyhfvjwuLi4EBgYyePBgLl26ZF1m7NixvPzyywCUK1fOennzem236nNz/PhxHn74YXx9fXFzc6Np06YsWrQo3TLX+w/NmTOHd955h1KlSuHi4kK7du04evToHfc7s3bu3EmnTp3w8vLCw8ODdu3asWnTpnTLpKSkMG7cOCpVqoSLiwt+fn7cc889LF++3LpMZGQkjz/+OKVKlcLZ2ZmgoCC6deuWqWMkkhlF4799Irnk0qVLdOrUib59+/Loo48SEBAAWPoweHh48MILL+Dh4cHff//NG2+8QUxMDBMmTLhjuzNnziQ2Npann34ak8nEBx98QM+ePTl+/Pgdzy6sW7eOuXPn8uyzz+Lp6cnnn39Or169OHnyJH5+foDlS6pjx44EBQUxbtw40tLSePPNN/H3979jbX369GHixIksWrSIhx9+2Do9ISGB33//nUGDBmFvb8/58+e5//778ff3Z9SoUfj4+HDixAnmzp17x23cSv/+/RkyZAhLly7lgQcesE7fs2cPe/fu5Y033gBg69atbNiwgb59+1KqVClOnDjBpEmTaNOmDfv378/SmTXDMOjWrRvr1q3jmWeeoVq1asybN4+BAwfetOzy5cs5fvw4jz/+OIGBgezbt49vv/2Wffv2sWnTJkwmEz179uTw4cPMmjWLTz75hOLFiwPc9s/93LlzNG/enISEBJ577jn8/Pz46aefePDBB/n111/p0aNHuuXfe+897OzseOmll4iOjuaDDz6gf//+bN68OdP7fDv79u2jZcuWeHl58d///hdHR0e++eYb2rRpw+rVq2nSpAlgCXDjx4/nySefpHHjxsTExLBt2zZ27NjBfffdB0CvXr3Yt28fI0aMoGzZspw/f57ly5dz8uTJbHewF0nHEJE7GjZsmPHvX5fWrVsbgPH111/ftHxCQsJN055++mnDzc3NSExMtE4bOHCgUaZMGevnsLAwAzD8/PyMy5cvW6cvWLDAAIzff//dOm3MmDE31QQYTk5OxtGjR63Tdu3aZQDGF198YZ3WtWtXw83NzThz5ox12pEjRwwHB4eb2vw3s9lslCxZ0ujVq1e66XPmzDEAY82aNYZhGMa8efMMwNi6dWuG7WXW5cuXDWdnZ6Nfv37ppo8aNcoAjEOHDhmGces/+40bNxqAMXXqVOu0lStXGoCxcuVK67R/H4/58+cbgPHBBx9Yp6WmphotW7Y0AGPy5MnW6bfa7qxZs9L9mRiGYUyYMMEAjLCwsJuWL1OmjDFw4EDr55EjRxqAsXbtWuu02NhYo1y5ckbZsmWNtLS0dPtSrVo1IykpybrsZ599ZgDGnj17btrWjSZPnnzHY9W9e3fDycnJOHbsmHXa2bNnDU9PT6NVq1bWaXXq1DG6dOly23auXLliAMaECRMyrEnkbuiylMhdcHZ25vHHH79puqurq/V9bGwsFy9epGXLliQkJHDw4ME7ttunTx+KFStm/dyyZUvAconiTtq3b0+FChWsn2vXro2Xl5d13bS0NFasWEH37t0JDg62LlexYkU6dep0x/ZNJhMPP/wwixcvJi4uzjr9559/pmTJktxzzz0A1s6yf/zxxy0vJWVVsWLF6Ny5MwsXLiQ+Ph6wnFmZPXs2DRs2pHLlykD6P/uUlBQuXbpExYoV8fHxYceOHVna5uLFi3FwcGDo0KHWafb29owYMeKmZW/cbmJiIhcvXqRp06YAWd7ujdtv3Lix9c8UwMPDgyFDhnDixAn279+fbvnHH38cJycn6+es/L3JSFpaGsuWLaN79+6UL1/eOj0oKIhHHnmEdevWERMTA1iO+759+zhy5Mgt23J1dcXJyYlVq1Zx5cqVu6pL5HYUbkTuQsmSJdN9mVy3b98+evTogbe3N15eXvj7+1s7I0dHR9+x3dKlS6f7fD3oZObL4N/rXl//+rrnz5/n6tWrVKxY8ablbjXtVvr06cPVq1dZuHAhAHFxcSxevJiHH37Y2mendevW9OrVi3HjxlG8eHG6devG5MmTSUpKytQ2bqV///7Ex8ezYMECwHLn0YkTJ9J1JL569SpvvPEGISEhODs7U7x4cfz9/YmKisrUn/2NwsPDCQoKwsPDI930KlWq3LTs5cuXef755wkICMDV1RV/f3/KlSsHZO6Y3277t9rW9bv0wsPD002/m783Gblw4QIJCQm3rcVsNnPq1CkA3nzzTaKioqhcuTK1atXi5ZdfZvfu3dblnZ2def/991myZAkBAQG0atWKDz74gMjIyLuqUeRGCjcid+HG/61fFxUVRevWrdm1axdvvvkmv//+O8uXL+f9998HyNStxvb29recbmTwnJecWDezmjZtStmyZZkzZw4Av//+O1evXqVPnz7WZUwmE7/++qv1Fu0zZ84wePBgGjRokO6MT1Y88MADeHt7M3PmTMDSN8ne3p6+fftalxkxYgTvvPMOvXv3Zs6cOSxbtozly5fj5+eXq7d59+7dm++++45nnnmGuXPnsmzZMmtH7ty+vfy6vDj2d9KqVSuOHTvGjz/+SM2aNfn++++pX78+33//vXWZkSNHcvjwYcaPH4+Liwuvv/461apVY+fOnXlWpxRuCjciOWzVqlVcunSJKVOm8Pzzz/PAAw/Qvn37dJeZbKlEiRK4uLjc8i6arNxZ07t3b/78809iYmL4+eefKVu2rPUyzI2aNm3KO++8w7Zt25gxYwb79u1j9uzZ2ard2dmZhx56iGXLlnHu3Dl++eUX7r33XgIDA63L/PrrrwwcOJCPPvqIhx56iPvuu4977rknWw/NK1OmDBERETeFsUOHDqX7fOXKFf766y9GjRrFuHHj6NGjB/fdd1+6SzjXZeWp0mXKlLlpW4D10maZMmUy3dbd8Pf
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2025-03-14 17:57:07 +00:00
"source": [
"plot_metrics(history_dropout)"
]
},
{
"cell_type": "markdown",
"id": "c10bf8c3",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "979f4033a7940ff00c6f7ca954637940",
"grade": false,
"grade_id": "cell-b670310c7765e587",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Comment on the performance of the improved model based on the loss and metrics during training._"
]
},
{
"cell_type": "markdown",
"id": "6b3faf05",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "00191b16cf0e011c9d03a1129754e555",
"grade": true,
"grade_id": "cell-6927b7d95cf333bb",
"locked": false,
"points": 2,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"While the accuracy is lower and the loss higher than the basic model despite more time training, we can see from the plots that the training and validation loss and accuracy diverge much more slowly. This suggests the model is less susceptible to overfitting, so we are likely to get a better model with more training."
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "markdown",
"id": "4bc94e80",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "efc719533371854eb0212f0e5c2b10ec",
"grade": false,
"grade_id": "cell-ce1c537bdeaf042b",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Why did we have to train the model for more epochs than the basic model?_"
]
},
{
"cell_type": "markdown",
"id": "d81fb816",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "7532010e993a0c2cf68ea538cc1828cb",
"grade": true,
"grade_id": "cell-ed5fd1fcd6d7edae",
"locked": false,
"points": 1,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"Each epoch has less training data to work from, so the model takes longer to learn class features with the same learning rate."
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "markdown",
"id": "d43af512",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "0019529f078ddad35635d799818a93a4",
"grade": false,
"grade_id": "cell-6fe45193734a98f1",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"Now we evaluate our model on the test set using the functions you wrote before"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 35,
2025-03-14 17:57:07 +00:00
"id": "b5d2ea24",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "a8a74e97055b77988de9ab2d2bbe584d",
"grade": false,
"grade_id": "cell-dbb41e724cc87ef4",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m12/12\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 46ms/step \n",
"Average Recall: 0.685, Average Precision 0.682\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2025-03-14 17:57:07 +00:00
"source": [
"test_targets_dropout = model_predict(model_dropout, x_test)\n",
"recall_dropout, precision_dropout = average_recall_precision(test_targets, test_targets_dropout) \n",
"plot_confusion_matrix(test_targets, test_targets_dropout, \"Dropout model\")"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 36,
2025-03-14 17:57:07 +00:00
"id": "dbae38a3",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "1ff7f78be2332484fcb2a4f42c88024b",
"grade": true,
"grade_id": "cell-38adf79a9623097a",
"locked": true,
"points": 1,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"test_targets_dropout defined.\n",
"recall_dropout defined.\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"check_var_defined('test_targets_dropout')\n",
"check_var_defined('recall_dropout')"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 37,
2025-03-14 17:57:07 +00:00
"id": "98f7bbc4",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "ef2773bada37ac2e989c915fd1c202ac",
"grade": true,
"grade_id": "cell-893d3a09e7d217a5",
"locked": true,
"points": 1,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"test_targets_dropout defined.\n",
"precision_dropout defined.\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"check_var_defined('test_targets_dropout')\n",
"check_var_defined('precision_dropout')"
]
},
{
"cell_type": "markdown",
"id": "f1997b4c",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "45af3ed742ffc985d3ae0d1bb0642ec9",
"grade": false,
"grade_id": "cell-ee9f450cfd4f28c1",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Comment on the precision and recall of the model as well as the predictions in the confusion matrix_"
]
},
{
"cell_type": "markdown",
"id": "c67b7709",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "4fff78a473cf809da4746a10024bf93a",
"grade": true,
"grade_id": "cell-5e65073f0a33499f",
"locked": false,
"points": 1,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"The model is more precise and has better recall than the previous model, as we can see by a lower proportion of misidentifications for example mistaking roses for tulips as before. However, the difference is not enormous - more training may yield better results."
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "markdown",
"id": "916a0268",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "16a0f02889f362263892d78966b2cdf7",
"grade": false,
"grade_id": "cell-05958d87bacb98bb",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"# Part 4: Transfer learning\n",
"\n",
"In order to improve our model even further, we will make use of transfer learning. \n",
"\n",
"_Explain in your own words what tranfer learning means and why it would help in our particular case._"
]
},
{
"cell_type": "markdown",
"id": "8beb5bd3",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "008803ee61ecba25492a7b6ab82d276c",
"grade": true,
"grade_id": "cell-308cc1a86688dfa3",
"locked": false,
"points": 2,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"Transfer learning allows us to use a pre-trained model which saves time by using weights that have already been found and reduces overfitting as the model will be more general than our dataset. "
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "markdown",
"id": "7c876e43",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "9738191e10f9792a81f9d65df11ab118",
"grade": false,
"grade_id": "cell-471888928c62b0bd",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"Below you can see how we load in a pre-trained MobileNet that is trained on the ImageNet datastet. By not including the top part of the network we get only the convolutional layers and can add our own dense layers after that. We set all the layers of the MobileNet as not trainable, since this would be computationally expensive to do and we also want to avoid overfitting. Instead we will only be training the dense part. "
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 38,
2025-03-14 17:57:07 +00:00
"id": "152fe58b",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "f6cb7992b095564ec69734777844f1f2",
"grade": false,
"grade_id": "cell-cb1e989dcd98ff48",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Output shape of the MobileNet: (None, 7, 7, 1024)\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"mobilenet = tf.keras.applications.mobilenet.MobileNet(\n",
" input_shape=(224, 224, 3),\n",
" include_top=False, \n",
" weights='imagenet'\n",
")\n",
"\n",
"for layer in mobilenet.layers:\n",
" layer.trainable = False\n",
"\n",
"print(\"Output shape of the MobileNet: \", mobilenet.output_shape)"
]
},
{
"cell_type": "markdown",
"id": "864f49e7",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "c8249bc8280f0c194b5224a4898b45d0",
"grade": false,
"grade_id": "cell-40d065f39b3e5f02",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Use a sequential model and add the MobileNet, followed by a MaxPool2D layer, and then the dense part of the network which you can use the same as we have used in the previous models. Store the model in the variable `model_mobilenet`. Compile the model using the same metrics, loss and optimiser as before._"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 39,
2025-03-14 17:57:07 +00:00
"id": "6427f088",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "8fbbe772986c6b73371072f2bdaa32f3",
"grade": true,
"grade_id": "cell-0e5534072707a1a9",
"locked": false,
"points": 3,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [],
"source": [
"tf.keras.backend.clear_session()\n",
"tf.keras.utils.set_random_seed(387453)\n",
"\n",
"# YOUR CODE HERE\n",
2025-03-20 23:31:24 +00:00
"model_mobilenet = tf.keras.models.Sequential([\n",
" mobilenet,\n",
" tf.keras.layers.MaxPool2D(strides=(2,2)),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(32, activation=\"relu\"),\n",
" tf.keras.layers.Dropout(0.5),\n",
" tf.keras.layers.Dense(5, activation=\"softmax\")\n",
"])\n",
"\n",
"#raise NotImplementedError()"
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 40,
2025-03-14 17:57:07 +00:00
"id": "27b1a82a",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "3908bbc5d4a03396a323b818481eff71",
"grade": true,
"grade_id": "cell-1901a93a5517baf3",
"locked": true,
"points": 0,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"model_mobilenet defined.\n"
]
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1mModel: \"sequential\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ mobilenet_1.00_224 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Functional</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">7</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">7</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1024</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">3,228,864</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">3</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">3</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1024</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">9216</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">294,944</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">5</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">165</span> │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"</pre>\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ mobilenet_1.00_224 (\u001b[38;5;33mFunctional\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m3,228,864\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m3\u001b[0m, \u001b[38;5;34m3\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m9216\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m294,944\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m5\u001b[0m) │ \u001b[38;5;34m165\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">3,523,973</span> (13.44 MB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m3,523,973\u001b[0m (13.44 MB)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">295,109</span> (1.13 MB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m295,109\u001b[0m (1.13 MB)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">3,228,864</span> (12.32 MB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m3,228,864\u001b[0m (12.32 MB)\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2025-03-14 17:57:07 +00:00
"source": [
"check_var_defined('model_mobilenet')\n",
"model_mobilenet.summary()"
]
},
{
"cell_type": "markdown",
"id": "32486ee9",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "74a789206fadd2fe414bb72553f5cd94",
"grade": false,
"grade_id": "cell-f779ec7bb8b27b20",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"*Train the model in the same way as before, for 10 epochs.*"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 41,
2025-03-14 17:57:07 +00:00
"id": "b06557e3",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "b5a02272f53a882dc78ea8dfc863738f",
"grade": true,
"grade_id": "cell-aacaa24fc5614424",
"locked": false,
"points": 1,
"schema_version": 3,
"solution": true,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 429ms/step - categorical_accuracy: 0.2296 - loss: 2.5558 - val_categorical_accuracy: 0.4741 - val_loss: 1.2791\n",
"Epoch 2/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 418ms/step - categorical_accuracy: 0.4566 - loss: 1.2256 - val_categorical_accuracy: 0.7193 - val_loss: 0.8473\n",
"Epoch 3/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m39s\u001b[0m 419ms/step - categorical_accuracy: 0.6146 - loss: 0.9444 - val_categorical_accuracy: 0.7956 - val_loss: 0.6352\n",
"Epoch 4/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m43s\u001b[0m 462ms/step - categorical_accuracy: 0.6761 - loss: 0.7756 - val_categorical_accuracy: 0.8501 - val_loss: 0.5471\n",
"Epoch 5/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 444ms/step - categorical_accuracy: 0.7207 - loss: 0.6936 - val_categorical_accuracy: 0.8365 - val_loss: 0.4774\n",
"Epoch 6/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m39s\u001b[0m 420ms/step - categorical_accuracy: 0.7470 - loss: 0.6032 - val_categorical_accuracy: 0.8638 - val_loss: 0.4606\n",
"Epoch 7/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 417ms/step - categorical_accuracy: 0.7697 - loss: 0.5277 - val_categorical_accuracy: 0.8665 - val_loss: 0.4382\n",
"Epoch 8/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m40s\u001b[0m 431ms/step - categorical_accuracy: 0.7939 - loss: 0.4792 - val_categorical_accuracy: 0.8828 - val_loss: 0.4102\n",
"Epoch 9/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 448ms/step - categorical_accuracy: 0.7955 - loss: 0.4710 - val_categorical_accuracy: 0.8747 - val_loss: 0.3781\n",
"Epoch 10/10\n",
"\u001b[1m92/92\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m40s\u001b[0m 438ms/step - categorical_accuracy: 0.7994 - loss: 0.4482 - val_categorical_accuracy: 0.8747 - val_loss: 0.3842\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"tf.keras.utils.set_random_seed(9673)\n",
"# YOUR CODE HERE\n",
2025-03-20 23:31:24 +00:00
"model_mobilenet.compile(loss=\"categorical_crossentropy\",\n",
" optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),\n",
" metrics=[tf.keras.metrics.CategoricalAccuracy()])\n",
"\n",
"history_mobilenet = model_mobilenet.fit(x_train, y_train, epochs=10,\n",
" validation_data=(x_val, y_val),\n",
" batch_size=32)\n",
"#raise NotImplementedError()"
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 42,
2025-03-14 17:57:07 +00:00
"id": "6268f779",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "ca257ea8df19cb9c0c69b5791331d558",
"grade": true,
"grade_id": "cell-0afec72710b80268",
"locked": true,
"points": 0,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"history_mobilenet defined.\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"check_var_defined('history_mobilenet')"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 43,
2025-03-14 17:57:07 +00:00
"id": "6cbcc8b8",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "fbb6ea9e46c5fb28ddabec590a316660",
"grade": false,
"grade_id": "cell-d159d268c6e2d3b7",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdQVJREFUeJzt3Xd4VGXax/HvpPcCKbRAgNCrgFQBC0pHUCnKSvFdKyAu6i6sCmJjbSwqCMoqFkRARAFFikEpgoD03jskJJRUSJk57x9DBkICZCDJSfl9rmuuzDxzZs49kzJ3nnZbDMMwEBERESkhXMwOQERERCQ/KbkRERGREkXJjYiIiJQoSm5ERESkRFFyIyIiIiWKkhsREREpUZTciIiISImi5EZERERKFCU3IiIiUqIouZFCMWjQICIjI2/qsa+++ioWiyV/AypFfv/9dywWC7///rujLa/fj8OHD2OxWPjiiy/yNabIyEgGDRqUr88peVfQv1O38vsukh+U3JRyFoslT5crPxil4DRs2JDKlStzvaoobdq0ITw8nMzMzEKMzHmrV6/m1Vdf5fz582aHksOBAwd48sknqVatGl5eXgQEBNCmTRs++OADLly44PTzffzxx/meAJY2zZs3x2KxMHnyZLNDkRLAzewAxFxff/11tttfffUVS5cuzdFep06dWzrP1KlTsdlsN/XYl19+mZEjR97S+YuL/v37M3LkSFauXEm7du1y3H/48GHWrFnD0KFDcXO7+V/fW/l+5NXq1asZO3YsgwYNIigoKNt9e/bswcXFnP+tfv75Z3r37o2npycDBgygfv36pKens2rVKl588UV27NjBp59+6tRzfvzxx4SEhBSb3qii9ju1b98+1q9fT2RkJN988w1PP/202SFJMafkppT729/+lu32n3/+ydKlS3O0Xy01NRUfH588n8fd3f2m4gNwc3O7pQ/y4uSRRx5h1KhRzJgxI9fk5ttvv8UwDPr3739L57mV70d+8PT0NOW8hw4dol+/flSpUoVly5ZRvnx5x31Dhgxh//79/Pzzz6bEVhhSUlLw9fUtcr9T06dPJywsjPfff5+HHnqIw4cPF8lhLZvNRnp6Ol5eXmaHIjegYSm5oTvvvJP69euzYcMG2rVrh4+PD//+978BmDdvHl27dqVChQp4enpSvXp1Xn/9daxWa7bnuHoMPmsux3vvvcenn35K9erV8fT05Pbbb2f9+vXZHpvb/ACLxcLQoUP58ccfqV+/Pp6entSrV49FixbliP/333+nWbNmeHl5Ub16dT755JM8zTkYOnQofn5+pKam5rjv4Ycfply5co7X+ddff9GxY0dCQkLw9vamatWqPPbYY9d9/txERETQrl075syZQ0ZGRo77Z8yYQfXq1WnRogVHjhzhmWeeoVatWnh7e1O2bFl69+7N4cOHb3ie3OZEnD9/nkGDBhEYGEhQUBADBw7MdUhp69atDBo0yDGkU65cOR577DHOnDnjOObVV1/lxRdfBKBq1aqO4c2s2HKbc3Pw4EF69+5NmTJl8PHxoWXLljkSjaz5Q7Nnz+bNN9+kUqVKeHl5cc8997B///4bvu533nmH5ORkPvvss2yJTZaoqCiGDx/uuD1t2jTuvvtuwsLC8PT0pG7dujmGTSIjI9mxYwfLly93vM4777wz2/v63HPPERERgaenJ1FRUbz99ts5es7OnDnDo48+SkBAgOP937JlS65znpYtW0bbtm3x9fUlKCiI+++/n127dmU7JutnfOfOnTzyyCMEBwdzxx13ZLvvatOnT6d58+b4+PgQHBxMu3btWLJkieP+vP6+O2vGjBk89NBDdOvWjcDAQGbMmJHrcWvXrqVLly4EBwfj6+tLw4YN+eCDD7Ids3v3bvr06UNoaCje3t7UqlWLl156yXH/teYDXe/vzDfffEO9evXw9PR0/I157733aN26NWXLlsXb25umTZsyZ86cXOO+3vs6cOBAQkJCcv19v++++6hVq9a13zi5pqKTukuRdubMGTp37ky/fv3429/+Rnh4OABffPEFfn5+jBgxAj8/P5YtW8bo0aNJTEzk3XffveHzzpgxg6SkJJ588kksFgvvvPMODzzwAAcPHrxh78KqVauYO3cuzzzzDP7+/nz44Yc8+OCDHD16lLJlywKwadMmOnXqRPny5Rk7dixWq5XXXnuN0NDQG8bWt29fJk2a5BjGyJKamsqCBQsYNGgQrq6unD59mvvuu4/Q0FBGjhxJUFAQhw8fZu7cuTc8R2769+/PE088weLFi+nWrZujfdu2bWzfvp3Ro0cDsH79elavXk2/fv2oVKkShw8fZvLkydx5553s3LnTqZ41wzC4//77WbVqFU899RR16tThhx9+YODAgTmOXbp0KQcPHmTw4MGUK1fOMYyzY8cO/vzzTywWCw888AB79+7l22+/5b///S8hISEA13zfY2Njad26NampqTz77LOULVuWL7/8kh49ejBnzhx69eqV7fj//Oc/uLi48MILL5CQkMA777xD//79Wbt27XVf54IFC6hWrRqtW7fO0/syefJk6tWrR48ePXBzc2PBggU888wz2Gw2hgwZAsCECRMYNmwYfn5+jg/RrN+P1NRU2rdvz4kTJ3jyySepXLkyq1evZtSoUZw6dYoJEyYA9h6B7t27s27dOp5++mlq167NvHnzcn3/f/31Vzp37ky1atV49dVXuXDhAh999BFt2rRh48aNOT64e/fuTY0aNXjrrbeuO5dr7NixvPrqq7Ru3ZrXXnsNDw8P1q5dy7Jly7jvvvuAW/99z83atWvZv38/06ZNw8PDgwceeIBvvvnG8Q9UlqVLl9KtWzfKly/P8OHDKVeuHLt27eKnn35yJKRbt26lbdu2uLu788QTTxAZGcmBAwdYsGABb7755k3Ft2zZMmbPns3QoUMJCQlxvL8ffPABPXr0oH///qSnpzNz5kx69+7NTz/9RNeuXR2Pv9H7+uijj/LVV1/l+H2PiYlh2bJljBkz5qbiLvUMkSsMGTLEuPrHon379gZgTJkyJcfxqampOdqefPJJw8fHx7h48aKjbeDAgUaVKlUctw8dOmQARtmyZY2zZ8862ufNm2cAxoIFCxxtY8aMyRETYHh4eBj79+93tG3ZssUAjI8++sjR1r17d8PHx8c4ceKEo23fvn2Gm5tbjue8ms1mMypWrGg8+OCD2dpnz55tAMaKFSsMwzCMH374wQCM9evXX/f58urs2bOGp6en8fDDD2drHzlypAEYe/bsMQwj9/d+zZo1BmB89dVXjrbffvvNAIzffvvN0Xb19+PHH380AOOdd95xtGVmZhpt27Y1AGPatGmO9tzO++2332Z7TwzDMN59910DMA4dOpTj+CpVqhgDBw503H7uuecMwFi5cqWjLSkpyahataoRGRlpWK3WbK+lTp06RlpamuPYDz74wACMbdu25ThXloSEBAMw7r///msec7XcXmvHjh2NatWqZWurV6+e0b59+xzHvv7664avr6+xd+/ebO0jR440XF1djaNHjxqGYRjff/+9ARgTJkxwHGO1Wo277747x/vfuHFjIywszDhz5oyjbcuWLYaLi4sxYMAAR1vW783VP0dX3pdl3759houLi9GrVy/He53FZrNd9/3Iy+/79QwdOtSIiIhwnGfJkiUGYGzatMlxTGZmplG1alWjSpUqxrlz564ZX7t27Qx/f3/jyJEj1zzmWrFd6++Mi4uLsWPHjhzHX/1epKenG/Xr1zfuvvtuR1te3ler1WpUqlTJ6Nu3b7b7x48fb1gsFuPgwYM5zi03pmEpyRNPT08GDx6co93b29txPSkpifj4eNq2bUtqaiq7d+++4fP27duX4OBgx+22bdsC9iGKG+nQoQPVq1d33G7YsCEBAQGOx1qtVn799Vd69uxJhQoVHMdFRUXRuXPnGz6/xWKhd+/eLFy4kOTkZEf7rFmzqFixoqOLP2uy7E8//ZRr17KzgoOD6dKlC/PnzyclJQWw96zMnDmTZs2aUbNmTSD7e5+RkcGZM2eIiooiKCiIjRs3OnXOhQsX4ub
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2025-03-14 17:57:07 +00:00
"source": [
"plot_metrics(history_mobilenet)"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 44,
2025-03-14 17:57:07 +00:00
"id": "fd842596",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "0496a72dd46f2c72d22da989a15c2476",
"grade": false,
"grade_id": "cell-d87a64b79f1549a7",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m12/12\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 414ms/step\n",
"Average Recall: 0.885, Average Precision 0.881\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2025-03-14 17:57:07 +00:00
"source": [
"test_targets_mobilenet = model_predict(model_mobilenet, x_test)\n",
"recall_mobilenet, precision_mobilenet = average_recall_precision(test_targets, test_targets_mobilenet) \n",
"plot_confusion_matrix(test_targets, test_targets_mobilenet, \"Mobilenet model\")"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 45,
2025-03-14 17:57:07 +00:00
"id": "e2342a8b",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "42cb5f8e28e56b7043c36d5df75d2983",
"grade": true,
"grade_id": "cell-40f99ea46ff86e1b",
"locked": true,
"points": 1,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"test_targets_mobilenet defined.\n",
"recall_mobilenet defined.\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"check_var_defined('test_targets_mobilenet')\n",
"check_var_defined('recall_mobilenet')\n"
]
},
{
"cell_type": "code",
2025-03-20 23:31:24 +00:00
"execution_count": 46,
2025-03-14 17:57:07 +00:00
"id": "2bb96e04",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "d14981d8b3ee887ec733ccdf2a5c4087",
"grade": true,
"grade_id": "cell-9cf521b9f236b452",
"locked": true,
"points": 1,
"schema_version": 3,
"solution": false,
"task": false
}
},
2025-03-20 23:31:24 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"precision_mobilenet defined.\n"
]
}
],
2025-03-14 17:57:07 +00:00
"source": [
"check_var_defined('precision_mobilenet')\n"
]
},
{
"cell_type": "markdown",
"id": "59328ebf",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "5c1cb00105466e9970116015677dc3c1",
"grade": false,
"grade_id": "cell-8ef0296961e07f6f",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Comment on the results from the transfer-learned model and why the results differ to the case considered previously without transfer learning._"
]
},
{
"cell_type": "markdown",
"id": "81595522",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "61f54494e95241953588077a482d2287",
"grade": true,
"grade_id": "cell-d7f4cdf7f9265a07",
"locked": false,
"points": 2,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"The initial accuracy started lower and the loss higher than with the other models. However, the transfer model was able to learn much more quickly and overtook the other models within a few generations. The average precision and recall are significantly better, and it can be seen from the confusion matrix that there was a much lower proportion of misclassification, with the model being very good at positive classification."
2025-03-14 17:57:07 +00:00
]
},
{
"cell_type": "markdown",
"id": "765888af",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "4e1abcc1a230cf42061638a716dde7e9",
"grade": false,
"grade_id": "cell-0f6125b686f4ee8e",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"_Suggest some ways the model could be improved further._"
]
},
{
"cell_type": "markdown",
"id": "835f9579",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "29e376668ed2a5736535480ca1085599",
"grade": true,
"grade_id": "cell-316415b7bac4ae5f",
"locked": false,
"points": 2,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
2025-03-20 23:31:24 +00:00
"As always, more training data and more tranining time would improve the results. Learning reate scheduling to reduce the learning rate during training could allow for faster convergence of the model. Different optimisation functions from Adam could also improve results. A deeper model architecture could allow for more nuanced features to be learned."
2025-03-14 17:57:07 +00:00
]
}
],
"metadata": {
"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.11.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}