Files
ArtStudies/M1/Statistical Learning/TP6_keras_intro.ipynb
Arthur DANJOU 8cf328e18a Refactor code in numerical methods notebooks
- Updated import order in Point_Fixe.ipynb for consistency.
- Changed lambda functions to regular function definitions for clarity in Point_Fixe.ipynb.
- Added numpy import in TP1_EDO_EulerExp.ipynb, TP2_Lokta_Volterra.ipynb, and TP3_Convergence.ipynb for better readability.
- Modified for loops in TP1_EDO_EulerExp.ipynb and TP2_Lokta_Volterra.ipynb to include strict=False for compatibility with future Python versions.
2025-09-01 16:14:53 +02:00

2267 lines
282 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"id": "ced704ec-0d0d-45c3-9b55-2368396e5c77",
"metadata": {
"id": "ced704ec-0d0d-45c3-9b55-2368396e5c77"
},
"source": [
"# TP6 A short introduction to neural networks with Keras"
]
},
{
"cell_type": "markdown",
"id": "cd455d57-9a48-4a1c-82d6-2894f99cdb6d",
"metadata": {
"id": "cd455d57-9a48-4a1c-82d6-2894f99cdb6d"
},
"source": [
"We will use the Keras library, which serves as a high-level API for TensorFlow.\n",
"\n",
" Keras is a\n",
"deep-learning framework for Python that provides a convenient way to define and\n",
"train almost any kind of deep-learning model. Keras was initially developed for\n",
"researchers, with the aim of enabling fast experimentation.\n",
"Keras has the following key features:\n",
"- It allows the same code to run seamlessly on CPU or GPU.\n",
"- It has a user-friendly API that makes it easy to quickly prototype deep-learning\n",
"models.\n",
"- It has built-in support for convolutional networks (for computer vision), recurrent\n",
"networks (for sequence processing), and any combination of both.\n",
"- It supports arbitrary network architectures: multi-input or multi-output models,\n",
"layer sharing, model sharing, and so on.\n",
"\n",
"Extracted from the book \"Deep Learning with Python \", author : François Chollet.\n",
"\n",
"Remark : \n",
"\n",
" - PyTorch is more popular among researchers and academic practitioners for its flexibility and ease of use.\n",
"\n",
" - TensorFlow is preferred by industry professionals for large-scale applications and production deployment.\n"
]
},
{
"cell_type": "markdown",
"id": "ahhFpKIMWSxI",
"metadata": {
"id": "ahhFpKIMWSxI"
},
"source": [
"This tutorial uses the Fashion MNIST dataset which contains 70,000 grayscale images in 10 categories. The images show individual articles of clothing at low resolution (28 by 28 pixels). We will only use an MLP."
]
},
{
"cell_type": "markdown",
"id": "cT3zmP9N-Gfb",
"metadata": {
"id": "cT3zmP9N-Gfb"
},
"source": [
"Remark : in colab, try using the GPU instead of the CPU (Click on the \"Runtime\" menu at the top.\n",
"Select \"Change runtime type.\"\n",
"In the dialog box that appears, choose \"GPU\" under the Hardware accelerator dropdown menu.\n",
"Click \"Save.\" \n",
"\n",
"(GPU access is available with free Colab, but it comes with usage and performance limitations compared to the paid options)."
]
},
{
"cell_type": "markdown",
"id": "48a02457-d8ec-4c0a-b11f-7d4819c75e8d",
"metadata": {
"id": "48a02457-d8ec-4c0a-b11f-7d4819c75e8d"
},
"source": [
" Fashion MNIST is a slightly more challenging problem than regular MNIST. Both datasets are relatively small and are used to verify that an algorithm works as expected.\n",
"\n",
"Here, 60,000 images are used to train the network and 10,000 images to evaluate how accurately the network learned to classify images. You can access the Fashion MNIST directly from TensorFlow"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5260add2-2092-4849-b39b-0b4416d60275",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "5260add2-2092-4849-b39b-0b4416d60275",
"outputId": "654e42f5-eb10-449a-f110-d62b0e81fc0a"
},
"outputs": [],
"source": [
"import numpy as np\n",
"import tensorflow as tf\n",
"\n",
"tf.keras.utils.set_random_seed(42)\n",
"fashion_mnist = tf.keras.datasets.fashion_mnist\n",
"(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()"
]
},
{
"cell_type": "markdown",
"id": "1003ff8e-552e-425e-81df-85d623b062e3",
"metadata": {
"id": "1003ff8e-552e-425e-81df-85d623b062e3"
},
"source": [
"Let us take a look at the shape and the datatype of the training set :"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "cf702fe0-4b88-441e-a6c1-73fd5c57111f",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "cf702fe0-4b88-441e-a6c1-73fd5c57111f",
"outputId": "4f1ec97c-59a0-4eb7-ed01-8423374eb1e5"
},
"outputs": [
{
"data": {
"text/plain": [
"((60000, 28, 28), dtype('uint8'))"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train.shape, X_train.dtype"
]
},
{
"cell_type": "markdown",
"id": "oXlaIKYNYQIl",
"metadata": {
"id": "oXlaIKYNYQIl"
},
"source": [
"We will need a validation set during training. As the dataset is already shuffled, we will just use the last rows of the dataset for the validation set :"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "aoanwQnmYa3K",
"metadata": {
"id": "aoanwQnmYa3K"
},
"outputs": [],
"source": [
"X_val, y_val = X_train[-5000:], y_train[-5000:]\n",
"X_train, y_train = X_train[:-5000], y_train[:-5000]"
]
},
{
"cell_type": "markdown",
"id": "100d1fdb-d769-4dc7-aada-69d816b099aa",
"metadata": {
"id": "100d1fdb-d769-4dc7-aada-69d816b099aa"
},
"source": [
"Neural networks process inputs using small weight values, and inputs with large integer values can disrupt or slow down the learning process. As such it is good practice to normalize the pixel values. We do not really know the best way to scale the pixel values for modeling, but we know that some scaling will be required.\n",
"\n",
"A good starting point is to normalize the pixel values of grayscale images, e.g. rescale them to the range [0,1]. This involves first converting the data type from unsigned integers to floats, then dividing the pixel values by the maximum value.\n",
"\n",
"\n",
"\n",
"(If we used the sigmoid or tanh activation for the first layer, it would be even more important not to have too big input values, as they could cause saturation).\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "d5d925c1-6a53-4a9d-99ee-4ebb1a9c9026",
"metadata": {
"id": "d5d925c1-6a53-4a9d-99ee-4ebb1a9c9026"
},
"outputs": [],
"source": [
"X_train01, X_val01, X_test01 = X_train / 255.0, X_val / 255.0, X_test / 255.0"
]
},
{
"cell_type": "markdown",
"id": "0d393d58-bb7b-4a0b-90d2-2d1895300aa4",
"metadata": {
"id": "0d393d58-bb7b-4a0b-90d2-2d1895300aa4"
},
"source": [
"Remarks :\n",
" Normalizing the inputs and initializing the weights properly are particularly important in the context of deep learning (see e.g. the vanishing gradient problem or the exploding gradient problem). Here we have a shallow network, but the size of the inputs and of the weights matter anyway, we just have fewer problems.\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "2e31918c-b394-410a-b879-474f95b25035",
"metadata": {
"id": "2e31918c-b394-410a-b879-474f95b25035"
},
"source": [
"Here are the class names (they are not included with the dataset) : "
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "731ad9e7-57ae-47c5-b50d-5d77c28216bd",
"metadata": {
"id": "731ad9e7-57ae-47c5-b50d-5d77c28216bd"
},
"outputs": [],
"source": [
"class_names = [\n",
" \"T-shirt/top\",\n",
" \"Trouser\",\n",
" \"Pullover\",\n",
" \"Dress\",\n",
" \"Coat\",\n",
" \"Sandal\",\n",
" \"Shirt\",\n",
" \"Sneaker\",\n",
" \"Bag\",\n",
" \"Ankle boot\",\n",
"]"
]
},
{
"cell_type": "markdown",
"id": "7e3a55f3-d4b6-450e-93a2-2d6fb339c3b5",
"metadata": {
"id": "7e3a55f3-d4b6-450e-93a2-2d6fb339c3b5"
},
"source": [
"Q1. What does the first image of the training set represent ?"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "WDW-zdxKxv13",
"metadata": {
"id": "WDW-zdxKxv13"
},
"outputs": [
{
"data": {
"image/png": "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v7dcli9fnnJauXJltll77LFHyqmhId/voKZMmZJyOuuss7LNGj16dMpp5syZdfs94Mgjj6zLWbn/vfX09KR6/bvl+LmuViqVSt3+rHDcccdlm9Xf359eeOGF1NHRkVpbW7f5WHtiAACAUEQMAAAQiogBAABCETEAAEAoIgYAAAhFxAAAAKGIGAAAIBQRAwAAhCJiAACAUEQMAAAQiogBAABCETEAAEAoIgYAAAhFxAAAAKGIGAAAIBQRAwAAhCJiAACAUEQMAAAQiogBAABCETEAAEAoIgYAAAhFxAAAAKGIGAAAIBQRAwAAhCJiAACAUEQMAAAQiogBAABCaUrD1Msvv5xGjRq1y+csX7485TRhwoRss7q7u1NOOf9bjh8/PuXU3NycbVZra2vK6Xe/+122Wf/3f/+Xcsq5nWzYsCHltHHjxmyzNm3alHK6++67s8365S9/mXKaOXNmtlkTJ05MOfX09GSb1d7ennLq7e2t239v/f392Wbl+LmuVn+3SqWS6vXnkoMOOijr9v/CCy/s0GPtiQEAAEIRMQAAQCgiBgAACEXEAAAAoYgYAAAgFBEDAACEImIAAIBQRAwAAFC/ETNv3rx09NFHly/YOHny5HTWWWelZ5555nUvwHbxxRen3XffvXyhuXPOOSetXr16qNcNAACMUDsVMYsWLSoDZcmSJem+++4rX8H2tNNOS+vXrx94zOWXX56+//3vp+9+97vl41euXJnOPvvsXbF2AABgBGramQcvWLBg0P1bb7213CPz+OOPp9mzZ6eOjo70jW98I337299O73rXu8rH3HLLLemtb31rGT7HHXfc0K4eAAAYcd7UOTFFtBQmTpxYvi1iptg7c+qppw485pBDDkl77713Wrx48Ra/Rnd3d+rs7Bx0AwAAGPKI6e/vT5dddlk64YQT0qGHHlq+78UXX0zNzc1pt912G/TYPffcs/zY1s6zaWtrG7jNmDHjjS4JAAAYAd5wxBTnxvzqV79Kd9xxx5tawNy5c8s9Optvy5cvf1NfDwAAqG87dU7MZpdcckm6995700MPPZSmT58+8P4pU6aknp6e1N7ePmhvTHF1suJjW9LS0lLeAAAAhnxPTLVaLQPm7rvvTvfff3/ad999B338yCOPTKNGjUoLFy4ceF9xCebnn38+HX/88TszCgAA4M3viSkOISuuPHbPPfeU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afr06QPvL54visPe29vbBz3ec8nItLXtZEuKX7gWPJ/UccQUu2mPPPLItHDhwkG76or7xx9/fE3XxvC0bt268jcbxW85YEuKw4OKHzBe+7zS2dlZXqXM8wpbs2LFivKcGM8tI0dxzYfiB9O777473X///eVzx2sVP5+MGjVq0HNJcYhQcV6m55KRY3vbyZY8+eST5VvPJ3V+OFlxeeXzzz8/HXXUUemYY45JN954Y3nZug9/+MO1XhrDwJVXXlm+1kNxCFlxacviUtzF3rsPfvCDtV4aNY7Z1/6GqziZv/imUZxoWZx0WxyzfP3116cDDzyw/IbzhS98oTxWubi+PyPDtraR4lacX1e85kcRvMUvRq666qp0wAEHlJfiZuQcGvTtb3873XPPPeU5lpvPcykuBFK8vlTxtjhsufg5pdhmWltb06WXXloGzHHHHVfr5TNMtpPi+aP4+Hve857y9YSKc2KKS3PPnj27PEyVrajWiX/6p3+q7r333tXm5ubykstLliyp9ZIYJs4999zq1KlTy21jr732Ku8vXbq01suixh544IHyEpe/fysum7v5Mstf+MIXqnvuuWd5aeVTTjml+swzz9R62QyTbaSrq6t62mmnVffYY4/yErr77LNP9cILL6y++OKLtV42GW1p+yhut9xyy8BjNmzYUP3kJz9Zfctb3lIdO3Zs9X3ve1911apVNV03w2s7ef7556uzZ8+uTpw4sfx+c8ABB1Q//elPVzs6Omq99GGtUvzP1gIHAABguAl/TgwAADCyiBgAACAUEQMAAIQiYgAAgFBEDAAAEIqIAQAAQhExAABAKCIGgCFx7bXXpiOOOGKrH7/11lvTbrvt9qZmXHDBBemss856U18DgPhEDAClxYsXp8bGxvTHf/zHaaQ76aST0mWXXVbrZQCwFSIGgNI3vvGNdOmll6aHHnoorVy5stbLAYCtEjEApHXr1qU777wzXXTRReWemOLQr9d68MEHU6VSSQsXLkxHHXVUGjt2bHr729+ennnmma1+zWXLlqX99tsvXXLJJalarW7xMffcc0/6oz/6ozR69Ojysdddd13atGnTdtdbPG6PPfZIra2t6ROf+ETq6ekZ+Fh3d3f6y7/8yzR58uTy65544onpF7/4xaDPX7RoUTrmmGNSS0tLmjp1avrsZz87MLc4ZK34+D/+4z+Wf+fi9txzz213TQDkI2IASN/5znfSIYcckg4++OD0Z3/2Z+nf/u3fthgef/3Xf53+4R/+IT322GOpqakpfeQjH9ni13vqqafKeDjvvPPS1772tTIEft9Pf/rT9Bd/8RfpU5/6VPrf//3f9C//8i9lPP3N3/zNNtdahNTTTz9dhtXtt9+e7rrrrjJqNrvqqqvSf/zHf6RvfvOb6YknnkgHHHBAmjNnTvrd735XfvyFF15I73nPe9LRRx+d/vu//zvdfPPN5V6o66+/vvx4ES/HH398uvDCC9OqVavK24wZM3b6vykAu1AVgBHv7W9/e/XGG28s/9zb21udNGlS9YEHHhj4ePHn4lvGT37yk4H3/eAHPyjft2HDhvL+NddcU501a1b15z//efUtb3lL9e///u8HzbjllluqbW1tA/dPOeWU6t/+7d8Oesy///u/V6dOnbrVdZ5//vnViRMnVtevXz/wvptvvrk6fvz4al9fX3XdunXVUaNGVb/1rW8NfLynp6c6bdq06g033FDe/9znPlc9+OCDq/39/QOPmT9//sDXKLzzne+sfupTn9qp/4YA5GNPDMAIVxwS9uijj6YPfvCD5f1iD8u5555b7p34fYcffvjAn4vDsAovvfTSwPuef/759O53vztdffXV6a/+6q+2ObfYC/LFL34xjR8/fuC2ee9HV1fXVj9v1qxZ5eFsmxV7TYrD4ZYvX14ewtbb25tOOOGEgY+PGjWqPHSs2HtTKN4Wn/PavUPF44uvsWLFiu3+9wKg9ppqvQAAaquIleJ8kGnTpg28rziUrDhfpDgUrK2tbVAQbLY5Avr7+wfeV5ynUnyd4jCv4lCz4pyVrSmioTgM7Oyzz37dx4pzWQBga+yJARjBini57bbbyvNcnnzyyYFbsZdkc4zsjDFjxqR77723jJDiPJS1a9du9bHFCf3FXqDinJXfvzU0bP3bU7G2DRs2DNxfsmRJuRenOG9l//33T83NzennP//5wMeLPTPFif1/8Ad/UN5/61vfWl5O+rXn/BSPnzBhQpo+fXp5v/gafX19O/V3ByAfEQMwghXB8eqrr6aPfvSj6dBDDx10O+ecc7Z4SNn2jBs3Lv3gBz8oD0s744wzyj0uW1IcclYEVLE35n/+53/Kw7zuuOOO9PnPf36bX7+4Elmx3uJiAD/84Q/TNddcU14BrQifYnZxhbVPf/rTacGCBeVjikPUisPTis8pfPKTnywPPSsuJ/3rX/+6vEJa8TWuuOKKgXiaOXNmeuSRR8qrkr3yyiuD9jYBUHsiBmAEKyLl1FNPHXTI2GZFxBRXISuuNLazij0jP/rRj8q9HcUlm9evX/+6xxR7aoqI+s///M/ySmHHHXdc+upXv5r22WefbX7tU045JR144IFp9uzZ5bk7f/Inf5KuvfbagY9/+ctfLtf+53/+5+XenqVLl6Yf//jH6S1veUv58b322quMn+I8oOL8muISzUXgvDaerrzyyvKFP4u9N8UhcsW5PgAMH5Xi7P5aLwIAAGBH2RMDAACEImIAAIBQRAwAABCKiAEAAEIRMQAAQCgiBgAACEXEAAAAoYgYAAAgFBEDAACEImIAAIBQRAwAABCKiAEAAFIk/w/9k5gyuCcrWAAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 1000x1000 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# answer Q1\n",
"import matplotlib.pyplot as plt\n",
"\n",
"plt.figure(figsize=(10, 10))\n",
"plt.imshow(X_train[0], cmap=\"gray\")\n",
"plt.xlabel(class_names[y_train[0]])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "244eb6d5-a902-41a6-ac33-c3d97036780a",
"metadata": {
"id": "244eb6d5-a902-41a6-ac33-c3d97036780a"
},
"source": [
"Let us display the first 25 images in the training set :"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "b2e30200-0700-435f-89cb-98e0ad0440bc",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 826
},
"id": "b2e30200-0700-435f-89cb-98e0ad0440bc",
"outputId": "ce7d30ed-d045-4673-b567-bf9699df5db6"
},
"outputs": [
{
"data": {
"image/png": "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K37RMJVpTee69tprw180zGVOBQ0dOjScLX777bdB165dw+qzPXr0SOqItjlz5gQtWrQIrr/++pSVDU0nOfDAA4MKFSqE+5rZqaqWajP71alTJ6hWrVpwzTXXJHVIU0HyxhtvDOrWrRve7+GHHx6MHTs26fbfffdd0K1bt6B8+fJBgwYNwo6a97jmWyHz788++2z+bN7MqlF06tevn/+fKUxjnvOCbWqQM33SvIamiqi5JO+www4L5s+fn7TP22+/HTRr1iy8zwsuuCCpAqn9q5XZz3y7cumll4b96qqrrgqaN28e/luXLl3CYzK3ybNw4cJgypQp4Ynd3Nbo1atXuF/etvHiiy8GLVu2DMqVKxe0bds2PKaCzP5mn1NOOSWoWLFi+D4wHwpQvOiD9MHSwJzTTH9t1KhReG696667wvPsF198kX9ez3u9zzjjjLDvPvzww5HnY3MON99qN2nSJHwM80WkOc/meeGFF4LWrVuHtzW/pJx77rkl9AwgHYx/L2b3+JfIAq+99lqia9eu4f8eOHBgomXLlonffvst/9+HDBliZgqJ7t27J4YOHZqYMmVK4ogjjkj06NEjf5/77rsv0alTp/B/T5gwIVG/fv3E//3f/+X/+xtvvJHIycnJ3/7+++8T1apVS7z55puJOXPmJL766qtEs2bNEvfff3/K47zssssSVapUSZx//vmJyZMnJz799NNEnTp1EnfddVf+PjfeeGOiYcOGic8//zw8TnObGjVqJFavXh3++6JFixKVKlVKXHfddYlp06Yl+vfvn6hdu3Z4/Ma6desShx56aOLKK69MLF26NPxv165dMT3TiGL3E2Xnzp3hPrfeemti9uzZialTp4b9aP78+eG/m9fS9JOzzz47MWnSpLCvmf5YsJ8cddRRid69e+dvN23aNOyP//znP8P7NP+NGTMm7PfffPNN2A/y+pDx73//O3HiiSeG/3vFihXhfubYzX5m2+jXr19i3333TTz//POJGTNmJJ588snE3nvvnRg8eHD+/Zjb1apVK/HKK6+E+9x9993hPuZvQsmgD9IHs5E515155pny38y5+ZRTTsl/vevWrZt4/fXXw3Ov6bNR5+MPP/ww/HdzXjX7jx49OvHyyy+H/zZ27Niwv/Tp0ycxb968xLhx4xLPPvtsMf7liBPj391ZN/5lxUTDTBieeeaZ/A5k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WOj1yqkKCF144YVO2//+9780jtQtSmc88cQTSdt33313UJqosUDlEGzqGmxVbEn1L/sxfbMQaj/7mmR1DL735XMtsO/t7ONSY7o61kWLFkUeAzJHuv1PsffbnaJjUVTuyi6s6/teVO99+/ygxhUU/bnaN4/hU0j30ksvjTxPpzouO2esMkmqAKYyderUpO2//OUvzj6NGjWKzCanwi8aAAAAAGLHRAMAAABA7JhoAAAAAIgdEw0AAAAApSMM3qtXr8iCfT/99FNkURvjjDPOcNpWrFiRtN2kSRNnH1V0RYVb7ICNup2igr2VKlWKDBWpIih2oR7j6aefjtxn6NChTluXLl282hBfeMy3KNSsWbMig2EjR470KmTZokULpy03NzeyONa8efOcts8//zyIy3vvvee0jR49OijNxo0b5xWK9ylmpwr2qcCfvdCEb4BR9VU7fOuzT6qx0qcAqu8Ya++nwpBqcQMV0LX7oFqAAyXDJ7Ct9lHvC5++lW7hVLW4y3//+1+n7bTTTnPaLrroosg+av89vu8TFH2hSUWNiT59QRXnW7duXWThR/sztNG4cWOvz982VfzUXnTGfFb94IMPAh/8ogEAAAAgdkw0AAAAAMSOiQYAAACA2DHRAAAAAFA6wuDTpk2LDErbla+NQw45xGkbPny40zZp0qTIgI9vJVGfYK8Kj6Vb4VT93XZQzOjcuXPSdvPmzb2CQG3btg3KEvU6q+fdDueq0G264TEV5Lrrrructvfff99pq1y5ctJ2gwYNnH26devmtbDBli1bkrb3228/Z5/Fixc7bffcc08QxV6AIdXfc8sttzht06dPj1wI4qCDDgqylRoffKpf+wa4fR5T3de2bdsij0GNW3syBtrUfW3fvt1py8nJcdrs6skqWK7+bnX/zzzzTCyV70u7dIPSmcLu376Bap9Aeq1atbwWWvnxxx+dtquvvjppe86cOc4+PXr0SNomDF4yfdl3PE/3fdFYfG5TiwStWbMmafv000/3uv969epFjpPHHHOMs4/92cP+bFIYftEAAAAAEDsmGgAAAABix0QDAAAAQOyYaAAAAAAoHWFwFXSyg00LFy70CkrbIXIVbFFVNlV4R1Xz9glw+4Yj7TCuCiqqUK36G+0gpArxqhDysmXLvKpIZyPfkJbiG/62qWqcffv2LbSiplGzZk2n7YADDojs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HHnstWrV8gr71qlTx2lDfFRxSLUYgWIHuLds2eLsM2rUKKetZs2akX1eFcA8+uijvUK9F154YdL2I488EhR1MB6Z4cMPP3Ta7rnnHqft5JNPjly4oH379kEmeOedd5K227Rp4+zTrVu3YjwiACgd+EUDAAAAQOyYaAAAAACIHRMNAAAAALFjogEAAACgdITBV69eHRl4Xr9+vbPP999/77T94Q9/cNoaNmwYGT7fvn17ZFg7VTjbJ9irbmdXBle3q1u3rlfY1w6lt2vXztlnw4YNTtv06dOdNsLgRcu30vWwYcOcthUrVkSGZ9X7ae3atU5bjRo1IhcGqF+/vtM2e/Zsp031N2Su3377zWlTC1ssXrzYabvxxhsj92nRooXTNnHiRKftqquuStoeMWJEkC57AYzXX3/d2WfVqlVO29atW522KlWqFHoOwe6xF33YkwUfnnvuuaTtAw88MO3zpn2u69ixo7NPo0aNguL26KOPJm0fcMABzj5nnHFGMR4REB9+0QAAAAAQOyYaAAAAAGLHRAMAAABA7JhoAAAAACgdYXAVQt24cWPS9pAhQ7xu99NPPzltRx55ZGQo0a5QmyrAbYcoVRXwHTt2RAa/jW3bthVa3TtVpfNKlSo5baNHjy70vo3c3FynbcKECU7bEUcc4bQhPr5BSLs6sQpVqn6lKsCrhQ3svqvuS91OOe+885K2b7nlFmefp556yuu5iDM4Cv+K7MqaNWucthkzZiRtN2vWLO0wrj2Gqz5/zDHHOG2ffvqp09a/f//IkLca2y677DKnLVMqlJcWv/76a+TCJ8o333zjtF1wwQWRi5fYfcEYP3585Ln0hRde8FrY4OCDD3baDjrooMgFMubNm+e0ffvtt07b/PnzI/syYfDsGl9VX25h9a2WLVt63Ve2nxP5RQMAAABA7JhoAAAAAIgdEw0AAAAApSOj8ec//9lpO+GEE5K2161bF1m4J1WRJrsoXYUKFbzyGCprYRe12rlzp9c1der+7etD7VyKMWbMGKftww8/jLz+XRXReumll5y28uXLO20o2uuTfQv2ffXVV5H5C/U6b9myxWlT/dSn+KQq/qdccsklkX/jmWee6bR98sknpe760+IssqeeK5/nz7cPdujQwWmrWbNm0vaUKVMii0Gqa9hV/7rhhhu8smWdOnVy2v76179G5izsQrCp+GSh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7fP2228HzZo1C+/zggsuyC9Ko761NfuZXzguvfTSoFq1asFVV10VNG/ePPy3Ll26hMdkbpNn4cKFwZQpU4KTTz45vK3Rq1evcL+8bePFF18MWrZsGZQrVy5o27ZteEwFmf3NPqecckpQsWLF8A300UcfxfK8wo+pgm0muObbEvOLhrnMye5r5nUyg1rXrl3Ditg9evRImgzb5syZE76W119/fcrKmmaieuCBBwYVKlQI9zW/kO3atSvyeM1+derUCfvpNddckzQpNhXrb7zxxqBu3brh/R5++OHB2LFjk27/3Xffhe8d861QgwYNwsly3uOaSxLMvz/77LP5vyiaX/aQWdatWxcMGzYsePzxx4NjjjkmaNq0afia3nnnncEZZ5wR7vPUU08FHTp0CMdIU4jruuuuS6r4nnc535dffhm0a9cuHGfNeFbwix9Tbf6WW24J96tVq1bwt7/9zenPgwYNCvtZ3j6nnXZa2P9RutEHkUl9zZyrXn311fBzmDlHt27dOhgwYEDS/UyePDn8rGX6Wb169YJLLrkkWLVqVdr9yPTNK664Ithvv/2CBQsWeJ3X8z7zmeM274uHH344yHqJLPPGG28kcnJyCt1n586d4T633nprYvbs2YmpU6cm3nzzzcT8+fPDf7/vvvsSVapUSZx99tmJSZMmJb7//vtE/fr1E3fddVf+fRx11FGJ3r175283bdo0Ua1atcQ///nP8D7Nf2PGjDGjWeKbb75JLF26NLF69er8/f/9738nTjzxxPB/r1ixItzPHLvZz2wb/fr1S+y7776J559/PjFjxozEk08+mdh7770TgwcPzr8fc7tatWolXnnllXCfu+++O9zH/E0oHq+99lqia9eu4f8eOHBgomXLlonffvst/9+HDBkSvk7du3dPDB06NDFlypTEEUcckejRo0f+PqbPderUKfzfEyZMCPvb//3f/6Xs16ZPmv5m+u2cOXMSX331VaJZs2aJ+++/P+VxXnbZZWG/Pv/88xOTJ09OfPrpp4k6deok9esbb7wx0bBhw8Tnn38eHqe5TY0aNfL77qJFixKVKlVKXHfddYlp06Yl+vfvn6hdu3Z4/Ma6desShx56aOLKK68M+7L5b9euXTE904iLGQNNX7jpppsS27Ztk/s8/fTT4Vgzd+7cxLfffpto27Zt4tprr03qk2Z8Ov744xNj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0bA/fFSqVClyH6Oo31s+x6WOIRMnGmXxHJzu86n2qVy5std50z6fq3Owui/1xWE1j+cuWyYau3NshMEBAAAAxI6JBgAAAIDYZeZv4kAWGzp0aNL25MmTvX5unDt3buS1pSpDUaNGDactJyfHaatevXrSdu3atZ195s2b57Qhs6mf2r/88suk7Q8++MDZZ8iQIU7b8uXLnbZt27YlbV9zzTXOPj///LPXZQ72NdD77befs8+rr77qtHXs2DHyPaTeU9l2GUJRUH9vupegXH311U7b9u3bnTb78hLVr5599lmvY7Uv8evSpYuzz9atW70u+Zs6dWrk5VuDBg1y2tatW+e0nXHGGUnb55xzTlqXqKXaD0Haz5OdvTGrI9lmzpzptE2cODHyXKrOt6p/2OOmGo86d+4clIXxid4NAAAAIHZMNAAAAADEjokGAAAAgNiR0QBitnnz5qTt5s2be9UwUAWR7Ot527Zt63WNtLoO2M5oqFoe6r5UbqNZs2ZOG+I1f/58p+33v/99ZH8z1q9fH3lts3r91TKN9nHYGaRU+SLFrp2grp2+4IILvK53vuqqq5K277jjDmcfchvpL/t75513Om1r16512kxl4Kglb9XYZvdRY+nSpZH94dprr3X2OfTQQ71qctjHqnJqatlntQyunXuya3QYN998s9frgfTNmTPHaVu0aFHSdtOmTb36mjr/2f1Infv23ntvp61WrVqRWY4ff/zRq75MtuMXDQAAAACxY6IBAAAAIHZMNAAAAADEjokGAAAAgNgRBgdiZhcCWrlyZWQhvlShXrutbt26zj67du3yCjTawVsVSlT39f333ztthMGL3uWXX+4VxlUFpOxQtwr/qgC0ui97MQNVNPK4445z2qpVq+a0bdiwIWm7SpUqaYe1P//886TtAQMGOPuMGDHC675KM98Ccb/88ktkoVEV6lYBWvs5Vo/XqFEjr/uyQ9YffvihV1hbBb3tPvnrr786+6hjVW12sHzSpEnOPur+VXDY3k/tA00Vy7MD3HYBSSM3N9dpe/vtt522/v37J2337NnT2ef444932tq1axd5XPPEQiuq+GTFihWDbMYvGgAAAABix0QDAAAAQOyYaAAAAACIHRMNAAAAALEjDA7EzA7LqurHPtWcVfVmFS5U4Vl1/3ZAUwUvVRhcBZARv1deeSVpe/ny5V4BV99A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gysqrK0CunawV1GBm4YNG0Y+pgqfq/tSoSL7ts8//7yzD2HwkmGHYFWY0Xdhg3r16kXelwqwqcCXHeJVgbz58+d7VR5Hdpk2bZrTtmbNGqetVatWTtuUKVMig+WqP6sKuvZYVrVq1cgFOHzD4GWherN5TguGWD/44IOkfx8wYIBzm44dO3qND99//33SdpMmTZx91q1b5/V6tW7dOml75cqVXq+pYj+mOr+rv0cttmIfR/Xq1b3OwT6fKVRfUwsiqPHafv+o58sOR2/cuDEoTYYMGZK0/cMPP0T2q1Svl70Agvpsp8636jW0n+fDDjssch9j0aJFkQH0qmL8s8/5qcbvBx98MLJCeqYskJEZRwEAAACgVGGiAQAAACB2TDQAAAAAlN6Mhn0tmbo+79JLL3Xaxo4d67TZ112qa/jU9ZuqgItdbM0uOGU0aNDA6742b94cef2cymOox7QLZNnX6qJ4qNdrxYoVkdc6q6zFzp07nTb72lJVnE9dP6wKCNlq1arltC1ZssRpI6NRPOyMgcoc+F5z+9prryVt5+bmOvsccMABTpsaK+3xTV2PrK47t6+5Nvbff//Iv8cuRGX89a9/jbzGWh17actofPHFF0mFX8ePH5/07w899JBzm2HDhjltgwYNisxwde7c2dln7ty5XgUB7YylKqqmiqitWrUqstCtynZMnz7da3yzb6sKHKoxVmU57HHXzrgYq1evdtrU82rnnuzPCsasWbMi98lmb7/9duRnKJV5Uez3vTpHqnOw2s/+rKj6u7qvP/7xj07bwoULk7ZnzpzplW2rUaOGV24jU/GLBgAAAIDYMdEAAAAAEDsmGgAAAABix0QDAAAAQOkNg/t46623vIrSffvtt5HhK1UsTwUT7YChCpipwKEK49rBYRV2UsWP7rzzTqftlltucdpQ/FTRM/t1VUEu32JLPoWi7BBnqn5kH1f9+vW9imKieNjjiFqwQo1RgwcPdtp++umnyICrGn/U/VerVi2yj9iLZhinn3565H6qqJVq6927t9P27LPPRh57aSviZ4L5BReIsEOoP/74o3ObMWPGOG05OTmRbSrcfNRRRzltixcvjjxXn3zyyc4+8+bN8wrVnn/++YUutpEqQKvGZns/Fajt0aOH06bO+3aQVy3aot5j9vtJFehTAX47XOyz4Ec2sRdDUeOfGntatmzptKVb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",
"text/plain": [
"<Figure size 1000x1000 with 25 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.figure(figsize=(10, 10))\n",
"for i in range(25):\n",
" plt.subplot(5, 5, i + 1)\n",
" plt.xticks([])\n",
" plt.yticks([])\n",
" plt.grid(False)\n",
" plt.imshow(X_train[i], cmap=plt.cm.binary)\n",
" plt.xlabel(class_names[y_train[i]])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "f18ae0cd-588e-4087-add7-9d32b727f6e1",
"metadata": {
"id": "f18ae0cd-588e-4087-add7-9d32b727f6e1"
},
"source": [
"Now let us build the neural network. Here we will build a classification MLP (multi layer perceptron). "
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "ed84911d-a6d5-484d-9ba6-97570069a4fb",
"metadata": {
"id": "ed84911d-a6d5-484d-9ba6-97570069a4fb"
},
"outputs": [],
"source": [
"model = tf.keras.Sequential(\n",
" [\n",
" tf.keras.layers.Input(shape=[28, 28]),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(300, activation=\"relu\", kernel_initializer=\"he_normal\"),\n",
" tf.keras.layers.Dense(100, activation=\"relu\", kernel_initializer=\"he_normal\"),\n",
" tf.keras.layers.Dense(10, activation=\"softmax\"),\n",
" ]\n",
")"
]
},
{
"cell_type": "markdown",
"id": "d18862c4-b4b6-4aec-9312-8c2ee7644117",
"metadata": {
"id": "d18862c4-b4b6-4aec-9312-8c2ee7644117"
},
"source": [
"Q2.\n",
" a) What does the `Flatten` layer do ?\n",
"\n",
" b) What do the numbers 300, 100 and 10 represent ?\n",
"\n",
" c) How many hidden layers are there ?\n",
"\n",
" d) Why do we use the softmax activation function in the output layer and what do the outputs of the last layer represent ?\n",
"\n",
" e) What does \"sequential\" mean ?"
]
},
{
"cell_type": "markdown",
"id": "491ab5d1",
"metadata": {},
"source": [
"**Answer**:\n",
"\n",
"a) The flatten layer transforms the 2D input (28×28 pixels) into a 1D vector of size 784. This is necessary before feeding the data into fully connected (Dense) layers.\n",
"\n",
"b) They are the number of neurons in each Dense (fully connected) layer:\n",
"- 300 neurons in the first hidden layer\n",
"- 100 neurons in the second hidden layer\n",
"- 10 neurons in the output layer (one for each class, e.g., digits 09)\n",
"\n",
"c) There are 2 hidden layers (those with 300 and 100 neurons). The final layer is the output layer.\n",
"\n",
"d) Softmax turns the raw scores into probabilities that sum to 1. Each output represents the models confidence that the input belongs to a specific class (e.g., digit 09 in MNIST).\n",
"\n",
"e) It means the models layers are arranged in a linear sequence: each layer feeds directly into the next, with no branching or multiple inputs/outputs.\n",
"\n",
"f) A Dense layer (also called a fully connected layer) is a layer where every neuron is connected to all the neurons in the previous layer."
]
},
{
"cell_type": "markdown",
"id": "cf344a37-1423-4295-bcc9-7effe7a6e2b1",
"metadata": {
"id": "cf344a37-1423-4295-bcc9-7effe7a6e2b1"
},
"source": [
"The model's summary() method displays all the model's layers :"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "b7d520b6-738e-413d-bf00-a47cc71c1c93",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"id": "b7d520b6-738e-413d-bf00-a47cc71c1c93",
"outputId": "42afbab3-c5a5-4f85-ee83-85b9898ebdae"
},
"outputs": [
{
"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",
"│ 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\">784</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\">300</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">235,500</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\">100</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">30,100</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_2 (<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\">10</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,010</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",
"│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m784\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;34m300\u001b[0m) │ \u001b[38;5;34m235,500\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m) │ \u001b[38;5;34m30,100\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m1,010\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\">266,610</span> (1.02 MB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m266,610\u001b[0m (1.02 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\">266,610</span> (1.02 MB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m266,610\u001b[0m (1.02 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\">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"
}
],
"source": [
"model.summary()"
]
},
{
"cell_type": "markdown",
"id": "c8dbecd7-0695-4eda-a03e-ad3cedaf24a1",
"metadata": {
"id": "c8dbecd7-0695-4eda-a03e-ad3cedaf24a1"
},
"source": [
"Q3. a) What does 235,500 correspond to ?\n",
"\n",
"b) What is a \"non trainable\" parameter ?"
]
},
{
"cell_type": "markdown",
"id": "b86437d9",
"metadata": {},
"source": [
"**Answer**: \n",
"\n",
"a) `235 000` represents the total number of parameters (weights + biais) for the first layer ($(784+1)*300=235 500$).\n",
"b) The parameter is not modified by back-propagation"
]
},
{
"cell_type": "markdown",
"id": "mSmqvW3tBvey",
"metadata": {
"id": "mSmqvW3tBvey"
},
"source": [
"Q4. Display the weights and the biases of the first hidden layer."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "Khr8wuf_DKW-",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Khr8wuf_DKW-",
"outputId": "18d2cb28-ec1b-4ba5-ffbf-a27c4a8d558f"
},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.02708957, -0.01657043, -0.02541305, ..., -0.0117284 ,\n",
" -0.07759066, -0.04104815],\n",
" [ 0.03956839, 0.03968426, 0.11159597, ..., 0.00709551,\n",
" 0.10016222, 0.00951595],\n",
" [ 0.0368086 , -0.00992455, 0.00582458, ..., -0.05939534,\n",
" 0.00859205, 0.04936637],\n",
" ...,\n",
" [ 0.0014246 , -0.04466628, 0.00846922, ..., -0.05190999,\n",
" 0.03495238, 0.05571212],\n",
" [ 0.00618674, 0.00718611, -0.04097459, ..., -0.04273593,\n",
" 0.03054574, -0.05612838],\n",
" [ 0.02281788, 0.00126068, -0.07944933, ..., 0.08006408,\n",
" -0.02017345, 0.07210501]], shape=(784, 300), dtype=float32)"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Answer for Q4.\n",
"weights, biaises = model.layers[1].get_weights()\n",
"weights"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "S__6iEM6NwHA",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "S__6iEM6NwHA",
"outputId": "e78e4fc9-64e4-497b-b944-b3e31408b614"
},
"outputs": [
{
"data": {
"text/plain": [
"array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"biaises"
]
},
{
"cell_type": "markdown",
"id": "w0aWN8LMwFS2",
"metadata": {
"id": "w0aWN8LMwFS2"
},
"source": [
"Q5.\n",
"\n",
"a) **Why don't we initialize all the weights to zero (as is done with the biases) ?**\n",
"\n",
"b) **What happens if we initialize all the weights and the biases of a layer with the same value ?**\n",
"\n",
"**Answer**: \n",
"\n",
"a) If all weights are initialized to zero, every neuron in the layer learns the same thing. Specifically:\n",
"\n",
"During forward propagation, all neurons in the same layer produce the same output.\n",
"\n",
"During backpropagation, they also receive the same gradients.\n",
"\n",
"As a result, they remain identical throughout training — this is called the symmetry problem.\n",
"\n",
"By contrast, biases can safely be initialized to zero because they are scalars per neuron and dont affect symmetry in the same way — they dont control how inputs are mixed.\n",
"\n",
"b) Same problem: no diversity in computation.\n",
"\n",
"All neurons in the layer will compute the same output (same weights + same bias).\n",
"\n",
"The network loses its capacity to learn different features, which defeats the purpose of having multiple neurons.\n",
"\n",
"The gradients with respect to each parameter are also the same → weights evolve identically, maintaining this symmetry forever.\n",
"\n",
"Thus, random initialization (usually with small values) breaks this symmetry and allows different neurons to specialize.\n",
"\n",
"----\n",
"\n",
"The initialization is usually random : the weights are sampled from a normal distribution or a uniform distribution, usually independently. In particular in the context of deep learning, the variances of these normal distributions are important to keep a relatively constant scale (in the neurons from layer to layer and in the gradients when doing the backpropagation).\n",
"\n",
"Remarks : when you create a multilayer perceptron (MLP) using Keras, each dense layer by default uses the Glorot Uniform initializer for its weight matrix and initializes the biases to zeros.\n",
"You can always override these defaults by specifying a different initializer in the layer's constructor if needed. Actually here, as we used a ReLU activation, we used the \"He\" intializer (it does not matter that much to use \"He\" or \"Gloriot\" here as the network is shallow. However, even for a shallow network, it is important for the weights not to be far too small or far too big.)\n",
"\n",
"See also :\n",
"\n",
"https://www.deeplearning.ai/ai-notes/initialization/index.html\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "b0bd0771-3463-46b8-bdef-5bcadbc07052",
"metadata": {
"id": "b0bd0771-3463-46b8-bdef-5bcadbc07052"
},
"source": [
"Now we need to \"compile the model\" : it means we will specify the loss function and the optimizer we use. Optionally, you can specify a list of extra metrics to compute during training and evaluation. "
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "3fcfe918-d745-4c66-8350-dd89e34ac93c",
"metadata": {
"id": "3fcfe918-d745-4c66-8350-dd89e34ac93c"
},
"outputs": [],
"source": [
"model.compile(\n",
" loss=\"sparse_categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]\n",
")"
]
},
{
"cell_type": "markdown",
"id": "5d06aed8-0611-461c-979c-9d14e3fe895f",
"metadata": {
"id": "5d06aed8-0611-461c-979c-9d14e3fe895f"
},
"source": [
"We used the `sparse_categorical_crossentropy` loss because we have \"sparse labels\" : for each instance, there is just a target class index : from 0 to 9. If instead we had one-hot vectors ( e.g. [0,0,1,0,0,0,0,0,0,0] to represent class 2), then we woud need to use the \"categorical_cross_entropy\" loss instead.\n",
"\n",
"Since it is a classifier, it is useful to measure its accuracy during training and evaluation, which is why we set `metrics=[\"accuracy\"]`. You can find the list of metrics proposed by keras here : https://www.tensorflow.org/api_docs/python/tf/keras/metrics\n",
"\n",
"Q6. What loss would we have chosen if we had a binary classification problem ? See : https://www.tensorflow.org/api_docs/python/tf/keras/losses\n",
"\n",
"Q7. What basic loss could we use for a regression problem ?\n"
]
},
{
"cell_type": "markdown",
"id": "813aff4b",
"metadata": {},
"source": [
"**Answer**:\n",
"\n",
"Q6) BinaryCrossentropy\n",
"\n",
"Q7) MeanSquareError or MeanAbsoluteError"
]
},
{
"cell_type": "markdown",
"id": "63c7c396-cd50-4822-bbf0-abcb0361fa01",
"metadata": {
"id": "63c7c396-cd50-4822-bbf0-abcb0361fa01"
},
"source": [
"Now the model is ready to be trained. For this we simply need to call its `fit` method :"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "e784cc36-b04c-4aca-abfc-9fc081fd726b",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "e784cc36-b04c-4aca-abfc-9fc081fd726b",
"outputId": "2b3ac988-ef08-4d0f-ece5-feb82c59c986"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 2ms/step - accuracy: 0.7850 - loss: 0.6068 - val_accuracy: 0.8392 - val_loss: 0.4062\n",
"Epoch 2/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8627 - loss: 0.3769 - val_accuracy: 0.8496 - val_loss: 0.3903\n",
"Epoch 3/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8785 - loss: 0.3303 - val_accuracy: 0.8546 - val_loss: 0.3747\n",
"Epoch 4/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8869 - loss: 0.3037 - val_accuracy: 0.8564 - val_loss: 0.3778\n",
"Epoch 5/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8955 - loss: 0.2810 - val_accuracy: 0.8696 - val_loss: 0.3513\n",
"Epoch 6/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9019 - loss: 0.2642 - val_accuracy: 0.8624 - val_loss: 0.3813\n",
"Epoch 7/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9075 - loss: 0.2505 - val_accuracy: 0.8692 - val_loss: 0.3840\n",
"Epoch 8/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9107 - loss: 0.2379 - val_accuracy: 0.8690 - val_loss: 0.3768\n",
"Epoch 9/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9154 - loss: 0.2250 - val_accuracy: 0.8708 - val_loss: 0.3813\n",
"Epoch 10/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9199 - loss: 0.2152 - val_accuracy: 0.8698 - val_loss: 0.4006\n",
"Epoch 11/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9217 - loss: 0.2051 - val_accuracy: 0.8742 - val_loss: 0.3909\n",
"Epoch 12/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9261 - loss: 0.1969 - val_accuracy: 0.8716 - val_loss: 0.4219\n",
"Epoch 13/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9292 - loss: 0.1890 - val_accuracy: 0.8752 - val_loss: 0.4213\n",
"Epoch 14/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9312 - loss: 0.1828 - val_accuracy: 0.8738 - val_loss: 0.4402\n",
"Epoch 15/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9324 - loss: 0.1763 - val_accuracy: 0.8736 - val_loss: 0.4419\n",
"Epoch 16/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 3ms/step - accuracy: 0.9362 - loss: 0.1691 - val_accuracy: 0.8732 - val_loss: 0.4577\n",
"Epoch 17/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9379 - loss: 0.1626 - val_accuracy: 0.8760 - val_loss: 0.4588\n",
"Epoch 18/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9375 - loss: 0.1652 - val_accuracy: 0.8720 - val_loss: 0.4908\n",
"Epoch 19/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9436 - loss: 0.1518 - val_accuracy: 0.8768 - val_loss: 0.5365\n",
"Epoch 20/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9417 - loss: 0.1511 - val_accuracy: 0.8756 - val_loss: 0.5036\n",
"Epoch 21/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9435 - loss: 0.1457 - val_accuracy: 0.8658 - val_loss: 0.6143\n",
"Epoch 22/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9448 - loss: 0.1445 - val_accuracy: 0.8808 - val_loss: 0.4766\n",
"Epoch 23/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9471 - loss: 0.1395 - val_accuracy: 0.8732 - val_loss: 0.5531\n",
"Epoch 24/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.9481 - loss: 0.1316 - val_accuracy: 0.8692 - val_loss: 0.5819\n",
"Epoch 25/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9482 - loss: 0.1355 - val_accuracy: 0.8780 - val_loss: 0.5516\n",
"Epoch 26/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9478 - loss: 0.1340 - val_accuracy: 0.8716 - val_loss: 0.6001\n",
"Epoch 27/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9520 - loss: 0.1270 - val_accuracy: 0.8726 - val_loss: 0.5817\n",
"Epoch 28/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9529 - loss: 0.1225 - val_accuracy: 0.8728 - val_loss: 0.6118\n",
"Epoch 29/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9530 - loss: 0.1208 - val_accuracy: 0.8742 - val_loss: 0.6002\n",
"Epoch 30/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9545 - loss: 0.1167 - val_accuracy: 0.8748 - val_loss: 0.6255\n",
"Epoch 31/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9550 - loss: 0.1166 - val_accuracy: 0.8772 - val_loss: 0.6220\n",
"Epoch 32/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 2ms/step - accuracy: 0.9566 - loss: 0.1126 - val_accuracy: 0.8652 - val_loss: 0.6661\n",
"Epoch 33/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9586 - loss: 0.1101 - val_accuracy: 0.8742 - val_loss: 0.6406\n",
"Epoch 34/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9555 - loss: 0.1156 - val_accuracy: 0.8818 - val_loss: 0.6403\n",
"Epoch 35/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9604 - loss: 0.1054 - val_accuracy: 0.8742 - val_loss: 0.6165\n",
"Epoch 36/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9610 - loss: 0.1020 - val_accuracy: 0.8746 - val_loss: 0.6116\n",
"Epoch 37/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9621 - loss: 0.0999 - val_accuracy: 0.8772 - val_loss: 0.6669\n",
"Epoch 38/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9618 - loss: 0.0983 - val_accuracy: 0.8732 - val_loss: 0.7090\n",
"Epoch 39/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9616 - loss: 0.1001 - val_accuracy: 0.8822 - val_loss: 0.6457\n",
"Epoch 40/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9631 - loss: 0.0970 - val_accuracy: 0.8748 - val_loss: 0.7724\n",
"Epoch 41/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9637 - loss: 0.0975 - val_accuracy: 0.8788 - val_loss: 0.6992\n",
"Epoch 42/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9637 - loss: 0.0961 - val_accuracy: 0.8720 - val_loss: 0.7026\n",
"Epoch 43/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9649 - loss: 0.0942 - val_accuracy: 0.8766 - val_loss: 0.7901\n",
"Epoch 44/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9660 - loss: 0.0868 - val_accuracy: 0.8822 - val_loss: 0.6867\n",
"Epoch 45/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9666 - loss: 0.0859 - val_accuracy: 0.8788 - val_loss: 0.7211\n",
"Epoch 46/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9650 - loss: 0.0945 - val_accuracy: 0.8808 - val_loss: 0.7023\n",
"Epoch 47/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9678 - loss: 0.0861 - val_accuracy: 0.8802 - val_loss: 0.7661\n",
"Epoch 48/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9673 - loss: 0.0903 - val_accuracy: 0.8754 - val_loss: 0.7853\n",
"Epoch 49/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9678 - loss: 0.0856 - val_accuracy: 0.8808 - val_loss: 0.7499\n",
"Epoch 50/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9682 - loss: 0.0821 - val_accuracy: 0.8824 - val_loss: 0.7406\n",
"Epoch 51/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9691 - loss: 0.0808 - val_accuracy: 0.8826 - val_loss: 0.7655\n",
"Epoch 52/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9710 - loss: 0.0757 - val_accuracy: 0.8822 - val_loss: 0.8760\n",
"Epoch 53/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9696 - loss: 0.0804 - val_accuracy: 0.8860 - val_loss: 0.7731\n",
"Epoch 54/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9731 - loss: 0.0747 - val_accuracy: 0.8806 - val_loss: 0.8113\n",
"Epoch 55/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9705 - loss: 0.0768 - val_accuracy: 0.8864 - val_loss: 0.8137\n",
"Epoch 56/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9703 - loss: 0.0798 - val_accuracy: 0.8814 - val_loss: 0.8953\n",
"Epoch 57/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9689 - loss: 0.0814 - val_accuracy: 0.8794 - val_loss: 0.8376\n",
"Epoch 58/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9722 - loss: 0.0756 - val_accuracy: 0.8806 - val_loss: 0.8223\n",
"Epoch 59/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9736 - loss: 0.0702 - val_accuracy: 0.8868 - val_loss: 0.8391\n",
"Epoch 60/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9720 - loss: 0.0726 - val_accuracy: 0.8838 - val_loss: 0.8715\n"
]
}
],
"source": [
"history = model.fit(X_train01, y_train, epochs=60, validation_data=(X_val01, y_val))"
]
},
{
"cell_type": "markdown",
"id": "pft_8LriRFk6",
"metadata": {
"id": "pft_8LriRFk6"
},
"source": [
"Remark : if you call the fit method again, keras continues the training where it left off.\n"
]
},
{
"cell_type": "markdown",
"id": "xkoeO0kLF3fp",
"metadata": {
"id": "xkoeO0kLF3fp"
},
"source": [
"Q8. Can you recall what is an \"epoch\" ?\n",
"\n",
"**Answer**: An epoch in training a neural network is one complete pass through the entire training dataset.\n",
"\n",
"During an epoch, the model sees every training example once and updates its weights accordingly.\n",
"\n",
"Usually, data is split into mini-batches, so multiple updates happen within a single epoch (this is mini-batch gradient descent).\n",
"\n",
"Training typically involves multiple epochs so the model can gradually improve.\n",
"\n",
"Think of an epoch as one full cycle through the training data to learn patterns and adjust weights."
]
},
{
"cell_type": "markdown",
"id": "eSKrY64nFqdj",
"metadata": {
"id": "eSKrY64nFqdj"
},
"source": [
"Q9. The `fit()` method also has the two arguments `class_weight` and `sample_weight` (not used here). When can these arguments be useful ?\n",
"\n",
"- `class_weight` is used to give more importance to underrepresented classes.\n",
"- `sample_weight` assigns weights to individual samples, useful for noisy data or time-sensitive importance."
]
},
{
"cell_type": "markdown",
"id": "a-6IJhqnMcnm",
"metadata": {
"id": "a-6IJhqnMcnm"
},
"source": [
"The `fit()` method returns a History object containing in particular a dictionary (`history.history`) containing the loss and extra metrics it measured at the end of each epoch on the training set and on the validation set (if any). Let us display the learning curves."
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "_UQsOj8JPc3q",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 470
},
"id": "_UQsOj8JPc3q",
"outputId": "8f1d6388-d46b-4891-d73f-793ccf3b9d32"
},
"outputs": [
{
"data": {
"image/png": "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GTNmJN63d+9eTJkyBTfffLMjDNu0aYPp06dj2bJluOqqq9C+fXtHsKWFbNmy4e2338bq1avx8ccf4+eff0afPn2SiMUrrrjCEYbz58/HnDlznOejhZL07dsXAwcORL9+/bBmzRqMHTvWEYPB8N9//+GVV17BBx984MyjVKlSjkDs3r2783y//vorqlSpgrZt2yYKR4pevg4UxmPGjHGem/PInj27IzC7dOmCUaNGJXke3r7++utRMDNLsniigAMHDvAd6fn22z3hnopIhhMnTngmTZrkLLM6+/Z5POefz6uox1Ovnsdz+LAnqs7RE0+YuY8eHbKpidPocxT5xNo5Onr0qGfNmjXOMhFetIwUDO0I8mLZoUMHz+233554+7333vOUKVPGEx8f79m3b5/n1KlTSbavUaOG55133km8XaFCBc+bb76ZptdtwoQJnuLFiyfevummmzzNmjXzu+3Bgwc9uXPn9owYMcLv4zNmzHA0DudsWbZsmXPfpk2bnNujRo1ybi9fvjzFefGYCxYs6Pn222+d21OnTvVky5bNs379er/bL1iwwJM9e3bP1q1bnds7duzw5MiRwzNz5szg3jM+eo3LlIgqy+fChQo+E5ENC7OzV/u6dcA55wDffgvkz4+oYsAAYOVK4NZbwz0TIYRInq5du+LLL7/E8dNB6p9++qljyaOVkpbPxx9/HBdccIHjrqbrfe3atWm2fNJlT8tm2bJlHYvgrbfe6lheaY10Wz79weflHJN7PFBy5cqF2rVrJ7lvx44duPPOOx2LJ93udKPz2O1xcl7nnHMOqlat6nefjRo1Qo0aNRxrLqF1tEKFCrjkkkuQmURVkfkFCyQ+ReTCn+6M65w+HShQwPRvZyejaIP1PllwXgiRRWEvXZ94xpA9bxDQre3xePD99987MZ2//PIL3nzzTecxurdnz56N119/3YmzzJs3r+NKPsGiy0HCuMurr74a9957rxOnWaxYMcfNzdhS7o8xntx/cqT0GKFYJjwWSzwtGX72wzhQN3S5UwS/9dZbjmhkLGiTJk0SjzO15yY9e/bE0KFD8eSTTzou9x49epzxPFlafC5aFOd8wSv7VkQir74KfPghLyQmy71OnXDPSAgh0gC/ZKPAZcPkmU6dOjkWzz///BPVqlVDvXr1nDjHBQsWOMLs2muvdbalNdAm7wTLkiVLnH2+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",
"text/plain": [
"<Figure size 800x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"\n",
"pd.DataFrame(history.history).plot(\n",
" figsize=(8, 5),\n",
" xlim=[0, 59],\n",
" ylim=[0, 1],\n",
" grid=True,\n",
" xlabel=\"Epoch\",\n",
" style=[\"r--\", \"b--\", \"r\", \"b\"],\n",
")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "L2qi9QymVrXy",
"metadata": {
"id": "L2qi9QymVrXy"
},
"source": [
"Q10. 4 values are displayed : \"accuracy\", \"loss\", \"val_accuracy\" and \"val_loss\". Can you tell precisely what each value represents ?\n",
"\n",
"**Answer**: \n",
"\n",
"- `accuracy`: Correct prediction rate on the training set.\n",
"- `loss`: Loss function value on the training set.\n",
"- `val_accuracy`: Correct prediction rate on the validation set.\n",
"- `val_loss`: Loss function value on the validation set."
]
},
{
"cell_type": "markdown",
"id": "04TFG3NsRH0N",
"metadata": {
"id": "04TFG3NsRH0N"
},
"source": [
"Q11. Comment the curves.\n",
"\n",
"Remark : if we kept increasing the number of epochs, we would end up with a training loss close to zero and a training accuracy close to 100%. More precisely, after about 150 epochs, we get the following values\n",
"- validation loss : about 1.4\n",
"- training loss : about 0.03\n",
"- validation accuracy : about 89%\n",
"- training accuracy : about 99%\n",
"\n",
"**Answer**: There is overfitting (not so grave). This is due to the large number of parameters in the neural network (aobut 260k) while the number of parameters of the dataset is smaller (about 50k)"
]
},
{
"cell_type": "markdown",
"id": "nBnufjfFXqiI",
"metadata": {
"id": "nBnufjfFXqiI"
},
"source": [
"Q12. a) Find the indices, for the first 200 rows of the validation set, where the model (that we trained for 60 epochs) gets wrong.\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "MUnWm1MfyBBk",
"metadata": {
"id": "MUnWm1MfyBBk"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m7/7\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 4ms/step \n"
]
}
],
"source": [
"probas_val_60 = model.predict(X_val01[:200])\n",
"classif_val_60 = probas_val_60.argmax(axis=1)\n",
"wrong_classif_val_60 = classif_val_60 != y_val[:200]"
]
},
{
"cell_type": "markdown",
"id": "vJ3wYKSDr2-L",
"metadata": {
"id": "vJ3wYKSDr2-L"
},
"source": [
"b) Now let us train the model for only 10 epochs and call this model `model_10`."
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "DBsp72CAqRef",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "DBsp72CAqRef",
"outputId": "ab6e22c3-19c2-4610-d028-02a4e940b209"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/10\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7866 - loss: 0.5999 - val_accuracy: 0.8326 - val_loss: 0.4162\n",
"Epoch 2/10\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8624 - loss: 0.3776 - val_accuracy: 0.8512 - val_loss: 0.3772\n",
"Epoch 3/10\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8763 - loss: 0.3341 - val_accuracy: 0.8502 - val_loss: 0.3915\n",
"Epoch 4/10\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.8875 - loss: 0.3049 - val_accuracy: 0.8592 - val_loss: 0.3675\n",
"Epoch 5/10\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8936 - loss: 0.2835 - val_accuracy: 0.8720 - val_loss: 0.3465\n",
"Epoch 6/10\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9017 - loss: 0.2663 - val_accuracy: 0.8752 - val_loss: 0.3437\n",
"Epoch 7/10\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9065 - loss: 0.2499 - val_accuracy: 0.8752 - val_loss: 0.3545\n",
"Epoch 8/10\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9102 - loss: 0.2404 - val_accuracy: 0.8810 - val_loss: 0.3369\n",
"Epoch 9/10\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9145 - loss: 0.2271 - val_accuracy: 0.8740 - val_loss: 0.3714\n",
"Epoch 10/10\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9161 - loss: 0.2195 - val_accuracy: 0.8816 - val_loss: 0.3601\n"
]
},
{
"data": {
"text/plain": [
"<keras.src.callbacks.history.History at 0x31c633350>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model_10 = tf.keras.Sequential(\n",
" [\n",
" tf.keras.layers.Input(shape=[28, 28]),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(300, activation=\"relu\", kernel_initializer=\"he_normal\"),\n",
" tf.keras.layers.Dense(100, activation=\"relu\", kernel_initializer=\"he_normal\"),\n",
" tf.keras.layers.Dense(10, activation=\"softmax\"),\n",
" ]\n",
")\n",
"\n",
"model_10.compile(\n",
" loss=\"sparse_categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]\n",
")\n",
"\n",
"model_10.fit(X_train01, y_train, epochs=10, validation_data=(X_val01, y_val))"
]
},
{
"cell_type": "markdown",
"id": "jowzB0kI6a4t",
"metadata": {
"id": "jowzB0kI6a4t"
},
"source": [
"So the accuracy on the validation set is almost the same with 10 epochs as with 60 epochs (stagnant val accuracy, and close to the training accuracy) but the validation loss is much better (and rather close to the training loss). If we want to understand better the situation, let us look at some values for the predicted probabilities."
]
},
{
"cell_type": "markdown",
"id": "ESbfJeBnsOHl",
"metadata": {
"id": "ESbfJeBnsOHl"
},
"source": [
"c) Find the indices, for the first 200 rows of the validation set, where `model_10` (that we trained for 10 epochs) gets wrong."
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "7w49W7ecsb42",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "7w49W7ecsb42",
"outputId": "2cef9214-3a2c-4631-c8f2-6275baae3fbf"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m7/7\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step \n"
]
}
],
"source": [
"probas_val_10 = model_10.predict(X_val01[:200])\n",
"classif_val_10 = probas_val_10.argmax(axis=1)\n",
"wrong_classif_val_10 = classif_val_10 != y_val[:200]\n",
"\n",
"indices = np.where(wrong_classif_val_10 * wrong_classif_val_60)[0]"
]
},
{
"cell_type": "markdown",
"id": "T3uLsznrwP-c",
"metadata": {
"id": "T3uLsznrwP-c"
},
"source": [
"d) Display the estimated probabilities of the two models for the right class and for the indices where both models gets wrong (among the first 200 rows of the validation set). (Round to 3 decimal places) \n",
" "
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "Hf7QyWqMFnUs",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Hf7QyWqMFnUs",
"outputId": "55185cf2-1517-49b2-f1a2-82cf1820dca8"
},
"outputs": [
{
"data": {
"text/plain": [
"array([0.001, 0.393, 0.343, 0. , 0. , 0.001, 0.023, 0.189, 0. ,\n",
" 0. , 0. , 0.001, 0.11 , 0.002, 0. , 0.005, 0.006, 0.021],\n",
" dtype=float32)"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"probas_val_60[indices, y_val[indices]].round(3)"
]
},
{
"cell_type": "markdown",
"id": "qrUnU77H7FAx",
"metadata": {
"id": "qrUnU77H7FAx"
},
"source": [
" We see that most of the time, in the overfitting situation (60 epochs), for an instance that the model does not classify correctly, the probability for the correct label tends to be lower : the model gets wrong for those instances and is \"overly confident while it is wrong\" (it indicates a high probability for a wrong label so the probability for the correct label gets lower making the loss increase).\n",
"\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "71vLRKp0TZeo",
"metadata": {
"id": "71vLRKp0TZeo"
},
"source": [
" An idea to prevent this overfitting is to use **Early stopping** :"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "vYe04DM5cu4r",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "vYe04DM5cu4r",
"outputId": "825bd44c-888d-4820-ca98-4fe2274b7d27"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7864 - loss: 0.5990 - val_accuracy: 0.8298 - val_loss: 0.4282\n",
"Epoch 2/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8627 - loss: 0.3785 - val_accuracy: 0.8450 - val_loss: 0.3963\n",
"Epoch 3/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8772 - loss: 0.3354 - val_accuracy: 0.8544 - val_loss: 0.3724\n",
"Epoch 4/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8889 - loss: 0.3041 - val_accuracy: 0.8632 - val_loss: 0.3656\n",
"Epoch 5/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8957 - loss: 0.2829 - val_accuracy: 0.8686 - val_loss: 0.3534\n",
"Epoch 6/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9019 - loss: 0.2651 - val_accuracy: 0.8746 - val_loss: 0.3442\n",
"Epoch 7/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9071 - loss: 0.2491 - val_accuracy: 0.8844 - val_loss: 0.3403\n",
"Epoch 8/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9088 - loss: 0.2387 - val_accuracy: 0.8840 - val_loss: 0.3357\n",
"Epoch 9/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9157 - loss: 0.2245 - val_accuracy: 0.8834 - val_loss: 0.3541\n",
"Epoch 10/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9198 - loss: 0.2157 - val_accuracy: 0.8714 - val_loss: 0.4132\n",
"Epoch 11/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9220 - loss: 0.2063 - val_accuracy: 0.8770 - val_loss: 0.4210\n",
"Epoch 12/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9256 - loss: 0.1986 - val_accuracy: 0.8768 - val_loss: 0.4228\n",
"Epoch 13/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9291 - loss: 0.1875 - val_accuracy: 0.8738 - val_loss: 0.4382\n"
]
}
],
"source": [
"early_stopping_cb = tf.keras.callbacks.EarlyStopping(\n",
" patience=5, restore_best_weights=True\n",
")\n",
"\n",
"model = tf.keras.Sequential(\n",
" [\n",
" tf.keras.layers.Input(shape=[28, 28]),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(300, activation=\"relu\", kernel_initializer=\"he_normal\"),\n",
" tf.keras.layers.Dense(100, activation=\"relu\", kernel_initializer=\"he_normal\"),\n",
" tf.keras.layers.Dense(10, activation=\"softmax\"),\n",
" ]\n",
")\n",
"\n",
"model.compile(\n",
" loss=\"sparse_categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]\n",
")\n",
"\n",
"history2 = model.fit(\n",
" X_train01,\n",
" y_train,\n",
" epochs=60,\n",
" validation_data=(X_val01, y_val),\n",
" callbacks=[early_stopping_cb],\n",
")"
]
},
{
"cell_type": "markdown",
"id": "MwTfIPcAeH6R",
"metadata": {
"id": "MwTfIPcAeH6R"
},
"source": [
"Q13. a) Explain what the previous cell does (first and last line).\n",
"\n",
" Hint : https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/EarlyStopping\n",
"\n",
"b) Can you name another way to prevent overfitting ? (mentioned in the lecture notes).\n",
"\n",
"**Answer**: \n",
"\n",
"a) *First Line*: This creates a callback to stop training early if the validation loss doesn't improve for 5 consecutive epochs (patience=5). With restore_best_weights=True, the model will roll back to the weights from the epoch with the best validation loss, preventing overfitting.\n",
"*Last Line*: This trains the model on X_train01 and y_train for up to 60 epochs. It uses the validation set (X_val01, y_val) to monitor performance. The training may stop early thanks to the early_stopping_cb, and training history is saved in history2.\n",
"\n",
"b) We can use Dropout. It randomly \"drops\" (i.e. sets to zero) a fraction of the neurons during training, which helps the model generalize better by preventing co-adaptations of neurons. Example:\n",
"\n",
"```{python}\n",
"tf.keras.layers.Dropout(rate=0.5)\n",
"```\n",
"This can be inserted between dense layers to regularize the model.\n"
]
},
{
"cell_type": "markdown",
"id": "Anus7RlTV_bL",
"metadata": {
"id": "Anus7RlTV_bL"
},
"source": [
"Remark : if you are not satisfied with the performance of your model, you should tune the hyperparameters. There are a lot of hyperparameters that you can tune : learning rate, optimizer, number of hidden layers, number of neurons, batch size etc.\n",
"If you want to fine tune the hyperparameters, you can use the Keras Tuner library : https://www.tensorflow.org/tutorials/keras/keras_tuner"
]
},
{
"cell_type": "markdown",
"id": "qZ-0xPXzcglX",
"metadata": {
"id": "qZ-0xPXzcglX"
},
"source": [
"Now let us see the performance of our model on the test set."
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "q6BXm1YJUmKK",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "q6BXm1YJUmKK",
"outputId": "6c7f3f57-fd81-4727-8422-a4480be423af"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 547us/step - accuracy: 0.8669 - loss: 55.3559\n"
]
},
{
"data": {
"text/plain": [
"[58.230831146240234, 0.864799976348877]"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.evaluate(X_test, y_test)"
]
},
{
"cell_type": "markdown",
"id": "MexBSb7NCYCP",
"metadata": {
"id": "MexBSb7NCYCP"
},
"source": [
"**Optional 1** Train a logistic regression model : this model has far fewer parameters : you should not see the same overfitting problem when increasing the number of epochs."
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "GUZldkyGyYwF",
"metadata": {
"id": "GUZldkyGyYwF"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 464us/step - accuracy: 0.7328 - loss: 0.7938 - val_accuracy: 0.8340 - val_loss: 0.4826\n",
"Epoch 2/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 430us/step - accuracy: 0.8391 - loss: 0.4794 - val_accuracy: 0.8422 - val_loss: 0.4516\n",
"Epoch 3/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 425us/step - accuracy: 0.8498 - loss: 0.4464 - val_accuracy: 0.8442 - val_loss: 0.4396\n",
"Epoch 4/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 425us/step - accuracy: 0.8539 - loss: 0.4302 - val_accuracy: 0.8468 - val_loss: 0.4333\n",
"Epoch 5/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 428us/step - accuracy: 0.8566 - loss: 0.4200 - val_accuracy: 0.8476 - val_loss: 0.4295\n",
"Epoch 6/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 427us/step - accuracy: 0.8587 - loss: 0.4128 - val_accuracy: 0.8486 - val_loss: 0.4271\n",
"Epoch 7/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 428us/step - accuracy: 0.8605 - loss: 0.4072 - val_accuracy: 0.8470 - val_loss: 0.4256\n",
"Epoch 8/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 461us/step - accuracy: 0.8622 - loss: 0.4028 - val_accuracy: 0.8486 - val_loss: 0.4246\n",
"Epoch 9/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 427us/step - accuracy: 0.8629 - loss: 0.3992 - val_accuracy: 0.8488 - val_loss: 0.4239\n",
"Epoch 10/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 427us/step - accuracy: 0.8634 - loss: 0.3960 - val_accuracy: 0.8482 - val_loss: 0.4236\n",
"Epoch 11/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 427us/step - accuracy: 0.8641 - loss: 0.3933 - val_accuracy: 0.8480 - val_loss: 0.4235\n",
"Epoch 12/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 428us/step - accuracy: 0.8648 - loss: 0.3910 - val_accuracy: 0.8476 - val_loss: 0.4235\n",
"Epoch 13/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 428us/step - accuracy: 0.8659 - loss: 0.3889 - val_accuracy: 0.8484 - val_loss: 0.4236\n",
"Epoch 14/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 423us/step - accuracy: 0.8665 - loss: 0.3870 - val_accuracy: 0.8490 - val_loss: 0.4238\n",
"Epoch 15/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 424us/step - accuracy: 0.8671 - loss: 0.3852 - val_accuracy: 0.8486 - val_loss: 0.4241\n",
"Epoch 16/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 423us/step - accuracy: 0.8677 - loss: 0.3837 - val_accuracy: 0.8486 - val_loss: 0.4244\n",
"Epoch 17/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 466us/step - accuracy: 0.8683 - loss: 0.3822 - val_accuracy: 0.8482 - val_loss: 0.4248\n",
"Epoch 18/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 439us/step - accuracy: 0.8689 - loss: 0.3809 - val_accuracy: 0.8486 - val_loss: 0.4252\n",
"Epoch 19/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 429us/step - accuracy: 0.8694 - loss: 0.3797 - val_accuracy: 0.8476 - val_loss: 0.4256\n",
"Epoch 20/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 424us/step - accuracy: 0.8698 - loss: 0.3785 - val_accuracy: 0.8472 - val_loss: 0.4260\n",
"Epoch 21/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 429us/step - accuracy: 0.8701 - loss: 0.3774 - val_accuracy: 0.8468 - val_loss: 0.4264\n",
"Epoch 22/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 426us/step - accuracy: 0.8704 - loss: 0.3764 - val_accuracy: 0.8468 - val_loss: 0.4269\n",
"Epoch 23/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 425us/step - accuracy: 0.8705 - loss: 0.3755 - val_accuracy: 0.8468 - val_loss: 0.4274\n",
"Epoch 24/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 426us/step - accuracy: 0.8705 - loss: 0.3746 - val_accuracy: 0.8470 - val_loss: 0.4278\n",
"Epoch 25/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 453us/step - accuracy: 0.8707 - loss: 0.3737 - val_accuracy: 0.8468 - val_loss: 0.4283\n",
"Epoch 26/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 448us/step - accuracy: 0.8708 - loss: 0.3729 - val_accuracy: 0.8470 - val_loss: 0.4288\n",
"Epoch 27/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 443us/step - accuracy: 0.8709 - loss: 0.3721 - val_accuracy: 0.8464 - val_loss: 0.4292\n",
"Epoch 28/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 443us/step - accuracy: 0.8709 - loss: 0.3714 - val_accuracy: 0.8464 - val_loss: 0.4297\n",
"Epoch 29/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 462us/step - accuracy: 0.8710 - loss: 0.3707 - val_accuracy: 0.8464 - val_loss: 0.4302\n",
"Epoch 30/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 453us/step - accuracy: 0.8711 - loss: 0.3700 - val_accuracy: 0.8468 - val_loss: 0.4307\n",
"Epoch 31/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 420us/step - accuracy: 0.8710 - loss: 0.3693 - val_accuracy: 0.8462 - val_loss: 0.4311\n",
"Epoch 32/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 418us/step - accuracy: 0.8714 - loss: 0.3687 - val_accuracy: 0.8458 - val_loss: 0.4316\n",
"Epoch 33/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 417us/step - accuracy: 0.8716 - loss: 0.3681 - val_accuracy: 0.8456 - val_loss: 0.4321\n",
"Epoch 34/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 420us/step - accuracy: 0.8721 - loss: 0.3675 - val_accuracy: 0.8452 - val_loss: 0.4326\n",
"Epoch 35/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 415us/step - accuracy: 0.8724 - loss: 0.3670 - val_accuracy: 0.8448 - val_loss: 0.4331\n",
"Epoch 36/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 420us/step - accuracy: 0.8726 - loss: 0.3665 - val_accuracy: 0.8450 - val_loss: 0.4335\n",
"Epoch 37/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 418us/step - accuracy: 0.8726 - loss: 0.3659 - val_accuracy: 0.8456 - val_loss: 0.4340\n",
"Epoch 38/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 418us/step - accuracy: 0.8727 - loss: 0.3654 - val_accuracy: 0.8450 - val_loss: 0.4345\n",
"Epoch 39/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 419us/step - accuracy: 0.8729 - loss: 0.3650 - val_accuracy: 0.8452 - val_loss: 0.4350\n",
"Epoch 40/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 415us/step - accuracy: 0.8731 - loss: 0.3645 - val_accuracy: 0.8448 - val_loss: 0.4354\n",
"Epoch 41/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 417us/step - accuracy: 0.8732 - loss: 0.3640 - val_accuracy: 0.8448 - val_loss: 0.4359\n",
"Epoch 42/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 417us/step - accuracy: 0.8733 - loss: 0.3636 - val_accuracy: 0.8446 - val_loss: 0.4364\n",
"Epoch 43/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 415us/step - accuracy: 0.8736 - loss: 0.3632 - val_accuracy: 0.8440 - val_loss: 0.4369\n",
"Epoch 44/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 453us/step - accuracy: 0.8738 - loss: 0.3628 - val_accuracy: 0.8434 - val_loss: 0.4373\n",
"Epoch 45/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 417us/step - accuracy: 0.8740 - loss: 0.3624 - val_accuracy: 0.8434 - val_loss: 0.4378\n",
"Epoch 46/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 418us/step - accuracy: 0.8740 - loss: 0.3620 - val_accuracy: 0.8426 - val_loss: 0.4382\n",
"Epoch 47/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 416us/step - accuracy: 0.8741 - loss: 0.3616 - val_accuracy: 0.8428 - val_loss: 0.4387\n",
"Epoch 48/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 448us/step - accuracy: 0.8743 - loss: 0.3612 - val_accuracy: 0.8428 - val_loss: 0.4392\n",
"Epoch 49/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 417us/step - accuracy: 0.8745 - loss: 0.3608 - val_accuracy: 0.8424 - val_loss: 0.4396\n",
"Epoch 50/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 418us/step - accuracy: 0.8746 - loss: 0.3605 - val_accuracy: 0.8420 - val_loss: 0.4401\n",
"Epoch 51/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 416us/step - accuracy: 0.8747 - loss: 0.3601 - val_accuracy: 0.8420 - val_loss: 0.4405\n",
"Epoch 52/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 417us/step - accuracy: 0.8747 - loss: 0.3598 - val_accuracy: 0.8422 - val_loss: 0.4410\n",
"Epoch 53/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 419us/step - accuracy: 0.8746 - loss: 0.3595 - val_accuracy: 0.8420 - val_loss: 0.4414\n",
"Epoch 54/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 414us/step - accuracy: 0.8748 - loss: 0.3592 - val_accuracy: 0.8418 - val_loss: 0.4419\n",
"Epoch 55/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 416us/step - accuracy: 0.8747 - loss: 0.3589 - val_accuracy: 0.8420 - val_loss: 0.4423\n",
"Epoch 56/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 416us/step - accuracy: 0.8748 - loss: 0.3585 - val_accuracy: 0.8422 - val_loss: 0.4428\n",
"Epoch 57/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 450us/step - accuracy: 0.8747 - loss: 0.3582 - val_accuracy: 0.8424 - val_loss: 0.4432\n",
"Epoch 58/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 416us/step - accuracy: 0.8749 - loss: 0.3580 - val_accuracy: 0.8426 - val_loss: 0.4436\n",
"Epoch 59/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 416us/step - accuracy: 0.8751 - loss: 0.3577 - val_accuracy: 0.8424 - val_loss: 0.4441\n",
"Epoch 60/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 414us/step - accuracy: 0.8752 - loss: 0.3574 - val_accuracy: 0.8422 - val_loss: 0.4445\n",
"Epoch 61/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 421us/step - accuracy: 0.8751 - loss: 0.3571 - val_accuracy: 0.8424 - val_loss: 0.4449\n",
"Epoch 62/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 419us/step - accuracy: 0.8752 - loss: 0.3568 - val_accuracy: 0.8420 - val_loss: 0.4453\n",
"Epoch 63/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 415us/step - accuracy: 0.8752 - loss: 0.3566 - val_accuracy: 0.8420 - val_loss: 0.4458\n",
"Epoch 64/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 424us/step - accuracy: 0.8754 - loss: 0.3563 - val_accuracy: 0.8418 - val_loss: 0.4462\n",
"Epoch 65/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 416us/step - accuracy: 0.8753 - loss: 0.3561 - val_accuracy: 0.8418 - val_loss: 0.4466\n",
"Epoch 66/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 508us/step - accuracy: 0.8754 - loss: 0.3558 - val_accuracy: 0.8416 - val_loss: 0.4470\n",
"Epoch 67/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 444us/step - accuracy: 0.8755 - loss: 0.3556 - val_accuracy: 0.8418 - val_loss: 0.4474\n",
"Epoch 68/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 435us/step - accuracy: 0.8755 - loss: 0.3553 - val_accuracy: 0.8416 - val_loss: 0.4478\n",
"Epoch 69/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 491us/step - accuracy: 0.8756 - loss: 0.3551 - val_accuracy: 0.8410 - val_loss: 0.4482\n",
"Epoch 70/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 435us/step - accuracy: 0.8756 - loss: 0.3549 - val_accuracy: 0.8408 - val_loss: 0.4486\n",
"Epoch 71/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 423us/step - accuracy: 0.8758 - loss: 0.3546 - val_accuracy: 0.8408 - val_loss: 0.4490\n",
"Epoch 72/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 422us/step - accuracy: 0.8758 - loss: 0.3544 - val_accuracy: 0.8408 - val_loss: 0.4494\n",
"Epoch 73/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 421us/step - accuracy: 0.8758 - loss: 0.3542 - val_accuracy: 0.8410 - val_loss: 0.4498\n",
"Epoch 74/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 421us/step - accuracy: 0.8759 - loss: 0.3540 - val_accuracy: 0.8410 - val_loss: 0.4502\n",
"Epoch 75/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 426us/step - accuracy: 0.8760 - loss: 0.3538 - val_accuracy: 0.8410 - val_loss: 0.4506\n",
"Epoch 76/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 471us/step - accuracy: 0.8760 - loss: 0.3536 - val_accuracy: 0.8410 - val_loss: 0.4510\n",
"Epoch 77/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 420us/step - accuracy: 0.8760 - loss: 0.3533 - val_accuracy: 0.8412 - val_loss: 0.4514\n",
"Epoch 78/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 421us/step - accuracy: 0.8761 - loss: 0.3531 - val_accuracy: 0.8412 - val_loss: 0.4518\n",
"Epoch 79/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 457us/step - accuracy: 0.8759 - loss: 0.3529 - val_accuracy: 0.8408 - val_loss: 0.4522\n",
"Epoch 80/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 420us/step - accuracy: 0.8761 - loss: 0.3527 - val_accuracy: 0.8406 - val_loss: 0.4526\n",
"Epoch 81/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 418us/step - accuracy: 0.8761 - loss: 0.3526 - val_accuracy: 0.8408 - val_loss: 0.4529\n",
"Epoch 82/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 418us/step - accuracy: 0.8763 - loss: 0.3524 - val_accuracy: 0.8404 - val_loss: 0.4533\n",
"Epoch 83/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 421us/step - accuracy: 0.8763 - loss: 0.3522 - val_accuracy: 0.8402 - val_loss: 0.4537\n",
"Epoch 84/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 421us/step - accuracy: 0.8763 - loss: 0.3520 - val_accuracy: 0.8400 - val_loss: 0.4541\n",
"Epoch 85/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 464us/step - accuracy: 0.8764 - loss: 0.3518 - val_accuracy: 0.8398 - val_loss: 0.4544\n",
"Epoch 86/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 421us/step - accuracy: 0.8765 - loss: 0.3516 - val_accuracy: 0.8398 - val_loss: 0.4548\n",
"Epoch 87/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 420us/step - accuracy: 0.8764 - loss: 0.3514 - val_accuracy: 0.8396 - val_loss: 0.4552\n",
"Epoch 88/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 450us/step - accuracy: 0.8764 - loss: 0.3513 - val_accuracy: 0.8394 - val_loss: 0.4555\n",
"Epoch 89/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 456us/step - accuracy: 0.8765 - loss: 0.3511 - val_accuracy: 0.8392 - val_loss: 0.4559\n",
"Epoch 90/90\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 419us/step - accuracy: 0.8765 - loss: 0.3509 - val_accuracy: 0.8390 - val_loss: 0.4563\n"
]
},
{
"data": {
"text/plain": [
"<keras.src.callbacks.history.History at 0x17fa78dd0>"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"reg_log = tf.keras.Sequential(\n",
" [\n",
" tf.keras.layers.Input(shape=[28, 28]),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(10, activation=\"softmax\"),\n",
" ]\n",
")\n",
"reg_log.compile(\n",
" loss=\"sparse_categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]\n",
")\n",
"reg_log.fit(X_train01, y_train, epochs=90, validation_data=(X_val01, y_val))"
]
},
{
"cell_type": "markdown",
"id": "GR2JJnwv3zUS",
"metadata": {
"id": "GR2JJnwv3zUS"
},
"source": [
"**Optional 2** : Train the model on the un-normalized dataset (use only 30 epochs as it takes time)."
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "zv-yV-xQyVd8",
"metadata": {
"id": "zv-yV-xQyVd8"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.6586 - loss: 7.7191 - val_accuracy: 0.7086 - val_loss: 0.7708\n",
"Epoch 2/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7257 - loss: 0.7339 - val_accuracy: 0.7668 - val_loss: 0.5891\n",
"Epoch 3/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7667 - loss: 0.6082 - val_accuracy: 0.7880 - val_loss: 0.5681\n",
"Epoch 4/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.8169 - loss: 0.5174 - val_accuracy: 0.7946 - val_loss: 0.5648\n",
"Epoch 5/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.8377 - loss: 0.4704 - val_accuracy: 0.8270 - val_loss: 0.5107\n",
"Epoch 6/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8448 - loss: 0.4490 - val_accuracy: 0.8330 - val_loss: 0.4713\n",
"Epoch 7/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8521 - loss: 0.4277 - val_accuracy: 0.8534 - val_loss: 0.4069\n",
"Epoch 8/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8628 - loss: 0.3925 - val_accuracy: 0.8542 - val_loss: 0.4263\n",
"Epoch 9/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8668 - loss: 0.3824 - val_accuracy: 0.8584 - val_loss: 0.4099\n",
"Epoch 10/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8705 - loss: 0.3706 - val_accuracy: 0.8496 - val_loss: 0.4153\n",
"Epoch 11/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8745 - loss: 0.3588 - val_accuracy: 0.8550 - val_loss: 0.4377\n",
"Epoch 12/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8766 - loss: 0.3548 - val_accuracy: 0.8652 - val_loss: 0.4027\n",
"Epoch 13/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8786 - loss: 0.3448 - val_accuracy: 0.8562 - val_loss: 0.4194\n",
"Epoch 14/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8769 - loss: 0.3622 - val_accuracy: 0.8440 - val_loss: 0.4315\n",
"Epoch 15/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8831 - loss: 0.3358 - val_accuracy: 0.8530 - val_loss: 0.4754\n",
"Epoch 16/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8853 - loss: 0.3256 - val_accuracy: 0.8578 - val_loss: 0.4148\n",
"Epoch 17/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8865 - loss: 0.3263 - val_accuracy: 0.8510 - val_loss: 0.4600\n",
"Epoch 18/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8854 - loss: 0.3193 - val_accuracy: 0.8552 - val_loss: 0.4512\n",
"Epoch 19/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8879 - loss: 0.3197 - val_accuracy: 0.8530 - val_loss: 0.4577\n",
"Epoch 20/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8876 - loss: 0.3229 - val_accuracy: 0.8572 - val_loss: 0.4659\n",
"Epoch 21/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8892 - loss: 0.3099 - val_accuracy: 0.8506 - val_loss: 0.4705\n",
"Epoch 22/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8880 - loss: 0.3213 - val_accuracy: 0.8626 - val_loss: 0.4255\n",
"Epoch 23/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8911 - loss: 0.3110 - val_accuracy: 0.8508 - val_loss: 0.4534\n",
"Epoch 24/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8951 - loss: 0.2982 - val_accuracy: 0.8580 - val_loss: 0.4383\n",
"Epoch 25/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8930 - loss: 0.3023 - val_accuracy: 0.8578 - val_loss: 0.4875\n",
"Epoch 26/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8929 - loss: 0.3012 - val_accuracy: 0.8634 - val_loss: 0.4421\n",
"Epoch 27/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8950 - loss: 0.2971 - val_accuracy: 0.8592 - val_loss: 0.4446\n",
"Epoch 28/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8946 - loss: 0.2928 - val_accuracy: 0.8622 - val_loss: 0.4505\n",
"Epoch 29/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8993 - loss: 0.2810 - val_accuracy: 0.8548 - val_loss: 0.5223\n",
"Epoch 30/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8961 - loss: 0.2942 - val_accuracy: 0.8574 - val_loss: 0.4575\n"
]
},
{
"data": {
"text/plain": [
"<keras.src.callbacks.history.History at 0x17f78e8a0>"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model_ter = tf.keras.Sequential(\n",
" [\n",
" tf.keras.layers.Input(shape=[28, 28]),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(300, activation=\"relu\", kernel_initializer=\"he_normal\"),\n",
" tf.keras.layers.Dense(100, activation=\"relu\", kernel_initializer=\"he_normal\"),\n",
" tf.keras.layers.Dense(10, activation=\"softmax\"),\n",
" ]\n",
")\n",
"model_ter.compile(\n",
" loss=\"sparse_categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]\n",
")\n",
"model_ter.fit(X_train, y_train, epochs=30, validation_data=(X_val, y_val))"
]
},
{
"cell_type": "markdown",
"id": "bsTVF2Dy6cGo",
"metadata": {
"id": "bsTVF2Dy6cGo"
},
"source": [
"**Optional 3** : Train the model on the dataset with a different normalization : divide by 25000 so that the inputs are much smaller (use only 30 epochs as it takes time). Compare with the case where you normalize by dividing by 255.0 (you can also try dividing by 2500.0, you should not see such a big difference with the case where we divide by 255.0. Remember that we have a shallow network here)."
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "1-KComPFy1wS",
"metadata": {
"id": "1-KComPFy1wS"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.6645 - loss: 0.9781 - val_accuracy: 0.8202 - val_loss: 0.4931\n",
"Epoch 2/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8294 - loss: 0.4769 - val_accuracy: 0.8336 - val_loss: 0.4414\n",
"Epoch 3/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8493 - loss: 0.4246 - val_accuracy: 0.8432 - val_loss: 0.4204\n",
"Epoch 4/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8587 - loss: 0.3927 - val_accuracy: 0.8468 - val_loss: 0.4029\n",
"Epoch 5/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8652 - loss: 0.3678 - val_accuracy: 0.8494 - val_loss: 0.3902\n",
"Epoch 6/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8718 - loss: 0.3475 - val_accuracy: 0.8546 - val_loss: 0.3777\n",
"Epoch 7/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8785 - loss: 0.3303 - val_accuracy: 0.8578 - val_loss: 0.3656\n",
"Epoch 8/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8828 - loss: 0.3153 - val_accuracy: 0.8598 - val_loss: 0.3589\n",
"Epoch 9/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8879 - loss: 0.3020 - val_accuracy: 0.8626 - val_loss: 0.3541\n",
"Epoch 10/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8918 - loss: 0.2908 - val_accuracy: 0.8648 - val_loss: 0.3486\n",
"Epoch 11/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8953 - loss: 0.2805 - val_accuracy: 0.8674 - val_loss: 0.3464\n",
"Epoch 12/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8993 - loss: 0.2703 - val_accuracy: 0.8688 - val_loss: 0.3441\n",
"Epoch 13/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9020 - loss: 0.2616 - val_accuracy: 0.8708 - val_loss: 0.3416\n",
"Epoch 14/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9050 - loss: 0.2533 - val_accuracy: 0.8732 - val_loss: 0.3379\n",
"Epoch 15/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9088 - loss: 0.2455 - val_accuracy: 0.8752 - val_loss: 0.3380\n",
"Epoch 16/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9120 - loss: 0.2377 - val_accuracy: 0.8758 - val_loss: 0.3348\n",
"Epoch 17/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9158 - loss: 0.2304 - val_accuracy: 0.8762 - val_loss: 0.3331\n",
"Epoch 18/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9181 - loss: 0.2232 - val_accuracy: 0.8756 - val_loss: 0.3341\n",
"Epoch 19/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9216 - loss: 0.2164 - val_accuracy: 0.8782 - val_loss: 0.3340\n",
"Epoch 20/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9231 - loss: 0.2097 - val_accuracy: 0.8802 - val_loss: 0.3352\n",
"Epoch 21/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9264 - loss: 0.2034 - val_accuracy: 0.8824 - val_loss: 0.3378\n",
"Epoch 22/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9279 - loss: 0.1971 - val_accuracy: 0.8824 - val_loss: 0.3412\n",
"Epoch 23/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9308 - loss: 0.1910 - val_accuracy: 0.8812 - val_loss: 0.3456\n",
"Epoch 24/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9327 - loss: 0.1850 - val_accuracy: 0.8844 - val_loss: 0.3487\n",
"Epoch 25/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9347 - loss: 0.1800 - val_accuracy: 0.8840 - val_loss: 0.3529\n",
"Epoch 26/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9370 - loss: 0.1740 - val_accuracy: 0.8836 - val_loss: 0.3559\n",
"Epoch 27/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9393 - loss: 0.1683 - val_accuracy: 0.8836 - val_loss: 0.3620\n",
"Epoch 28/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9410 - loss: 0.1630 - val_accuracy: 0.8830 - val_loss: 0.3677\n",
"Epoch 29/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9425 - loss: 0.1580 - val_accuracy: 0.8828 - val_loss: 0.3725\n",
"Epoch 30/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9439 - loss: 0.1531 - val_accuracy: 0.8850 - val_loss: 0.3794\n"
]
},
{
"data": {
"text/plain": [
"<keras.src.callbacks.history.History at 0x17f68e870>"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model_5 = tf.keras.Sequential(\n",
" [\n",
" tf.keras.layers.Input(shape=[28, 28]),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(300, activation=\"relu\", kernel_initializer=\"he_normal\"),\n",
" tf.keras.layers.Dense(100, activation=\"relu\", kernel_initializer=\"he_normal\"),\n",
" tf.keras.layers.Dense(10, activation=\"softmax\"),\n",
" ]\n",
")\n",
"model_5.compile(\n",
" loss=\"sparse_categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]\n",
")\n",
"\n",
"X_train_far_too_small, X_val_far_too_small = X_train / 25500.0, X_val / 25500.0\n",
"\n",
"model_5.fit(\n",
" X_train_far_too_small,\n",
" y_train,\n",
" epochs=30,\n",
" validation_data=(X_val_far_too_small, y_val),\n",
")"
]
},
{
"cell_type": "markdown",
"id": "kH6PsYnL9Tmz",
"metadata": {
"id": "kH6PsYnL9Tmz"
},
"source": [
"**Optional 4** : try using the sigmoid activation for the hidden layers instead of the ReLU. First train the model on normalized data then on un-normalized data."
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "dShxjtDny8HD",
"metadata": {
"id": "dShxjtDny8HD"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7407 - loss: 0.7888 - val_accuracy: 0.8360 - val_loss: 0.4605\n",
"Epoch 2/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8553 - loss: 0.3999 - val_accuracy: 0.8386 - val_loss: 0.4300\n",
"Epoch 3/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8715 - loss: 0.3539 - val_accuracy: 0.8498 - val_loss: 0.4042\n",
"Epoch 4/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8813 - loss: 0.3239 - val_accuracy: 0.8580 - val_loss: 0.3892\n",
"Epoch 5/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8894 - loss: 0.3013 - val_accuracy: 0.8626 - val_loss: 0.3787\n",
"Epoch 6/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8959 - loss: 0.2828 - val_accuracy: 0.8678 - val_loss: 0.3787\n",
"Epoch 7/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9021 - loss: 0.2669 - val_accuracy: 0.8678 - val_loss: 0.3790\n",
"Epoch 8/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9069 - loss: 0.2533 - val_accuracy: 0.8710 - val_loss: 0.3780\n",
"Epoch 9/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9120 - loss: 0.2399 - val_accuracy: 0.8704 - val_loss: 0.3782\n",
"Epoch 10/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9176 - loss: 0.2273 - val_accuracy: 0.8710 - val_loss: 0.3808\n",
"Epoch 11/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9214 - loss: 0.2158 - val_accuracy: 0.8726 - val_loss: 0.3805\n",
"Epoch 12/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9257 - loss: 0.2049 - val_accuracy: 0.8694 - val_loss: 0.3859\n",
"Epoch 13/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9304 - loss: 0.1945 - val_accuracy: 0.8720 - val_loss: 0.3934\n",
"Epoch 14/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9336 - loss: 0.1846 - val_accuracy: 0.8716 - val_loss: 0.4023\n",
"Epoch 15/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9372 - loss: 0.1754 - val_accuracy: 0.8676 - val_loss: 0.4147\n",
"Epoch 16/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9404 - loss: 0.1666 - val_accuracy: 0.8676 - val_loss: 0.4186\n",
"Epoch 17/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9441 - loss: 0.1582 - val_accuracy: 0.8696 - val_loss: 0.4338\n",
"Epoch 18/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9460 - loss: 0.1509 - val_accuracy: 0.8670 - val_loss: 0.4443\n",
"Epoch 19/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9500 - loss: 0.1429 - val_accuracy: 0.8706 - val_loss: 0.4454\n",
"Epoch 20/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9526 - loss: 0.1362 - val_accuracy: 0.8686 - val_loss: 0.4618\n",
"Epoch 21/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9554 - loss: 0.1292 - val_accuracy: 0.8656 - val_loss: 0.4863\n",
"Epoch 22/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9577 - loss: 0.1220 - val_accuracy: 0.8662 - val_loss: 0.4932\n",
"Epoch 23/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 2ms/step - accuracy: 0.9597 - loss: 0.1170 - val_accuracy: 0.8658 - val_loss: 0.5143\n",
"Epoch 24/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9599 - loss: 0.1135 - val_accuracy: 0.8648 - val_loss: 0.5415\n",
"Epoch 25/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9629 - loss: 0.1068 - val_accuracy: 0.8620 - val_loss: 0.5629\n",
"Epoch 26/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9644 - loss: 0.1021 - val_accuracy: 0.8590 - val_loss: 0.6076\n",
"Epoch 27/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9667 - loss: 0.0971 - val_accuracy: 0.8640 - val_loss: 0.6027\n",
"Epoch 28/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9673 - loss: 0.0953 - val_accuracy: 0.8594 - val_loss: 0.6309\n",
"Epoch 29/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9688 - loss: 0.0910 - val_accuracy: 0.8630 - val_loss: 0.6526\n",
"Epoch 30/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9710 - loss: 0.0864 - val_accuracy: 0.8640 - val_loss: 0.6396\n"
]
},
{
"data": {
"text/plain": [
"<keras.src.callbacks.history.History at 0x31e048dd0>"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# sigmoid activation, normalized data (scale : [0,1])\n",
"model_sig_norm = tf.keras.Sequential(\n",
" [\n",
" tf.keras.layers.Input(shape=[28, 28]),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(\n",
" 300, activation=\"sigmoid\", kernel_initializer=\"he_normal\"\n",
" ),\n",
" tf.keras.layers.Dense(\n",
" 100, activation=\"sigmoid\", kernel_initializer=\"he_normal\"\n",
" ),\n",
" tf.keras.layers.Dense(10, activation=\"softmax\"),\n",
" ]\n",
")\n",
"model_sig_norm.compile(\n",
" loss=\"sparse_categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]\n",
")\n",
"model_sig_norm.fit(X_train01, y_train, epochs=30, validation_data=(X_val, y_val))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "1O32YLVuy8k3",
"metadata": {
"id": "1O32YLVuy8k3"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.6551 - loss: 1.0137 - val_accuracy: 0.6920 - val_loss: 0.7548\n",
"Epoch 2/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7053 - loss: 0.7489 - val_accuracy: 0.7290 - val_loss: 0.7050\n",
"Epoch 3/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7162 - loss: 0.7261 - val_accuracy: 0.7220 - val_loss: 0.7043\n",
"Epoch 4/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7244 - loss: 0.6950 - val_accuracy: 0.7410 - val_loss: 0.6906\n",
"Epoch 5/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7329 - loss: 0.6854 - val_accuracy: 0.7522 - val_loss: 0.6677\n",
"Epoch 6/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7434 - loss: 0.6751 - val_accuracy: 0.7538 - val_loss: 0.6704\n",
"Epoch 7/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7419 - loss: 0.6836 - val_accuracy: 0.7470 - val_loss: 0.6619\n",
"Epoch 8/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7357 - loss: 0.6719 - val_accuracy: 0.7456 - val_loss: 0.6474\n",
"Epoch 9/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7386 - loss: 0.6690 - val_accuracy: 0.7386 - val_loss: 0.6632\n",
"Epoch 10/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7397 - loss: 0.6665 - val_accuracy: 0.7442 - val_loss: 0.6630\n",
"Epoch 11/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7473 - loss: 0.6595 - val_accuracy: 0.7466 - val_loss: 0.6551\n",
"Epoch 12/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7376 - loss: 0.6605 - val_accuracy: 0.7662 - val_loss: 0.6222\n",
"Epoch 13/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7563 - loss: 0.6315 - val_accuracy: 0.7732 - val_loss: 0.5941\n",
"Epoch 14/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7706 - loss: 0.6042 - val_accuracy: 0.7624 - val_loss: 0.6283\n",
"Epoch 15/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7615 - loss: 0.6226 - val_accuracy: 0.7598 - val_loss: 0.6130\n",
"Epoch 16/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7657 - loss: 0.6080 - val_accuracy: 0.7798 - val_loss: 0.5883\n",
"Epoch 17/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7628 - loss: 0.6154 - val_accuracy: 0.7702 - val_loss: 0.6045\n",
"Epoch 18/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7724 - loss: 0.5999 - val_accuracy: 0.7810 - val_loss: 0.5828\n",
"Epoch 19/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7839 - loss: 0.5758 - val_accuracy: 0.7930 - val_loss: 0.5618\n",
"Epoch 20/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7901 - loss: 0.5718 - val_accuracy: 0.7860 - val_loss: 0.5895\n",
"Epoch 21/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7845 - loss: 0.5713 - val_accuracy: 0.7808 - val_loss: 0.5898\n",
"Epoch 22/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7779 - loss: 0.5845 - val_accuracy: 0.7874 - val_loss: 0.5695\n",
"Epoch 23/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7872 - loss: 0.5686 - val_accuracy: 0.7676 - val_loss: 0.5934\n",
"Epoch 24/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7815 - loss: 0.5739 - val_accuracy: 0.7920 - val_loss: 0.5528\n",
"Epoch 25/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7892 - loss: 0.5618 - val_accuracy: 0.7928 - val_loss: 0.5675\n",
"Epoch 26/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7882 - loss: 0.5590 - val_accuracy: 0.7988 - val_loss: 0.5464\n",
"Epoch 27/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7866 - loss: 0.5598 - val_accuracy: 0.7764 - val_loss: 0.5784\n",
"Epoch 28/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7838 - loss: 0.5673 - val_accuracy: 0.7848 - val_loss: 0.5651\n",
"Epoch 29/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7886 - loss: 0.5563 - val_accuracy: 0.8008 - val_loss: 0.5436\n",
"Epoch 30/30\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7971 - loss: 0.5387 - val_accuracy: 0.8010 - val_loss: 0.5349\n"
]
},
{
"data": {
"text/plain": [
"<keras.src.callbacks.history.History at 0x361d65190>"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model_sig_un_norm = tf.keras.Sequential(\n",
" [\n",
" tf.keras.layers.Input(shape=[28, 28]),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(\n",
" 300, activation=\"sigmoid\", kernel_initializer=\"he_normal\"\n",
" ),\n",
" tf.keras.layers.Dense(\n",
" 100, activation=\"sigmoid\", kernel_initializer=\"he_normal\"\n",
" ),\n",
" tf.keras.layers.Dense(10, activation=\"softmax\"),\n",
" ]\n",
")\n",
"model_sig_un_norm.compile(\n",
" loss=\"sparse_categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]\n",
")\n",
"model_sig_un_norm.fit(X_train, y_train, epochs=30, validation_data=(X_val, y_val))"
]
},
{
"cell_type": "markdown",
"id": "z9Tmg3PRUXCe",
"metadata": {
"id": "z9Tmg3PRUXCe"
},
"source": [
"**Optional 5** Use the ReLU again and try initializing the weights with normally distributed and independent weigths but with a high variance."
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "p5nkk6t8zIzz",
"metadata": {
"id": "p5nkk6t8zIzz"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.6039 - loss: 86.8092 - val_accuracy: 0.7452 - val_loss: 19.3635\n",
"Epoch 2/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7728 - loss: 14.7505 - val_accuracy: 0.7648 - val_loss: 8.7317\n",
"Epoch 3/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7867 - loss: 6.8569 - val_accuracy: 0.7916 - val_loss: 3.7573\n",
"Epoch 4/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7893 - loss: 3.0035 - val_accuracy: 0.7756 - val_loss: 1.6859\n",
"Epoch 5/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7805 - loss: 1.3666 - val_accuracy: 0.7798 - val_loss: 1.0656\n",
"Epoch 6/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7814 - loss: 0.9145 - val_accuracy: 0.7768 - val_loss: 0.9132\n",
"Epoch 7/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7917 - loss: 0.7225 - val_accuracy: 0.7832 - val_loss: 0.8141\n",
"Epoch 8/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7993 - loss: 0.6555 - val_accuracy: 0.7934 - val_loss: 0.7410\n",
"Epoch 9/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8125 - loss: 0.5778 - val_accuracy: 0.7986 - val_loss: 0.6734\n",
"Epoch 10/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8231 - loss: 0.5296 - val_accuracy: 0.8092 - val_loss: 0.6434\n",
"Epoch 11/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8347 - loss: 0.4960 - val_accuracy: 0.8220 - val_loss: 0.6397\n",
"Epoch 12/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8415 - loss: 0.4696 - val_accuracy: 0.8220 - val_loss: 0.6570\n",
"Epoch 13/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8482 - loss: 0.4438 - val_accuracy: 0.8270 - val_loss: 0.6685\n",
"Epoch 14/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8525 - loss: 0.4270 - val_accuracy: 0.8238 - val_loss: 0.6539\n",
"Epoch 15/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8581 - loss: 0.4113 - val_accuracy: 0.8290 - val_loss: 0.6831\n",
"Epoch 16/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8640 - loss: 0.3913 - val_accuracy: 0.8298 - val_loss: 0.7134\n",
"Epoch 17/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8691 - loss: 0.3778 - val_accuracy: 0.8262 - val_loss: 0.7223\n",
"Epoch 18/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8705 - loss: 0.3728 - val_accuracy: 0.8280 - val_loss: 0.7357\n",
"Epoch 19/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8743 - loss: 0.3598 - val_accuracy: 0.8288 - val_loss: 0.7622\n",
"Epoch 20/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8787 - loss: 0.3488 - val_accuracy: 0.8250 - val_loss: 0.7780\n",
"Epoch 21/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8801 - loss: 0.3455 - val_accuracy: 0.8354 - val_loss: 0.7774\n",
"Epoch 22/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8834 - loss: 0.3304 - val_accuracy: 0.8282 - val_loss: 0.7972\n",
"Epoch 23/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8846 - loss: 0.3250 - val_accuracy: 0.8316 - val_loss: 0.8399\n",
"Epoch 24/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8864 - loss: 0.3191 - val_accuracy: 0.8364 - val_loss: 0.8428\n",
"Epoch 25/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8881 - loss: 0.3186 - val_accuracy: 0.8266 - val_loss: 0.9485\n",
"Epoch 26/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8901 - loss: 0.3106 - val_accuracy: 0.8376 - val_loss: 0.9145\n",
"Epoch 27/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8923 - loss: 0.3062 - val_accuracy: 0.8310 - val_loss: 0.9605\n",
"Epoch 28/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8931 - loss: 0.3016 - val_accuracy: 0.8420 - val_loss: 0.9259\n",
"Epoch 29/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8948 - loss: 0.2966 - val_accuracy: 0.8424 - val_loss: 0.9897\n",
"Epoch 30/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8977 - loss: 0.2851 - val_accuracy: 0.8406 - val_loss: 1.0251\n",
"Epoch 31/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8985 - loss: 0.2840 - val_accuracy: 0.8340 - val_loss: 1.0227\n",
"Epoch 32/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.8979 - loss: 0.2931 - val_accuracy: 0.8336 - val_loss: 1.0029\n",
"Epoch 33/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9007 - loss: 0.2807 - val_accuracy: 0.8366 - val_loss: 1.0235\n",
"Epoch 34/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9013 - loss: 0.2741 - val_accuracy: 0.8410 - val_loss: 0.9453\n",
"Epoch 35/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9049 - loss: 0.2732 - val_accuracy: 0.8376 - val_loss: 1.0164\n",
"Epoch 36/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9045 - loss: 0.2665 - val_accuracy: 0.8408 - val_loss: 1.0273\n",
"Epoch 37/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9060 - loss: 0.2627 - val_accuracy: 0.8380 - val_loss: 1.0743\n",
"Epoch 38/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9054 - loss: 0.2668 - val_accuracy: 0.8386 - val_loss: 1.0879\n",
"Epoch 39/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9070 - loss: 0.2561 - val_accuracy: 0.8424 - val_loss: 1.0748\n",
"Epoch 40/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9097 - loss: 0.2540 - val_accuracy: 0.8308 - val_loss: 1.1934\n",
"Epoch 41/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9112 - loss: 0.2570 - val_accuracy: 0.8412 - val_loss: 1.0743\n",
"Epoch 42/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9100 - loss: 0.2514 - val_accuracy: 0.8400 - val_loss: 1.1461\n",
"Epoch 43/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9093 - loss: 0.2524 - val_accuracy: 0.8370 - val_loss: 1.1910\n",
"Epoch 44/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9118 - loss: 0.2487 - val_accuracy: 0.8394 - val_loss: 1.1850\n",
"Epoch 45/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9132 - loss: 0.2391 - val_accuracy: 0.8398 - val_loss: 1.2205\n",
"Epoch 46/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9142 - loss: 0.2433 - val_accuracy: 0.8356 - val_loss: 1.3211\n",
"Epoch 47/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9157 - loss: 0.2344 - val_accuracy: 0.8372 - val_loss: 1.2488\n",
"Epoch 48/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9160 - loss: 0.2348 - val_accuracy: 0.8420 - val_loss: 1.2971\n",
"Epoch 49/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9162 - loss: 0.2360 - val_accuracy: 0.8468 - val_loss: 1.2902\n",
"Epoch 50/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9179 - loss: 0.2328 - val_accuracy: 0.8336 - val_loss: 1.2355\n",
"Epoch 51/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9202 - loss: 0.2245 - val_accuracy: 0.8302 - val_loss: 1.4387\n",
"Epoch 52/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9182 - loss: 0.2329 - val_accuracy: 0.8346 - val_loss: 1.3602\n",
"Epoch 53/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9196 - loss: 0.2244 - val_accuracy: 0.8370 - val_loss: 1.2779\n",
"Epoch 54/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9206 - loss: 0.2242 - val_accuracy: 0.8444 - val_loss: 1.3331\n",
"Epoch 55/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9234 - loss: 0.2143 - val_accuracy: 0.8542 - val_loss: 1.2873\n",
"Epoch 56/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9205 - loss: 0.2204 - val_accuracy: 0.8406 - val_loss: 1.3728\n",
"Epoch 57/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9207 - loss: 0.2259 - val_accuracy: 0.8414 - val_loss: 1.3721\n",
"Epoch 58/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9237 - loss: 0.2151 - val_accuracy: 0.8474 - val_loss: 1.3719\n",
"Epoch 59/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9228 - loss: 0.2189 - val_accuracy: 0.8414 - val_loss: 1.3527\n",
"Epoch 60/60\n",
"\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9254 - loss: 0.2101 - val_accuracy: 0.8394 - val_loss: 1.4407\n"
]
},
{
"data": {
"text/plain": [
"<keras.src.callbacks.history.History at 0x36270fad0>"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model_high_variance = tf.keras.Sequential(\n",
" [\n",
" tf.keras.layers.Input(shape=[28, 28]),\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(300, activation=\"relu\"),\n",
" tf.keras.layers.Dense(100, activation=\"relu\"),\n",
" tf.keras.layers.Dense(10, activation=\"softmax\"),\n",
" ]\n",
")\n",
"model_high_variance.layers[1].set_weights(\n",
" [200 * np.random.randn(28 * 28, 300) / 100, np.zeros(300)]\n",
")\n",
"model_high_variance.layers[2].set_weights(\n",
" [200 * np.random.randn(300, 100) / 100, np.zeros(100)]\n",
")\n",
"\n",
"model_high_variance.compile(\n",
" loss=\"sparse_categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]\n",
")\n",
"\n",
"model_high_variance.fit(X_train01, y_train, epochs=60, validation_data=(X_val01, y_val))"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"gpuType": "T4",
"provenance": []
},
"kernelspec": {
"display_name": "studies",
"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.13.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}