{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercise 12.3\n", "## Discriminative localization (CAM)\n", "In this exercise we will create class activation maps (CAMs) for predictions made by a model trained to classify magentic phases (see [Exercise 7_1](Exercise_7_1_solution.ipynb)).\n", " 1. Pick out two correctly and two wrongly classified images classified with a convolutional network.\n", " 2. Look at Exercise 8.1 to extract weights and feature maps from the trained network model.\n", " 3. Create and plot the class activation maps and compare them with the images in order to see which regions lead to the prediction.\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "keras version 2.4.0\n" ] } ], "source": [ "from tensorflow import keras\n", "import numpy as np\n", "callbacks = keras.callbacks\n", "layers = keras.layers\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load and prepare dataset\n", "See https://doi.org/10.1038/nphys4035 for more information" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import gdown\n", "url = \"https://drive.google.com/u/0/uc?export=download&confirm=HgGH&id=1Ihxt1hb3Kyv0IrjHlsYb9x9QY7l7n2Sl\"\n", "output = 'ising_data.npz'\n", "gdown.download(url, output, quiet=True)\n", "\n", "f = np.load(output)\n", "n_train = 20000\n", "\n", "x_train, x_test = f[\"C\"][:n_train], f[\"C\"][n_train:]\n", "T_train, T_test = f[\"T\"][:n_train], f[\"T\"][n_train:]\n", "\n", "Tc = 2.27\n", "y_train = np.zeros_like(T_train)\n", "y_train[T_train > Tc] = 1\n", "y_train = keras.utils.to_categorical(y_train, 2)\n", "\n", "y_test = np.zeros_like(T_test)\n", "y_test[T_test > Tc] = 1\n", "y_test = keras.utils.to_categorical(y_test, 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plot data" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "for i,j in enumerate(np.random.choice(n_train, 6)):\n", " plt.subplot(2,3,i+1)\n", " image = x_train[j]\n", " plot = plt.imshow(image)\n", " plt.title(\"T: %.2f\" % T_train[j])\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Definition of the model\n", "\n", "Define a CNN for discriminative localization. Note that the CNN must use `GlobalAveragePooling2D` after the convolutional part and must not feature more than a single fully-connected layer as output." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"sequential\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "reshape (Reshape) (None, 32, 32, 1) 0 \n", "_________________________________________________________________\n", "conv2d (Conv2D) (None, 32, 32, 16) 160 \n", "_________________________________________________________________\n", "conv2d_1 (Conv2D) (None, 32, 32, 16) 2320 \n", "_________________________________________________________________\n", "max_pooling2d (MaxPooling2D) (None, 16, 16, 16) 0 \n", "_________________________________________________________________\n", "conv2d_2 (Conv2D) (None, 16, 16, 32) 4640 \n", "_________________________________________________________________\n", "conv2d_3 (Conv2D) (None, 16, 16, 32) 9248 \n", "_________________________________________________________________\n", "global_average_pooling2d (Gl (None, 32) 0 \n", "_________________________________________________________________\n", "dropout (Dropout) (None, 32) 0 \n", "_________________________________________________________________\n", "dense (Dense) (None, 2) 66 \n", "=================================================================\n", "Total params: 16,434\n", "Trainable params: 16,434\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "model = keras.models.Sequential()\n", "model.add(layers.InputLayer(input_shape=(32, 32)))\n", "model.add(layers.Reshape((32, 32,1)))\n", "model.add(layers.Convolution2D(16, (3, 3), padding='same', activation='relu'))\n", "model.add(layers.Convolution2D(16, (3, 3), padding='same', activation='relu'))\n", "model.add(layers.MaxPooling2D((2, 2)))\n", "model.add(layers.Convolution2D(32, (3, 3), padding='same', activation='relu'))\n", "model.add(layers.Convolution2D(32, (3, 3), padding='same', activation='relu'))\n", "model.add(layers.GlobalAveragePooling2D())\n", "model.add(layers.Dropout(0.25))\n", "model.add(layers.Dense(2, activation='softmax'))\n", "\n", "model.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### prepare model for training" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "model.compile(\n", " loss='binary_crossentropy',\n", " optimizer=keras.optimizers.Adam(0.001),\n", " metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/50\n", "282/282 - 10s - loss: 0.1006 - accuracy: 0.9611 - val_loss: 0.0612 - val_accuracy: 0.9750\n", "Epoch 2/50\n", "282/282 - 14s - loss: 0.0476 - accuracy: 0.9814 - val_loss: 0.0415 - val_accuracy: 0.9825\n", "Epoch 3/50\n", "282/282 - 23s - loss: 0.0464 - accuracy: 0.9810 - val_loss: 0.0555 - val_accuracy: 0.9785\n", "Epoch 4/50\n", "282/282 - 24s - loss: 0.0480 - accuracy: 0.9804 - val_loss: 0.0364 - val_accuracy: 0.9845\n", "Epoch 5/50\n", "282/282 - 24s - loss: 0.0465 - accuracy: 0.9809 - val_loss: 0.0379 - val_accuracy: 0.9840\n", "Epoch 6/50\n", "282/282 - 25s - loss: 0.0443 - accuracy: 0.9811 - val_loss: 0.0435 - val_accuracy: 0.9835\n", "\n", "Epoch 00006: ReduceLROnPlateau reducing learning rate to 0.0006700000318232924.\n", "Epoch 7/50\n", "282/282 - 23s - loss: 0.0421 - accuracy: 0.9832 - val_loss: 0.0377 - val_accuracy: 0.9840\n", "Epoch 8/50\n", "282/282 - 25s - loss: 0.0424 - accuracy: 0.9823 - val_loss: 0.0388 - val_accuracy: 0.9835\n", "\n", "Epoch 00008: ReduceLROnPlateau reducing learning rate to 0.0004489000252215192.\n", "Epoch 9/50\n", "282/282 - 25s - loss: 0.0396 - accuracy: 0.9828 - val_loss: 0.0390 - val_accuracy: 0.9835\n", "Epoch 00009: early stopping\n" ] } ], "source": [ "results = model.fit(x_train, y_train,\n", " batch_size=64,\n", " epochs=50,\n", " verbose=2,\n", " validation_split=0.1,\n", " callbacks=[\n", " callbacks.EarlyStopping(patience=5, verbose=1),\n", " callbacks.ReduceLROnPlateau(factor=0.67, patience=2, verbose=1)]\n", " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Evaluate training" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(1, (12, 4))\n", "plt.subplot(1, 2, 1)\n", "plt.plot(results.history['loss'])\n", "plt.plot(results.history['val_loss'])\n", "plt.ylabel('loss')\n", "plt.xlabel('epoch')\n", "plt.legend(['train', 'val'], loc='upper right')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(1, (12, 4))\n", "plt.subplot(1, 2, 1)\n", "plt.plot(results.history['accuracy'])\n", "plt.plot(results.history['val_accuracy'])\n", "plt.ylabel('accuracy')\n", "plt.xlabel('epoch')\n", "plt.legend(['train', 'val'], loc='upper right')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create class activation maps" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Task\n", "Look at Exercise 8.1 to extract weights and feature maps from the trained network model. \n", "\n", "First, extract the activations of the last convolutional layer." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "conv = model.layers[-4] # last conv layer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, create the class activation maps by omitting the global average pooling operation and applying the weights of the single classification layer to the extracted activations." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plot the class activation maps for examples just below and above the critical temperature" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Task\n", "Plot the CAMs for wrongly and correctly classified images. \n", "\n", "Note, you can use `interpolation='bilinear` in `plt.imshow` to upsample the CAMs." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.6.9" } }, "nbformat": 4, "nbformat_minor": 4 }