StanfordMLPython/ex4/.ipynb_checkpoints/Untitled-checkpoint.ipynb

521 lines
89 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h1> Programming Exercise 4:\n",
" Neural Networks Learning</h1>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h3>Introduction</h3>\n",
"In this exercise we will implement the backpropagation algorithm for neural networks and apply it to the task of hand-written digit recognition.\n",
"\n",
"<h4>Files included in this exercise</h4>\n",
"- ex4data1.mat - Training set of hand-written digits\n",
"- ex4weights.mat - Neural network parameters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h3>1 Neural Networks</h3>\n",
"In the previous exercise, we implemented feedforward propogation for neural networks and used it to predict handwritten digits with given weights. Here we will implement backpropagation to learn the parameters ourselves. We begin by bringing in some useful functions from our previous exercise."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# used for manipulating directory paths\n",
"import os\n",
"\n",
"# Scientific and vector computation for python\n",
"import numpy as np\n",
"\n",
"# Plotting library\n",
"from matplotlib import pyplot as plt\n",
"\n",
"# Optimization module in scipy\n",
"from scipy import optimize\n",
"\n",
"# will be used to load MATLAB mat datafile format\n",
"from scipy.io import loadmat\n",
"\n",
"# tells matplotlib to embed plots within the notebook\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def displayData(X, example_width=None, figsize=(10, 10)):\n",
" \"\"\"\n",
" Displays 2D data stored in X in a nice grid.\n",
" \"\"\"\n",
" # Compute rows, cols\n",
" if X.ndim == 2:\n",
" m, n = X.shape\n",
" elif X.ndim == 1:\n",
" n = X.size\n",
" m = 1\n",
" X = X[None] # Promote to a 2 dimensional array\n",
" else:\n",
" raise IndexError('Input X should be 1 or 2 dimensional.')\n",
"\n",
" example_width = example_width or int(np.round(np.sqrt(n)))\n",
" example_height = n / example_width\n",
"\n",
" # Compute number of items to display\n",
" display_rows = int(np.floor(np.sqrt(m)))\n",
" display_cols = int(np.ceil(m / display_rows))\n",
"\n",
" fig, ax_array = plt.subplots(display_rows, display_cols, figsize=figsize)\n",
" fig.subplots_adjust(wspace=0.025, hspace=0.025)\n",
"\n",
" ax_array = [ax_array] if m == 1 else ax_array.ravel()\n",
"\n",
" for i, ax in enumerate(ax_array):\n",
" ax.imshow(X[i].reshape(example_width, example_width, order='F'),\n",
" cmap='Greys', extent=[0, 1, 0, 1])\n",
" ax.axis('off')\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def sigmoid(z):\n",
" \"\"\"\n",
" Compute sigmoid function given the input z.\n",
" \n",
" Parameters\n",
" ----------\n",
" z : array_like\n",
" The input to the sigmoid function. This can be a 1-D vector \n",
" or a 2-D matrix. \n",
" \n",
" Returns\n",
" -------\n",
" g : array_like\n",
" The computed sigmoid function. g has the same shape as z, since\n",
" the sigmoid is computed element-wise on z.\n",
" \"\"\"\n",
" # convert input to a numpy array\n",
" z = np.array(z)\n",
"\n",
" g = 1 + np.exp(-1*z)\n",
" g = np.reciprocal(g)\n",
"\n",
" return g"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def predict(Theta1, Theta2, X):\n",
" \"\"\"\n",
" Predict the label of an input given a trained neural network\n",
" Outputs the predicted label of X given the trained weights of a neural\n",
" network(Theta1, Theta2)\n",
" \"\"\"\n",
" # Useful values\n",
" m = X.shape[0]\n",
" num_labels = Theta2.shape[0]\n",
"\n",
" # You need to return the following variables correctly\n",
" p = np.zeros(m)\n",
" h1 = sigmoid(np.dot(np.concatenate([np.ones((m, 1)), X], axis=1), Theta1.T))\n",
" h2 = sigmoid(np.dot(np.concatenate([np.ones((m, 1)), h1], axis=1), Theta2.T))\n",
" p = np.argmax(h2, axis=1)\n",
" return p"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can visualize our data using our old function displayData"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# training data stored in arrays X, y\n",
"data = loadmat(os.path.join('Data', 'ex4data1.mat'))\n",
"X, y = data['X'], data['y'].ravel()\n",
"\n",
"# set the zero digit to 0, rather than its mapped 10 in this dataset\n",
"# This is an artifact due to the fact that this dataset was used in \n",
"# MATLAB where there is no index 0\n",
"y[y == 10] = 0\n",
"\n",
"# Number of training examples\n",
"m = y.size"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjoAAAItCAYAAAAwm9DjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOy9Z5wU1bf9vfhfQTCgGDBgFgOKiFlAFFBEMWIOqIg5ICKoSFAQA0YQMWfFiIqKAoryA8WIESMiBjAhGBAkqPfe58Vz165VzClmpruru6fY3zfsz2a6u06dU6eqdqz1v//7v3Acx3Ecx8ki/6/UB+A4juM4jpMW/qDjOI7jOE5m8Qcdx3Ecx3Eyiz/oOI7jOI6TWfxBx3Ecx3GczLLCsv5z8eLFmUzJqlu3bi0A+OeffzI5vtq1a9cCgH///TeT41thhRVqAcDff/+dyfHVqVNnuZi/JUuWZHJ8K664Yi0g+/tn1ucv6/eHRYsWZXJ89erVq7W0zi06juM4juNklmVadJzlj1q1agVlrbe0PNZeSjov5H/+53+KeTgF5//9v4rvPDV9TI5TLlS2fyzv+2vauEXHcRzHcZzMUlKLTtJT7n/9139V0IX47//+b5P17dOfiKsPz/WiRYtMt2TJEpPr1q1r8oorrhj7DBA//5XNW01BrRx6XubPnw8AWGmllUy3yiqrmFwTLSEcExDNn46v3NE1x3kLWakU3Sd0L/H9wyk0un/89ddfAKL7HACsvPLKJof2V12f5Q6PW8en1yKvrySPwb///ltBly9u0XEcx3EcJ7P4g47jOI7jOJmlJK4rmrHUNDVv3jyTP/30UwDA7NmzK3xG5V133dV0DRs2NDnJJFZKquPOKcUx07R6xhlnmO7ll182effddzf5kEMOAQAcffTRpqO5NQtwrn755RfTnX322SY/++yzAIC2bdua7rHHHjN5jTXWAFD+Liw9vi5duphMN9xdd91lutq1a5tcymsq5OIGgMWLF5s8c+ZMAMCXX365zO9Ye+21TdesWTOTOdZy2TuWJuTaz7rrLRd3eKnPg96zLr30UpOHDh0KAFh33XVNt++++5q82267AQAOP/xw062zzjomp+HayZfQPfeNN94w3ffff28y168ev7ru2rRpAwCoV6+e6TjmXHGLjuM4juM4mcUfdBzHcRzHySypuq7UnLXCCtFPzZo1CwBwxx13mO711183ma4rzfpR1wjNtE2aNDHdjTfeaPLOO+9sMs3z+Zr5OJZQ9HjS36prICQnfV7dBJX9Vj7oWKZNmwYAePrpp02nrsFNN93U5Pfeew8A8Pvvv5vuvPPOM5mmyXJ33Sh6LuiyOuecc0z3/vvvm3z88ccDiFxYQHz9DRgwAEDctVKOZmY9JnXT8bpTd0hoTRYTHvPChQtN98wzz5g8duxYk6dMmQIA+Oabbyp8HojmhS5GALjvvvtMphuh1Jkuuib//vtvk0eNGgUAGD16tOn69etncuPGjZf5XSF0LaSRwVpZ7ZjQ3+oxh9x0epw6V5zfquzVxeKggw4y+Z133gEQd60+99xzJtMNfvvtt5vu1FNPNfmkk04CAKy66qqmK8VaTQoRefTRRwHE7wmadcZ5ScrU5bm65JJLTKeuZaWq8+oWHcdxHMdxMkutZT0R5dKrJam2yrvvvmtyt27dAMQtArvssovJe++9NwBgzz33NN16661n8lVXXQUAuOGGG0yn1qGuXbuazCddHWcuva4YDDV37lzTrbbaaiaHLFbjx483Ha0gADBp0qQK36VP54MGDQIAnHjiiaarzhtJLr2u+BbfunVr0zVo0MDk4cOHm7zZZpsBiM+vjv/NN98EEA9m1jcaWtxyfQspVK8rXasa7HbRRRcBAG677TbT6Rs/g7Evv/xy0915550mjxw5EkC0joHqWbfS7nXFcev533///U3+4IMPAERWPgBYc801Tc7XUpdLryu+pX/88cema9++vclq8WjUqBEAoF27dqbbeOONTea4HnzwQdMddthhJnMutY5QdcacT68rtQJqAKfuaR999BEAoH79+qbTwM0DDzwQANC0aVPTbbHFFsv8Lf0uve65x6l1hOOrbP5CVhy1DCYFGDOwfMGCBaabPn26ya+99hqAyDICAOPGjTN5xIgRAKLzAFTPSpVGrysda8hiyto6QBTE++STT5pOx0rvxsMPP2y67bff3uTK9tVC9brSNfHHH3+YzGBqXUcDBw40uU6dOgDitbs08YH3x2233dZ0ei422GADk0Nj9V5XjuM4juMsV/iDjuM4juM4maVgwcg0Y6kJWc1RdMcAwA477AAg7m5SMyvNsP/884/p1HT1wgsvAABWX31102200Ub5DSCAmhsZTKUu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p37nUB2TUhGqjKzHx/9PGl+5v11xLEmNOvkmWe7jSCJUOVjnKjR/SqgBpZ6LNKr0hhr9/fzzzybffPPNJr/44osV/paNBAFgwIABAIBtttmmwvcDNWdeQ3MGRPPz119/mY61rwBg5ZVXBhDfk8p9/KE6XldffbXpOOcA8OSTT1b4TDmOSdFjrer+k8UKymnhFh3HcRzHcTKLP+g4juM4jpNZytJ1VVXTd6nNkWpa/PDDD03ec889AcRdT9tvv73JNE2q62fVVVc1uVWrVgCAww47zHQ77LCDyaU2WbKB54MPPmi6XXbZxeTOnTsDiI9PzeR6XkpJkml41qxZAICvv/7adNqAb8sttwQQd9eVei1WRsg1qu6MP/74w2SOe+7cuaZbaaWVTN56660BAOutt57pks5FodxY/P5vv/3WdLrmdH7WXnttAPHrRF0bL7/8MgBg7NixpmvZsqXJNaVBK1shAMCMGTNMfvzxxwEA48ePN937779vcps2bQDEXT/NmjVL6zBzRtfOvHnzTB48eDAA4J577jHdBRdcYPK6664LoPyvSd1/tF0Q7yXTp0833QYbbGAy54ouSCD/sYZS9kP7Y66/EwqMTwqW53VbyPucW3Qcx3Ecx8ks/qDjOI7jOE5mWWYLiLQrXyZlfdCMl2RCDmUlVcekVqjKl3r8avpv3bo1AGDzzTc33R577GHyb7/9BgDYfffdTacdsRs2bAgAWGONNUxXHTNloSpf6vief/55k8855xwA8THXr1/fZNaxWLJkieno7gEiM/Mmm2xiuuq4C/KpjKzr7M8//zR54MCBJr/++usAgG+++cZ0Oj9PPfUUgHidDnXT5WtyzacycshFBcRdS8zGGTRokOnUzfHVV18BABYsWKDHZPJWW20FADj22GNNd+6555qsXadD5LI+ORY9pqlTp5q88cYbm0w3qc71Rx99ZHL37t0BRNcZEGXqAMBqq60GIPd5TKMyss4l5+/KK6803UMPPWTy7NmzAQCrr7666XT+6QY677zzTKffleTSJYWqjJzk4uTv6/5xyimnmMy56tOnj+l69+5tMtefzl85VUbm+L744gvTqRuOrseffvrJdA0aNDC5Y8eOAIAbbrjBdHqvyOf+oPvYu+++a3Ljxo0BAGuuueYyvzuJH3/80WS65HT83333ncnHH388gNzdqV4Z2XEcx3Gc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ClqOx6/XlLqmtOnqgw8+CAB4++23TbfffvuZfMQRRwAA9tlnH9OVu2tH1x9dwldeeaXprr/+epPpOshlzZYTuR5/Oc5fIeF5KfU41fXEaw6IrsXnnnvOdLvttpvJmmqeFXRfmjFjBgBg+vTppmvfvn26v5/qtzuO4ziO45QQf9BxHMdxHCezFM11FcqaUtfTxIkTTX755ZcBRC4sAFh33XVN3nnnnQEAp59+uukaNmxocjmapLUTMU2XTz75pOn69etX9GPKFZoh1TSs5tbK6pRwflZYYYUKnykmuk70+H/66ScAwLBhw0zHTB0A6NGjB4B4pl+pMyQ4J8yoAuIuXM3wYFaV8vjjj5vMdanurt13393kcjSt61w+/fTTAIAbbrjBdAceeKDJdHOrO67U81cZITeq7qmh60c/E5KTsurSuBZDtZtC/6+yHoceK2X9TOj/1V2icpro7/z6668mX3XVVSbvuuuuAIDtt9/edElVkmsyur/PmzfPZIZmzJ0713TuunIcx3Ecx8mRVC06+kTeu3dvk/nGqHVkVl11VZNbtWoFADj77LNNxwBJAFh99dWX+btJFV+LjT7da82fESNGAIhbCQ466CCTyyWYTtE3jpkzZwIAnn32WdNNmTLF5Ndffx0AMH/+fNOpRYuWkOeff950jRs3NjnNt+ukNy6tqTJ69GgAceuIvmXxuO+77z7TaTA5Keb88bd0fFpttWfPnibz/F577bWmu/32203mXGswczmia1LXX69evQDE95Q+ffqYvPbaawMo/zdnHZ++EU+ePBlAPNiaVkgg2j/22msv06lFrmXLlgCAzTbbzHRq5SuURTxUJ0X3BP2d3377zWT+je6Zn3zyicnfffcdAKBOnTqm+/rrr01+5ZVXAAAHH3yw6dSi0qBBA5MLtdeEzpla7L///nuT999/fwDxPbHcLYrVgev2zz//NB2tOAAwfvx4AHGPTtoWLbfoOI7jOI6TWfxBx3Ecx3GczFJw11Wo1DwQN1P9+++/AIBLLrnEdB07djSZJtV69eqZLhTsWu6o6fbTTz81+bHHHgMAnHnmmabbdNNNTS4XM6aaE3X+GIz78ccfm26NNdYweY899gAAbLLJJqZj7SMgqo901113mU7dKGkQaruhv/nEE0+YzMA4rc2kroNRo0YBADp37mw6dbMef/zxAOKtPNJes/x+dUG0aNHC5HfffdfkW265BQDwwgsvmI7XJBDVd9pzzz1NVy5rUtFg3OHDh5tMN0j37t1N17x5c5PzNY2n4RoPuT6++eYbk+mOA4CxY8cCiLtu9PPcd0aOHGm6Rx991GSuEQ0HGDRokMnrr7++ydU9V7rn0cUNAIMHDwYAfPnll8G/1TppP//8M4DwmFRW108o2FjX91lnnWXymmuuaXKhXVd6z9MEG01cOPHEEwHEr1W9/ioL3CalbmStx6f3ij/++ANAvE4c73lAFKSs5yRt3KLjOI7jOE5m8Qcdx3Ecx3EyS6quK3UHzJo1y2S6rM4//3zThaKu1ZxXE9Hj15ok5KijjjK5XOoo6HF89NFHJp9wwgkms9P1HXfcYTptIbDaaqsBiLtu3nzzTZOPOeYYAMBOO+1UqMOuFJq2tXaD1pZRMyozsDRrReekTZs2AOKuoaFDh5p8wAEHAADWW2890xXLtKzzx+wGADjppJNMpmtHXR+HHXaYyV26dAEQrm0ClM/6VHecuimYbcZWD0D1MlxCbhC9ljUbjWs8lzotek5pzmd5fAA47bTTTFY3CLNONatMr7VffvkFQDSPQHx981w9/PDDptPu9dddd53JPG+5rF89Jz/++CMAYNq0aabTOivMhAOirNukOjp0k2uLoG+//dZkujS33npr06211lrB7yo0em1o1tgGG2xgMuvn6N/quQq52dUlRpfXSiutVOEzQLp7TZI7Td2szHAcM2aM6fRYuVZ1Taa9P7pFx3Ecx3GczOIPOo7jOI7jZJaCu65CXciBeIQ5CzmpOVnNeKGo81JHmFcHHreau7VT9JZbbgkgblot9ZhCrh0toqdjoUuyWbNmptPj53ep6fWee+4xecGCBQCAHXfcMfj5YqFjorsNALbbbjsA8aweNS2/9957AIDZs2eb7rjjjjOZWR2lGFNSpp8eK03Genzq5vrPf/4DIJ6pcsYZZ5hM10EpXFjqduBxAtGaAoCjjz4aQDy7RueSJHWnnzNnDoD4/qTyKaecYnL//v0BRGumMpJM/3QTd+rUKXh8mnXF6073D3UT0LV26aWXmk7dlDz+du3amU5dfwMHDjSZbrKqrmWdn0aNGplMNxnP7dLfqW4MtvPR/w8VLNW2Hjq/3F/vvfde02kmWbEyCCtrd6HX6pIlS0xmCyTteM49B4hc4kceeaTpGA4AxNshFeoa5bHquZswYYLJp556qsncS5966inTacFSPgvo9VkZ+brm3KLjOI7jOE5mSTUYWQPM9I2Lb0Fa20IDN1muXIPVNPAu9CRYaouIwnOgAdhah+aQQw4BEA8ALPXx84ldg8r0iV1bePBNUoMyp0+fbjLL0etbptbxOOeccwDEA/SKVWdGg+IOP/xwk/Xtk3+ja1kDCx944AEA8TcyfRPn23Mpas+olUrHpy02Qi08NAiWVr3LLrvMdLoWGIS++eabB383DXiuf//9d9PxzReIzx+DxZOCPfn2rOPXcv1sJ6BWAO5ZQHxf0jL3VUEtE1OnTjWZAexq+b7//vtN3m233Sp8h7Yw0bd4Jg4kBWBzLWiwtjawTbJ0VRe9pnlNaW2tpABufi5UmwWIklm07YNaZLt16wYgfs8IeQxKBX9f74lXXHGFyby+1llnHdPp/stzoTpdk2qJzaedUKiFhybV6O/ssMMOJg8ZMgRAPACcAfJAtFdqAH3od5OatuZi3XGLjuM4juM4mcUfdBzHcRzHySypBiNriwM1g9GNo+ZiDYKlSUs72qoZsl+/fgCiUvtLf3+p4TlQ07N27d02pZW7AAAgAElEQVRnn30AxFtclLpmEI9Zj1PRwDIGmavpXMu905yvplmOGYjcAEktPtKApk8GVwLA1VdfbXJl5mw9L6wFoi5UDcwuJWriVdeLugn5NxpAqONjuw7tjq2Bvyxhr67JYtXEUHeGmr5VT5ewHocGc9Lk/8Ybb5hOO3nz8zo+DUDW+jO8bnX9hlw/XF/6dxoATHeEBoWru0rnld+hv8MAbCA6L0muU35O61ipSzeNvZRzoXOi7mBtDUE3lB6HBhaPHj0aQNw1p4kPrM+mtbu0zpW6B9Ncq/rdoXYJ7EK/9PHxvqkd13V+OP+a4KI1pTQwW89RVdBzrvv3RRddBAC47777TKd14LQFC/dFvb/rvWKLLbYAEHe36bniXsQu9QDw/PPPm6z3/Y022ghAFWpjLfN/HcdxHMdxajD+oOM4juM4TmZJ1XWl5mztZMqu0FpTQV1XNPN9/vnnpgtlANFsBQBt27Y1uRTZLqFIcM1gUjOddvouF3jM6oJhdhQQdewGgK+++gpA1KUcAJo2bWoyXXbqLtGy8vXr1wdQmjosuWZcfPLJJyYzw0y7e2vWR7l0+tZrMZR1oq6PBg0amNyxY0cAcdeG1nFh6wztXs+y/Uv/VqHgOdU9ZeeddzZ50qRJJrNTsrq21E3JdgRa+0jbLdBN8sMPP5hOs7pCnbQrg+dc66VonbHWrVsDiNeW0nUUcrGoO1+p6vpTF47uxer60MzQfOB50jWjWX3qhgl1tWYmJxCuU6Z7DbMNNSuoWO4qdRXpNaXtdJiBpK41Xas8fj0PoWtK53mrrbYKHkN10fWs65+uX/1N/f/LL7/cZGZb6Zj1/L/++usA4nOqGby873/44Yem0/1F29lUFbfoOI7jOI6TWQpu0VGSnpxZZ2TDDTc0nVpnyC677GIya+sAUYO7ESNGmE4tOqWGT70aIKdvnxxLubz5A9GxqLVJrTBaR4RP51pDZMCAASbzjVCD0bfZZhuTWZOh3NHj7N69u8kcvwYLFjOwOl9C12WoCq3WwVKLRrk09dT9Qd+IBw0aBCA+fyrzb9W6wGBLAJgyZQqAuBVaLZa5JA7w/CY1StVzXd3vrAohi7O+UWtgsI6v0DVntB6OBpvSygsAP//8M4D4OtNgXDYQ1vlnHSIgsu6oFT3tvZbfr8fJemkAMHLkSJPvvPNOAHHLmSYOsKZcqI4NEFnXtXbZNddcY7JeI9Vdq/r3Wntr3LhxAOJJCWPHjjWZAeJAVOtKj1nHwutLrz+tLE5L+bXX/n/snWXcFGX7/g8/fwHxZxc2igkWBiioGNiY2C0odoItthiomGCA3QL62IHdgt2FomIr4mMg6ov/m+c49xiZ5Y7d2dl7OL5vOD8ne8/ONdc1186cOTh0rHYNJPfaxs6rLTrGGGOMKSx+0DHGGGNMYWmy60pNmQwqAkrmNjV3lTNx03RarkR7WjCv5ukzmFAb1eVBuRLVbHfAeiRAssEezdT16MJRc3i5AGrOm7qz1DRL0yNL0evftATS2mFwzQHAeuutByC51uvJDUkacjuUC6RlHQua2AHgyiuvDJlmdtbDAGrXwkTHpHWMNNjxl19+AZA0w2uAJl0G2oJBAz+5fvv06RM6dQdUa671+qubu1LSmiKrPHHiRADJYF0NnNV9tVrzymvWvXv30D3++OMhawsErjs9Jw12ZRB5ufOknMc9qd/JfQIANt5445DZIqGcu5stLvbff//QaesFhmyoa0dba1S7kSdQmgttK9O7d++Q9beMdcY02FxrUg0fPhwAsOmmm4ZO79W0fUnntznzaouOMcYYYwqLH3SMMcYYU1ia7LpSs5LmuTPT4dZbbw2dlttPM6OrOeq7774LmVHlae4qADjggAMAAEcddVTqsWqFjknrY7BEvEbVa9ZYS3LjpHHTTTcBSLa4YCYEAFxxxRUAknU+6tG1Uw6u8WuuuSZ0Wg598803B5DM9KmX8emaVHdIWh0dZrcAyU7eNDNrnQ91IwwdOhRAsmN2rda0mrifffbZkLU7Mus7ab0N7c7Oc9WOy1qHhBlmun9VOr+85mriV9cozf10uwFJ11xD9XrSXDeaFanl+FknSOtAqZshy3Ye6gJ87bXXQtYMWroZ6cIBSm1HlHrcR3Wd6PzpbxmzUceOHRs6zXpjnapHH300dJq1yv/v2rVr6jlUa87S1lQ5NMyhc+fOAJJZcdqChVlx5Y6fxbzaomOMMcaYwlJRHZ1NNtkk5KuuugpAMh9enzi1QR0DB19//fXQaeVjPt317NkzdNpMjNVDswgQbC5a2ZFVnvXNaMkllww5D+tTc9C3SJ0fNlXV2g+06AGlN5l6DLYuh1pC/vjjDwDJRoNaIZbVo/X65L3+eC9otdJtt902ZK1fkqZTSwLvT60DcvDBB4fMgNJajpnXWpuPagPMFVZYIeRLLrkEQLLKd1o9EZ2/tDoz1Rwfj6lB0xtuuGHITFzQAGgNYNU3+nbt2gFI1p758ssvQ2aVaL75A0nrHYNAhw0bFjo9L32jrtZexfWpzSd33XXXkNX6TUuONp1VWsr+qeepdeJo8Vcrqjb45PXX3z+tE8TEkCzmqRpwLllBH0jei0sttRSA2lrkbNExxhhjTGHxg44xxhhjCkuTXVdqbtKyzAx2UxeTmtEvvvjikGl+ZtASAOy8884hMz9f3V1aM4HnkLe7QM2Fen5s96Cuj0mTJoXMIN16MjcSDSpT06PWdOB11znVmiotyWVF1HXBudJg0Q4dOoRMM3Te6y8NdUGo/MUXX4RMN4LW3thnn31CZlNPDaDX0va8/2q5ftNK7GvZe63z1L59ewANl7+v5fzxWun9pW1F2MJGa2/RRQyU3KlAKVha/57uLKB03+rf012gsp5Lc9paNAUma9CtCCTdpbvvvnvIbCZcyxYOWVAuwJYNgNVN2bdv30b/fdZzVSk8P21RoWEOrB+k7sqssUXHGGOMMYXFDzrGGGOMKSwzTc/8/OeffzbaNk1zuLot1MSmdQJohtMS2FqThG4gNVdW00w+yyyzzPS/c83E9k6TnI5f3QiaLZYFrVq1mul/59Ho8TEDhZ1ngWSJeM3gYOuH448/fpq/B7J3abRu3XomAJg6dWrVvkjPnzVZNCtGYQdf7ThdTdN6mzZtmjx/JC177N8yP6PuVnUJpd1/1Rwf568541PUtZF1HY6m0Njx6ZrjWHT/1EwqbVfBrMaOHTuGju6Q/30vgOScpl2f5t6nHF9D+6eOj53KtQu8uk41g47thPKaR+6f1dxf6gnuL035fW8K3F9uv/320GmdK9a/y8oFx993xRYdY4wxxhQWP+gYY4wxprBUVDBQoZlR3TIqq2sqjXoyPVcK3VT12CKgHDQzT5gwIXSjR48O+dhjjw25f//+AOqrYGOl6Pmz9P+JJ54YOl2fdBPU45j1PLXIoRavTPusyvWe1UFaynmWQ9cP3U3qemT22L/ltL9X6HrMO/tR1xSzwrp16xY6bbsx33zzhVyP95VpPJx3LQip5HHf2qJjjDHGmMJStWDklkTWwch505xgZL5JaisLte5oHRlarPJ688oiGDkNDXZVsn4jqSQYuSVQrWDkemVGGV9T9k/uL5rsoAHyDEDWz+aFg5FbNg5GNsYYY8wMhR90jDHGGFNYpuu6MsYYY4xpydiiY4wxxpjCMt308qIH6xY92Kzo4yt6sKfH1zKpVbB8XvD+8+9Dy2RG2T8VW3SMMcYYU1iqVjCwljD90PFFJgu0R08aXHdFWn865rT0Xh1rSynopuNIG1NLGYcxRaehPadSbNExxhhjTGFpskWnXNn4ht6CK0WPz0JTrVq1Cl3WHcGbQqUFr4pkKahntCCgth3573//CwD4/fffQ6fra+65557m71vinOk9NWXKlJDffPNNAMDpp58eunXWWSfk4447DkDymtTT+DkuPadJkyaFTEsO5xHIv0jdjI6uRa4rLczZnPWl61Pnt6W3DikKOifaroRFa7WFTaX3py06xhhjjCksftAxxhhjTGGpyHWl5v4sXFd6zF9++SXkfv36AQDOP//80C2++OKp51ht1ISm56fm0Eq7BvO49e4aKRfsSZOx6jTwk+umlmNKC2D/6KOPQr7vvvtCfvjhhwEke/HQnQUAu+22GwDg6KOPDp2uhXqfK57r5MmTQ3fEEUeEPGbMGADAr7/+Gjrtfv79998DSPYnyps0N9yNN94YumOPPTbkAw88EAAwaNCg0Kmbw0HKtUHXpPbAouu0a9euoWvbtm3Ijb2/3nnnnZDVDb3qqquGnGfIQ7nfkoYC57l/1pO7tTnBxDrmUaNGhcy9+Kabbpru8ZuCLTrGGGOMKSx+0DHGGGNMYWmy60rNTVlnWikjRowI+d577wUADBkyJHRq2srCdcDj//jjj6F7+umnQ37jjTdC/uCDD6Y5p+kdE0ie87zzzgsAOO2000LXrl271M/mAc9b5/+bb74JeejQoQCA8ePHh27DDTcMee+99wZQW9ccXYu33npr6K699tqQt95665B5/vPNN1/oPv3005D3339/AMB2220XumWXXTbkPOennDtR5eeffx4AcPbZZ4fumWeeCblNmzYAgNatW4fuueeeC3nw4MEAgAsuuCB0eWRglRsf94rLL788dOqaXGKJJQAk3eGa4UE3iboLstxTgHQXSrkM16LUcfrrr79CHjBgQMhvvfUWAOChhx4K3ayzzhpyQ+PmddX7W/ft4cOHT/PZrK9l2l6v53TzzTeHTJe6ZhXvs88+Ia+++uqJ4wDlw0iyHJfeH+om5m9Vr169Uj/La6Gu8WuuuSbknj17Aqju84UtOsYYY4wpLHVZGZlvN/oWrYHHyyyzDABggQUWCF0WT676RPnEE08AAPr27Rs6fSNsSuXYtCdV/RsGMy+66KKhO+WUU0LOow5EWmDxyy+/HLqddtopZL4dzzHHHKF74IEHQmYQqz7xK9WaS73Or7/+OgDguuuuC52+RSy99NLT/J2eB9+iAGDbbbcFkLSCqEUnT9KCFgHgxRdfDLlPnz4AkgGgm2yySci8r3766afQaWAnLarnnHNO6PII6tQ33uuvvz5k7hWPP/546PReOuusswAA999/f+g02JpB5ltttVXoqmWx0vtIg90//PBDAEnLxeyzzx6y1vyZZZZZACTHn2Z9qsegah3/1KlTQ9Z7aYMNNgCQ3D8aa8UBStdVkw10fet1q1Xiis4196BLL700dJrswH1x/vnnD91XX30V8oorrggAGDt2bOjuuuuukHv37h3y2muvDaB649QxjR49OuRDDz00ZFqKy3k0qH/11VdDp79pBx10EIDk/l3pWrZFxxhjjDGFxQ86xhhjjCksdeO6UjMXS0CrOWzjjTcOmTU/sg660uMzGPPrr78O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u3fvkNndPUu3WzXQ9fvqq6+GPHToUADAXHPNFTq6s4CSa+/EE08MXadOnULOe99JC1L9+OOPQx4xYgQAYKuttgrd4osvHvLkyZMBJMekbq487tW00Iy0ju3/1rdk9P5T1+lVV10FADjrrLNCp3sp51W7t6+77rohNye0wxYdY4wxxhQWP+gYY4wxprDUjevqlltuCfmYY44BAEycODF0NCcDLcdNoONT0/HTTz8NAPjqq69C11LGpDTFhPjDDz+E/NZbbwEAXnjhhdC9++67Ia+55poh9+/fH0D210fdVAMHDgQAPPPMM6FTN8euu+4KADj22GNDx0wBoH5Mz+Xm55tvvgEA3H777aF75JFHQp4wYQKApDmZOqA0vvnmmy906ka6/PLLQ+7cuXPib6qJjq9nz54hf/rppwCS2VdPPvlkyEOGDAGQdCc8+uijIXP/WWONNap8xtWB5/3111+H7qijjgp5tdVWAwAccsghodP1e8EFFwAAxowZE7qOHTuGnJYhkwX6Perm4F5x7bXXhm7kyJEh04116623hm7BBRec5u+322670J1yyikhzz333CFnua/o+vrwww9DHjZsGACgffv2oTvggANC1gzcNOrxt0LXCedyypQpoTvhhBNCHj58OABg8ODBoWvXrl3I3Iv4OwkAK6ywQsi67zT2WtiiY4wxxpjCUjcWHX0i55tkloGotSCt9gNQCszSOhYtKdiabypqpdHAagbWaYDrTTfdFDLfRBdYYIHQaWDhNttsE3K13yh1TiZNmhTygQceGPJHH30EAOjevXvoPvvss5AvueQSAMk5Pffcc0OuR4uOWg8322wzAEmLqb598u1J33x1TjbZZBMAyWQB/XsN/MzyWuj36P6x//77AwBeeeWV0H355Zch0+KhCQBq3XjuuecAJNfsxhtvHHLeNWd4rdXiwTkFSpZG3T91rfbt2xcA0KZNm9DlYcXRt3G9vw499FAAwDvvvBM6vb+6desGALj77rtDt/rqq4fMsfbp0yd03377bch63RhwXy0rid4Hes/ttttuIdNiretTLY7cS3XN6lwtt9xyVT3napC216gVbdSoUSHTknPwwQeHTu/lHXbYAUD5ddiccduiY4wxxpjC4gcdY4wxxhSWXF1XaoKiuwAAll56aQDJYMh6cQc0BTXnaeDgiy++CAA444wzQsfaOUB9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99+he/zxx0O+//77AQCrr7566FZeeeWQ9XclS/dyuTo3lHXPOeGEE0K+6aabACTXgl4LXX/VwhYdY4wxxhSWXCw6fBLUp81PPvkk5E8//RRAMtgq78BHfv/JJ58cuhEjRoRMKwYALLDAAgCSb9TzzTdfyJ999hmA5BP55ZdfHvKiiy6a+M56QJ/YOa7ffvstdHfffXfIl112GQDgvffeC92OO+4Y8plnngkAWHDBBUPXnDcuvvkAwLhx4wAASy+9dOjUIrj++usDAOacc86KvrMcOlecv1oFderx9S2JQcdA6S0QAO68887pnt/cc88NAHj33XdD99Zbb4W83nrrAQBWXXXV0B122GEhzzPPPKnHrTY6VlpxAKB///4AgFGjRqWe0x9//AEAOOigg0Kn91/v3r0BJO/pvC0Cev+xzsxHH30Uum233TZkBhZrMOscc8wR8lNPPQUA2GWXXUI3bNiwkPv27Rsya9VUa/w6jh9++CFk7olAyZJ49dVXh659+/Yhv/baawCA/fffP3RnnXVWyAw233333atyztVALY601AwdOjR0p556asjcS9QipcHyPNZXX30VOg3m1n01S8pV43766acBJK04P/30U8jbb789AOChhx4KHWsjAenB1JVWSbZFxxhjjDGFxQ86xhhjjCksNXNdpZUYZ70AIBmYRjOcmsbzQM+ZbgA1h9PEDwBnn312yKussgqApOlRTefHH388gFJQFpA03S622GIVn3s1SCsrDwD33nsvAODGG28Mnbo5aDrfYYcdQqcuP7p2TjnllIrOb7bZZgt53nnnBQDccMMNoaOLAgAuuugiAMmy4801h/Kz6ppUN9Hzzz8PIBkgqG6QLEgLcOSYgZI7ESi5rHT8aeen10RN58899xyAZG0aulMA4PTTTw+52jU99Jy0hcyJJ54YMl1zev/p+ZFffvklZHXd0PWh85c3Oq8MMta1rqZ/upvKtYDgWtVrsuSSS4acZR0WdfFqbabtttsu5JdffhlAycUNANdcc03IrClz4YUXhm633XYLmXXYdt5559CVa3eSJbp/qpuJdWT4L5Ccq7Q6SbqWORZ1/fGaAUDPnj0rPvfGoPfixx9/HDL3dU3Q0QBjBtGnBSgDJTf5Ouusk/pdzcEWHWOMMcYUFj/oGGOMMaaw1Mx1leYm0KwPde0sv/zyic/VAz/++CMA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\n",
"text/plain": [
"<Figure size 720x720 with 100 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Randomly select 100 data points to display\n",
"rand_indices = np.random.choice(m, 100, replace=False)\n",
"sel = X[rand_indices, :]\n",
"\n",
"displayData(sel)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that, as before, our data consists of 5000 samples of 20 by 20 pixel grayscale images of a digit. Each pixel is represented by a floating point number indicating grayscale value, and the grid of pixels is \"unrolled\" into a 400-dimensional vector. Each training sample is a row in our data matrix X, leaving us with the 5000 by 400 matrix X. We also have a 5000 dimensional vector y consiting of labels for the training set. The following figure provides a representation of our neural network model.\n",
"\n",
"![](Figures/neural_network.png)\n",
"\n",
"It has 3 layers - an input layer, a hidden layer and an output layer. Recall that our inputs are pixel values\n",
"of digit images. Since the images are of size $20 \\times 20$, this gives us 400 input layer units (not counting the extra bias unit which always outputs +1). The training data was loaded into the variables `X` and `y` above."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# Setup the parameters you will use for this exercise\n",
"input_layer_size = 400 # 20x20 Input Images of Digits\n",
"hidden_layer_size = 25 # 25 hidden units\n",
"num_labels = 10 # 10 labels, from 0 to 9\n",
"\n",
"# Load the weights into variables Theta1 and Theta2\n",
"weights = loadmat(os.path.join('Data', 'ex4weights.mat'))\n",
"\n",
"# Theta1 has size 25 x 401\n",
"# Theta2 has size 10 x 26\n",
"Theta1, Theta2 = weights['Theta1'], weights['Theta2']\n",
"\n",
"# swap first and last columns of Theta2, due to legacy from MATLAB indexing, \n",
"# since the weight file ex3weights.mat was saved based on MATLAB indexing\n",
"Theta2 = np.roll(Theta2, 1, axis=0)\n",
"\n",
"# Unroll parameters \n",
"nn_params = np.concatenate([Theta1.ravel(), Theta2.ravel()])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will now implement our neural network's cost function to return the cost. Recall that our regularized cost function is represented by $$ J(\\theta) = \\frac{1}{m} \\sum_{i=1}^{m}\\sum_{k=1}^{K} \\left[ - y_k^{(i)} \\log \\left( \\left( h_\\theta \\left( x^{(i)} \\right) \\right)_k \\right) - \\left( 1 - y_k^{(i)} \\right) \\log \\left( 1 - \\left( h_\\theta \\left( x^{(i)} \\right) \\right)_k \\right) \\right] + \\frac{\\lambda}{2 m} \\left[ \\sum_{j=1}^{25} \\sum_{k=1}^{400} \\left( \\Theta_{j,k}^{(1)} \\right)^2 + \\sum_{j=1}^{10} \\sum_{k=1}^{25} \\left( \\Theta_{j,k}^{(2)} \\right)^2 \\right] $$\n",
"\n",
"and our regularized gradient as $$ \\begin{align} \n",
"& \\frac{\\partial}{\\partial \\Theta_{ij}^{(l)}} J(\\Theta) = D_{ij}^{(l)} = \\frac{1}{m} \\Delta_{ij}^{(l)} & \\qquad \\text{for } j = 0 \\\\\n",
"& \\frac{\\partial}{\\partial \\Theta_{ij}^{(l)}} J(\\Theta) = D_{ij}^{(l)} = \\frac{1}{m} \\Delta_{ij}^{(l)} + \\frac{\\lambda}{m} \\Theta_{ij}^{(l)} & \\qquad \\text{for } j \\ge 1\n",
"\\end{align}\n",
"$$\n",
"\n",
"Note that we will *not* be regularizing the first column of $\\Theta^{(l)}$ which is used for the bias term. Furthermore, in the parameters $\\Theta_{ij}^{(l)}$, $i$ is indexed starting from 1, and $j$ is indexed starting from 0. Thus, \n",
"\n",
"$$\n",
"\\Theta^{(l)} = \\begin{bmatrix}\n",
"\\Theta_{1,0}^{(i)} & \\Theta_{1,1}^{(l)} & \\cdots \\\\\n",
"\\Theta_{2,0}^{(i)} & \\Theta_{2,1}^{(l)} & \\cdots \\\\\n",
"\\vdots & ~ & \\ddots\n",
"\\end{bmatrix}\n",
"$$\n",
"\n",
"Note that for this cost function we will need the sigmoid gradient function as well as a function to randomly initialize theta, since a zero initialization would not lead to a helpful solution."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"def sigmoidGradient(z):\n",
" \"\"\"\n",
" Computes the gradient of the sigmoid function evaluated at z. \n",
" This should work regardless if z is a matrix or a vector. \n",
" In particular, if z is a vector or matrix, you should return\n",
" the gradient for each element.\n",
" \n",
" Parameters\n",
" ----------\n",
" z : array_like\n",
" A vector or matrix as input to the sigmoid function. \n",
" \n",
" Returns\n",
" --------\n",
" g : array_like\n",
" Gradient of the sigmoid function. Has the same shape as z. \n",
" \n",
" Instructions\n",
" ------------\n",
" Compute the gradient of the sigmoid function evaluated at\n",
" each value of z (z can be a matrix, vector or scalar).\n",
" \n",
" Note\n",
" ----\n",
" We have provided an implementation of the sigmoid function \n",
" in `utils.py` file accompanying this assignment.\n",
" \"\"\"\n",
"\n",
" g = np.zeros(z.shape)\n",
"\n",
" # ====================== YOUR CODE HERE ======================\n",
"\n",
" g = np.multiply(sigmoid(z), (1-sigmoid(z)))\n",
"\n",
" # =============================================================\n",
" return g"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"def randInitializeWeights(L_in, L_out, epsilon_init=0.12):\n",
" \"\"\"\n",
" Randomly initialize the weights of a layer in a neural network.\n",
" \n",
" Parameters\n",
" ----------\n",
" L_in : int\n",
" Number of incomming connections.\n",
" \n",
" L_out : int\n",
" Number of outgoing connections. \n",
" \n",
" epsilon_init : float, optional\n",
" Range of values which the weight can take from a uniform \n",
" distribution.\n",
" \n",
" Returns\n",
" -------\n",
" W : array_like\n",
" The weight initialiatized to random values. Note that W should\n",
" be set to a matrix of size(L_out, 1 + L_in) as\n",
" the first column of W handles the \"bias\" terms.\n",
" \"\"\"\n",
" epsilon_init = 0.12\n",
" W = np.random.rand(L_out, 1 + L_in) * 2 * epsilon_init - epsilon_init\n",
"\n",
" return W"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def nnCostFunction(nn_params,\n",
" input_layer_size,\n",
" hidden_layer_size,\n",
" num_labels,\n",
" X, y, lambda_=0.0):\n",
" \"\"\"\n",
" Implements the neural network cost function and gradient for a two layer neural \n",
" network which performs classification. \n",
" \n",
" Parameters\n",
" ----------\n",
" nn_params : array_like\n",
" The parameters for the neural network which are \"unrolled\" into \n",
" a vector. This needs to be converted back into the weight matrices Theta1\n",
" and Theta2.\n",
" \n",
" input_layer_size : int\n",
" Number of features for the input layer. \n",
" \n",
" hidden_layer_size : int\n",
" Number of hidden units in the second layer.\n",
" \n",
" num_labels : int\n",
" Total number of labels, or equivalently number of units in output layer. \n",
" \n",
" X : array_like\n",
" Input dataset. A matrix of shape (m x input_layer_size).\n",
" \n",
" y : array_like\n",
" Dataset labels. A vector of shape (m,).\n",
" \n",
" lambda_ : float, optional\n",
" Regularization parameter.\n",
" \n",
" Returns\n",
" -------\n",
" J : float\n",
" The computed value for the cost function at the current weight values.\n",
" \n",
" grad : array_like\n",
" An \"unrolled\" vector of the partial derivatives of the concatenatation of\n",
" neural network weights Theta1 and Theta2.\n",
" \"\"\"\n",
" # Reshape nn_params back into the parameters Theta1 and Theta2, the weight matrices\n",
" # for our 2 layer neural network\n",
" Theta1 = np.reshape(nn_params[:hidden_layer_size * (input_layer_size + 1)],\n",
" (hidden_layer_size, (input_layer_size + 1)))\n",
"\n",
" Theta2 = np.reshape(nn_params[(hidden_layer_size * (input_layer_size + 1)):],\n",
" (num_labels, (hidden_layer_size + 1)))\n",
"\n",
" # Setup some useful variables\n",
" m = y.size\n",
" K = num_labels\n",
" J = 0\n",
" Theta1_grad = np.zeros(Theta1.shape)\n",
" Theta2_grad = np.zeros(Theta2.shape)\n",
"\n",
" # Forward Propogation\n",
" y_mat = np.identity(num_labels)[y,:]\n",
" a1 = np.concatenate([np.ones((m, 1)), X], axis=1) # Add collumn of ones to X\n",
" z2 = Theta1.dot(a1.transpose())\n",
" z2 = z2.transpose()\n",
" a2 = sigmoid(z2)\n",
" a2 = np.concatenate([np.ones((a2.shape[0], 1)), a2], axis=1)\n",
" z3 = Theta2.dot(a2.transpose())\n",
" a3 = sigmoid(z3)\n",
" a3 = a3.transpose()\n",
" p = np.argmax(a3, axis=1)\n",
" \n",
" # Unregularized cost function\n",
" log_h = np.log(a3)\n",
" prod1 = np.multiply(y_mat, log_h)\n",
" prod2 = np.multiply((1-y_mat), np.log(1-a3))\n",
" for i in range(m):\n",
" for k in range(K):\n",
" J = J + prod1[i,k]\n",
" J = J + prod2[i,k]\n",
" J = -(J/m)\n",
" temp = 0\n",
" \n",
" # Regularization term\n",
" for i in range(Theta1.shape[0]):\n",
" for j in range(1,Theta1.shape[1]):\n",
" temp = temp + (Theta1[i,j])**2\n",
" temp = temp * (lambda_/(2*m))\n",
" J = J + temp\n",
" temp = 0\n",
" for i in range(Theta2.shape[0]):\n",
" for j in range(1,Theta2.shape[1]):\n",
" temp = temp + (Theta2[i,j])**2\n",
" temp = temp * (lambda_/(2*m))\n",
" J = J + temp\n",
" \n",
" # Backpropagation\n",
" d3 = a3 - y_mat\n",
" d2 = np.multiply((d3.dot(Theta2[:,1:])), sigmoidGradient(z2))\n",
" Delta1 = d2.transpose().dot(a1)\n",
" Delta2 = d3.transpose().dot(a2)\n",
" Theta1_grad = Delta1/m\n",
" Theta2_grad = Delta2/m\n",
" \n",
" # Regularized Backpropagation\n",
" Theta1[:,0] = 0\n",
" Theta2[:,0] = 0\n",
" Theta1 = (lambda_/m)*Theta1\n",
" Theta2 = (lambda_/m)*Theta2\n",
" Theta1_grad = Theta1_grad + Theta1\n",
" Theta2_grad = Theta2_grad + Theta2\n",
" \n",
" # ================================================================\n",
" # Unroll gradients\n",
" # grad = np.concatenate([Theta1_grad.ravel(order=order), Theta2_grad.ravel(order=order)])\n",
" grad = np.concatenate([Theta1_grad.ravel(), Theta2_grad.ravel()])\n",
"\n",
" return J, grad"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can now initialize lambda and check our cost function"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cost at parameters (loaded from ex4weights): 0.383770\n",
"This value should be about : 0.383770.\n"
]
}
],
"source": [
"# Weight regularization parameter (we set this to 1 here).\n",
"lambda_ = 1\n",
"J, _ = nnCostFunction(nn_params, input_layer_size, hidden_layer_size,\n",
" num_labels, X, y, lambda_)\n",
"\n",
"print('Cost at parameters (loaded from ex4weights): %.6f' % J)\n",
"print('This value should be about : 0.383770.')"
]
}
],
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}