{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# CS-109B Introduction to Data Science\n",
"## Lab 6: Convolutional Neural Networks 2\n",
"\n",
"**Harvard University** \n",
"**Spring 2020** \n",
"**Instructors:** Mark Glickman, Pavlos Protopapas, and Chris Tanner \n",
"**Lab Instructors:** Chris Tanner and Eleni Angelaki Kaxiras \n",
"**Content:** Eleni Angelaki Kaxiras, Cedric Flamant, Pavlos Protopapas\n",
"\n",
"---"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n"
],
"text/plain": [
""
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# RUN THIS CELL TO PROPERLY HIGHLIGHT THE EXERCISES\n",
"import requests\n",
"from IPython.core.display import HTML\n",
"styles = requests.get(\"https://raw.githubusercontent.com/Harvard-IACS/2019-CS109B/master/content/styles/cs109.css\").text\n",
"HTML(styles)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Learning Goals\n",
"\n",
"In this lab we will continue with Convolutional Neural Networks (CNNs), will look into the `tf.data` interface which enables us to build complex input pipelines for our data. We will also touch upon visualization techniques to peak into our CNN's hidden layers.\n",
"\n",
"By the end of this lab, you should be able to:\n",
"\n",
"- know how a CNN works from start to finish\n",
"- use `tf.data.Dataset` to import and, if needed, transform, your data for feeding into the network. Transformations might include normalization, scaling, tilting, resizing, or applying other data augmentation techniques.\n",
"- understand how `saliency maps` are implemented with code."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" \n",
"\n",
"## Table of Contents\n",
"\n",
"1. **Part 1**: [Beginning-to-end Convolutional Neural Networks](#part1).\n",
"2. **Part 2**: [Image Pipelines with `tf.data.Dataset`](#part2). \n",
"3. **Part 3**: [Hidden Layer Visualization, Saliency Maps](#part3)."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from scipy.optimize import minimize\n",
"from sklearn.utils import shuffle\n",
"\n",
"import matplotlib.pyplot as plt\n",
"plt.rcParams[\"figure.figsize\"] = (5,5)\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import tensorflow as tf\n",
"from tensorflow import keras\n",
"from tensorflow.keras.models import Sequential, Model\n",
"from tensorflow.keras.layers import Dense, Conv2D, Conv1D, MaxPooling2D, MaxPooling1D,\\\n",
" Dropout, Flatten, Activation, Input\n",
"from tensorflow.keras.optimizers import Adam, SGD, RMSprop\n",
"from tensorflow.keras.utils import to_categorical\n",
"from tensorflow.keras.metrics import AUC, Precision, Recall, FalsePositives, \\\n",
" FalseNegatives, TruePositives, TrueNegatives\n",
"from tensorflow.keras.preprocessing import image\n",
"from tensorflow.keras.regularizers import l2"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.1.0\n",
"0 GPUs\n"
]
}
],
"source": [
"from __future__ import absolute_import, division, print_function, unicode_literals\n",
"tf.keras.backend.clear_session() # For easy reset of notebook state.\n",
"print(tf.__version__) # You should see a > 2.0.0 here!\n",
"from tf_keras_vis.utils import print_gpus\n",
"print_gpus()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"## Additional Packages required if you don't already have them\n",
"# While in your conda environment,\n",
"\n",
"# imageio\n",
"# Install using \"conda install imageio\"\n",
"# pillow\n",
"# Install using \"conda install pillow\"\n",
"# tensorflow-datasets\n",
"# Install using \"conda install tensorflow-datasets\"\n",
"# tf-keras-vis\n",
"# Install using \"pip install tf-keras-vis\"\n",
"# tensorflow-addons\n",
"# Install using \"pip install tensorflow-addons\""
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"from tf_keras_vis.saliency import Saliency\n",
"from tf_keras_vis.utils import normalize\n",
"import tf_keras_vis.utils as utils\n",
"from matplotlib import cm\n",
"from tf_keras_vis.gradcam import Gradcam"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"np.random.seed(109)\n",
"tf.random.set_seed(109)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part 0: Running on SEAS JupyterHub\n",
"\n",
"**PLEASE READ**: [Instructions for Using SEAS JupyterHub](https://canvas.harvard.edu/courses/65462/pages/instructions-for-using-seas-jupyterhub?module_item_id=638544)\n",
"\n",
"SEAS and FAS are providing you with a platform in AWS to use for the class (accessible from the 'Jupyter' menu link in Canvas). These are AWS p2 instances with a GPU, 10GB of disk space, and 61 GB of RAM, for faster training for your networks. Most of the libraries such as keras, tensorflow, pandas, etc. are pre-installed. If a library is missing you may install it via the Terminal.\n",
"\n",
"**NOTE: The AWS platform is funded by SEAS and FAS for the purposes of the class. It is FREE for you - not running against your personal AWS credit. For this reason you are only allowed to use it for purposes related to this course, and with prudence.**\n",
"\n",
"**Help us keep this service: Make sure you stop your instance as soon as you do not need it. Your instance will terminate after 30 min of inactivity.**\n",
"\n",
"\n",
"*source: CS231n Stanford, Google Cloud Tutorial*"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"## Part 1: Beginning-to-end Convolutional Neural Networks\n",
"\n",
"\n",
"\n",
"*image [source](http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/)*\n",
"
\n",
"We will go through the various steps of training a CNN, including:\n",
"- difference between cross-validation and validation\n",
"- specifying a loss, metrics, and an optimizer,\n",
"- performing validation,\n",
"- using callbacks, specifically `EarlyStopping`, which stops the training when training is no longer improving the validation metrics,\n",
"- learning rate significance\n",
"
\n",
"
Table Exercise: Use the whiteboard next to your table to draw a CNN from start to finish as per the instructions. We will then draw it together in class.
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" [Back to Table of Contents](#top)\n",
"\n",
"## Part 2: Image Preprocessing: Using `tf.data.Dataset`"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"import tensorflow_addons as tfa\n",
"import tensorflow_datasets as tfds"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" `tf.data` API in `tensorflow` enables you to build complex **input pipelines** from simple, reusable pieces. For example, the pipeline for an image model might aggregate data from files in a distributed file system, apply random perturbations to each image, and merge randomly selected images into a batch for training. \n",
"\n",
"The pipeline for a text model might involve extracting symbols from raw text data, converting them to embedding identifiers with a lookup table, and batching together sequences of different lengths. The `tf.data API` makes it possible to handle large amounts of data, read from different data formats, and perform complex transformations.\n",
"\n",
"The `tf.data API` introduces a `tf.data.Dataset` that represents a sequence of **elements**, consistινγ of one or more **components**. For example, in an image pipeline, an element might be a single training example, with a pair of tensor components representing the image and its label.\n",
"\n",
"To create an input pipeline, you must start with a data **source**. For example, to construct a Dataset from data in memory, you can use `tf.data.Dataset.from_tensors()` or `tf.data.Dataset.from_tensor_slices()`. Alternatively, if your input data is stored in a file in the recommended TFRecord format, you can use `tf.data.TFRecordDataset()`.\n",
"\n",
"The Dataset object is a Python iterable. You may view its elements using a for loop:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[4 3 1 9 7 4 8 9 4 6]\n",
"[9 6 2 2 6 4 7 2 9 8]\n",
"[5 7 5 4 8 5 6 4 8 4]\n",
"[6 2 2 2 6 6 4 2 2 2]\n"
]
}
],
"source": [
"dataset = tf.data.Dataset.from_tensor_slices(tf.random.uniform([4, 10], minval=1, maxval=10, dtype=tf.int32))\n",
"\n",
"for elem in dataset:\n",
" print(elem.numpy())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once you have a Dataset object, you can **transform** it into a new Dataset by chaining method calls on the `tf.data.Dataset` object. For example, you can apply per-element transformations such as `Dataset.map()`, and multi-element transformations such as `Dataset.batch()`. See the [documentation](https://www.tensorflow.org/api_docs/python/tf/data/Dataset) for `tf.data.Dataset` for a complete list of transformations.\n",
"\n",
"The `map` function takes a function and returns a new and augmented dataset. "
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 8 6 2 18 14 8 16 18 8 12]\n",
"[18 12 4 4 12 8 14 4 18 16]\n",
"[10 14 10 8 16 10 12 8 16 8]\n",
"[12 4 4 4 12 12 8 4 4 4]\n"
]
}
],
"source": [
"dataset = dataset.map(lambda x: x*2) \n",
"for elem in dataset:\n",
" print(elem.numpy())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Datasets are powerful objects because they are effectively dictionaries that can store tensors and other data such as the response variable. We can also construct them by passing small sized `numpy` arrays, such as in the following example.\n",
"\n",
"Tensorflow has a plethora of them:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"# uncomment to see available datasets\n",
"#tfds.list_builders()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### `mnist` dataset"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((60000, 28, 28), (60000,))"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# load mnist\n",
"(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()\n",
"x_train.shape, y_train.shape"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"# take only 10 images for simplicity\n",
"train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))\n",
"test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(28, 28)\n",
"(28, 28)\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# In case you want to retrieve the images/numpy arrays\n",
"for element in iter(train_dataset.take(1)):\n",
" image = element[0].numpy()\n",
" print(image.shape)\n",
" print(image.shape)\n",
" plt.figure()\n",
" plt.imshow(image, cmap='gray')\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once you have your Model, you may pass a Dataset instance directly to the methods `fit()`, `evaluate()`, and `predict()`. The difference with the way we have been previously using these methods is that we are not passing the images and labels separately. They are now both in the Dataset object.\n",
"\n",
"```\n",
"model.fit(train_dataset, epochs=3)\n",
"\n",
"model.evaluate(test_dataset)\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Data Augmentation"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(1,6, figsize=(10,3))\n",
"for i, (image, label) in enumerate(train_dataset.take(4)):\n",
" axes[i].imshow(image)\n",
" axes[i].set_title(f'{label:.2f}')\n",
"image_flip_up = tf.image.flip_up_down(np.expand_dims(image, axis=2)).numpy()\n",
"image_rot_90 = tf.image.rot90(np.expand_dims(image, axis=2), k=1).numpy()\n",
"axes[4].imshow(image_flip_up.reshape(28,-1))\n",
"axes[4].set_title(f'{label:.2f}-flip')\n",
"axes[5].imshow(image_rot_90.reshape(28,-1))\n",
"axes[5].set_title(f'{label:.2f}-rot90')\n",
"plt.show();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Note:\n",
"\n",
"The tf.data API is a set of utilities in TensorFlow 2.0 for loading and preprocessing data in a way that's fast and scalable. You also have the option to use the `keras` [`ImageDataGenerator`](https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator), that accepts `numpy` arrays, instead of the Dataset. We think it's good for you to learn to use Datasets.\n",
"\n",
"As a general rule, for input to NNs, Tensorflow recommends that you use `numpy` arrays if your data is small and fit in memory, and `tf.data.Datasets` otherwise.\n",
"\n",
"#### References:\n",
"1. `tf.data.Dataset` [Documentation](https://www.tensorflow.org/api_docs/python/tf/data/Dataset).\n",
"2. Import [`numpy` arrays in Tensorflow](https://www.tensorflow.org/tutorials/load_data/numpy)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### The Street View House Numbers (SVHN) Dataset\n",
"\n",
"We will play with the SVHN real-world image dataset. It can be seen as similar in flavor to MNIST (e.g., the images are of small cropped digits), but incorporates an order of magnitude more labeled data (over 600,000 digit images) and comes from a significantly harder, unsolved, real world problem (recognizing digits and numbers in natural scene images). SVHN is obtained from house numbers in Google Street View images. \n",
"\n",
"All digits have been resized to a fixed resolution of 32-by-32 pixels. The original character bounding boxes are extended in the appropriate dimension to become square windows, so that resizing them to 32-by-32 pixels does not introduce aspect ratio distortions. Nevertheless this preprocessing introduces some distracting digits to the sides of the digit of interest. Loading the .mat files creates 2 variables: X which is a 4-D matrix containing the images, and y which is a vector of class labels. To access the images, $X(:,:,:,i)$ gives the i-th 32-by-32 RGB image, with class label $y(i)$.\n",
"\n",
"\n",
"\n",
"*Yuval Netzer, Tao Wang, Adam Coates, Alessandro Bissacco, Bo Wu, Andrew Y. Ng Reading Digits in Natural Images with Unsupervised Feature Learning NIPS Workshop on Deep Learning and Unsupervised Feature Learning 2011.*"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"# Will take some time but will only load once\n",
"train_svhn_cropped, test_svhn_cropped = tfds.load('svhn_cropped', split=['train', 'test'], shuffle_files=False)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"isinstance(train_svhn_cropped, tf.data.Dataset)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((32, 32, 3), ())"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# # convert to numpy if needed\n",
"features = next(iter(train_svhn_cropped))\n",
"images = features['image'].numpy()\n",
"labels = features['label'].numpy()\n",
"images.shape, labels.shape"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"tf.Tensor(5, shape=(), dtype=int64)\n"
]
}
],
"source": [
"for i, element in enumerate(train_svhn_cropped):\n",
" if i==1: break;\n",
" image = element['image'] \n",
" label = element['label']\n",
" print(label)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# batch_size indicates that the dataset should be divided in batches \n",
"# each consisting of 4 elements (a.k.a images and their labels)\n",
"# take_size chooses a number of these batches, e.g. 3 of them for display\n",
"\n",
"batch_size = 4\n",
"take_size = 3\n",
"\n",
"# Plot\n",
"fig, axes = plt.subplots(take_size,batch_size, figsize=(10,10))\n",
"for i, element in enumerate(train_svhn_cropped.batch(batch_size).take(take_size)):\n",
" for j in range(4):\n",
" image = element['image'][j]\n",
" label = element['label'][j]\n",
" axes[i][j].imshow(image)\n",
" axes[i][j].set_title(f'true label={label:d}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we convert from a collection of dictionaries to a collection of tuples. We will still have a `tf.data.Dataset`"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"def normalize_image(img):\n",
" return tf.cast(img, tf.float32)/255.\n",
"\n",
"def normalize_dataset(element):\n",
" img = element['image']\n",
" lbl = element['label']\n",
" return normalize_image(img), lbl"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"train_svhn = train_svhn_cropped.map(normalize_dataset)\n",
"test_svhn = test_svhn_cropped.map(normalize_dataset)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"isinstance(train_svhn, tf.data.Dataset)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Define our CNN model "
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: \"sequential_5\"\n",
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"conv2d_15 (Conv2D) (None, 30, 30, 16) 448 \n",
"_________________________________________________________________\n",
"max_pooling2d_10 (MaxPooling (None, 15, 15, 16) 0 \n",
"_________________________________________________________________\n",
"conv2d_16 (Conv2D) (None, 13, 13, 32) 4640 \n",
"_________________________________________________________________\n",
"max_pooling2d_11 (MaxPooling (None, 6, 6, 32) 0 \n",
"_________________________________________________________________\n",
"conv2d_17 (Conv2D) (None, 4, 4, 64) 18496 \n",
"_________________________________________________________________\n",
"flatten_5 (Flatten) (None, 1024) 0 \n",
"_________________________________________________________________\n",
"dense_10 (Dense) (None, 32) 32800 \n",
"_________________________________________________________________\n",
"dense_11 (Dense) (None, 10) 330 \n",
"=================================================================\n",
"Total params: 56,714\n",
"Trainable params: 56,714\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"n_filters = 16\n",
"input_shape = (32, 32, 3)\n",
"\n",
"svhn_model = Sequential() \n",
"svhn_model.add(Conv2D(n_filters, (3, 3), activation='relu', input_shape=input_shape))\n",
"svhn_model.add(MaxPooling2D((2, 2)))\n",
"svhn_model.add(Conv2D(n_filters*2, (3, 3), activation='relu')) \n",
"svhn_model.add(MaxPooling2D((2, 2)))\n",
"svhn_model.add(Conv2D(n_filters*4, (3, 3), activation='relu'))\n",
"svhn_model.add(Flatten())\n",
"svhn_model.add(Dense(n_filters*2, activation='relu'))\n",
"svhn_model.add(Dense(10, activation='softmax'))\n",
"svhn_model.summary()"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"loss = keras.losses.sparse_categorical_crossentropy # we use this because we did not 1-hot encode the labels\n",
"optimizer = Adam(lr=0.001)\n",
"metrics = ['accuracy'] \n",
"\n",
"# Compile model\n",
"svhn_model.compile(optimizer=optimizer,\n",
" loss=loss,\n",
" metrics=metrics)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### With Early Stopping"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/15\n",
"1145/1145 [==============================] - 30s 26ms/step - loss: 1.0362 - accuracy: 0.6684 - val_loss: 0.6124 - val_accuracy: 0.8285\n",
"Epoch 2/15\n",
"1145/1145 [==============================] - 30s 26ms/step - loss: 0.5177 - accuracy: 0.8515 - val_loss: 0.5254 - val_accuracy: 0.8519\n",
"Epoch 3/15\n",
"1145/1145 [==============================] - 30s 26ms/step - loss: 0.4393 - accuracy: 0.8739 - val_loss: 0.4789 - val_accuracy: 0.8639\n",
"Epoch 4/15\n",
"1145/1145 [==============================] - 30s 26ms/step - loss: 0.3956 - accuracy: 0.8865 - val_loss: 0.4440 - val_accuracy: 0.8750\n",
"Epoch 5/15\n",
"1145/1145 [==============================] - 30s 26ms/step - loss: 0.3654 - accuracy: 0.8951 - val_loss: 0.4233 - val_accuracy: 0.8816\n",
"Epoch 6/15\n",
"1145/1145 [==============================] - 29s 25ms/step - loss: 0.3412 - accuracy: 0.9014 - val_loss: 0.4168 - val_accuracy: 0.8846\n",
"Epoch 7/15\n",
"1145/1145 [==============================] - 29s 25ms/step - loss: 0.3215 - accuracy: 0.9072 - val_loss: 0.4084 - val_accuracy: 0.8871\n",
"Epoch 8/15\n",
"1145/1145 [==============================] - 30s 26ms/step - loss: 0.3055 - accuracy: 0.9124 - val_loss: 0.4026 - val_accuracy: 0.8888\n",
"Epoch 9/15\n",
"1145/1145 [==============================] - 31s 27ms/step - loss: 0.2916 - accuracy: 0.9163 - val_loss: 0.4100 - val_accuracy: 0.8887\n",
"Epoch 10/15\n",
"1145/1145 [==============================] - 30s 26ms/step - loss: 0.2780 - accuracy: 0.9200 - val_loss: 0.4217 - val_accuracy: 0.8861\n",
"Epoch 00010: early stopping\n",
"CPU times: user 20min 1s, sys: 8min 31s, total: 28min 33s\n",
"Wall time: 4min 58s\n"
]
}
],
"source": [
"%%time\n",
"batch_size = 64\n",
"epochs=15\n",
"\n",
"callbacks = [ \n",
" keras.callbacks.EarlyStopping(\n",
" # Stop training when `val_accuracy` is no longer improving\n",
" monitor='val_accuracy',\n",
" # \"no longer improving\" being further defined as \"for at least 2 epochs\"\n",
" patience=2,\n",
" verbose=1)\n",
" ]\n",
"\n",
"history = svhn_model.fit(train_svhn.batch(batch_size), #.take(50), # change 50 only\n",
" epochs=epochs,\n",
" callbacks=callbacks,\n",
" validation_data=test_svhn.batch(batch_size)) #.take(50))"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgoAAAEYCAYAAAA9N95YAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3deXjU5bn/8fdNCEkIhH0HBVFRoQjI5o5LVXAB61JrtXZxq15t9fS09rI9p9qentrf79fWY1tFS621rVVrTwb3ui9VKZtUUQREQfZNdsgCuX9/PJMwCTNJJkzynUw+r+ua65l8n2++uRMxz51nNXdHREREJJl2UQcgIiIi2UuJgoiIiKSkREFERERSUqIgIiIiKSlREBERkZTaRx1ANurZs6cPHjw46jBERERaxLx58za5e69kdUoUkhg8eDBz586NOgwREZEWYWYrUtVp6EFERERSUqIgIiIiKSlREBERkZQ0R6GRKisrWbVqFWVlZVGH0qwKCwsZOHAg+fn5UYciIiJZQIlCI61atYrOnTszePBgzCzqcJqFu7N582ZWrVrFkCFDog5HRESygIYeGqmsrIwePXrkbJIAYGb06NEj53tNRESk8ZQopCGXk4RqbeF7FBGRxtPQg4iISJaprIQtW2Dr1lDWfd+1K9xwQ8vEokShldi6dSsPPfQQN6T5L2PKlCk89NBDdO3atZkiExGRutxh9+7ajXt9DX/d97t21f/8MWOUKEgdW7du5e677z4gUdi3bx95eXkpP+/pp59u7tBERHJSVRVs3568MW9Mo19ZWf/zS0qgW7fQO9CtGxxxxP73idfrfty1KxQWtszPAJQotBrf+973WLZsGaNGjSI/P59OnTrRr18/FixYwPvvv8+0adNYuXIlZWVlfOtb3+Laa68F9m9HvXPnTiZPnsxJJ53Em2++yYABA5g5cyZFRUURf2ciIs3HPTT2n34aGu9PP639vrpM1tBv2xY+P5W8vAMb9EMPTd7Q1230S0qgfStpgVtJmNnlpptgwYLMPnPUKLjzztT1d9xxBwsXLmTBggW88sornHvuuSxcuLBmGeP9999P9+7d2bNnD+PGjeOiiy6iR48etZ6xdOlS/vKXv/Db3/6WSy+9lL/97W9cccUVmf1GRESaQXl5w419smtbtoSegVQKC2s34P37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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def print_history(history):\n",
" fig, ax = plt.subplots(1, 1, figsize=(8,4))\n",
" ax.plot((history.history['accuracy']), 'b', label='train')\n",
" ax.plot((history.history['val_accuracy']), 'g' ,label='val')\n",
" ax.set_xlabel(r'Epoch', fontsize=20)\n",
" ax.set_ylabel(r'Accuracy', fontsize=20)\n",
" ax.legend()\n",
" ax.tick_params(labelsize=20)\n",
" fig, ax = plt.subplots(1, 1, figsize=(8,4))\n",
" ax.plot((history.history['loss']), 'b', label='train')\n",
" ax.plot((history.history['val_loss']), 'g' ,label='val')\n",
" ax.set_xlabel(r'Epoch', fontsize=20)\n",
" ax.set_ylabel(r'Loss', fontsize=20)\n",
" ax.legend()\n",
" ax.tick_params(labelsize=20)\n",
" plt.show();\n",
" \n",
"print_history(history)"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [],
"source": [
"svhn_model.save('svhn_good.h5')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Too High Learning Rate"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [],
"source": [
"loss = keras.losses.sparse_categorical_crossentropy \n",
"optimizer = Adam(lr=0.5) # really big learning rate\n",
"metrics = ['accuracy'] \n",
"\n",
"# Compile model\n",
"svhn_model.compile(optimizer=optimizer,\n",
" loss=loss,\n",
" metrics=metrics)"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/10\n",
"1145/1145 [==============================] - 29s 25ms/step - loss: 1518.9293 - accuracy: 0.1763 - val_loss: 2.2455 - val_accuracy: 0.1594\n",
"Epoch 2/10\n",
"1145/1145 [==============================] - 29s 25ms/step - loss: 2.2719 - accuracy: 0.1741 - val_loss: 2.2437 - val_accuracy: 0.1594\n",
"Epoch 3/10\n",
"1145/1145 [==============================] - 29s 25ms/step - loss: 2.2734 - accuracy: 0.1745 - val_loss: 2.2431 - val_accuracy: 0.1959\n",
"Epoch 4/10\n",
"1145/1145 [==============================] - 29s 26ms/step - loss: 2.2737 - accuracy: 0.1743 - val_loss: 2.2429 - val_accuracy: 0.1959\n",
"Epoch 5/10\n",
"1145/1145 [==============================] - 29s 26ms/step - loss: 2.2738 - accuracy: 0.1743 - val_loss: 2.2428 - val_accuracy: 0.1959\n",
"Epoch 6/10\n",
"1145/1145 [==============================] - 29s 25ms/step - loss: 2.2738 - accuracy: 0.1743 - val_loss: 2.2428 - val_accuracy: 0.1959\n",
"Epoch 7/10\n",
"1145/1145 [==============================] - 29s 25ms/step - loss: 2.2738 - accuracy: 0.1743 - val_loss: 2.2428 - val_accuracy: 0.1959\n",
"Epoch 8/10\n",
"1145/1145 [==============================] - 29s 25ms/step - loss: 2.2738 - accuracy: 0.1743 - val_loss: 2.2428 - val_accuracy: 0.1959\n",
"Epoch 9/10\n",
"1145/1145 [==============================] - 29s 25ms/step - loss: 2.2738 - accuracy: 0.1743 - val_loss: 2.2428 - val_accuracy: 0.1959\n",
"Epoch 10/10\n",
"1145/1145 [==============================] - 29s 25ms/step - loss: 2.2738 - accuracy: 0.1743 - val_loss: 2.2428 - val_accuracy: 0.1959\n",
"CPU times: user 19min 22s, sys: 8min 17s, total: 27min 40s\n",
"Wall time: 4min 50s\n"
]
}
],
"source": [
"%%time\n",
"batch_size = 64\n",
"epochs=10\n",
"\n",
"history = svhn_model.fit(train_svhn.batch(batch_size), #.take(50), # change 50 to see the difference\n",
" epochs=epochs,\n",
" validation_data=test_svhn.batch(batch_size)) #.take(50))"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"print_history(history)\n",
"fig.savefig('../images/train_high_lr.png')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Too Low Learning Rate\n",
"\n",
"Experiment with the learning rate using a small sample of the training set by using .take(num) which takes only `num` number of samples.\n",
"```\n",
"history = svhn_model.fit(train_svhn.batch(batch_size).take(50))\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [],
"source": [
"#loss = keras.losses.categorical_crossentropy\n",
"loss = keras.losses.sparse_categorical_crossentropy # we use this because we did not 1-hot encode the labels\n",
"optimizer = Adam(lr=1e-5) # very low learning rate\n",
"metrics = ['accuracy'] \n",
"\n",
"# Compile model\n",
"svhn_model.compile(optimizer=optimizer,\n",
" loss=loss,\n",
" metrics=metrics)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/10\n",
"2290/2290 [==============================] - 37s 16ms/step - loss: 2.2603 - accuracy: 0.1707 - val_loss: 2.2314 - val_accuracy: 0.1957\n",
"Epoch 2/10\n",
"2290/2290 [==============================] - 34s 15ms/step - loss: 2.2295 - accuracy: 0.1894 - val_loss: 2.2119 - val_accuracy: 0.1970\n",
"Epoch 3/10\n",
"2290/2290 [==============================] - 35s 15ms/step - loss: 2.2046 - accuracy: 0.2012 - val_loss: 2.1738 - val_accuracy: 0.2342\n",
"Epoch 4/10\n",
"2290/2290 [==============================] - 35s 15ms/step - loss: 2.1504 - accuracy: 0.2458 - val_loss: 2.0987 - val_accuracy: 0.2948\n",
"Epoch 5/10\n",
"2290/2290 [==============================] - 36s 16ms/step - loss: 2.0492 - accuracy: 0.3008 - val_loss: 1.9756 - val_accuracy: 0.3434\n",
"Epoch 6/10\n",
"2290/2290 [==============================] - 37s 16ms/step - loss: 1.9201 - accuracy: 0.3507 - val_loss: 1.8509 - val_accuracy: 0.3832\n",
"Epoch 7/10\n",
"2290/2290 [==============================] - 38s 16ms/step - loss: 1.7967 - accuracy: 0.3975 - val_loss: 1.7373 - val_accuracy: 0.4274\n",
"Epoch 8/10\n",
"2290/2290 [==============================] - 35s 15ms/step - loss: 1.6818 - accuracy: 0.4490 - val_loss: 1.6338 - val_accuracy: 0.4714\n",
"Epoch 9/10\n",
"2290/2290 [==============================] - 34s 15ms/step - loss: 1.5778 - accuracy: 0.4939 - val_loss: 1.5412 - val_accuracy: 0.5111\n",
"Epoch 10/10\n",
"2290/2290 [==============================] - 35s 15ms/step - loss: 1.4837 - accuracy: 0.5307 - val_loss: 1.4577 - val_accuracy: 0.5436\n",
"CPU times: user 20min 26s, sys: 9min 2s, total: 29min 28s\n",
"Wall time: 5min 56s\n"
]
}
],
"source": [
"%%time\n",
"batch_size = 32\n",
"epochs=10\n",
"\n",
"history = svhn_model.fit(train_svhn.batch(batch_size).take(50),\n",
" epochs=epochs,\n",
" validation_data=test_svhn.batch(batch_size)) #.take(50))"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"print_history(history)\n",
"fig.savefig('../images/train_50.png')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Changing the batch size"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [],
"source": [
"#loss = keras.losses.categorical_crossentropy\n",
"loss = keras.losses.sparse_categorical_crossentropy # we use this because we did not 1-hot encode the labels\n",
"optimizer = Adam(lr=0.001)\n",
"metrics = ['accuracy'] \n",
"\n",
"# Compile model\n",
"svhn_model.compile(optimizer=optimizer,\n",
" loss=loss,\n",
" metrics=metrics)"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/5\n",
"36629/36629 [==============================] - 175s 5ms/step - loss: 0.8544 - accuracy: 0.7295 - val_loss: 0.5765 - val_accuracy: 0.8363\n",
"Epoch 2/5\n",
"36629/36629 [==============================] - 135s 4ms/step - loss: 0.5045 - accuracy: 0.8494 - val_loss: 0.5326 - val_accuracy: 0.8511\n",
"Epoch 3/5\n",
"36629/36629 [==============================] - 134s 4ms/step - loss: 0.4520 - accuracy: 0.8649 - val_loss: 0.5270 - val_accuracy: 0.8584\n",
"Epoch 4/5\n",
"36629/36629 [==============================] - 141s 4ms/step - loss: 0.4209 - accuracy: 0.8744 - val_loss: 0.5106 - val_accuracy: 0.8614\n",
"Epoch 5/5\n",
"36629/36629 [==============================] - 126s 3ms/step - loss: 0.4007 - accuracy: 0.8811 - val_loss: 0.5079 - val_accuracy: 0.8617\n",
"CPU times: user 19min 36s, sys: 10min 1s, total: 29min 37s\n",
"Wall time: 11min 50s\n"
]
}
],
"source": [
"%%time\n",
"batch_size = 2\n",
"epochs=5\n",
"\n",
"history = svhn_model.fit(train_svhn.batch(batch_size), \n",
" epochs=epochs,\n",
" validation_data=test_svhn.batch(batch_size)) "
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"print_history(history)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" [Back to Table of Contents](#top)\n",
"## Part 3: Hidden Layer Visualization, Saliency Maps\n",
"\n",
"[Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps](https://arxiv.org/pdf/1312.6034.pdf)\n",
"\n",
"It is often said that Deep Learning Models are black boxes. But we can peak into these boxes. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's train a small model on MNIST"
]
},
{
"cell_type": "code",
"execution_count": 408,
"metadata": {},
"outputs": [],
"source": [
"from tensorflow.keras.datasets import mnist\n",
"# load MNIST data\n",
"(x_train, y_train), (x_test, y_test) = mnist.load_data()"
]
},
{
"cell_type": "code",
"execution_count": 409,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0, 255)"
]
},
"execution_count": 409,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x_train.min(), x_train.max()"
]
},
{
"cell_type": "code",
"execution_count": 410,
"metadata": {},
"outputs": [],
"source": [
"x_train = x_train.reshape((60000, 28, 28, 1)) # Reshape to get third dimension\n",
"x_test = x_test.reshape((10000, 28, 28, 1)) \n",
"\n",
"x_train = x_train.astype('float32') / 255 # Normalize between 0 and 1\n",
"x_test = x_test.astype('float32') / 255 \n",
"\n",
"# Convert labels to categorical data \n",
"y_train = to_categorical(y_train)\n",
"y_test = to_categorical(y_test)"
]
},
{
"cell_type": "code",
"execution_count": 411,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.0, 1.0)"
]
},
"execution_count": 411,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x_train.min(), x_train.max()"
]
},
{
"cell_type": "code",
"execution_count": 412,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(60000, 28, 28, 1)"
]
},
"execution_count": 412,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data(\n",
"# path='mnist.npz')\n",
"x_train.shape"
]
},
{
"cell_type": "code",
"execution_count": 413,
"metadata": {},
"outputs": [],
"source": [
"class_idx = 0\n",
"indices = np.where(y_test[:, class_idx] == 1.)[0]\n",
"\n",
"# pick some random input from here.\n",
"idx = indices[0]\n",
"img = x_test[idx]"
]
},
{
"cell_type": "code",
"execution_count": 414,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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qu9UrMUBAB2GgAaApAhoAEiKgAaApAhoAEiKgAaApAhoAEiKgAaApAhoAEiKgAaApAhoAEhqdrsbQGfbv39/7doHHnigaN+9srZGqV27dhXV33fffUX1N954Y1E9msMIGgCSIqABICkCGgCSIqABICkCGgCSIqABICkCGgCSIqABICkCGgCSIqABIClu9e5yfX3N/h980003Nbp/nM92UX3p90CT3zObNm0qqr///vubaaRDMIIGgKQIaABIioAGgKQIaABIioAGgKQIaABIioAGgKQIaABIioAGgKQIaABIioAGgKRYi6MDPfjgg7VrR0ZGGuwE7bBy5cqi+sWLFxfVl3zPlH5/la7F0esYQQNAUgQ0ACQ1aUDb3m77hO2DY7Ztsv2J7berP3c02yYA9J46I+hfSlo+zvb/iIgbqj+7W9sWAGDSgI6IvZK+nIFeAABjTGcO+hHb71ZTIHMnKrI9YHu/7f3TeC0A6DlTDeitkq6RdIOkYUnPTlQYEYMRsSQilkzxtQCgJ00poCPieESciYgRSb+QtLS1bQEAphTQtueNeXqXpIMT1QIApmbSOwltvyDpVkmX2T4m6WeSbrV9g6SQdFjS2gZ7BICeNGlAR8S942x+voFeAABjsBZHBypdiwEzr7+/v3bt9ddfX7TvDRs2lLbTmM8++6yo/vTp0w110p241RsAkiKgASApAhoAkiKgASApAhoAkiKgASApAhoAkiKgASApAhoAkiKgASApAhoAkmItDqABGzdurF378MMPN9hJucOHD9euXbNmTdG+jx49WthNb2MEDQBJEdAAkBQBDQBJEdAAkBQBDQBJEdAAkBQBDQBJEdAAkBQBDQBJEdAAkBS3egM17N69u6h+0aJFDXXSvEOHDtWuff311xvsBIygASApAhoAkiKgASApAhoAkiKgASApAhoAkiKgASApAhoAkiKgASApAhoAkiKgASAp1uLoQLZr1/b1Nft/8IoVKxrb9+DgYFH9lVde2VAn5X+PIyMjDXXSvJUrV7a7BVQYQQNAUgQ0ACRFQANAUgQ0ACRFQANAUgQ0ACRFQANAUgQ0ACRFQANAUgQ0ACRFQANAUqzF0YG2bt1au/bpp59usBPp5Zdfrl3b9PoUmda/yNTLtm3b2t0CpogRNAAkNWlA277a9h7bQ7bft72+2n6p7Vdtf1B9nNt8uwDQ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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# pick some random input from here.\n",
"idx = indices[0]\n",
"\n",
"# Lets sanity check the picked image.\n",
"from matplotlib import pyplot as plt\n",
"%matplotlib inline\n",
"plt.rcParams['figure.figsize'] = (18, 6)\n",
"\n",
"#plt.imshow(test_images[idx][..., 0])\n",
"img = x_test[idx] * 255 \n",
"img = img.astype('float32')\n",
"img = np.squeeze(img) # trick to reduce img from (28,28,1) to (28,28)\n",
"plt.imshow(img, cmap='gray');"
]
},
{
"cell_type": "code",
"execution_count": 415,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: \"sequential_10\"\n",
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"conv2d_29 (Conv2D) (None, 26, 26, 32) 320 \n",
"_________________________________________________________________\n",
"conv2d_30 (Conv2D) (None, 24, 24, 64) 18496 \n",
"_________________________________________________________________\n",
"max_pooling2d_19 (MaxPooling (None, 12, 12, 64) 0 \n",
"_________________________________________________________________\n",
"dropout_2 (Dropout) (None, 12, 12, 64) 0 \n",
"_________________________________________________________________\n",
"flatten_10 (Flatten) (None, 9216) 0 \n",
"_________________________________________________________________\n",
"dense_19 (Dense) (None, 128) 1179776 \n",
"_________________________________________________________________\n",
"dropout_3 (Dropout) (None, 128) 0 \n",
"_________________________________________________________________\n",
"preds (Dense) (None, 10) 1290 \n",
"=================================================================\n",
"Total params: 1,199,882\n",
"Trainable params: 1,199,882\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"input_shape=(28, 28, 1)\n",
"num_classes = 10\n",
"\n",
"model = Sequential()\n",
"model.add(Conv2D(32, kernel_size=(3, 3),\n",
" activation='relu',\n",
" input_shape=input_shape))\n",
"model.add(Conv2D(64, (3, 3), activation='relu'))\n",
"model.add(MaxPooling2D(pool_size=(2, 2)))\n",
"model.add(Dropout(0.25))\n",
"model.add(Flatten())\n",
"model.add(Dense(128, activation='relu'))\n",
"model.add(Dropout(0.5))\n",
"model.add(Dense(num_classes, activation='softmax', name='preds'))\n",
"model.summary()"
]
},
{
"cell_type": "code",
"execution_count": 416,
"metadata": {},
"outputs": [],
"source": [
"model.compile(loss=keras.losses.categorical_crossentropy,\n",
" optimizer=keras.optimizers.Adam(),\n",
" metrics=['accuracy'])"
]
},
{
"cell_type": "code",
"execution_count": 417,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"60000"
]
},
"execution_count": 417,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"num_samples = x_train.shape[0]\n",
"num_samples"
]
},
{
"cell_type": "code",
"execution_count": 418,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train on 48000 samples, validate on 12000 samples\n",
"Epoch 1/10\n",
"48000/48000 [==============================] - 60s 1ms/sample - loss: 0.2007 - accuracy: 0.9381 - val_loss: 0.0620 - val_accuracy: 0.9823\n",
"Epoch 2/10\n",
"48000/48000 [==============================] - 62s 1ms/sample - loss: 0.0851 - accuracy: 0.9741 - val_loss: 0.0476 - val_accuracy: 0.9871\n",
"Epoch 3/10\n",
"48000/48000 [==============================] - 62s 1ms/sample - loss: 0.0625 - accuracy: 0.9806 - val_loss: 0.0414 - val_accuracy: 0.9890\n",
"Epoch 4/10\n",
"48000/48000 [==============================] - 62s 1ms/sample - loss: 0.0527 - accuracy: 0.9839 - val_loss: 0.0438 - val_accuracy: 0.9875\n",
"Epoch 5/10\n",
"48000/48000 [==============================] - 62s 1ms/sample - loss: 0.0442 - accuracy: 0.9864 - val_loss: 0.0335 - val_accuracy: 0.9902\n",
"Epoch 6/10\n",
"48000/48000 [==============================] - 63s 1ms/sample - loss: 0.0380 - accuracy: 0.9875 - val_loss: 0.0359 - val_accuracy: 0.9907\n",
"Epoch 7/10\n",
"48000/48000 [==============================] - 65s 1ms/sample - loss: 0.0329 - accuracy: 0.9894 - val_loss: 0.0385 - val_accuracy: 0.9903\n",
"Epoch 8/10\n",
"48000/48000 [==============================] - 65s 1ms/sample - loss: 0.0286 - accuracy: 0.9910 - val_loss: 0.0396 - val_accuracy: 0.9904\n",
"Epoch 9/10\n",
"48000/48000 [==============================] - 65s 1ms/sample - loss: 0.0294 - accuracy: 0.9905 - val_loss: 0.0427 - val_accuracy: 0.9901\n",
"Epoch 10/10\n",
"48000/48000 [==============================] - 67s 1ms/sample - loss: 0.0254 - accuracy: 0.9915 - val_loss: 0.0456 - val_accuracy: 0.9894\n",
"CPU times: user 33min 28s, sys: 24min 14s, total: 57min 42s\n",
"Wall time: 10min 33s\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"execution_count": 418,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"batch_size = 32\n",
"epochs = 10\n",
"\n",
"model.fit(x_train, y_train,\n",
" batch_size=batch_size,\n",
" epochs=epochs,\n",
" verbose=1,\n",
" validation_split=0.2,\n",
" shuffle=True)"
]
},
{
"cell_type": "code",
"execution_count": 419,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Test loss: 0.03391535646364073\n",
"Test accuracy: 0.9909\n"
]
}
],
"source": [
"score = model.evaluate(x_test, y_test, verbose=0)\n",
"print('Test loss:', score[0])\n",
"print('Test accuracy:', score[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Let's look at the layers with `tf.keras.viz` \n",
"\n",
"https://pypi.org/project/tf-keras-vis/\n",
"\n",
"And an example: https://github.com/keisen/tf-keras-vis/blob/master/examples/visualize_conv_filters.ipynb"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can identify layers by their layer id:"
]
},
{
"cell_type": "code",
"execution_count": 638,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('conv2d_29', 'dropout_3')"
]
},
"execution_count": 638,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Alternatively we can specify layer_id as -1 since it corresponds to the last layer.\n",
"layer_id = 0\n",
"model.layers[layer_id].name, model.layers[-2].name"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Or you may look at their output"
]
},
{
"cell_type": "code",
"execution_count": 639,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 639,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"output = [model.layers[layer_id].output]\n",
"output"
]
},
{
"cell_type": "code",
"execution_count": 640,
"metadata": {},
"outputs": [],
"source": [
"# # You may also replace part of your NN with other parts,\n",
"# # e.g. replace the activation function of the last layer\n",
"# # with a linear one\n",
"\n",
"# model.layers[-1].activation = tf.keras.activations.linear"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Generate Feature Maps"
]
},
{
"cell_type": "code",
"execution_count": 641,
"metadata": {},
"outputs": [],
"source": [
"def get_feature_maps(model, layer_id, input_image):\n",
" \"\"\"Returns intermediate output (activation map) from passing an image to the model\n",
" \n",
" Parameters:\n",
" model (tf.keras.Model): Model to examine\n",
" layer_id (int): Which layer's (from zero) output to return\n",
" input_image (ndarray): The input image\n",
" Returns:\n",
" maps (List[ndarray]): Feature map stack output by the specified layer\n",
" \"\"\"\n",
" model_ = Model(inputs=[model.input], outputs=[model.layers[layer_id].output]) \n",
" return model_.predict(np.expand_dims(input_image, axis=0))[0,:,:,:].transpose((2,0,1))"
]
},
{
"cell_type": "code",
"execution_count": 664,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(28, 28, 1)"
]
},
"execution_count": 664,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Choose an arbitrary image\n",
"image_id = 67\n",
"img = x_test[image_id,:,:,:]\n",
"img.shape"
]
},
{
"cell_type": "code",
"execution_count": 665,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 665,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"img_to_show = np.squeeze(img)\n",
"plt.imshow(img_to_show, cmap='gray')"
]
},
{
"cell_type": "code",
"execution_count": 666,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1, 28, 28, 1)\n",
"Prediction is: 4\n"
]
}
],
"source": [
"# Was this successfully predicted?\n",
"img_batch = (np.expand_dims(img,0))\n",
"print(img_batch.shape)\n",
"predictions_single = model.predict(img_batch)\n",
"print(f'Prediction is: {np.argmax(predictions_single[0])}') "
]
},
{
"cell_type": "code",
"execution_count": 667,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(32, 26, 26)"
]
},
"execution_count": 667,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# layer id should be for a Conv layer, a Flatten will not do\n",
"maps = get_feature_maps(model, layer_id, img)# [0:10]\n",
"maps.shape"
]
},
{
"cell_type": "code",
"execution_count": 668,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plot just a subset\n",
"maps = get_feature_maps(model, layer_id, img)[0:10]\n",
"\n",
"fig, ax = plt.subplots()\n",
"img = np.squeeze(img)\n",
"ax.imshow(img + 0.5)\n",
"label = y_test[image_id,:]\n",
"label = int(np.where(label == 1.)[0])\n",
"\n",
"ax.set_title(f'true label = {label}')\n",
"\n",
"f, ax = plt.subplots(3,3, figsize=(8,8))\n",
"for i, axis in enumerate(ax.ravel()):\n",
" axis.imshow(maps[i], cmap='gray')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### `tf_keras_vis.gradcam.Gradcam`\n",
"\n",
"[Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization](https://arxiv.org/pdf/1610.02391.pdf)"
]
},
{
"cell_type": "code",
"execution_count": 669,
"metadata": {},
"outputs": [],
"source": [
"#from tensorflow.keras import backend as K\n",
"# Define modifier to replace a softmax function of the last layer to a linear function.\n",
"def model_modifier(m):\n",
" m.layers[-1].activation = tf.keras.activations.linear"
]
},
{
"cell_type": "code",
"execution_count": 670,
"metadata": {},
"outputs": [],
"source": [
"#img_batch = (np.expand_dims(img,0))\n",
"# Define modifier to replace a softmax function of the last layer to a linear function.\n",
"def model_modifier(m):\n",
" m.layers[-1].activation = tf.keras.activations.linear\n",
"\n",
"# Create Saliency object\n",
"saliency = Saliency(model, model_modifier)\n",
"\n",
"# Define loss function. Pass it the correct class label.\n",
"loss = lambda output: tf.keras.backend.mean(output[:, tf.argmax(y_test[image_id])])"
]
},
{
"cell_type": "code",
"execution_count": 671,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1, 28, 28, 1)\n"
]
}
],
"source": [
"# Generate saliency map\n",
"print(img_batch.shape)"
]
},
{
"cell_type": "code",
"execution_count": 679,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"saliency_map = saliency(loss, img_batch)\n",
"\n",
"saliency_map = normalize(saliency_map)\n",
"\n",
"f, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 5)) #, subplot_kw={'xticks': [], 'yticks': []})\n",
"ax[0].imshow(saliency_map[i], cmap='jet')\n",
"ax[1].imshow(img);"
]
},
{
"cell_type": "code",
"execution_count": 686,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# from matplotlib import cm\n",
"# from tf_keras_vis.gradcam import Gradcam\n",
"\n",
"# Create Gradcam object\n",
"gradcam = Gradcam(model, model_modifier)\n",
"\n",
"# Generate heatmap with GradCAM\n",
"cam = gradcam(loss, img_batch)\n",
"cam = normalize(cam)\n",
"\n",
"f, ax = plt.subplots(nrows=1, ncols=1, figsize=(10, 5),\n",
" subplot_kw={'xticks': [], 'yticks': []})\n",
"for i in range(len(cam)):\n",
" heatmap = np.uint8(cm.jet(cam[i])[..., :3] * 255)\n",
" ax.imshow(img)\n",
" ax.imshow(heatmap, cmap='jet', alpha=0.5)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}