{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "\n", "##
CSCI-UA 9473 Introduction to Machine Learning
\n", "###
Spring 2022
\n", "##
Assignment 3: Convolutional nets, SVM and Robust PCA
\n", "\n", "\n", "
Given date: Wednesday April 5
\n", "\n", "
Due date: Sunday April 24
\n", "\n", "\n", "####
Total: 30pts
\n", "\n", "Additional readings (To go further): \n", "\n", " - [Ian Goodfellow and Yoshua Bengio and Aaron Courville, Deep Learning](https://www.deeplearningbook.org/)\n", " - [Saharon Rosset, Ji Zhu and Trevor Hastie, Margin Maximizing Loss Functions](https://web.stanford.edu/~hastie/Papers/margmax1.pdf)\n", " \n", "The assignment is divided into three parts. In the first part, we will go back to neural networks. You will be asked to build and train a convolutional neural network for image classification. In the second part, we will focus on the max margin classifier and study how such a classifier can be learned by means of gradient descent. Finally, in the last part, we will implement a principal component decomposition of a video sequence to extract moving targets from their background. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Question I: (15pts) conv nets and autonomous driving \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this first question, we will use [the Keras API](https://keras.io/) to build and train a convolutional neural network to discriminate between four types of road signs. To simplify we will consider the detection of 4 different signs: \n", "\n", "- A '30 km/h' sign (folder 1)\n", "- A 'Stop' sign \n", "- A 'Go straight' sign\n", "- A 'Keep left' sign \n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An example of each sign is given below." ] }, { "cell_type": "code", "execution_count": 2, "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", "import matplotlib.image as mpimg\n", "\n", "img1 = mpimg.imread('1/00001_00000_00012.png')\n", "plt.subplot(141)\n", "plt.imshow(img1)\n", "plt.axis('off')\n", "plt.subplot(142)\n", "img2 = mpimg.imread('2/00014_00001_00019.png')\n", "plt.imshow(img2)\n", "plt.axis('off')\n", "plt.subplot(143)\n", "img3 = mpimg.imread('3/00035_00008_00023.png')\n", "plt.imshow(img3)\n", "plt.axis('off')\n", "plt.subplot(144)\n", "img4 = mpimg.imread('4/00039_00000_00029.png')\n", "plt.imshow(img4)\n", "plt.axis('off')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Question I.1. (10pts) \n", "\n", "In this exercise, you need to build and train a convolutional neural network to discriminate between the four images. \n", "\n", "- Before building the network, you should start by cropping the images so that they all have a common predefined size (take the smallest size across all images) \n", "\n", "- We will use a __Sequential model__ from Keras but it will be up to you to define the structure of the convolution net. Initialization of the sequential model can be done with the following line " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = Sequential()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### I.1.a. Convolutions. \n", "\n", "- We will use a __convolutional__ architecture. you can add convolutional layers to the model by using the following lines " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model.add(Conv2D(num_units, (filter_size1, filter_size2), padding='same',\n", " input_shape=(3, IMG_SIZE, IMG_SIZE),\n", " activation='relu'))\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "for the first layer and " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model.add(Conv2D(filters, filter_size, activation, input_shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "for all the others. 'filters' indicate the number of filters you want to use in the convolutional layer. filter_size is the size of each filter and activation is the usual activation that comes on top of the convolution, i.e.\n", "$x_{\\text{out}} = \\sigma(\\text{filter}*\\text{input})$. Finally input_shape indicates the size of your input. Note that only the input layer should be given the input size. Subsequent layers will automatically compute the size of their inputs based on previous layers. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### I.1.b Pooling Layers \n", "\n", "On top of the convolutional layers, convolutional neural networks (CNN) also often rely on __Pooling layers__. The addition of such a layer can be done through the following line " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ " model.add(MaxPooling2D(pool_size=(filter_sz1, filter_sz2),strides=None))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "The _pooling layers_ usually come with two parameters: the 'pool size' and the 'stride' parameter. The basic choice for the pool size is (2,2) and the stride is usually set to None (which means it will split the image into non overlapping regions such as in the Figure below). You should however feel free to play a little with those parameters. The __MaxPool operator__ considers a mask of size 'pool_size' which is slided over the image by a number of pixels equal to the stride parameters (in x and y, there are hence two translation parameters). for each position of the mask, the output only retains the max of the pixels appearing in the mask (This idea is illustrated below). One way to understand the effect of the pooling operator is that if the filter detects an edge in a subregion of the image (thus returning at least one large value), although a MaxPooling will reduce the number of parameters, it will keep track of this information. \n", "\n", "Adding 'Maxpooling' layers is known to work well in practice. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Although it is a little bit up to you to decide how you want to structure the network, a good start is to add a couple (definitely not exceeding 4) combinations (convolution, convolution, Pooling) with increasing number of units (you do every power of two like 16, 32, 128,...). " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### I.1.c. Flattening and Fully connected layers\n", "\n", "Once you have stacked the convolutional and pooling layers, you should flatten the output through a line of the form" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model.add(Flatten())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And add a couple (no need to put more than 2,3) dense fully connected layers through lines of the form" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model.add(Dense(num_units, activation='relu'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### I.1.d. Concluding \n", "\n", "Since there are four possible signs, you need to __finish your network with a dense layer with 4 units__. Each of those units should output four number between 0 and 1 representing the likelihood that any of the four signs is detected and such that $p_1 + p_2 + p_3 + p_4 = 1$ (hopefully with one probability much larger than the others). For this reason, a good choice for the __final activation function__ of those four units is the __softmax__ (Why?). \n", "\n", "\n", "Build your model below. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = Sequential()\n", "\n", "# construct the model using convolutional layers, dense fully connected layers and \n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Question I.2 (3pts). Setting up the optimizer\n", "\n", "Once you have found a good architecture for your network, split the dataset, by retaining about 90% of the images for training and 10% of each folder for test. To train your network in Keras, we need two more steps. The first step is to set up the optimizer. Here again it is a little bit up to you to decide how you want to set up the optimization. Two popular approaches are __SGD and ADAM__. You will get to choose the learning rate. This rate should however be between 1e-3 and 1e-2. Once you have set up the optimizer, we need to set up the optimization parameters. This includes the loss (we will take it to be the __categorical cross entropy__ which is the extension of the log loss to the multiclass problem). " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras.optimizers import SGD\n", "from tensorflow.keras.optimizers import Adam\n", "\n", "# set up the optimize here\n", "# Myoptimizer = SGD\n", "# Myoptimizer = Adam\n", "\n", "model.compile(loss='categorical_crossentropy',\n", " optimizer=Myoptimizer,\n", " metrics=['accuracy'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Question I.3 (2pts). Optimization\n", "\n", "The last step is to fit the network to your data. Just as any function in scikit-learn, we use a call to the function 'fit'. The training of neural networks can be done by splitting the dataset into minibatches and using a different batch at each SGD step. This process is repeated over the whole dataset. A complete screening of the dataset is called an epoch. We can then repeat this idea several times. In keras the number of epochs is stored in the 'epochs' parameter and the batch size is stored in the 'batch_size' parameter. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "batch_size = 32\n", "epochs = 30\n", "\n", "model.fit(X, t,batch_size=batch_size,epochs=epochs, validation_split=0.2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Question II (10pts): Max margin classifiers and outliers\n", "\n", "Consider the dataset below. We would like to learn a classifier for this dataset that maximizes the margin (i.e. such that the distance between the closest points to the classifier is maximized). We have seen that one can solve this problem by means of the constrained formulation\n", "\n", "\\begin{align*}\n", "\\min_{\\mathbf{\\beta}} \\quad & \\|\\mathbf{\\beta}\\|^2 \\\\\n", "\\text{subject to} \\quad & y(\\mathbf{x}^{(i)})t^{(i)} \\geq 1 \n", "\\end{align*}\n", "\n", "where $y(\\mathbf{x}^{(i)}) = \\mathbf{\\beta}^T\\mathbf{x}^{(i)} + \\beta_0$. We might sometimes want to use a (softer) unconstrained formulation. in particular, when selecting this option, we can use the following function known as the _Hinge loss_ \n", "\n", "\\begin{align*}\n", "\\max(0, 1-t^{(i)}y(\\mathbf{x}^{(i)})) = \\max(0, 1-t^{(i)}(\\mathbf{\\beta}^T\\mathbf{x}^{(i)}+\\beta_0))\n", "\\end{align*}\n", "\n", "For such a loss, we can derive a softer, unconstrained version of the problem as \n", "\n", "\\begin{align*}\n", "\\min_{\\mathbf{\\beta}} \\quad & \\|\\mathbf{\\beta}\\|^2 + \\frac{C}{N}\\sum_{i=1}^N \\max(0, 1-t^{(i)}(\\mathbf{\\beta}^T\\mathbf{x}^{(i)}+\\beta_0))\n", "\\end{align*}\n", "\n", "In short we penalize a point, only if this point lies on the wrong side of the plane." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from scipy.io import loadmat\n", "pointsClass1 = loadmat('KernelPointsEx4class1.mat')['PointsEx4class1']\n", "pointsClass2 = loadmat('KernelPointsEx4class2.mat')['PointsEx4class2']\n", "\n", "\n", "plt.scatter(pointsClass1[:,0], pointsClass1[:,1], c='r')\n", "plt.scatter(pointsClass2[:,0], pointsClass2[:,1], c='b')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Question II.1 (3pts)\n", "\n", "Start by completing the function below which should return the value and gradient of the hinge loss at a point $\\mathbf{x}^{(i)}$. What is the gradient of the hinge loss?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def HingeLoss(x):\n", " \n", " '''Returns the value and gradient of the hinge \n", " loss at the point x'''\n", " \n", " \n", " \n", " return value, gradient" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Question II.2 (7pts)\n", "\n", "Once you have the function, implement a function HingeLossSVC that takes as innput a starting weight vector $\\mathbf{\\beta}$ and intercept $\\beta_0$ as well as the set of training points and a value for the parameter $C$ and returns the maximum margin classifier. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def HingeLossSVC(beta_init, beta0_init training, C):\n", " \n", " '''Returns the maximal margin classifier for the \n", " training dataset'''\n", " \n", " \n", " \n", " \n", " \n", " return beta, beta0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Question III (5pts): Segmentation with K means\n", "\n", "Upload a picture of yourself (possibly downsampled) and apply a Kmeans segmentation in the RGB space for a few distinct numbers of centroids (e.g. 5, 10, 20). " ] }, { "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.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }