{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Logistic Regression with a Neural Network mindset\n", "\n", "> In this post, we will build a logistic regression classifier to recognize cats. This is the summary of lecture \"Neural Networks and Deep Learning\" from DeepLearning.AI. (slightly modified from original assignment)\n", "\n", "- toc: true \n", "- badges: true\n", "- comments: true\n", "- author: Chanseok Kang\n", "- categories: [Python, Coursera, DeepLearning.AI]\n", "- image: images/LogReg_kiank.png" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Packages\n", "\n", "First, let's run the cell below to import all the packages that you will need during this assignment. \n", "- [numpy](https://numpy.org/doc/1.20/) is the fundamental package for scientific computing with Python.\n", "- [h5py](http://www.h5py.org) is a common package to interact with a dataset that is stored on an H5 file.\n", "- [matplotlib](http://matplotlib.org) is a famous library to plot graphs in Python.\n", "- [PIL](https://pillow.readthedocs.io/en/stable/) and [scipy](https://www.scipy.org/) are used here to test your model with your own picture at the end." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import copy\n", "import matplotlib.pyplot as plt\n", "import h5py\n", "import scipy\n", "from PIL import Image\n", "from scipy import ndimage" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Dataset\n", "\n", "You are given a dataset (\"data.h5\") containing:\n", " - a training set of m_train images labeled as cat (y=1) or non-cat (y=0)\n", " - a test set of m_test images labeled as cat or non-cat\n", " - each image is of shape (num_px, num_px, 3) where 3 is for the 3 channels (RGB). Thus, each image is square (height = num_px) and (width = num_px).\n", "\n", "You will build a simple image-recognition algorithm that can correctly classify pictures as cat or non-cat." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def load_dataset():\n", " train_ds = h5py.File('./dataset/train_catvnoncat.h5', 'r')\n", " train_set_x = np.array(train_ds['train_set_x'][:])\n", " train_set_y = np.array(train_ds['train_set_y'][:])\n", " \n", " test_ds = h5py.File('./dataset/test_catvnoncat.h5', 'r')\n", " test_set_x = np.array(test_ds['test_set_x'][:])\n", " test_set_y = np.array(test_ds['test_set_y'][:])\n", " \n", " classes = np.array(test_ds['list_classes'][:])\n", " \n", " train_set_y = train_set_y.reshape((1, train_set_y.shape[0]))\n", " test_set_y = test_set_y.reshape((1, test_set_y.shape[0]))\n", " \n", " return train_set_x, train_set_y, test_set_x, test_set_y, classes" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We added \"_orig\" at the end of image datasets (train and test) because we are going to preprocess them. After preprocessing, we will end up with train_set_x and test_set_x (the labels train_set_y and test_set_y don't need any preprocessing).\n", "\n", "Each line of your train_set_x_orig and test_set_x_orig is an array representing an image. You can visualize an example by running the following code. Feel free also to change the `index` value and re-run to see other images. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "y = [0], it's a 'non-cat' picture.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "index = 30\n", "plt.imshow(train_set_x_orig[index])\n", "print (\"y = \" + str(train_set_y[:, index]) + \", it's a '\" + classes[np.squeeze(train_set_y[:, index])].decode(\"utf-8\") + \"' picture.\")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "y = [1], it's a 'cat' picture.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "index = 25\n", "plt.imshow(train_set_x_orig[index])\n", "print (\"y = \" + str(train_set_y[:, index]) + \", it's a '\" + classes[np.squeeze(train_set_y[:, index])].decode(\"utf-8\") + \"' picture.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Information from dataset\n", "We want to find out how many data do we have, and what shape each image have. Remember that `train_set_x_orig` is a numpy-array of shape (m_train, num_px, num_px, 3)." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of training examples: m_train = 209\n", "Number of testing examples: m_test = 50\n", "Height/Width of each image: num_px = 64\n", "Each image is of size: (64, 64, 3)\n", "train_set_x shape: (209, 64, 64, 3)\n", "train_set_y shape: (1, 209)\n", "test_set_x shape: (50, 64, 64, 3)\n", "test_set_y shape: (1, 50)\n" ] } ], "source": [ "m_train = train_set_x_orig.shape[0]\n", "m_test = test_set_x_orig.shape[0]\n", "num_px = train_set_x_orig.shape[1]\n", "\n", "print (\"Number of training examples: m_train = \" + str(m_train))\n", "print (\"Number of testing examples: m_test = \" + str(m_test))\n", "print (\"Height/Width of each image: num_px = \" + str(num_px))\n", "print (\"Each image is of size: (\" + str(num_px) + \", \" + str(num_px) + \", 3)\")\n", "print (\"train_set_x shape: \" + str(train_set_x_orig.shape))\n", "print (\"train_set_y shape: \" + str(train_set_y.shape))\n", "print (\"test_set_x shape: \" + str(test_set_x_orig.shape))\n", "print (\"test_set_y shape: \" + str(test_set_y.shape))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For convenience, you should now reshape images of shape (num_px, num_px, 3) in a numpy-array of shape (num_px $*$ num_px $*$ 3, 1). After this, our training (and test) dataset is a numpy-array where each column represents a flattened image. There should be m_train (respectively m_test) columns." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Reshape dataset\n", "\n", "Reshape the training and test data sets so that images of size (num_px, num_px, 3) are flattened into single vectors of shape (num\\_px $*$ num\\_px $*$ 3, 1).\n", "\n", "A trick when you want to flatten a matrix X of shape (a,b,c,d) to a matrix X_flatten of shape (b$*$c$*$d, a) is to use: \n", "```python\n", "X_flatten = X.reshape(X.shape[0], -1).T # X.T is the transpose of X\n", "```" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "train_set_x_flatten shape: (12288, 209)\n", "train_set_y shape: (1, 209)\n", "test_set_x_flatten shape: (12288, 50)\n", "test_set_y shape: (1, 50)\n" ] } ], "source": [ "train_set_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0], -1).T\n", "test_set_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0], -1).T\n", "\n", "print (\"train_set_x_flatten shape: \" + str(train_set_x_flatten.shape))\n", "print (\"train_set_y shape: \" + str(train_set_y.shape))\n", "print (\"test_set_x_flatten shape: \" + str(test_set_x_flatten.shape))\n", "print (\"test_set_y shape: \" + str(test_set_y.shape))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To represent color images, the red, green and blue channels (RGB) must be specified for each pixel, and so the pixel value is actually a vector of three numbers ranging from 0 to 255.\n", "\n", "One common preprocessing step in machine learning is to center and **standardize** your dataset, meaning that you substract the mean($\\mu$) of the whole numpy array from each example, and then divide each example by the standard deviation($\\sigma$) of the whole numpy array. But for picture datasets, it is simpler and more convenient and works almost as well to just divide every row of the dataset by 255 (which is the maximum value of a pixel channel).\n", "\n", "Let's standardize our dataset." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "train_set_x = train_set_x_flatten / 255.\n", "test_set_x = test_set_x_flatten / 255." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**What you need to remember:**\n", "\n", "Common steps for pre-processing a new dataset are:\n", "- Figure out the dimensions and shapes of the problem (m_train, m_test, num_px, ...)\n", "- Reshape the datasets such that each example is now a vector of size (num_px \\* num_px \\* 3, 1)\n", "- \"Standardize\" the data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## General Architecture of the learning algorithm\n", "\n", "It's time to design a simple algorithm to distinguish cat images from non-cat images.\n", "\n", "You will build a Logistic Regression, using a Neural Network mindset. The following Figure explains why **Logistic Regression is actually a very simple Neural Network!**\n", "\n", "\n", "\n", "**Mathematical expression of the algorithm**:\n", "\n", "For one example $x^{(i)}$:\n", "$$z^{(i)} = w^T x^{(i)} + b \\tag{1}$$\n", "$$\\hat{y}^{(i)} = a^{(i)} = sigmoid(z^{(i)})\\tag{2}$$ \n", "$$ \\mathcal{L}(a^{(i)}, y^{(i)}) = - y^{(i)} \\log(a^{(i)}) - (1-y^{(i)} ) \\log(1-a^{(i)})\\tag{3}$$\n", "\n", "The cost is then computed by summing over all training examples:\n", "$$ J = \\frac{1}{m} \\sum_{i=1}^m \\mathcal{L}(a^{(i)}, y^{(i)})\\tag{6}$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Building the parts of our algorithm ## \n", "\n", "The main steps for building a Neural Network are:\n", "1. Define the model structure (such as number of input features) \n", "2. Initialize the model's parameters\n", "3. Loop:\n", " - Calculate current loss (forward propagation)\n", " - Calculate current gradient (backward propagation)\n", " - Update parameters (gradient descent)\n", "\n", "You often build 1-3 separately and integrate them into one function we call `model()`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sigmoid \n", "\n", "we need to implement implement `sigmoid()`. As you've seen in the figure above, you need to compute $$sigmoid(z) = \\frac{1}{1 + e^{-z}}$$ for $z = w^T x + b$ to make predictions." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def sigmoid(z):\n", " \"\"\"\n", " Compute the sigmoid of z\n", "\n", " Arguments:\n", " z -- A scalar or numpy array of any size.\n", "\n", " Return:\n", " s -- sigmoid(z)\n", " \"\"\"\n", " s = 1 / (1 + np.exp(-z))\n", " return s" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sigmoid([0, 2]) = [0.5 0.88079708]\n" ] } ], "source": [ "print (\"sigmoid([0, 2]) = \" + str(sigmoid(np.array([0,2]))))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.62245933 0.5 0.88079708]\n" ] } ], "source": [ "x = np.array([0.5, 0, 2.0])\n", "output = sigmoid(x)\n", "print(output)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Initializing parameters\n", "\n", "Now we need to implement parameter initialization in the cell below. You have to initialize w as a vector of zeros. " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def initialize_with_zeros(dim):\n", " \"\"\"\n", " This function creates a vector of zeros of shape (dim, 1) for w and initializes b to 0.\n", " \n", " Argument:\n", " dim -- size of the w vector we want (or number of parameters in this case)\n", " \n", " Returns:\n", " w -- initialized vector of shape (dim, 1)\n", " b -- initialized scalar (corresponds to the bias) of type float\n", " \"\"\"\n", " w = np.zeros(shape=(dim, 1), dtype=np.float32)\n", " b = 0.0\n", " \n", " return w, b" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "w = [[0.]\n", " [0.]]\n", "b = 0.0\n" ] } ], "source": [ "dim = 2\n", "w, b = initialize_with_zeros(dim)\n", "\n", "assert type(b) == float\n", "print (\"w = \" + str(w))\n", "print (\"b = \" + str(b))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Forward and Backward propagation\n", "\n", "Now that your parameters are initialized, you can do the \"forward\" and \"backward\" propagation steps for learning the parameters. \n", "Note that, Forward Propagation:\n", "- You get X\n", "- You compute $A = \\sigma(w^T X + b) = (a^{(1)}, a^{(2)}, ..., a^{(m-1)}, a^{(m)})$\n", "- You calculate the cost function: $J = -\\frac{1}{m}\\sum_{i=1}^{m}(y^{(i)}\\log(a^{(i)})+(1-y^{(i)})\\log(1-a^{(i)}))$\n", "\n", "Here are the two formulas you will be using: \n", "\n", "$$ \\frac{\\partial J}{\\partial w} = \\frac{1}{m}X(A-Y)^T\\tag{7}$$\n", "$$ \\frac{\\partial J}{\\partial b} = \\frac{1}{m} \\sum_{i=1}^m (a^{(i)}-y^{(i)})\\tag{8}$$" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "def propagate(w, b, X, Y):\n", " \"\"\"\n", " Implement the cost function and its gradient for the propagation explained above\n", "\n", " Arguments:\n", " w -- weights, a numpy array of size (num_px * num_px * 3, 1)\n", " b -- bias, a scalar\n", " X -- data of size (num_px * num_px * 3, number of examples)\n", " Y -- true \"label\" vector (containing 0 if non-cat, 1 if cat) of size (1, number of examples)\n", "\n", " Return:\n", " cost -- negative log-likelihood cost for logistic regression\n", " dw -- gradient of the loss with respect to w, thus same shape as w\n", " db -- gradient of the loss with respect to b, thus same shape as b\n", " \n", " Tips:\n", " - Write your code step by step for the propagation. np.log(), np.dot()\n", " \"\"\"\n", " \n", " m = X.shape[1]\n", " \n", " # forward propagation (from x to cost)\n", " # compute activation\n", " A = sigmoid(w.T @ X + b)\n", " # compute cost by using np.dot to perform multiplication\n", " cost = np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A)) / -m\n", " \n", " # backward propagation (to find grad)\n", " dw = X @ (A - Y).T / m\n", " db = np.sum(A - Y) / m\n", " \n", " cost = np.squeeze(np.array(cost))\n", " \n", " grads = {'dw': dw, 'db': db}\n", " return grads, cost" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dw = [[ 0.25071532]\n", " [-0.06604096]]\n", "db = -0.12500404500439652\n", "cost = 0.15900537707692405\n" ] } ], "source": [ "w = np.array([[1.], [2]])\n", "b = 1.5\n", "X = np.array([[1., -2., -1.], [3., 0.5, -3.2]])\n", "Y = np.array([[1, 1, 0]])\n", "grads, cost = propagate(w, b, X, Y)\n", "\n", "assert type(grads[\"dw\"]) == np.ndarray\n", "assert grads[\"dw\"].shape == (2, 1)\n", "assert type(grads[\"db\"]) == np.float64\n", "\n", "\n", "print (\"dw = \" + str(grads[\"dw\"]))\n", "print (\"db = \" + str(grads[\"db\"]))\n", "print (\"cost = \" + str(cost))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Optimization\n", "You have initialized your parameters. and also able to compute a cost function and its gradient. Now, you want to update the parameters using gradient descent." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "def optimize(w, b, X, Y, num_iterations=100, learning_rate=0.009, print_cost=False):\n", " \"\"\"\n", " This function optimizes w and b by running a gradient descent algorithm\n", " \n", " Arguments:\n", " w -- weights, a numpy array of size (num_px * num_px * 3, 1)\n", " b -- bias, a scalar\n", " X -- data of shape (num_px * num_px * 3, number of examples)\n", " Y -- true \"label\" vector (containing 0 if non-cat, 1 if cat), of shape (1, number of examples)\n", " num_iterations -- number of iterations of the optimization loop\n", " learning_rate -- learning rate of the gradient descent update rule\n", " print_cost -- True to print the loss every 100 steps\n", " \n", " Returns:\n", " params -- dictionary containing the weights w and bias b\n", " grads -- dictionary containing the gradients of the weights and bias with respect to the cost function\n", " costs -- list of all the costs computed during the optimization, this will be used to plot the learning curve.\n", " \n", " Tips:\n", " You basically need to write down two steps and iterate through them:\n", " 1) Calculate the cost and the gradient for the current parameters. Use propagate().\n", " 2) Update the parameters using gradient descent rule for w and b.\n", " \"\"\"\n", " \n", " w = copy.deepcopy(w)\n", " b = copy.deepcopy(b)\n", " \n", " costs = []\n", " \n", " for i in range(num_iterations):\n", " # cost and gradient calculation\n", " grads, cost = propagate(w, b, X, Y)\n", " \n", " # Retrieve derivatives from grads\n", " dw = grads[\"dw\"]\n", " db = grads[\"db\"]\n", " \n", " # update rule\n", " w -= learning_rate * dw\n", " b -= learning_rate * db\n", " \n", " # Record the costs\n", " if i % 100 == 0:\n", " costs.append(cost)\n", " \n", " # Print the cost every 100 training iterations\n", " if print_cost:\n", " print (\"Cost after iteration %i: %f\" %(i, cost))\n", " \n", " params = {\"w\": w,\n", " \"b\": b}\n", " \n", " grads = {\"dw\": dw,\n", " \"db\": db}\n", " \n", " return params, grads, costs" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "w = [[0.35627617]\n", " [0.60199214]]\n", "b = -0.14956979978997242\n", "dw = [[-0.21189539]\n", " [-0.33376766]]\n", "db = -0.13290329100668044\n", "Costs = [array(0.5826722)]\n" ] } ], "source": [ "params, grads, costs = optimize(w, b, X, Y, num_iterations=100, learning_rate=0.009, print_cost=False)\n", "\n", "print (\"w = \" + str(params[\"w\"]))\n", "print (\"b = \" + str(params[\"b\"]))\n", "print (\"dw = \" + str(grads[\"dw\"]))\n", "print (\"db = \" + str(grads[\"db\"]))\n", "print(\"Costs = \" + str(costs))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Predict\n", "\n", "The previous function will output the learned w and b. We are able to use w and b to predict the labels for a dataset X. Implement the `predict()` function. There are two steps to computing predictions:\n", "\n", "1. Calculate $\\hat{Y} = A = \\sigma(w^T X + b)$\n", "\n", "2. Convert the entries of a into 0 (if activation <= 0.5) or 1 (if activation > 0.5), stores the predictions in a vector `Y_prediction`. If you wish, you can use an `if`/`else` statement in a `for` loop (though there is also a way to vectorize this). " ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "def predict(w, b, X):\n", " '''\n", " Predict whether the label is 0 or 1 using learned logistic regression parameters (w, b)\n", " \n", " Arguments:\n", " w -- weights, a numpy array of size (num_px * num_px * 3, 1)\n", " b -- bias, a scalar\n", " X -- data of size (num_px * num_px * 3, number of examples)\n", " \n", " Returns:\n", " Y_prediction -- a numpy array (vector) containing all predictions (0/1) for the examples in X\n", " '''\n", " \n", " m = X.shape[1]\n", " Y_prediction = np.zeros((1, m))\n", " w = w.reshape(X.shape[0], 1)\n", " \n", " # compute vector 'A' predicting the probabilities of a cat being present in the picture\n", " A = sigmoid(w.T @ X + b)\n", " \n", " for i in range(A.shape[1]):\n", " # convert probabilities A[0, i] to actual predictions p[0, i]\n", " if A[0, i] > 0.5:\n", " Y_prediction[0, i] = 1\n", " else:\n", " Y_prediction[0, i] = 0\n", " \n", " return Y_prediction" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "predictions = [[1. 1. 0.]]\n" ] } ], "source": [ "w = np.array([[0.1124579], [0.23106775]])\n", "b = -0.3\n", "X = np.array([[1., -1.1, -3.2],[1.2, 2., 0.1]])\n", "print (\"predictions = \" + str(predict(w, b, X)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**What to remember:**\n", " \n", "You've implemented several functions that:\n", "- Initialize (w,b)\n", "- Optimize the loss iteratively to learn parameters (w,b):\n", " - Computing the cost and its gradient \n", " - Updating the parameters using gradient descent\n", "- Use the learned (w,b) to predict the labels for a given set of examples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Merge all functions into a model\n", "\n", "You will now see how the overall model is structured by putting together all the building blocks (functions implemented in the previous parts) together, in the right order." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "def model(X_train, Y_train, X_test, Y_test, num_iterations=2000, learning_rate=0.5, print_cost=False):\n", " \"\"\"\n", " Builds the logistic regression model by calling the function you've implemented previously\n", " \n", " Arguments:\n", " X_train -- training set represented by a numpy array of shape (num_px * num_px * 3, m_train)\n", " Y_train -- training labels represented by a numpy array (vector) of shape (1, m_train)\n", " X_test -- test set represented by a numpy array of shape (num_px * num_px * 3, m_test)\n", " Y_test -- test labels represented by a numpy array (vector) of shape (1, m_test)\n", " num_iterations -- hyperparameter representing the number of iterations to optimize the parameters\n", " learning_rate -- hyperparameter representing the learning rate used in the update rule of optimize()\n", " print_cost -- Set to True to print the cost every 100 iterations\n", " \n", " Returns:\n", " d -- dictionary containing information about the model.\n", " \"\"\"\n", " w, b = initialize_with_zeros(dim=X_train.shape[0])\n", " \n", " # Gradient descent\n", " params, grads, costs = optimize(w, b, X_train, Y_train, num_iterations, learning_rate, print_cost)\n", " \n", " # Retrieve parameters w and b from dictionary \"params\"\n", " w = params['w']\n", " b = params['b']\n", " \n", " # Predict test/train set examples\n", " Y_prediction_test = predict(w, b, X_test)\n", " Y_prediction_train = predict(w, b, X_train)\n", " \n", " # Print train/test Errors\n", " if print_cost:\n", " print(\"train accuracy: {} %\".format(100 - np.mean(np.abs(Y_prediction_train - Y_train)) * 100))\n", " print(\"test accuracy: {} %\".format(100 - np.mean(np.abs(Y_prediction_test - Y_test)) * 100))\n", "\n", " \n", " d = {\"costs\": costs,\n", " \"Y_prediction_test\": Y_prediction_test, \n", " \"Y_prediction_train\" : Y_prediction_train, \n", " \"w\" : w, \n", " \"b\" : b,\n", " \"learning_rate\" : learning_rate,\n", " \"num_iterations\": num_iterations}\n", " \n", " return d" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cost after iteration 0: 0.693147\n", "Cost after iteration 100: 0.584508\n", "Cost after iteration 200: 0.466949\n", "Cost after iteration 300: 0.376007\n", "Cost after iteration 400: 0.331463\n", "Cost after iteration 500: 0.303273\n", "Cost after iteration 600: 0.279880\n", "Cost after iteration 700: 0.260042\n", "Cost after iteration 800: 0.242941\n", "Cost after iteration 900: 0.228004\n", "Cost after iteration 1000: 0.214820\n", "Cost after iteration 1100: 0.203078\n", "Cost after iteration 1200: 0.192544\n", "Cost after iteration 1300: 0.183033\n", "Cost after iteration 1400: 0.174399\n", "Cost after iteration 1500: 0.166521\n", "Cost after iteration 1600: 0.159305\n", "Cost after iteration 1700: 0.152667\n", "Cost after iteration 1800: 0.146542\n", "Cost after iteration 1900: 0.140872\n", "train accuracy: 99.04306220095694 %\n", "test accuracy: 70.0 %\n" ] } ], "source": [ "logistic_regression_model = model(train_set_x, train_set_y, test_set_x, test_set_y, num_iterations=2000, learning_rate=0.005, print_cost=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Comment**: Training accuracy is close to 100%. This is a good sanity check: your model is working and has high enough capacity to fit the training data. Test accuracy is 70%. It is actually not bad for this simple model, given the small dataset we used and that logistic regression is a linear classifier. \n", "\n", "Also, you see that the model is clearly overfitting the training data. Later in this specialization you will learn how to reduce overfitting, for example by using regularization. Using the code below (and changing the `index` variable) you can look at predictions on pictures of the test set." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "y = 1, you predicted that it is a \"cat\" picture.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Example of a picture that was wrongly classified.\n", "index = 1\n", "plt.imshow(test_set_x[:, index].reshape((num_px, num_px, 3)))\n", "print (\"y = \" + str(test_set_y[0,index]) + \", you predicted that it is a \\\"\" + classes[int(logistic_regression_model['Y_prediction_test'][0,index])].decode(\"utf-8\") + \"\\\" picture.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's also plot the cost function and the gradients." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot learning curve (with costs)\n", "costs = np.squeeze(logistic_regression_model['costs'])\n", "plt.plot(costs)\n", "plt.ylabel('cost')\n", "plt.xlabel('iterations (per hundreds)')\n", "plt.title(\"Learning rate =\" + str(logistic_regression_model[\"learning_rate\"]))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Interpretation**:\n", "You can see the cost decreasing. It shows that the parameters are being learned. However, you see that you could train the model even more on the training set. Try to increase the number of iterations in the cell above and rerun the cells. You might see that the training set accuracy goes up, but the test set accuracy goes down. This is called overfitting. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Further analysis\n", "\n", "Let's analyze it further, and examine possible choices for the learning rate $\\alpha$. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Choice of learning rate\n", "\n", "**Reminder**:\n", "In order for Gradient Descent to work you must choose the learning rate wisely. The learning rate $\\alpha$ determines how rapidly we update the parameters. If the learning rate is too large we may \"overshoot\" the optimal value. Similarly, if it is too small we will need too many iterations to converge to the best values. That's why it is crucial to use a well-tuned learning rate.\n", "\n", "Let's compare the learning curve of our model with several choices of learning rates. Run the cell below. This should take about 1 minute. Feel free also to try different values than the three we have initialized the `learning_rates` variable to contain, and see what happens. " ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training a model with learning rate: 0.01\n", "\n", "-------------------------------------------------------\n", "\n", "Training a model with learning rate: 0.001\n", "\n", "-------------------------------------------------------\n", "\n", "Training a model with learning rate: 0.0001\n", "\n", "-------------------------------------------------------\n", "\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learning_rates = [0.01, 0.001, 0.0001]\n", "models = {}\n", "\n", "for lr in learning_rates:\n", " print (\"Training a model with learning rate: \" + str(lr))\n", " models[str(lr)] = model(train_set_x, train_set_y, test_set_x, test_set_y, num_iterations=1500, learning_rate=lr, print_cost=False)\n", " print ('\\n' + \"-------------------------------------------------------\" + '\\n')\n", "\n", "for lr in learning_rates:\n", " plt.plot(np.squeeze(models[str(lr)][\"costs\"]), label=str(models[str(lr)][\"learning_rate\"]))\n", "\n", "plt.ylabel('cost')\n", "plt.xlabel('iterations (hundreds)')\n", "\n", "legend = plt.legend(loc='upper center', shadow=True)\n", "frame = legend.get_frame()\n", "frame.set_facecolor('0.90')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**What to remember from this assignment:**\n", "1. Preprocessing the dataset is important.\n", "2. You implemented each function separately: initialize(), propagate(), optimize(). Then you built a model().\n", "3. Tuning the learning rate (which is an example of a \"hyperparameter\") can make a big difference to the algorithm." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bibliography:\n", "- http://www.wildml.com/2015/09/implementing-a-neural-network-from-scratch/\n", "- https://stats.stackexchange.com/questions/211436/why-do-we-normalize-images-by-subtracting-the-datasets-image-mean-and-not-the-c" ] } ], "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.10" } }, "nbformat": 4, "nbformat_minor": 4 }