{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.rcParams['axes.labelsize'] = 14" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Neural Networks\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Activation functions\n", "\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# the common activation functions:\n", "\n", "def logistic(x):\n", " return 1/(1 + np.exp(-x))\n", "\n", "def tanh(x):\n", " return np.tanh(x)\n", "\n", "def relu(x):\n", " return np.maximum(x, 0)\n", "\n", "# and their derivatives:\n", "\n", "def tanh_deriv(x):\n", " return 1.0 - np.tanh(x)**2\n", "\n", "def logistic_deriv(x):\n", " return logistic(x)*(1-logistic(x))\n", "\n", "def relu_deriv(x) :\n", " deriv = x.copy()\n", " deriv[deriv < 0] = 0\n", " return deriv\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "
" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "Text(0.5,1,'Activation functions')" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "[-5, 5, -1.2, 1.2]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "Text(0.5,1,'Derivatives')" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "[-5, 5, -0.2, 1.2]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAicAAAEJCAYAAABPHocGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzsnXd8VFX2wL930gMpQAglBEMXpIcm\nsBJUFBRkbbhg2agr1l3L2lZ37T93dVfBXVEsKK669o4ICBKUopSAIB0hkFATII30mfv7484kk8ok\nUwPny+d93pv37rv3vCHvzXnnnHuO0lojCIIgCIIQKFj8LYAgCIIgCIIzopwIgiAIghBQiHIiCIIg\nCEJAIcqJIAiCIAgBhSgngiAIgiAEFKKcCIIgCIIQUIhy0oxQSmUope71wTiPKaV+8cE4FqXUK0qp\no0oprZRK8faYJ5FnrlJqnj9lEIRTGaVUqlKq0EdjaaXUFb4YS/A8SvKceAel1CBgLfCj1npUI899\nDLhCa923xv62wAmtdZGHZEwC9gBDtdZrnfa3BMK01kc9MU4D408EPgVSgN3AMa11mTfHtI+bAiwF\n2mqtc5z2x2DuiVxvyyAIgYhSai7we/vHCuA4sBn4GHhVa13uZv8RQJTW+og7/dTocy4Qp7WeWGN/\ne+C41rrUU2MJvkMsJ97jJuAloK9SqrcnOtRaZ3tKMTnJOIXeVkzsdAcOaq1Xaq0P+UIxaQitdZ4o\nJoLAYqADkARcAHwFPA78oJRq0dROlVIhWutiTyomDWF/pohi0lzRWsvi4QWIAHKB/sAc4F91tOkI\nvAscBYqADcBYIBXQNZZU+zkZwL327feAT2r0aQEygbvtn8cDP2Defo4BC4HeTu1rjpNm3/8Y8EuN\nfv9m77sU2ARMdjqeZD//cuBb+/VsAcY18B3NrTF2hn1/GvBiHW3nOX1Owyh+TwM5wBHgX4DFqU2o\n/fheu8y7gT85yeq8zK1nnDBgJnAYKAF+BEY7HU+xn38e8JP9utcCg53axABv22Ussctxl7//RmWR\npa6l5j3gtL8vUAY8bv8cCjwDZAEngDXAhU7tHffGRcBq+7kTMc+3QnubnvY2/WqMNd1+X4cAQZhn\n6B6gGNgJ3O+41+3Pqpr3c4r9mMZYoAFWAc/VGCfa3uelLl5TCPBv4ID9mZIJ/MPf/2en6iKWE+9w\nBbBXa70R88N0nVIqxHHQ/vaxDPNDeSnQD3jCfvgD4DlgO+btpYN9X03eAS5WSsU67Rtjb/+e/XML\nzI/rMMzDIg/4SikVaj8+zL4ebz/vsnqu507gPuABu6yfAZ8qpQbWaPd/mJt3AObGft/uIqqvzycw\nD4IOwNB62tXH1Riz80jgDuAu4Cqn428B1wH3AL2BGzEKYyZGiQI4yz72nfWM8ay9zxuAQRilbIFS\nqkONdn8HHgQGY5TNd5VSyn7sKcx3NhE4097X/kZeqyD4Fa31L8ACqu6dNzHPm2mYv++3MM+WATVO\nfQb4K+Zv/6cafe7AKPNX1zjnauADbVxIFsz9MgVzHz8MPARcb2/7L+BDqqw9HYCVdVzCO8DvlFLO\nv3mXY5STr128pj9hnte/A3pgng3b6xhL8AT+1o5OxQWjeDgsHApj8bjc6fhNQAHGT1rX+Y/hZLlw\n2p/h1G8w5m38RqfjrwMLG5CrBWDF/vZPlRVhSEPjYx4Oj9Rokwa8U6Ofm52OJ9j3jW5AnnuxW0xq\n9OuK5WRVjTbfAq/bt3vYxx5fz7gp9uNx9Y1j/67KgOucjgcBvwJP1ejH+e1qlH1fJ/vnL4E3/f03\nKYssriw177Uax/6BsQ52A2xA5xrHPwdesm877o3La7RJxW45sX++E2PddMQ/Jtr7PrsBGf8BLD6Z\nzFS3nLSx38/nOR1fDLxi33blmv4NLHHIKot3F7GceBilVHfMD9T/ALT5q34X+INTs0HARu0UjNlY\ntNYVGIvK1fZxwzBvAu84ydJNKfU/pdSvSql8jHvCAnRuxPVEY1xQK2ocWg70qbFvo9P2Afs63tWx\nGsnGGp8POI01CPOgWepG/90wZtzK69ZaWzHm4cZc98vAFKXUz0qpfymlxrghkyD4E4X5wR9s396i\nlCp0LMDFmPvGmbU0zHuY58tv7J+nAbu11qsqB1XqFqXUWqVUtn2cu2nEMwxAmxi6hVQ9Lztg3OiO\n56Ur1zQXGAjsUErNUkpdXMMSI3iQYH8LcAryB8wb9r4qyz4KQCmVqLXOdHz2AO8AK5VSCcBwjM/0\nM6fjX2GsHjfb1xWYWJBQGk9d07pq7quM5Ndaa/v1N/bmtVH7+wmpo13NWQPaaSxPfL+OPhp13U7H\nLABa62+UUmcAEzCxKV8rpT7SWl+PIDQv+mBipiyYv/Oh1L4Pi2t8PtFQh1rrI0qpxRil4Xv7+l3H\ncaXUVRjX9L0Yd00+cDvGvdJY3gFeVUrdBkzFuHiX24+d9Jq01un2GY7jgXMxbp+flVLjtNa2Jsgj\nNIBofR5EKRWMmYb3F4yG7VgGYN6uHT9I6UB/pVRcPV2VYRScBtFa/4RxM0zF3NSfa60L7bK0wfho\nn9ZaL9ZabwWiqK6QOmbH1DuW1jofYw0YXePQaIyi42myMX5jZ2r6sU9GOuZve2w9x0963cAue7vK\n61ZKBQFn08jr1lrnaK3f1lqnYmJffm+3dAlCs0Ap1Rfzo/wxsB6jvLfXWu+qsTQlnuod4EqlVDIm\n1uMdp2OjgZ+01i9qrdO11ruobZ1x6XkJfGFfT8SuBNkt27h6TVrrAq31R1rrWzFWlXMxsw4FDyOW\nE89yMRAHvKZrTMVVSr0P3KqUegrj8nkQ+Fwp9RdMUGg/oEBrvRQTW3KGUmowsM++v74pcQ6XURLV\n3yaOYyLeb1JKZWJiQP6JsZ44OIJ5K7hQKZUBlGit8+oY45/AE0qpncA64BqMGTb5ZF9IE/gOmKmU\nugQTbHYzxg+d4WoHWuudSqkPgdeVUndilJVOQJLW+m2Mj1tjAoq/AoodSp1THyeUUi8D/1BK5WBm\nC9wNtMPMFHIJpdQT9vE3Y+63yzBma5niKAQqYfYcIRagLcbi9xDm3v+X/d54F5irlPoz5u+7NfZ8\nRVrrTxs53mfAbMysnNVa651Ox3YAqUqpCZgXht9hglaPO7XJACYopXphAtLzdB35WLTWJUqpTzEB\nugMwzzHHsR0nuyal1D3AQczMynKMCyof8/wWPIxYTjzLjcDSmoqJnY+AM4DztdYnMDfYfozrZTMm\nj4BDi/8EmI8JvsrGWEbq4x2gF2YmzreOnXYz41WY6cy/ALMw04FLndpUYCLQ/4CxjnxB3fwbo6A8\na+/rUkyg24YG5GoqbzgtK4BCqruqXOU6jBL4b2Abxl8cA2B/E3oUM7voMPBiPX08gJkJ8CbmgdQf\nE2R7sBFylNrH+RlzPVHApMZdiiD4lPMxP8L7MM+gSzDPp3Pszy4wVuA3Mc+EbcA84ByM4t8otMnd\n9BlGYXinxuFXMPfg/zAzAJMwsxmdeQ3YiolvycbE/NXH2/Zx0u3WZGdOdk0FmFmLqzHKy0BggvZB\n7qnTEckQKwiCIAhCQCGWE0EQBEEQAgpRTgRBCAiUUm8opY7UV3RSKXW1UmqjfVlZR8IvQRBOEUQ5\nEQQhUJiLmRFSH3uAMVrr/sCTwKu+EEoQBN8js3UEQQgItNbf2/NI1HfcOS35j5gZWIIgnIIErHIS\nFxenk5KSvNL3iRMnaNGiycU1/YbI7Tuao8zgXbnXrVuXo7Vu65XOG8+NwDd1HVBKTccUjyMiIiI5\nMTHRKwLYbDYsluZnfBa5G6AcY58LBrq6351817XZsWOHa88Rf+fPr29JTk7W3mLp0qVe69ubiNz1\nkzMvR2+eulnnzM/xSH/yXdcGWKu9fN9jporWqitVo81YzNTRNifrT54jtRG56+fowqN6KUv1+pT1\nHulPvuvauPocaX4qnSDUQc5XORx57wiFPxeevLHQbFFK9ccUuJys684nJAhNpmiHSVkS0SPCz5II\nopwIpwS5abkAxKbE+lkSwVsopToDnwLXaq13+Fse4dSjeKcpDRTRU5QTfxOwMSeC4CqlB0op3l5M\nUMsgopKj/C2O0ESUUu9h0oXHKaWyMFl8QwC01rOBR4A2wEv2opIVWush/pFWOBUp3mGUk8iekX6W\nRBDlRGj2OKwmMaNjsISIMbC5orVuqEwDWus/YEotCIJXiPttHKHtQ2nRr/kFw59qiHIiNHsqXTpj\nxaUjCELT6XhzRzre3NHfYgiIciKcAuQulXgToWnk5+dz5MgRystrFbE9KTExMWzdWrN2XOATiHKH\nhIQQHx9PdHS0v0URAgRRToRmTUlWCcW7igmKCqLl4Jb+FkdoRuTn53P48GESEhKIiIjAHsfiMgUF\nBURFNb8Yp0CTW2tNcXEx+/fvB/CbglL8azFF24po0b8F4YnhfpFBqEIc9EKzpjLe5DcxWILlz1lw\nnSNHjpCQkEBkZGSjFRPBcyiliIyMJCEhgSNHjvhNjpzPc9g0cROZz2b6TQahCnmaC80amUIsNJXy\n8nIiImTKaKAQERHRJPeapwjtEEqr81sRNTRwrEqnM+LWEZo1lfEmEgwrNAGxmAQO/v6/aDetHe2m\ntfOrDEIVYjkRmi0l+0oo2V1CUHQQLQdKvIkgCMKpglhOhGZLeXY5LQe3JKxTmMSbCILQZGylNoq2\nFRHRPYKgFkH+FkdALCdCMyYqOYoh64bQ99O+/hZFEHxKamoqEydO9Fh/aWlpKKXIyclpch9z586l\nZcvmacEs2lbE2oFrWTdknb9FEex4RDlRSr2hlDqilPqlnuNKKfVvpdQupdRGpdRgT4wrCAAqSOIG\nBMEdRo4cycGDB2nTpo1L7ZVSfPzxx9X2XXXVVezevdsb4nmdyoJ/UlMnYPCU5WQuML6B4xOAHvZl\nOvCyh8YVTlPKc8s5se0EpgK3IAjuEBoaSvv27d0KSo2IiCA+Pt6DUvkOR00dqUYcOHgk5kRr/b1S\nKqmBJpOB/2rzS/KjUipWKdVBa33QE+MLAczatXSZMwe+/daj3eZs7MD2eX1p1/cAvS/Z7NG+Abrs\n3etxmbWGkopgCsrCKK4IocwaVOdSag2u3C63BWHTyrUFxdFjuayJ/cZpvwWtQaMqZYCqz43ZJwQm\npaWlPPDAA7z33nvk5eUxcOBA/vWvfzF69OjKNl9//TX33HMPe/fuJTk5mT/+8Y9MnTqVPXv2kJSU\nRFpaGmPHjiU7O5u4uDjy8vK44447WLhwIfn5+XTs2JE//elP3HXXXSQlJQFw5ZVXAnDGGWeQkZHB\n3LlzueOOOygsLKw27hNPPMHGjRuJjIxk5MiRfPTRR4SHB1aSs6KdxnIiBf8CB18FxCYAzpltsuz7\nqiknSqnpGMsK7dq1Iy0tzSvCFBYWeq1vb9Ic5U6++WbO2OH56vY2JhNCR1r+8in88onH+z/DhTYn\niGQPXdjLGRwhnmzacoT4yuUYrSkgikJaVq6tEoMe8KjH61fIXpn4CtOTpwPw5sY3uXPxnfW21Y9W\nWfWSX00m/WD6Sds1hfvvv58PP/yQN954g65du/L8888zfvx4du7cSYcOHdi3bx+XXXYZt99+Ozff\nfDOrV6/m/vvvb7DPv/71r2zatIl58+YRHx9PRkYG2dnZAKxZs4b4+Hhee+01Jk6cSFBQ3QGkCxYs\nYPLkyTz44IO8+eabVFRUsGjRImw2m1vX6w0qLSfi1gkYfPWkrOtur3VHaq1fBV4FGDJkiE5JSfGK\nMGlpaXirb2/SXOUG4M47oW1bj3WXAHTUW9HWwRA8yGP9Oti9Zw9du3QBIOdEBD8faseGg+34+VA8\nu462ZvfxWA4XNj74Lyy4gqjQUsKDrYQFVxAWbCU0qOZiq9wOCbISpDRaWSlQJZSpMkocC2ZdrEo5\nx9KZNpZwCvLzWBd9hA1qP6BB2UDZ10AcLbjVMhQApeD/bGlYsVF5O6qq23K86sHZKhGloECX8s/v\n3PpKBS9w4sQJXn75ZV5//XUuvvhiAGbPns13333HrFmzeOqpp3j55Zfp2rUrzz33HEopOnbsSGZm\nJg8//HC9/e7du5dBgwYxbNgwgEprCUBb+30cGxtL+/bt6+3jySef5IorruCpp56q3Ne/f393Ltdr\nFO80yklkD7GcBAq+Uk6ygESnz52AAz4aW/Anjrek22+HHj082rWibq3XXQ4dgjdnbeHIvj6kpUF9\nhp/QUEhKMkv79hAfX31p3RqioqBly6p1SEgwNW87rTWHCg+x4+gu9uTuYV/ePvbm7uWs+LO45+x7\nANiWs43es+pXwq65ZiEXdBtDWloabSs2s+2nmcSGxxIbHktMWIxZh8fQJbYLT5z/m8rz4n7aQLAl\nmMiQyFpLl1ZdiG9hYgisNiv/PE1mWLpqybi+//X8adSfXGq7brp3ZoH8+uuvlJeXM2rUqMp9QUFB\nnH322WzZsgWAbdu2MXTo0GrxJMOHD2+w31tvvZUrrriC9PR0xo0bx6RJkxgzZkyjZFu/fj2pqamN\nOscflB8rpzynHEukhdCOof4WR7DjK+XkS+AOpdT7wHAgT+JNThMcyonFc7PWS7JKCI4KJjjGc3++\nhw7BJ5/Ahx/CDz+A1n0qj0VGwoABMHCgWffuDV27QseOjbssrTV7c/fRKboTQRbzS3/b17fx7qZ3\nyS/Nr9X+vC7nVSon7Vu2p0/bPrRr0Y74FvFV65ZmPah9leLyf+f9H38//+8uyfTH4X90qZ1DXiGw\ncASE1xXI6tintW50oOuECRPYu3cv33zzDUuWLOHiiy/myiuv5M0333Rf6ACj0mrSU2osBRIeebor\npd4DUoA4pVQW8CgQAqC1ng3MBy4CdgFFwPWeGFdoBjgiKz140+95aA+H3z1M77d7u5VuWmtYvBhe\nfBHmzavSo8LCoH//Y1x+eWtSUmDwYAgJaWzfmr15e/kx60fWH1xP+qF00g+mc6z4GFtu20Lvtr0B\nsGkb+aX5tApvxZlxZ9K1VVc6x3TmjJgzKtsAxIbHsvk21wJ/LUrSF50udO/endDQUJYvX07Xrl0B\nsFqtrFq1imnTpgHQu3dvvvjii2rnrV69+qR9x8XFce2113LttdcyYcIEpk6dyuzZswkLCyMkJASr\n1drg+YMGDWLJkiXcdNNNTbw63+AIhpWZOoGFp2brTD3JcQ3c7omxhGaGhy0nWmtT7M8GLfq2aGIf\n8Pnn8OijsGmT2RcSAhMnwpQpMGkSpKdvbHJ8z6/HfmXM3DHsL9hf61ibiDbsL9hfqXg8MuYRnhz7\nJHGRcfLWJjSaFi1acOutt/Lggw8SFxdHly5dmDFjBocPH+a2224D4JZbbuH555/n3nvv5aabbmLt\n2rW88sorQP31bB555BEGDx7MWWedRUVFBZ9++ildu3YlLCwMMDEoS5YsYcyYMYSFhdGqVatafTz8\n8MNMmjSJ7t27M23aNLTWLFq0iJtvvpnIyMCJ7ZBg2MBEpg4I3sXDlpOS3SWUZpYS3Ca4ScrJmjUm\n/GXNGvO5Y0e47Ta46SYTJ9IYjhUfY/HuxSzYtQCN5s3JxuSdGJPIseJjtApvxcjEkSR3SGZwh8EM\n7jCYTtGdqv0gdIzq2OhrEARnnnnmGQCuv/56cnNzGTRoEAsWLKBDhw6Amer7ySefcM899/Diiy8y\nePBgHn30UW644YZ6p/SGhYXx8MMPs2fPHsLDwxkxYgRfffVV5fHnnnuOe+65h8TERBISEsjIyKjV\nx0UXXcRnn33G448/zj//+U+ioqIYOXIkt956q+e/BDdwdusIgYMoJ4J38bDl5PjS4wDEjolFWVxX\neAoK4C9/gZdeMvpS+/bw8MNGKbG/DLrE/vz9fLL1Ez7e8jErMldg0+b6woPDeemil4gIiSA0KJQt\nt2+hc0xncbEIXmHu3LmV22FhYcycOZOZM2fW237ixImV6e4LCgp44403iI6Orpx5k5KSUi2h4cMP\nP9zgbJ5JkyYxadKkavtSU1NrBcBecsklXHLJJa5ell+ozA4rbp2AQpQTwbt4WDnJTcsFIHZsrMvn\nbNhg3DU7d0JQENxzDzzyiJk90xj+t+l/XPPpNWj7tNsQSwhjzhjD+O7jmdB9AuHBVW+hSbFJjetc\nELzIrFmzGDp0KG3btmXp0qU8+eSTpKamYvFgoHpzpX1qewoHFRLZSywngYQoJ4J38aBbR2tN7lK7\ncpLimnIyZ45x25SVQb9+8M474EqqBau2snDXQoorivntmb8FYHTn0YQFhzG++3iu7HMlE3tOJDos\nusnXIwi+YteuXTz99NMcPXqUjh07csstt/DII4/4W6yAoNMfO/lbBKEORDkRvIsHLSfFu4opO1BG\nSFwILc5qON5EaxPw+uST5vMtt8Dzz0PESSy32Seymb12NrN+msXh7w/TrVU3Lul1CRZloXNMZ47e\nf5TIEHnD8gZKqTeAicARrXWtUtPKBOu8gJn5VwSkaq3rTrsqVGPGjBnMmDEDMG6dqKgoP0skCA0j\nyongXTyonDhbTRqa2WKzwfTpxmpiscDLL5vPDbHz6E5m/DiDNze8SUlFCQBdW3XlhkE3UGYtq3TZ\niGLiVeYCLwL/ree4cwHR4ZgCog1nExOEBijcWEhJRgktB7ckvFNg1fs53RHlRPAuHnTrVMabNODS\n0dq4cebMMcnTPvjATBFuiOX7lnPOm+dUxpJM7DmRlPAU7v7t3RLQ6kOkgKhQE8e0/y1boKKiLWPG\neDRlEoffOUzmPzNJeiKJpL8lea5jwW1EORG8i4csJ9XiTeoJhtUa7rsPXnkFwsPh66+hvlQlx4qP\n0TqiNQAjOo2gZ5uejO48mj+f/Wd6t+1NWlqaKCaBh0cLiMbExFBQUNBkYaxWq1vn+4tAlrukpKTy\n/6ukxMITT/Rh1ao4+9Gz+PrrYzz++GYiIhpOAOcyGhgKGSEZZKRleKZPJ5pjsVYIDLlFORG8i4cs\nJ8U7iik7VEZIfAiRvet2rbz4Ijz3HAQHm1T0dSkme47v4fFlj/Pp1k/Z8ccdtG/ZnmBLMJtu3URI\nUCPTwAq+xqMFRLdu3epW7EVzjd0IZLnDw8MZNMiUYpg+HVatglat4Pe/hzfeKGfNmtZ88MFvcJpJ\n7R4pHuqnHpprsdZAkFteDQXv4iHLSWV+k3riTZYtg7vvNttz58JFF1U/fqLsBA8teYheL/birZ/f\noriimO/3fl95XBSTZoEUED1NmD8fXnvN5CBauhRmzICZM9cTEQFvvWVcPcKpjSgngnfxkHLS5uI2\n9Jzdkw5/6FDrWGYmXHklWK1w771w9dVVx7TWfLLlE3rP6s3fl/+dcls5V/e7mm23b2PKWVPckknw\nOV8C1ynDCKSA6CmJ1vC3v5ntp54yxTYBunQp4h//MNt/+1vVo6WpVBRUUJBeQEVBhXsdCV5BlBPB\nu3jIrROeGE7HmzvSelzravttNqOMZGfD+efD32sU473v2/u44qMryMzPZHCHway6cRXvXPYO3Vp3\nc0sewfPYC4iuAnoppbKUUjcqpW5RSt1ibzIf2I0pIPoacJufRD1lSUlJ4Y477vCrDPPmQXo6dOhg\nSk04c/PNkJgIv/wCn37q3jj5P+azLnkdmyZtcq8jwSuIciJ4Fw9niK3JCy/ADz9Au3bw3nsm3sSZ\nqX2nEhcZx0sXvcTqP6xmRKcRXpFDcB+t9VStdQetdYjWupPWeo7Wera9sjnacLvWupvWup/Weq2/\nZfYXgaBEeItZs8z63ntr5yUKC4P77zfbL73k3jiOgn9SUycwEeVE8C4eUE6yP8lm1593UbCu+gyD\nbdvgoYfM9quvQlwc7Dq2i7//UGU+Se6YzL679nHr0FsJsgQ1WQZBELxPRQUsWgShoSYIti6uvdYo\nLUuXwq+/Nn0sqakT2IhyIngXD7h1jnxwhKzns6opJzYbXH89lJRAaipMnGTjxdUvMmD2AB767iE+\n31YVMRcRIg8f4dQhNTWVZcuWMWvWLJRSKKX49ddfufHGG+nSpQsRERH06NGDZ599FptTYEZqaioT\nJ07kpZdeIiEhgVatWnH99ddTVFRUrX+bzcZDDz1EXFwc8fHx3HvvvdX68SaFheaRceml0KZN3W1i\nYuCKK8z2m282fSypRhzYyFRiwbt4wHLS6c5ORPaKpNUFrSr3/fe/8OOPxi/9t6ePMum965i/cz4A\n0/pN45wzznFLbOH0pHE6tOem4+paE6Lr54UXXmDHjh2ceeaZPP300wC0atWKhIQEPvzwQ9q2bcvq\n1auZPn06bdq04cYbb6w894cffiAuLo7FixeTmZnJlClT6NmzJ3/5y18q27z77rvceeedrFy5kg0b\nNjBt2jSSk5OZOnWqx663Phx6Uo3ixrVITYW33zZJFp98smnvPmI5CWxEORG8iwcsJzGjYogZFVP5\nOT8fHnzQbN94/w7GvH8eWflZtI5ozasTX+XyPpe7I7EgBDQxMTGEhoYSGRlJ+/btK/c/8cQTldtJ\nSUmkp6fz3nvvVVNOoqOjmTFjBq1ataJ3795ceeWVLFmypJpy0qdPn8q+evbsyWuvvcaSJUu8rpyU\nlEB5ubGMnHtuw23POcdYVnbtgs2boW+tSkwNYyuzUbKnBBREdBPlJBARt47gXbwQEPt//weHD0Ov\ngcd5OvcssvKzOLvT2ay/eb0oJoJbaO36kp9f0Kj2DS2eYPbs2QwZMoS2bdvSsmVLZsyYwb59+6q1\n6dOnD8FOUeMdO3bkyJEj1dr0r1G2u6423uC4SWXEpEkm5qQhgoNh8mSz/dlnjR+rZE8J2CA8KRxL\nmPwMBiLyvyJ4FzeVk33P7iNzRiZl2WUA7NljEjIBzH4xlB5x3bhv5H0sS11G55jOnpBYEJodH3zw\nAXfddRepqaksXLiQDRs2cNttt1FWVlatXUhI9WSDSqla8SSutPEGuaY6BZde6lp7R7umJGQTl07g\nI24dwXs4vxI2wa2jbZrMf2ZSnlNOm0ltCG0bygN/K6C8PIprr4WUUS1YN3QdLUJbeFBoQQh8QkND\nsVqr6sssX76c4cOHV5te/Ks7U1l8TEUFnDhhti+4wLVzzjvPTC1OTzd5jtq2dX08mUYc+IjlRPAe\nduVENzHe5MTmE5TnlBPWKYwCgwh+AAAgAElEQVSIbhG8nbaCj96LQFms/O1vpm9RTITTkaSkJFav\nXk1GRgY5OTl0796d9PR0vvnmG3bu3MmTTz7JsmXL/C2my+Tnm3V4OLRs6do5EREm9gTg228bN17R\nTrGcBDqinAjew81gWEcV4piUGP6z+j/8/p4dYAum02/S6Nyl7CRnC8Kpy7333ktoaCh9+vShbdu2\nTJgwgSlTpjBt2jSGDh1KRkYGf/7zn/0tpss4KyeN4cILzXrRosad57CcRPQU5SRQEbeO4D3sfmqt\nVJ3lZE9GbppRTua1nscD/3sFNmxHWawseX0sYcGiVwunLz179mTVqlXV9s2ZM4c5c+ZU2/fII49U\nbs+1l/ItKKjKF/TYY4/x2GOPVX5OS0urNdZcj5UArhsTXGy2a2aEPRkOF9CiRaYfV9+DHDEn4tYJ\nXEQ5EbyHG8Gw2qY5vsyE789kJkGrHseqg0lNhR7dPSijIAh+pazMLEFBENLI4uB9+5pYk4MHTbbY\n7i48G7TWJN6TSNGOIsI6hzVNaMHryOun4D3cmCN5YtMJrMesHIo5RHFMJMGbbgDgvvs8JZwgCIGA\nw5ATFdV4D7BSMHq02V6+3NVzFIn3JNJrdi8sYoENWOR/RvAeDrdOEywnx5caq0nugFxu0CspLQli\n/Hjo3dujEgqC4GcKC806qokJdxurnAjNA1FOBO/hcOs04nVo59GdlFnLKuNNJl43mQ/ejAfg7rs9\nLqEgCH7GYTlxdZZOTRzKyQ8/uNY+b1Ue2Z9lU3qgtGkDCj5BlBPBezRyKvHaA2sZ/vpwrv7oanKX\nGeVk5YlY9u83FpNx47wmqSAIfqCsDEpLTbxJZBNjUwcNMufu2AGuJLI98MoBNl+2maPzjjZtQMEn\niHIieI9GBMSuylzFef89j+Mlx4nZE4M110p4Ujgz3zfh+3fd5VZ5HkEQAhBH4rUWLZp+f4eEwIgR\nZnvFipO3j0qOovXFrWk5oImmGsEniHIieA8XA2K/3/s9F7xzAfml+VzR5wr+GvJXc2BgLKtWGV/0\n1Vd7UU5BEPyCs3LiDo2JO+n0x070n9ef6OHR7g0qeBVRTgTv4UJA7JLdSxj/zngKywqZ1m8a713+\nHrZjNlSoYlVxLABTp7r/8BIEIfBwBMM2Nd7EQWPjToTAR5QTwXucJCD2x6wfmfjeRIorirl+4PX8\n97f/JdgSTNenuzLsyGj+tdYUy3Cq+C4IwimCzQZFJhea2y8fI0aYuJX09CprTF2U5ZSRvzqf8txy\n9wYUvI4oJ4L3OElAbP92/Tm709ncknwLr1/yOkGWoMpj8xcHceBoEH37wtChPpFWEAQfUlxsFJSw\nMAh2Mx1oVBQMHAhWK/z0U/3tji88TvrwdHZM3+HegILXEeVE8B71BMRqu9ISGRLJ19O+5qWLX8Ki\nTJuy7DK0VePIwn3jjRIIKwg1SU1NRSmFUorg4GA6d+7MrbfeyvHjx13uIy0tDaUUOTk59Y4xceLE\nRp/nKg4Lh7suHQfDh5v1mjX1t3GkrZeaOoGPKCeC93CqrePgf5v+x5SPp1BuNWbViJAIlNPxbddv\n44fWyzm84DghIXDNNb4VWRCaC+effz4HDx4kIyOD119/na+++orbbrvN32K5jKeCYR04LKwNKSeO\ngn+RPaSmTqAjyongPWpUJX5rw1tc8+k1fLzlYz7d+mkdzTVlB8qw5VvZpyO4+GKIi/OlwII/UUqN\nV0ptV0rtUko9WMfxzkqppUqp9UqpjUqpi/whZ6AQFhZG+/bt6dSpExdccAFXXXUVi5zK8+bl5TF9\n+nTi4+OJiopizJgxrF271o8SV8cRDOtL5aRop1hOmgtS+E/wHk4Bsa+ue5Vb5t2CRvPk2Ce5qu9V\ntZorpRiSPoQLBpeSsz6MqVN9LK/gN5RSQcAsYByQBaxRSn2ptd7i1OyvwIda65eVUn2A+UCSp2VJ\nU2mNat9ycEuGrBtS6/wUnVK5b23yWgrTC+s837ldU9m9ezcLFiwgxF45T2vNxRdfTExMDPPmzaN1\n69a89dZbnHvuuaxbt46opuaK9xAVFSb5msXS+ErE9XHmmUbR2bfPJGOLj69+XGtdaTmJ6CHKSaDj\nEcuJC288qUqpbKXUBvvyB0+MKwQ4dsvJS/1LuHnezWg0z57/LH8956/1nrJ7N3y7PowWLaAOd7dw\n6jIM2KW13q21LgPeBybXaKMBR3KKGOCAD+ULOBYsWEDLli2JiIigW7dubNmyhQceeACApUuXsmHD\nBj7++GOGDRtG9+7defLJJ+natSvvv/++nyWvculERjapaHmdBAVBcrLZrstAVHa4DGuBleBWwYS0\naWT5Y8HnuG05cfGNB+ADrfUd7o4nNCNsNp47G+49x7wxzrxwJneOuLPe5hV5FXzwgfmTnDy56ems\nhWZJApDp9DkLGF6jzWPAIqXUH4EWwPl1daSUmg5MB2jXrh1paWl1DhgTE0OBo7CLE8n5yS4JbLVa\nCQoyM8yc+3Gc77yvV1qvevupS4aTUV5ezqhRo3jhhRcoKSlh7ty57Nmzh+uvv56CggJWrlxJUVER\nbdu2rXZeSUkJAwcOpKCggCL7PN7CwkLCwsLqHKOioqKWfCc7zxWOHQsFwggJKaOgoKrGTUlJSb3/\nX4WFhfUec9CuXTcgkY8+2kNk5N7qBzeaVUW7CpYtW9YkuRuLKzIHIoEgtyfcOpVvPABKKccbT03l\nRDjNsFaUs6ib2X754pe5Zcgt9ba1ldtYlbiKLmVhhDOY3/1OPI6nGXXNyaqZYngqMFdr/ZxS6mzg\nbaVUX621rdpJWr8KvAowZMgQnZKSUueAW7dudcu9UVBQ4Df3SEhICFFRUQwcOBCAESNGMHbsWGbO\nnMljjz1GSEgI7dq144c6spJZLBaioqKItGv/LVu2rPM62rRpw759+2odKysrw2Kx0KFDhyYrJ4cP\nm3VsbChRUaGV+8PDwxk0aFCd56SlpVHf/6WDQ4fgo48gO7sLKSldqh07+OtBtrOddkPa0TvFN+XN\nXZE5EAkEuT3xC+DKGw/A5Uqpc4AdwN1a68yaDVx943GXQNAKm0Jzkzv8wAE++wDmD4olbsyZDcu+\nBSiAMjTBLTXh4ctIS3Mt/b03aG7ftYPmKjfmuZHo9LkTtd02NwLjAbTWq5RS4UAc4EK5t1OfRx99\nlAkTJjB9+nQGDx7M4cOHsVgsdO3atVo7Vy01vXr14t1336W4uJgIp8CQ9PR0zjjjjCYrJuC55Gs1\ncQ6K1bp6GgKZRty88IRy4sobz1fAe1rrUqXULcBbwLm1TnLxjcddAkErbArNQW6tNW/9/BbT+k0j\ndM8+KIeLsyKJOInce3/cyx728DOxTJkSwrhxY3wjcD00h++6Lpqr3MAaoIdSqguwH/gdMK1Gm33A\necBcpVRvIBzI9qmUAUxKSgpnnXUWTz31FLNmzWLUqFFMnjyZZ599ljPPPJNDhw6xYMECRo4cyYUX\nXlh53i+//EJsbGy1vvr3788111zDE088wXXXXceDDz5ITEwMP/zwAzNnzuSZZ55pspzl5aYascVi\nErB5kq5doXVrExCbmQmdO1cdK94pwbDNCU+EIp30jUdrfVRr7XAsvga45tQVmhVaa+5eeDfXf3E9\n1352bZ15TuojNy0XgPXEctllXhVTCEC01hXAHcBCYCtmVs5mpdQTSqlL7M3+DNyklPoZeA9I1drF\n6pKnCffccw9z5sxh3759zJ8/n3PPPZebbrqJXr16MWXKFLZv30779u2rnTN27FgGDRpUbSkqKqpU\nRqxWK5dccgkDBw7khRde4Pnnn+eWW+p30Z4Mh9UkMtLzCRaVgiH2iVM1pxQ7LCeRPSWYrTngCcvJ\nSd94lFIdtNYH7R8vwTx8hFMIm7Zxx/w7eHnty4RYQpjWd1pVnpOThOPbym3k/pAHwK7IWM47z9vS\nCoGI1no+Znqw875HnLa3AKN8LVcgMnfu3Dr3T5s2jWnTqh6/L7zwAi+88EK1Ng63TkpKCifT7Xr2\n7Mmnn9bOSeQOzsqJNxg6FBYtMsrJ5ZebfdqmKd4llpPmhNvKida6QinleOMJAt5wvPEAa7XWXwJ/\nsr/9VADHgFR3xxUCB6vNys3zbmbO+jmEBYXx6VWfclGPi2Cr0UFPZjkpWFuALrKxl0hGXBxGeLgv\npBYEwR94WzlxTCdOT6/ap8s13Z7pRun+UoKjJNi+OeCR/yUX3nj+AvzFE2MJgUWFrYIbvriBtze+\nTURwBF9O/ZLzu9pneNbIEFsfuUuNS2cDsVx6qTelFQTB33grGNaBQzlZt64qKNYSZqHTnZ28M6Dg\nFSR9veAWM1bN4O2Nb9MipAXfXP1NlWIC1TLENsSRb41ysikolotO64TkgnBq45wZ1lsW0sREaNMG\njh0z2WKF5okoJ4Jb/HH4H7mizxUsvm4xY5JqzLBxBMQ2EHNiK7NRsNLEm0T/JpaYGK+JKgiCn3FY\nTSIivFdtXKnarp1j3x7jyEdHKD1UWv+JQkAhyonQaApKCyipKAEgPDicj678iBGdRtRu6MJEioI1\nBVjKbGQQybgpoSdtLwieRCb7+JaG4k08+X8xeLBZr1tn1lkzstgyZQv5P+Z7bAzBu4hyIjSKY8XH\nOP/t87nyoyspt5Y33NgFy0nOt8cBE28yaZLHxBSEkxISEkJxcbG/xTitaEg5KS4urixc6C41LSex\nY2Npc0kbWpzlpUAXweOIciK4zOHCw4x9ayyr969m85HNHDlxksScLgTE7v3SxJsc7xxLJ4lXE3xI\nfHw8+/fvp6ioSCwoPqKuYFitNUVFRezfv5/4mqWEm4iz5URr6HxfZ/p90Y/IHpLjpLkgc6oEl9h1\nbBcXvnMhu4/vplebXiy+bjEJ0QkNn+RCQOy6jh05vD6CpMmx9bYRBG8QHW0KHB84cIDy8pNYAeug\npKSE8GY4791fcttskJVltjMyqj8WHLWAHP8n7tKlC8TGmkyxBw5AwkkeVULgIcqJcFLWHljLRe9e\nRHZRNskdkpl/9XziW7jwhuOCW2fOrni2E8/3V3pKWkFwnejo6Cb/IKalpdVbpC6Q8Zfc338PEyYY\nl8vatd4dSyljPfnuO0hfUELLPqVEnhlJSCvPuI0E7yNuHaFBNhzaQMrcFLKLsrmg2wWkpaa5ppjA\nSQNif/0Vtm+HmBg4+2wPCCsIQsDiiP9I9lHxEsc4hz/MZv3I9ez52x7fDCx4BLGcCA1yVtuzGN15\nNHGRcbwx+Q1Cgxoxo+YklpPV92ZyLqG0Py+O4OAgT4grCEKA4lBOHPEg3sYxzoltUlOnOSLKiVAL\nrTVF5UW0CG1BSFAIn131GWHBYVhUIw1tDcScWEustP1yN39Dkzl2JKbygSAIpyqOab2+8ig5LCdB\nh6SmTnNE3DpCNYrLi5n6yVQmvTepcqpwREhE4xUTaHC2TkmB5r+WLnxBRy64UvKbCMKpTFERbNsG\nQUHQv79vxuzWDaKiIL7MKCdiOWleiHIiVHKw4CBj5o7hg80fsPbAWjZnb3avwwbcOqt/Cebtis58\n178n7dq5N4wgCIHNxo3mcXDWWd5LW18TiwWGD7ASTyk6SBF2RphvBhY8gignAgDpB9MZ9vow1hxY\nQ1JsEitvXMnA9gPd67SBgNjvvjPrc891bwhBEAIfR7yJrycJjUoyVpPiVuFYguXnrjkh/1unOVpr\nXk9/nZFzRpKVn8WoxFH89Ief6Bvf1/3O67GcWIut6Lcy6Ese553n/jCCIAQ269ebta+CYR30a22C\nYQ8Fi0unuSEBsac5X27/kpu+ugmA6YOn8+8J/yYs2EPmz3oCYg9/l8/5mRkkkcM55wzxzFiCIAQs\n/rKcnGEpphDYXijBsM0NUU5Ocyb1msSlZ17Kb8/8LdcNuM6zndcTELv53VxCgEPtY/FQQkhBEAKU\nsjLYtMlsD3TTU9xYWhw3ysnWwkiys6FtW9+OLzQdceucZmiteWfjO+zN3QuARVn4ZMonnldMoF63\nTv73pp5Oi9GSsl4QTnW2bIHycujZ08ye8SXFO41bJ4uISuuN0DwQ5eQ04mjRUaZ8PIVrP7uW33/+\ne2zaKA+qgdo3blGHW8daZCXmQD42oP/VMd4ZVxCEgMFfLh2A4p0mIDZTlJNmh7h1ThO+2fkNN3x5\nA4cKDxEVGkXqwFQUXlJKHNjdOtpJOclamE+w1uxULbnmQqlzIQinOv4Khi3PLac8uxxbqIWjZWGV\nSeCE5oEoJ6c4x4uP88DiB3gt/TUAftP5N/z30v+SFJvk/cHrsJxsefc4EUBOQiwREqMmCKc8vk5b\n70BZFN3/050Du6zoF5RYTpoZ4tY5hSmtKGXQK4N4Lf01QiwhPHv+syz9/VLfKCZQZ0DsiZUm3iR6\njMSbCNVRSo1XSm1XSu1SSj1YT5spSqktSqnNSqn/+VpGoXFYrbBhg9n2tVsnODqYTnd0YvC/ziAi\nAvbsgePHfSuD0HREOTmFCQsO44ZBNzC682g23LKB+0bdR5DFhzVsagTEWk9YiT1YgBUYcK0oJ0IV\nSqkgYBYwAegDTFVK9anRpgfwF2CU1vos4C6fCyo0ip07Ter6zp2hTRv/yBAcDAMGmG2xnjQfRDk5\nhThefJy7F9zN3A1zK/c99JuHWJa6jD5t+9R/oreo4dbZ/VUewWh+tUQx/FzxKArVGAbs0lrv1lqX\nAe8Dk2u0uQmYpbU+DqC1PuJjGYVG4s9g2OxPszn8/mHKcsoqXUqinDQf5BfiFKC4vJjZa2fz1A9P\ncaz4GB1admBav2mEBoUSbPHjf3GNgNht/8slCsg9I5YQiYUVqpMAZDp9zgKG12jTE0AptQJTxvox\nrfUC34gnNAV/xZsA7H16L4XrChm0YhDJyaa4qATFNh9EOWnGlFSU8Oq6V/nH8n9wsPAgAClJKcy4\ncAahQQFQ6beG5aT4J6OctBorLh2hFnVNHatZnCkY6AGkAJ2AH5RSfbXWudU6Umo6MB2gXbt2pKWl\neVxYgMLCQq/17U18Kfd33w0AWhESsom0tKNu9dVoufsDkbA+ez02W0tgCCtWFJGWttotORqD/I00\nHVFOmik7j+5k7Ftj2V+wH4BB7QfxxNgnuLjHxd7LW9JYnJQTW5mNyJwirMDg30t+E6EWWUCi0+dO\nwIE62vyotS4H9iiltmOUlTXOjbTWrwKvAgwZMkSnpKR4ReC0tDS81bc38ZXcWpsgVIDrrutHQoJ7\n/TVabqemI8vg9tshKyuSQYNSiPHRI0j+RpqOxJw0IworCiu3u7bqSlRYFAPaDeDzqz5n3fR1TOw5\nMXAUE6jm1snIsjDZNpI/Rw9h4CjRiYVarAF6KKW6KKVCgd8BX9Zo8zkwFkApFYdx8+z2qZSCy2Rk\nQG4uxMdDx47+lSU0FPr3N9uO2UNCYCPKSYCjtWZl5kqmfTKNK1ZdQVZ+FgBBliAWX7uY9JvTmXzm\n5MBSShw4LCcWC999BzYsdDu/JUE+nDAkNA+01hXAHcBCYCvwodZ6s1LqCaXUJfZmC4GjSqktwFLg\nPq21e74CwWs4kq8NGlSrvJbXKdpRRO7yXMqPlVfuc8S9SNxJ80BeYQOUrPws3v75beb+PJcdR3cA\nYMHCsoxlXN3/agASot20k3obJ8vJ0sU2wMK55/pXJCFw0VrPB+bX2PeI07YG7rEvQoDjz2DYg28c\nJPOZTJIeTyLpkSQAkpOryyUENqKcBBhaay778DK+2PYF2h4P2L5le67rfx2DrYO5qv9VfpawEdgt\nJxUVYVzz4QoGEs3YlP7UHfsoCMKphD+Vk+IdpqZORM+qNNRiOWleiFvHz+zN3ct/fvoPpRWlgCnC\nZ1EWQoJCuLLPlXw97Wsy787kmXHP0C68nZ+lbSR25WRnzkAitJWYECu9+4hiIginA85uHV/jKPgX\n2SOycl+/fiYh2/btUFhY35lCoCCWEx+TV5LH0oylfPvrt3y7+1t2HtsJQPfW3ZnQYwIAz5z/DK9N\neo3WEa39Kar72N06K6wJPMtIrh1X7nPfsyAIvufgQTh0CGJioGtX346tbZqinUUARPSospyEhUHf\nviYgdsMGGD3at3IJjUOUEx9RUlHC6DdGs+HQBqzaWrk/OiyacV3H0SqiVeW+7q27+0NEz2O3nCw/\nPpB8Qhl8eQDkXhEEwes4Z4b19QtJaWYpulQT2j6U4OjqP3HJyUYxSU8X5STQEeXEQ1htVnYd28WG\nQxv4+fDPbDi0gbzSPFbcsAKA8OBw8kvzARiVOIpxXccxrts4hiUM828WV2+iNRUEsepoPwAJhhWE\n0wRHXIc/XDp1WU0cDB4Mc+ZI3Elz4BT9VfQeeSV52LSt0tKx6NdFPPzdw2zJ3kJReVGt9ocKD9G+\nZXsAvpz6JZ2iO9EytKVPZfYbNhvr+B2vWDezvFVHkpLO8LdEgiD4gDX2tHhDh/p+7LqCYR3IjJ3m\ngygndrTW1XKFfLT5I3Ye28m+vH1k5meSmZdJZn4muSW5PDbmMR5NebSy7doDawFIjE5kQPsBDGw3\nkAHtBzCg3QDiW8RXtjsz7kzfXVAgYLOxm7F0oJSena0nby8IQrNH6yrlZNgw349fGQzbM7LWsf79\nISgItmwx1ZIjazcRAgSPKCdKqfHAC5hiXK9rrf9R43gY8F8gGTgKXKW1zvDE2M7YtI3CskLySvLI\nL80nrzSPpNgkOkaZ9ITrDqzj822fs/nXzczOmU12UTZHThwh+0Q2J8pPkP9gfqWC8tiyx9iSvaXW\nGBHBERRXFFd+HtFpBCtuWMGZcWc2/wBWD6NtmmC6ANDxIqmnIwinA1lZcPgwtG7t+2BYMAnYoG63\nTkQE9OkDmzbBxo0wYoSvpRNcxW3lRCkVBMwCxmFqX6xRSn2ptXb+Zb8ROK617q6U+h3wDNBgwo7c\nklz+9M2fKC4vpriimJKKEooriikuLyYhOoG3L327sm3H5zqSX5pPUXlRZW4QB/+Z8B/uGHYHABsP\nb+SpH54yB2pW7QAKywqJCosC4Nr+13Ks+BiJ0YkkxiTSOaYzidGJxEXGVbOwRIdFMzJxpEvf1enG\nobUtaIuFHEIZOV3q6QjC6cBqe129IUN8HwwLVW6duiwnYOJONm0ycSeinAQunrCcDAN2aa13Ayil\n3gcmA87KyWTgMfv2x8CLSillz/hYJ+UHyznv8vPqPGaxWFgevrzy8+zi2Wit+evUv5LRPYPosGiu\n/vZqxiwfQ0VZhZEQ6Jfej0XPL8JmsxEcHIxFWbBgqcwt8vN/fq7sczQmlLvL411IuN1kYs3+JJsV\nN6+g7WVt6fVqLwCKdhWRPqJxDsy6zo/oFkHyT8mVbVadsQrriRqukHJYHrKcuqjv/BEZIwhuaf6b\nN03eRN6KvEbJWtf5/b7oR8woo2zseWQP+1/aX+e5FbnGYrU4LIorkiRnvSCcDvgz3sRWbqN4TzEo\nCO8WXmeb5GR46y2JOwl0PKGcJACZTp+zgOH1tdFaVyil8oA2QI5zI+dS54mRicQU1/+2XXGionI7\nmmgAZvadSdAg+4/gj0AhcJyq0s97ICQ/pFo/2v7Phq3OcXZu3snONJOLhPXAUTj460EOph00+zLN\nvsZQ1/kFEQXVS1RnA8W1z62govZO6j9/+ffLwfECsbfxstZ1/vo168FRsmJbQ30q9hJJWbsMt8ul\n+5pAKBneFJqr3MKpgz+Vk5I9JWCFsDPCCAqv+4XIkSlWlJPAxhPKSV2Gu5oWEVfaVCt1njw4WY9c\n1Dh3SXBMMJYQk/S2YkgFtpdsBLUIIijC/JFaR1ix3mVl5YqVjBzlWt91nW8JsxAcZb46bdWUTyhv\nqIta1HW+sihCWlcpTuWZ5dQ0LDUkd33nh7QOQVnM11+xrAJbed1KWH3UdX5d33Nd/HbYQRbuSWR2\nh3+SkvJAo8b1N4FQMrwpNFe5hVMDmw3WmvkBflFOglsH0+PlHnX8ulQxcKBxN/3yC5SUQHjdBhbB\nz3hCOckCEp0+d6J2RIejTZZSKhiIAY411KmyKELjmp60K7hlMNSYsRsUHmS06Ria1Hfl+c5yBrkn\nZ33nh7QJqd24EXLXdX5wjHv/3XWdX9f3DCYSfsm+Tmjg7Lhf3BpXEITmwc6dkJ8PCQnQsaPvxw+N\nCyXhloYLorZoAWeeCVu3GgVlyBAfCSc0Ck/U1lkD9FBKdVFKhQK/A76s0eZL4Pf27SuA7xqKNxGa\nPytWQJk1iMGkExteh39KEIRTDn+6dBqDI9+JJGMLXNxWTrTWFcAdwEJgK/Ch1nqzUuoJpdQl9mZz\ngDZKqV2YcucPujuuENh8951Zn8t3aCmoIwinBf5WTg7OPcihdw5Rntuwq13iTgIfj+Q50VrPB+bX\n2PeI03YJcKUnxhKaB87KCSrav8IIguATfvrJrP2lnGQ8kkFpZinDdg4jJLYO17gdhyvHIa8QeHjC\nrSMI1cjLM0FxwRYro1mOtsifmSCc6hQXG0uEUjC85nxNH6C1pv3v29N2SlvCkxqOck1OhuBgk++k\noMBHAgqNQn41BI+zbJmJ2h/R+QAtOeGfTEyCIPiUdeugvBz69YNoPxhLlVJ0ebILZ31wFpbghn/a\nIiPNrB2brcoVJQQWopwIHqfSpdN1r9kQ5UQQTnlWrjTrs8/2rxyuMtKelcEhtxBYiHIieJwq5SQD\nQAJiBeE0YNUqsx7pp2oeBRsKOJ52nPJjruWdcihRopwEJqKcCB7lyBHjxw0PhxGdssxOUU4E4ZRG\n66ofeX8pJ/v/vZ+fx/7MkQ+PuNTeIeePPxr3jhBYiHIieBRH5vTRoyHMYt5gJCBWEE5tdu82LyZt\n20K3bv6RwVGNuL6CfzVJTDTJ4o4fh+3bvSmZ0BTkV0PwKEuWmPV551H1OiKWE8EFlFLjlVLblVK7\nlFL15kJSSl2hlNJKKcntGSA4x5v463Yv3mmSPUb0iHCpvVLi2glkRDkRPEplvMm5GFsviHIinBSl\nVBAwC5gA9AGmKqX61Bf6C88AACAASURBVNEuCvgTIBkqAgh/u3TKc8spP1KOJcJCWEKYy+dJUGzg\nIsqJ4DH27YNdu8w0wsGDqbScSECs4ALDgF1a691a6zLgfWByHe2eBJ4FSnwpnNAw/g6GdbaaOAqV\nuoJDXof8QuAgyongMZYuNesxY0yCI7GcCI0gAch0+pxl31eJUmoQkKi1nudLwYSGycszQfDBwVU1\na3xNY106DgYNgrAwUwQwJ8cbkglNxSPp6wUB4Ntvzfq88+w7HJYTCYgVTk5dGmxlcVCllAWYAaSe\ntCOlpgPTAdq1a0eaI0rbwxQWFnqtb2/iablXrWqDzdaP3r3zWL16vcf6rUmDci8yq5ywnEZfW+/e\nA9iwoRUvvfQL55zjWQ1F/kaajigngkfQGhYvNtvjxtl3SkCs4DpZQKLT507AAafPUUBfIE2Zv6f2\nwJdKqUu01mudO9Javwq8CjBkyBCdkpLiFYHT0tLwVt/exNNyz7PbsSZPjvHq99GQ3Fte28IRjtBr\nXC86pHRoVL+//S1s2AA5OX3xtPjyN9J05JVW8Ai//AKHD0PHjtC7t32nuHUE11kD9FBKdVFKhQK/\nA750HNRa52mt47TWSVrrJOBHoJZiIvgexwu2P3/LincYt05kD9emETvjkLsZGjhOaUQ5ETyCw6Uz\nbpyTLiIBsYKLaK0rgDuAhcBW4EOt9Wal1BNKqUv8K51QH3l5sH69iTfxVzCs1pqinSbHSUTPxsWc\ngClSGBZm4mYk7iRwEOVE8AgO5eT88512Otw6EnMiuIDWer7WuqfWupvW+v/s+x7RWn9ZR9sUsZr4\nn+XLzW0+bBi0aOEfGcqzy7HmWQmODSYkLqTR54eHV+U7+eEHDwsnNBn51RDcprTUVCKGGsqJ3a0j\nlhNBODUJBJeOIzNsRI8IVBOfNeLaCTwkIFZwm5UrobjYlEpv397pgATECsIpTSAoJxHdIuj5ak+C\nWgQ1uQ9RTgIPUU4Et6k1S8eBlwNibTYbWVlZnDhxwuN9x8TEsHXrVo/3623ckTskJIT4+Hiio6M9\nLJVwKpKXB+np/o03AQjrEEbHmzq61Ycj7mTjRjh6FNq08ZBwQpMR5URwmzrjTcDrAbE5OTkopejV\nqxcWD8e1FBQUEBUV5dE+fUFT5dZaU1xczP79+wFEQRFOyvffm1t8+HD/xZt4CkfcSVqaWS6/3N8S\nCRJzIrjFsWOwdi2EhsI559Q46OWA2NzcXNq1a+dxxeR0RClFZGQkCQkJHDniWsl54fRm4UKzvuAC\n/8qR9UIWh946hPWE1a1+HJbfBQs8IJTgNvJUF9ziu++M92bkyDrenhwBsV4a22q1EhLS+Oh8oX4i\nIiIoLy/3txhCgKM1fPON2R4/3o9y2DS7H9zNttRtaKt7TxrHdSxYUOWRFvyHuHUEt6g33gR8MpW4\nqdH5Qt3I9ym4wq5dsHs3tG4NQ4f6Tw5bmY3E+xMpO1hGcLR7P2cDB0K7dpCVBVu2wFlneUhIoUmI\n5URoMlrDIntNi1rxJiBJ2AThFMXh+rjgAghq+iQZtwkKD6LL413o9Wovt/uyWODCC822uHb8jygn\nQpPZvh327IG4uHqqkUr6+lo8/fTT/OEPf/C3GILgFo4fb3+6dLyBs2tH8C/i1hGazPz5Zj1+fD1v\nT5IhthYPPfSQv0UQBLcoKYGlS822w9LgL/JW5GErsdFycEtCWrkff+Yov/H993DiRPOfhdSckV8N\nock4lJOLLqqngZcDYgVB8D3ff2+SLg4aVCPpoh/Y+/e9/Hz+z+QuzfVIf3FxJhV/WVmVAib4B1FO\nhCZRUGAeUhZLA1MJT3PLyTPPPENCQgJRUVH06tWLJUv+v707j4uq6h84/jkMw74qsomKoqap5UKW\nWbnvaeZTT2aZS2alPWWrlT2P5pLWU2k9WWlmmb/SVjPNJTfKMgszNJVURFEEFRHZ9zm/P+4wgAwy\nyGzIeb9e9zV37j33zHdGvHPmrNuYNWsW999/vynNJ598QosWLWjcuDFz5swhMjKSrcZexrNmzeKf\n//wnDzzwAL6+vnTo0IE9e9RyMopjOcMonTJlqxFfyYJ/1Sl7X2U/vhTHaJjfGkqdbdsGxcVw002X\nmU3R3h1ihbDa5uvnV/15Cxw+fJh33nmH2NhYsrOz2bx5M5GRkZXSHDp0iClTpvDpp5+SmppKZmam\naRK0Mt999x2jR4/m4sWLjBgxgscee8xan5ai1JqUsGaNtn/77Y6NxVBsID/RWDiJsl7hpOx9fftt\n+e8rxf5U4US5IjU26UCD7hCr0+koLCzk0KFDFBcXExkZSVRUVKU0X331FcOHD+eWW27Bzc2N2bNn\nVxnKe8sttzB06FB0Oh1jx45l37599nwbilLJ3r2QlATh4doPE0cqOFEApeDe3B2dp/WGDHXrBi1a\nQGoq/Pab1bJVakkVTpRak9LCwom9m3WktNqWnZVV/XkLtG7dmkWLFjFr1iyCg4MZPXo0KSkpldKk\npKTQrFkz03MvLy8aX1INFVqhUd/Ly4uCggJKSkrq8CEpypX7+mvt8c47Hd9aW9ak49XWy6r5CgGj\nRmn7Ze9XsT9VOFFqbd8+OH0awsK0iYuq1cDnORkzZgw///wzSUlJCCGYPn16pfNhYWEkJyebnufn\n55Oenm7vMBXFIlKWf1mXfXk7Ut6RPAA821ivSadM2fv75hs1W6yjqMKJUmvffqs9jhhRQ4tNA27W\nOXz4MNu3b6ewsBAPDw88PT3RXTLe+q677mLdunXs2rWLoqIiZs6ciVR3QsVJHToER45ofcyqrKNl\nI8WlxWQVZpGel05OSQ4GWd4JJP+o9TvDlrn5Zm0k0vHjEBdn9ewVC6jCiVJrZR3iRo6sIWEDrjkp\nLCzk+eefJygoiNDQUM6dO8crr7xSKU2HDh343//+x+jRowkLC8PX15fg4GDc3d0dFLWiVO+bb7TH\nO+4AVxvNkHXg3AHGfzue6KXRhL4eittcN/wX+BP03yCG/zKc/Wf3m9Ie33scgORGyRSXWnc9KBeX\n8vtb2ftW7EtNwqbUSmIi7N8Pvr7Qp08NiRtwzcl1113H77//XuX4rFmzKj0fP34848ePByAnJ4eX\nX36ZiIgIs2kjIyNVzYriMF99pT3+4x/WyS+/OJ8NRzfg7ebN4Nba+N2CkgJW7FthSuMiXPDWe6PX\n6SkoKiDAI8B0rjChEHfcuXvP3eSk5DCkzRBGXjOSEdeMwFNf99qUf/wD3n8fvvwSZs9ukLcxh1KF\nE6VW1q7VHocNgxp/4DfweU4ssW7dOvr164eUkmeeeYZOnTpVGXKsKI62b5/2oyQwEPr1q1tef5//\nm3d+f4dP9n1CdlE2PZv1NBVOOgZ3ZPHQxVwXch0tA1oS4hOCq4v2NRUTE0NkQCQApfml+KX7YdAZ\n8G3ly+nM06w+sJrVB1YT6BHIzF4zeeKmJ+oUZ+/eEBysLdOxZ49jFzhsiNS3hlIrFjfpQINu1rHU\n2rVrCQ8PJzw8nKNHj7J69Wq1MrDidFYYKzPGjLHgR4kZUko2J2xm4MqBtF/cnsWxi8kuyiY6PJpR\n7UeZagQ9XD2YcsMUbml+C039mpoKJpfKT9D6m3hHeRM/LZ6EfyXw5sA3iQ6PJqMgAy99+QieotKi\nK6pxdHWF++7T9lesuHxaxfrqVDgRQjQSQmwRQhw1PgZWk65UCBFn3L6ry2sqjnPuHPzyC7i5wZAh\nFlzQgJt1LLVs2TIuXrxIZmYm27Zt45pr6r66qqJYU3Ex/N//afvjxl1ZHp/s+4TBnw5mS+IWvPRe\nTO46mf2P7Cf2oVie6vFUrQvkpplhjSN1ohpF8WSPJ4l9KJY/H/6T0R1Hm9LO2DaDmz68ifVH1te6\nkFL2fj/7DAoLa3WpUkd1rTl5HtgmpWwDbDM+NydfStnZuI2o42sqDrJunVYZ0q8f+PlZcIGqOVGU\nem/jRkhLg2uvhehoy6/LLMg07d917V10aNKBBf0WkPxkMkuGL6FTSKcrjsn3Bl+u+fAawh8Jr3Ku\nc2hnfN19ASgxlPB1/Nf8fvp3hq8aTu8VvYk9HWvx61x/vTZdQkaGdv9T7KeuhZM7gLIKrxWAJZX9\nSj31+efao8VzHKiaE6UWhBCDhRCHhRAJQogqP3SEEE8JIQ4JIfYLIbYJIVo4Is6GpqxJY9w4y/4r\nn805y4NrH6Td4namAoq3mzd/PfoX02+ZTqCn2Qr2WvFo7kHYxDCCbg+6bDpXF1f+evQv3hz4Jo09\nG/NT0k90X9adMV+P4WTmSYteq6z2RDXt2FddO8SGSClTAaSUqUKI4GrSeQgh9gAlwAIp5bfmEgkh\nJgOTAUJCQoiJialjeObl5OTYLG9bcmTcFy7o2bbtZlxdJcHBu4iJqXmW0k5paTQG8gsLbRK3v78/\n2dnZVs8XoLS01GZ525I14i4oKLD735kQQgcsBgYAyUCsEOI7KeWhCsn+BKKllHlCiEeB14B77Bpo\nA3P+vFZj4OICFdarNKuotIi3f3ub2T/OJrsoG72Lnp0nd3J7W22xGkf1pfJ28+bJHk8ysctE5v88\nn0W7F7HqwCrWHl7L/kf2E9Uo6rLXjxkDzz6r1SClpmqTTyq2V2PhRAixFTC3MPaMWrxOcyllihCi\nFbBdCPGXlPLYpYmklEuBpQDR0dGyd+/etXgJy8XExGCrvG3JkXG/847WSjN0qGDEiFssuyhQ+4Xk\n4eVFdxvEHR8fj6+vr9XzBcjOzrZZ3rZkjbg9PDzo0qWLlSKyWHcgQUqZCCCEWI1WM2sqnEgpKy5i\nvxuo4etSqaulS7U+J8OGaevpVOeXk7/w0LqHiD8fD8CwNsN4c9CbtG3c1iZxnZh9Avem7oQ8EIKL\n3rIGAH8Pfxb0X8Cj0Y/y7JZnySvOo1VgqxqvCw6G4cO1wQBLlsAlI/wVG6mxcCKl7F/dOSHEWSFE\nmLHWJAw4V00eKcbHRCFEDNAFqFI4UZzX6tXa47331uIi1ayjWK4pcKrC82TgxsukfxDYaO6EqoG9\nPEvjLikRLFx4E+BO7977iInJMJtuZdJKlp9YDkBTz6Y8FvUYNzW+iZS/Ukghxew1dYo7B5gJuMPh\nloevqHPClCZTKDIU8eOPPwJwLOcYX53+ikdaPYK/3r9K+ttu82fNmi68/XYRN9/8K25ulnWsvdr/\nRmyprs063wHjgAXGx7WXJjCO4MmTUhYKIYKAnmjVsUo9cfKkNkrH01Obst5iDbhDbGRkJMuWLaN/\n/2rL9jV65JFHaNq0Kf/+979rdd3Jkye59tpryczMrDJlvhMz90di9htACHE/EA30Mnde1cBenqVx\nr1qlNetcey08/fT11f7GKDpWxMqTK3mu53O8dNtLeLh6WDdgo7K4izOKOT37NKW5pUT1vXyTjKXm\nfjKXbWe2EZsZy8JBC7n/uvsrNUP16qX1OYmLcyM1tZfFo5au9r8RW6prh9gFwAAhxFG0tuIFAEKI\naCHEMmOa9sAeIcQ+YAdan5NDZnNTnFJZrcnw4eDjU4sL1SRsdfL+++9bVDCJjIxk69atpufNmzcn\nJyenPhVMQKspaVbheQRU/dkthOiP1qQ8QkqpBnfaiJSwcKG2P21a5crPszlnWRFX3jt0YNRAEp9I\nZG7fuTYrmFSkD9QT+e9IohZYp2AC8N6w9+jXsh/p+ek88O0DDPy/gRy7UF65L4T2OQAsWqQWA7SH\nOn1rSCnTpZT9pJRtjI8XjMf3SCknGfd3SSk7SSmvNz5+aI3AFfuQsnyOg9GjL5/W7MWgmnUUS8QC\nbYQQLYUQbsBotJpZEyFEF2AJWsHEbBOyYh27d0NsrLbIX1lHWCklH/35Ee0Xt2fC2gn8eupXU/oI\nvwgHRWodbRq3YcvYLXx8x8c08mzE1sStdHyvIwt+XmBat2f0aK3/SVwcGFuDFBtSP2mVy9qzB/76\nC4KCtE5xtdKAm3XKFBYWMm3aNNMssNOmTaOwwmxOr732GmFhYYSHh7Ns2TKEECQkJADaujsvvfQS\nAOfPn+f2228nICCARo0aceutt2IwGBg7diwnT55k+PDh+Pj4sGjRIk6cOIEQgpISbUTVhQsXmDBh\nAuHh4QQGBjLSoul97UtKWQI8BmwG4oEvpJQHhRCzhRBljYn/BXyAL9WEjrY1d672+PDDWnNuYkYi\nA/9vIBO/m0hGQQaDWg8i3PcyPWRt6MIPF7iw+QIlmTWPGKwNIQTjOo/j76l/c/9191NQUsCcn+aQ\nkq1V4Lm7w5QpWtp586z60ooZam0d5bI+NNZzjR2rzQxbKw6oOREvV/9aS25fwuRukwFY+sdSHl7/\ncLVps57KMu13W9qNval7AZAza1efO2/ePHbv3k1cXBxCCO644w7mzp3LnDlz2LRpE2+++Sbbtm2j\nZcuWPPxw9fG88cYbREREkJaWBsDu3bsRQrBy5Up27txp6t+SnZ1Nenp6pWvHjh2Lj48PBw8exMfH\nh127dtXqPdiLlHIDsOGSY/+psH/lHXgUi+3aBRs2aE24jz9RysJf3+alHS+RV5xHY8/GLBq8iPs6\n3eewocHHXzpOdmw2XX7ugn/Pqp1X66qJdxNW3rmSB657gNPZp2kRoE2nY5AGJjycy8KFvmzdCjEx\n2vo7im2omhOlWnl5Wqc4gAcfvIIMVM0Jn376Kf/5z38IDg6mSZMmzJw5k5UrVwLwxRdfMGHCBDp0\n6ICXlxczZ86sNh+9Xk9qaipJSUno9XpuvfVWi74cUlNT2bhxI++//z6BgYHo9Xp69TLbj1RRACjr\n5jRtGrxzYBZP/fAUecV53NvxXuKnxlfpLGpPUkryjuQB5VPX28qAqAGM7zze9PyDPz6g56prGTbu\nb0D7nFTfE9tRNSdKtb76CrKy4MYboUOHK8jAAR1iLa3ZmNxtsqkWxZyKE5n9MfmPK44nJSWFFi3K\nJzJt0aIFKSkppnPRFeYDb9asWZXryzz77LPMmjWLgQMHavFPnszzz1e3WkS5U6dO0ahRIwID6z4r\np3L1275d2wIC4OmnoUj/L9YdWce8vvMY1ra27brWV3y+mNLMUnT+OvRN9HZ7XSklX8d/TXJWMp95\ndcfNN5mff/bjhx9g0CC7hdGgqJoTpVplTTpXVGsCqkMsEB4eTlJSkun5yZMnCTfOZhUWFkZycrLp\n3KlTp6pcX8bX15c33niDxMRE1q1bZ2oOgsvPvNmsWTMuXLjAxYsX6/pWlKucwQCPPaUVyqc9WUpA\nAAR7B/Pnw386RcEEyhf882rrZdfaGyEEG+/byFuD38Lb10DRjVqnnEmPn6e4xGC3OBoSVThRzDp4\nEH76Cby84J4rnSBcNetw7733MnfuXNLS0jh//jyzZ8/mfuPwh3/+85989NFHxMfHk5eXx+zZs6vN\nZ/369SQkJCClxM/PD51OZxoqHBISQmJiotnrwsLCGDJkCFOmTCEjI4Pi4mJ++ukn679RpV47l3uO\nnlM/Jn6fL/iexvvWZaZzjmrCMcdeTTrm6Fx0PH7j4xyaeogh9yWCfxLJR4K4ZtxbnM05a/d4rnaq\ncKKY9fbb2uO4cRauQGyOmueEl156iejoaK677jo6depE165dTSNwhgwZwuOPP06fPn1o3bo1PXr0\nAMDd3b1KPkePHqV///74+PjQo0cPpkyZYpok6YUXXmDu3LkEBATwdtk/XAUrV65Er9fTrl07goOD\nWbRoke3esFKvlBpKWfz7YlrPv5ndH2uDokZN+5nHbrVwljE7yz9aXnPiKM39m/P9uC95bo7WPJv0\nzSSKMhs7LJ6rlpTSKbdu3bpJW9mxY4fN8rYle8Wdlialh4eUIGV8fB0y6t5dSpB7Fi+2WmwVHTp0\nyCb5SillVlaWzfKuzqFDh6SLi4ssLi6+4jysEXd1nyuwRzrBvaE2m7qPVFUW9+5Tu2WX97tIZiHp\nvFyClLf0yZEGg2Pjq86OHTvkX//4S+5ghzzz6RlHhyMNBikHDS2SIOW992rHzmSfkdsTt5vS1Pe/\nEVuw9D7ScH/SKtVauhQKCmDIEGjXrg4ZqZqTGq1Zs4aioiIyMjKYPn06w4cPx9VV9VNXbO9g2kH+\nPPMnQacmQNwE3Nwky5d4O3UXsbI+J55t7d+scykh4L139Hh4aKMav/kGpm2eRt9P+jL6q9EkZphv\nalUso741lEqKimDxYm2/bLrmK6Y6xNZoyZIlNGnShKioKHQ6He+9956jQ1KuUhn5GWw4Wj6NzPjO\n45l3w0fIb7We7/PmCdq0cVR0FjBAfoKxWaeN45p1KmrZEl59Vdt/8EFJU0MP3HXufH7wc9q9047F\nCYtJz0u/fCaKWapwolSyahWkpGiLfQ0YUMfMVIfYGm3atInMzEwuXLjAmjVrCAsLc3RIylUmtyiX\n13e9TtTbUYz6fBRnC7TOm9LgwtbXx5OeLhg0CJ56ysGB1uQ8GPIN6IP1uPo7T+3iv/4Ft98OFy8K\nfv/f4xx69Ajjrh9HiaGEr05/RdTbUSz4eQE5RTmODrVeUYUTxaSkpHza6meftUKFh2rWURSHySnK\n4bVfXqPlWy15dsuzZBRk0LN5T4oN2loxzz8PO3Zo68WsWFEP/psaR9o7sjOsOULARx9BWBjs3Alv\nzW7OxyM/Zu/De4kOjCazMJMZ22eYpsFXLOM8xU/F4T79FBISoHXr8sW+6sTYrKMmUVQU+5FSsuDn\nBbzx6xuk52tNCt2bdufl3i8zKGoQP/74I4sXw+uvg6urVlsaEuLgoC1xWntwxDDimgQFweefQ//+\n2kjHli1h2rTO/Pe6/1LcrJjYlFjaNm4LaP8+S/5YwuiOownwCHBw5M7L2cvKip2UlMCcOdr+v/+t\n3bTqTNWcKIrdCSH45dQvpOen0yOiB5vu28TuB3czuPVghBDs3BnE449raZctg759HRuvxaKh3cft\nCB0X6uhIzLr1Vq0GBbQmsi++0PYHRA3gxVtfNKXblLCJR79/lIg3I5j6/VQOnz/sgGidn/rWUABY\nuRKOHYM2bWDMGCtlWlY4UX1OFMUmDNLA1sStjFg1gu3Ht5uOz+83n61jt/LLxF8Y1HqQaSK1zz+H\nl1++FoMBZs7U5jGqN8IhdFwoAb2ct7ZhzBhtxWIptf0tW6pWSQV5BdG/VX9yi3N5d8+7tFvcjmGf\nDeOHYz9gkGq22TKqWUchJweM84JZr9YEypt1VOFEUawq6WISK/at4OO4jzl+8TigzWDat6VWDdIp\npFOVa5Yvh4ceAoPBhenTtcKJYn0vvKBNxTBnDsyf345mzeCRR8rP39D0BraM3cKBcwd4+7e3Wbl/\nJRuObmDD0Q3c2vxWfpqgZnAGVXOiAPPnayN0oqPhvvusmLFq1rEaIQQJCQmODkNxsA1HNzBg5QBa\nvtWSmTEzOX7xOM38mvFy75dZcvsSs9cUF2vTAjz4oPZfcuLE48yfX78qNA0lBngfUj5IQTr5UsBC\nwOzZsGABSCl49FGYOlWbpqGijsEdWTp8KaeePMXcPnNp7t+c3pG9TefP5pzl47iPycjPsO8bcBKq\n5qSBS0yEN97Q9t9+28rliAbeITYyMpJly5bRv39/R4ei1FMX8i8A0MizEQB7U/eyNXEr7jp37mx/\nJxM7T6Rvy77oXHRmrz9xQmu6+ekn0Ovhf/+Da65JQoiW9noLVlFwogA+h6Rfkwh/KNzR4Vhk+nRI\nT/+bt95qx7vvQlyc1nzeqlXldEFeQcy4bQYv3PoCBSUFpuMr96/k2S3P4uriSv9W/bmr/V2MbDeS\nxl4NY6p89ZO2AZNS67hVWKiNzjEu7WI9quZEUWrFIA3sTd3LKztf4baPbiPk9RDeiy2fmG9MpzG8\nO/RdUp9OZdU/VjEgaoDZgonBoE2m2LGjVjAJC4Mff4SHH7bnu7EenY8OHoSmU5s6OpRaGTr0DDt3\nQkQE7NoFnTrBW29BaWnVtC7CBS99+TDpVoGt6NeyHwZpYFPCJiatm0TI6yHcsvwWFu2++tfHUt8a\nDdjnn8PateDjUz7LoVU14EnYxo4dy8mTJxk+fDg+Pj689tpr3H333YSGhuLv789tt93GwYMHTenH\njx/P1KlTGTZsGL6+vtx4440cO3asUp5bt26lTZs2BAYGMnXqVKev3lYst/rAasZ8PYbQ10PptrQb\nM7bPYOfJnUgpSc1JNaVrFdiKR294lEDPQLP5SAk//ADdusFjj0FuLtx9t/ar3eo/PuzIPdQd7ofm\nzzV3dCi11r07/Pkn3Hsv5OVpTWxdusCGDeWTaJszqv0otj6wlTNPn+GD4R8wKGqQaSTWT0nl/VKy\nC7N5N/Zd/jr711XVoVY16zRQqakwZYq2/+abEG6LmlI7T19v3ZfxrfaMJWWClStXsnPnzkrNOsuX\nL2f58uW4ubkxffp07rvvPuLi4kzXrFq1ik2bNtG1a1fGjRvHjBkzWL16ten8+vXriY2NJSsri27d\nujF8+HAGDx585W9Rsbu03DTizsTx++nfmdxtMk28mwCwMWEjqw6sAqCZXzMGtx7M4NaD6deyH/4e\n/jXmW1oK69drTbQ7d2rHIiK0X+mjRtns7SgWCgqCzz6D0aO1GWX/+guGDYObb4ann4Y77gCd+ZY5\nmng3YVLXSUzqOonMgky2H99eqWln16ldTN0wFYBAj0B6Nu/JjU1vpGtYV7qGdSXUxzmHXtdEFU4a\nICm1XvsZGTB4MEyaZKMXUs06lUycONG0P2vWLAIDA8nMzMTfX/vyGTVqFN27dwfgvvvu46lL5hN/\n/vnnCQgIICAggD59+hAXF6cKJ06ssKSQtYfXsu/MPuLOxhF3Jq7SLKHtm7RnVHut5DD++vH0iOhB\nrxa9aBfUzjT0tybHjmn9GD75BI5rg3YICIAXX9RqTjydb76yK5L2dRochZLoElx96u/X1ogRMHAg\nvPuuNuR41y5ta9ECHngAxo7lsusb+Xv4c2f7OysdC/QMZEynMexM2smprFOsP7Ke9UfWm86nP5du\n6rO04/gOAjwCEUORDgAAE3dJREFUaNu4Ld5u3jZ5j9ZSf/+VlSu2cCF8/712E1u2zIYVG3buEGvN\nVo7s7Gx8fauvPamt0tJSZsyYwZdffklaWhouxgLb+fPnTYWT0NDyXzheXl7k5FRei6Om84r9SCnJ\nLM4k7kwcJzNPknAhgaPpR/HSe/HGIK2HuUQy+qvRyAr/A3zcfLg+5Hq6hHYhMiDSdLxPyz70admn\nxtctLNS+zDZu1JoFKrQMGmclhQkTwIp/ug4npSRhWgIkQ9GoIlzb1u+vLQ8Pra/f5Mnw8cewaJFW\nyJwzR9vat4ehQ7VV4W+5BdzdL59f96bd+XTUp4A2xPyXU7/wR8of7D2zl4z8DFPBBGDidxM5cfEE\nAC38W9AuqB1tG7elhX8L+rbsS5ewLjZ617VXv/+VlVrbtk1bNwfgww+hqS37lzXwmpOKv34/++wz\n1q5dy9atW4mMjCQzM5PAwEDVb8TJFJYUkpaXRlpuWqXH4W2HE9UoCoB5P81j3s555Jfkw67K14f7\nhpsKJx6uHkzoPIEw3zA6h3amc2hnWgW2wkVY9v8hKwuOHIH4eNizB377Teu7UHFIqo8P3HmnNiKn\nd+/qmwbqs/wj+RQmF4IfeEZdJVVBaP92jz2mNa//+KNW+/XNN9q/d3y81kSn10PnznDjjXDDDVrB\n5ZprwM/PfJ4tAlrQIqAFYzpVnUnTIA1Eh0fj6erJ0QtHScpMIikzic3HNgPw3wH/NRVOdp3fxZTF\nU4jwiyDEJ4QQb+Nm3O/Xqh+uLrYtPqjCSQNy/Djcc49WZnjxRTu0RTfgDrEAISEhJCYmAlpNjLu7\nO40bNyYvL48XX3yxhqsbHiHEYOAtQAcsk1IuuOS8O/AJ0A1IB+6RUp64XJ65xbms3LeSrMIssgqz\nyCzMNO1HBUbxcp+XATifd55Wb7UiuyjbbD7hvuGmwomHqwf5Jfl467yJbBRJhF8ErRu1pk2jNrRt\n3BYppalg+uEdH1bJq7hYK3hkZGh9vy7dkpLg8GE4c8b8e+rYUWuOHToUevYEN7fLfQL1X/r32vpA\ndAehu/ruJS4u0KePti1dqtWMbdig1Y4dOACxsdpWUUiIVkhp2VLrL1i2hYVBo0YQGKhten2F1xEu\nfHn3lwAUlxZz/OJx4tPiOZZxjKSLSfSIKO8xnZyfTPz5eOLPx1eNV7hQ9FJ5Cfm2j27j+MXjBHgE\nVN7cA+jXqh8j240EID0vnaMXjlr8uajCSQORmgoDBkB6ulZdOHu2HV7Uzh1inc0LL7zAv/71L557\n7jmeeeYZWrRoQdOmTWnUqBFz5szhvffeqzmTBkIIoQMWAwOAZCBWCPGdlPJQhWQPAhlSytZCiNHA\nq8A9l8v3bEoui57cDVIALtqjdAcZTJZvIF/9kIFBQokB2vwyFSF0JAcX4+rpjY/ej6icxjQp8mVf\ndidSIrQ/aXluEovO3s+Z0+kENQ6jqFgrcJwvhtRi2Fp8kWLjsaIibYTGsRIvTua6k5UFPvkFNCOf\nNNw5hTZ01JsSrqG8YBQOROqhaYTWsbV1a2jfDq5pB97GrgLu4e64uWnXl2SWkL0nG52fDr8btJ/V\n0iC5uONi1Q8lDjJKzU/sZfZ6AYF9y0cHZe7OxJBbi1Eh1Vzve6Ovqf9I7qFcilKLzF5+7otz2k49\nHm1kKb0eevXStldfhczMyrVmhw/D0aNw9qy2/VTDZLJeXlohxd9f63/k5aU9enrq8fRsi5dXWzw9\ntaamdT/CRldthvCcpGk8Hv5vckszyS3JIrckk9zSTHJKLlJKIZ99qsPFRbu1/72jC2l54SQLAwgJ\nSBB5QC4n22cgumjpDpxLYeOxGIs/C+Gs1crR0dFyz549Nsk7JiaG3r172yRvW7rSuNPTtSrfAwe0\nIWzbt2v9TWwuNBTOnmXX119zsw2qaeLj42nfvr3V8wXr9zmxF2vEXd3nKoT4Q0oZXafMqyGE6AHM\nklIOMj5/AUBKOb9Cms3GNL8KIVyBM0ATeZmbWKjoKFfzTq1imUg0x/EB4Dn+ZghneJVr2EQYACNJ\n5glqN1tvxevvFMk8LhPY5hvO1g5tCQuDDiKTft/8Was8w6eG0/YdbaXbzF8z+fPmP/G7yY+uv3YF\nwFBk4Cf32k2Fbu56oRf0KuplShPbKZbcA7kW51nd9dH7o/HppH3Of0/4mzMfV1NVBFpd2hroPbx3\nrd6Po9niu8ZggFOntILKqVPa7N5lW2qqViN38aL2aG4+Fcez7D6iak6ucqmpWvXvgQNae+XmzXYq\nmECDb9ZRaqUpcKrC82TgxurSSClLhBCZQGPgfMVEQojJwGSAJrr2HPP2BuOfoADjr7vKFXoV92+6\nLp1rvbNwcQGfhGJOpXnSrm0WXqGluLhIWqXkkpzgARjQ6VxwERLhAkJI469JiRCYjut0kgm3n2BS\nj+N4eZXgsccAa6BfzxT6/cM4eue4cauFFJFCSkyF67tAVlgWMTEx2rES7dilSkpLcNWZv/Wbu17q\nZPkxgOaAvuq11anu+j1/7dEa5wDczMdq0gNyRE7lfOqBnBzbxezmBlFR2maOlJCfryMnx5XcXFcK\nC12Mm67KflGRCwaDoLRU2/Lzi9Hp3E3PS0sFBgOm/ZISF1OXQimFVqMoy/fLXt/cud9+s+z9qcLJ\nVSw+XmvCSUrShqdt2QJNmtgxgAberKPUirk/kktrRCxJg5RyKbAUtBrYB/fcUKtAxld6pk0ANNZM\nuiv+VTwE+Pclx3oDE2qfVY3X7616qFZxm7keCy+tlrnrLcizPtZ418eYwbZxW/p10DCHUTQA336r\nTfCTlKT19N61y8Yjc8xRNSeK5ZKBZhWeRwAp1aUxNuv4AxfsEp2iKHalCidXmfx8eOIJbXjhxYsw\ncqTWxyQoyAHBqJoTxXKxQBshREshhBswGvjukjTfAeOM+3cB2y/X30RRlPpLNetcRTZt0pbmTkzU\nen2/9ppWUHFY2aCBz3OiWM7Yh+QxYDNa98flUsqDQojZwB4p5XfAh8BKIUQCWo3JaMdFrCiKLanC\nyVUgLg7+8x9Yt0573rEjLF+uTdrjUKpZR6kFKeUGYMMlx/5TYb8AuNvecSmKYn/qJ209JSXExGgT\nqXXpohVMvLy02pK9e52gYAKqWUdRFEW5IqrmpJ45ehS++EJb4fKQcXoqd3d49FF4/nlt5kCnoWpO\nFEVRlCugCidOLi9PG2kTEwOff96NhApzP4WGwsMPa1tYmMNCrJ7qc6IoiqJcAfWt4UQyMrQJapYu\n1RaD6tFDmzBtwABtee2EBF/8/LSltdet04YJz5rlpAUTaNDNOpGRkXh6euLj40NoaCjjx4+3aBXh\nmJgYIiIizJ7r3bs3y5Ytszi9oihKfVWnmhMhxN3ALKA90F1KaXa++ZoW9LqaGQyQm6sVPM6dq7ol\nJWmjaxITtaG/l3JxgW7dtOnnGzfez1NPXVfjEtpOo4E366xbt47+/ftz5swZBg0axPz585k3b56j\nw1IURXF6dW3WOQCMApZUl8DCBb2qyEjO5fOnfyuf/pZLpsLlyvdPp+Szf+W+qvlesl9c4kJxqQtF\nJS4Ul4jy/VJhPCeM51zIL9KRU+BKTkHZo7blFVr+EXt7lNAqOJfrIzO5PjKTzpEXiW59kQDvYu3D\nPnAA9+9rt6aHQ5Ut7NBACydlQkNDGTRoEHFxcQAUFhYyY8YMvvjiCwoLC7nzzjtZuHAhnp5Xz3Lw\niqIodVGnwomUMh4wLQ9eje5AgpQy0Zh2NXAHcNnCSeJZb0a/eenSGtbS2Ub5mudDNv5kEsy5SlsT\n0mjGKVqRSCsSaVKQhjgJnATMrNfV0a5RW4lOZ9eakxgRU6v0Pl19iP6jfA2qsuu7ZXUzHdvTbQ85\ne7Ummd6yd61jSk5OZuPGjfTt2xeA6dOnk5iYSFxcHHq9njFjxjB79mzmz59fQ06KoigNgz06xFqy\noBdQecEuX5fW9Gm0HQEIpLaYlnEZjYrPLz1fbXrTMZCGUnQuwvS87DyXPNe7lOAqSnAT2qPepQS9\nKN9cXcrPebgU4a3Lw1uXX2nzcinARdQ0iaUb0I7ztLtsqpKSElxd61cf5owuXcjJz7fJ4lf+/v5k\nZ2fXnPAyDAaD2TxKS0tNxw2G8uXhLX09KSUjR45ECEFOTg69evXimWeeISsriw8++IBdu3ah12ur\npz3xxBNMmjSJF198kby8PKSU1cZUUFBQ6dyl6SvGfaUKCgrq3QJriqJcXWr8phNCbAVCzZyaIaVc\na8FrWLRYF1RdsGvtnr4WZF97ajEm+2kCpNgo7vj4eHx9fSsdu5KaDXPXZ2dnm/Lu/mf3WucjhODb\nb7+lf//+/Pjjj4wZM4bCwkIKCgrIy8ujV6/yJeSllJSWluLr64uXlxdCiCrvC8Dd3R2dTlfpnF6v\nx83NzXSsYtxXysPDgy5dLrdErKIoim3VWDiRUvav42tYsqCXoly1evXqxfjx43nmmWf45ptv8PT0\n5ODBgzSt5UqMzZs358SJE5WOHT9+nBYtWlgxWkVRFMezx1BiSxb0UpSr2rRp09iyZQv79+/noYce\n4sknn+TcuXMAnD59ms2bN1dKX1BQUGmTUnLPPffw0Ucf8fvvvyOl5MiRIyxcuJDRo9USM4qiXF3q\nVDgRQtwphEgGegDfCyE2G4+HCyE2gLagF1C2oFc88IWU8mDdwlaU+qVJkyY88MADzJkzh1dffZXW\nrVtz00034efnR//+/Tl8+LAp7enTp/H09Ky0HTt2jEGDBrFgwQImTJiAv78/Q4cOZdy4cUyePNmB\n70xRFMX66jpaZw2wxszxFGBohedVFvRSlKvZpc0vAO+9955p/5VXXuGVV16pkqZ3795IWX0H6okT\nJzJx4kSrxKgoiuKs1AyxiqIoiqI4FVU4URRFURTFqajCiaIoiqIoTkUVTpR67XL9M5TaU5+noijO\nQBVOlHpLp9NRXFzs6DCuKvn5+aaZaxVFURxFFU6UeisgIICzZ89Wml5euTJSSvLy8jh9+jTBwcGO\nDkdRlAaufi3UoigVBAUFkZycXGmOEGspKCjAw8PD6vnaWl3i1uv1hISE4OfnZ+WoFEVRakcVTpR6\ny8XFhebNm9sk75iYmHq5vkx9jVtRFKUi1ayjKIqiKIpTUYUTRVEcSgjRSAixRQhx1PgYaCZNZyHE\nr0KIg0KI/UKIexwRq6Io9qEKJ4qiONrzwDYpZRtgm/H5pfKAB6SUHYDBwCIhRIAdY1QUxY5U4URR\nFEe7A1hh3F8BjLw0gZTyiJTyqHE/BTgHNLFbhIqi2JVw1kmXhBBpQJKNsg8Cztsob1tScdtPfYwZ\nbBt3Cyml1QsEQoiLUsqACs8zpJRVmnYqnO+OVojpIKWsMo5cCDEZKFuq+RrA+sO5NOpvxL7qY9z1\nMWZwgvuI0xZObEkIsUdKGe3oOGpLxW0/9TFmcN64hRBbgVAzp2YAKywtnAghwoAYYJyUcrctYrWU\ns37WNVFx2099jBmcI241lFhRFJuTUvav7pwQ4qwQIkxKmWosfJyrJp0f8D3wkqMLJoqi2Jbqc6Io\niqN9B4wz7o8D1l6aQAjhBqwBPpFSfmnH2BRFcYCGWjhZ6ugArpCK237qY8xQP+NeAAwQQhwFBhif\nI4SIFkIsM6b5J3AbMF4IEWfcOjsmXJP6+FmDitue6mPM4ARxN8g+J4qiKIqiOK+GWnOiKIqiKIqT\nUoUTRVEURVGcSoMvnAghnhFCSCFEkKNjsYQQ4r9CiL+NU3ivceZZMoUQg4UQh4UQCUIIc7N+Oh0h\nRDMhxA4hRLxxqvQnHB2TpYQQOiHEn0KI9Y6OpaFR9xHbUfcR+3KW+0iDLpwIIZqhdcA76ehYamEL\n0FFKeR1wBHjBwfGYJYTQAYuBIcC1wL1CiGsdG5VFSoCnpZTtgZuAqfUkboAngHhHB9HQqPuI7aj7\niEM4xX2kQRdOgIXAc0C96RUspfxBSllifLobiHBkPJfRHUiQUiZKKYuA1WjTlDs1KWWqlHKvcT8b\n7T9pU8dGVTMhRAQwDFhWU1rF6tR9xHbUfcSOnOk+0mALJ0KIEcBpKeU+R8dSBxOBjY4OohpNgVMV\nnidTD/5zViSEiAS6AL85NhKLLEL7gqwynbtiO+o+YnPqPmJfTnMfuapniK1hyuwXgYH2jcgyl4tb\nSrnWmGYGWtXhp/aMrRaEmWP15pelEMIH+BqYJqXMcnQ8lyOEuB04J6X8QwjR29HxXG3UfcSh1H3E\nTpztPnJVF06qmzJbCNEJaAnsE0KAVqW5VwjRXUp5xo4hmnW5qb4BhBDjgNuBftJ5J6pJBppVeB4B\npDgolloRQujRbiifSim/cXQ8FugJjBBCDAU8AD8hxP9JKe93cFxXBXUfcSh1H7Efp7qPqEnYACHE\nCSBaSun0q0cKIQYDbwK9pJRpjo6nOkIIV7SOdv2A00AsMEZKedChgdVAaN8yK4ALUsppjo6ntoy/\neJ6RUt7u6FgaGnUfsT51H3EMZ7iPNNg+J/XYO4AvsMU4hff7jg7IHGNnu8eAzWidwb5w9huKUU9g\nLNC3wjTpQx0dlKJYmbqP2Ja6j9SRqjlRFEVRFMWpqJoTRVEURVGciiqcKIqiKIriVFThRFEURVEU\np6IKJ4qiKIqiOBVVOFEURVEUxamowomiKIqiKE5FFU4URVEURXEq/w+VjrPO3LllGgAAAABJRU5E\nrkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(-5, 5, 200)\n", "plt.figure(figsize=(9,4))\n", "plt.subplot(121)\n", "plt.plot(x, np.sign(x), \"r-\", linewidth=2, label=\"sign\")\n", "plt.plot(x, logistic(x), \"g--\", linewidth=2, label=\"logistic\");\n", "plt.plot(x, np.tanh(x), \"b-\", linewidth=2, label=\"tanh\");\n", "plt.plot(x, relu(x), \"m-.\", linewidth=2, label=\"ReLU\");\n", "plt.grid(True);\n", "plt.legend(fontsize=12);\n", "plt.title(\"Activation functions\", fontsize=14);\n", "plt.axis([-5, 5, -1.2, 1.2]);\n", "\n", "plt.subplot(122)\n", "plt.plot(x, logistic_deriv(x), \"g--\", linewidth=2, label=\"logistic\")\n", "plt.plot(x, tanh_deriv(x), \"b-\", linewidth=2, label=\"tanh\")\n", "plt.plot(x, relu_deriv(x), \"m-.\", linewidth=2, label=\"ReLU\")\n", "plt.grid(True)\n", "plt.legend(fontsize=14)\n", "plt.title(\"Derivatives\", fontsize=14)\n", "plt.axis([-5, 5, -0.2, 1.2])\n", "plt.savefig('activation_functions.png')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## The XOR learning problem\n", "\n", "The XOR problem is an example of data that is not linearly separable:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "X = np.array( [[0,0], [0,1], [1,0], [1,1]])\n", "y = np.array([0,1,1,0])\n", "colors = np.array(['#377eb8', '#ff7f00'])\n", "plt.scatter(X[:, 0], X[:, 1], color=colors[y])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's demonstrate that this problem can be solved with a very simple neural network:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def mlp_xor(x1, x2, activation=tanh):\n", " return activation(-activation(x1 + x2 - 1.5) + activation(x1 + x2 - 0.5) - 0.5)\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "Text(0.5,1,'XOR network with tanh activation')" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x1_values = np.linspace(-0.2, 1.2, 100)\n", "x2_values = np.linspace(-0.2, 1.2, 100)\n", "x1, x2 = np.meshgrid(x1_values, x2_values)\n", "\n", "z = mlp_xor(x1, x2, activation=tanh)\n", "\n", "plot=plt.contourf(x1, x2, z, 20, cmap=plt.cm.bone)\n", "plt.colorbar(plot)\n", "\n", "plt.scatter(X[:, 0], X[:, 1], color=colors[y])\n", "plt.title(\"XOR network with tanh activation\", fontsize=12)\n", "plt.grid(True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also solve this problem with the ReLu activation fuction:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAERRJREFUeJzt3W2MXGd5h/Hr9q4d550SL4HaTmzA\nqWIshKOpIaUqQQnIcVv7Q6PgqIjQBixoQz+AqAJUKTKq2ga1tBWm4A8pEEGMSSVYIaNAwRHUxYnX\nOATsyLA4xN46kE3iOC9+2bV998MM6WY99pzdndlhn1w/aZU559w6z/14Zv85c86ZnchMJEllmdXt\nBiRJ7We4S1KBDHdJKpDhLkkFMtwlqUCGuyQVyHCXpAIZ7pJUIMNdkgrU262B582bl4sWLerW8JI0\nI+3cufOJzOxrVde1cF+0aBEDAwPdGl6SZqSIeLRKnadlJKlAhrskFchwl6QCGe6SVCDDXZIKZLhL\nUoG6divklJw6BQe2wdGnYOHvwfktb/mUpK554tnj7B56mpdfcA7LFlxMRHR8zJbhHhF3An8EPJ6Z\ny5psD+BfgVXAEeDdmfnDdjf6gid/Bl+8Do4eggg4OQK//xG45vaODSlJk5GZbPj2T9m8fT+ze4NT\nCZdccA6fvrnGK192bkfHrnJa5vPAyrNsvx5Y0vhZB/z71Ns6g0z40io4fABGnoXjz8CJY7DtDhi8\nt2PDStJkbN3zK+554AAjJ0/x/PGTHB05ycFDR/jru3d1fOyW4Z6Z3wOeOkvJGuCLWbcdeFlEvKpd\nDb7IL38Ezz4GjPtS79Hn4YFPd2RISZqszffv59joyRetO5Xw6BPPM/TUkY6O3Y4LqvOBA2OWhxrr\nThMR6yJiICIGhoeHJz7S8WdgVk/zbUcPTXx/ktRBzx0bbbq+Z1bw3LETHR27HeHe7MpANllHZm7M\nzFpm1vr6JnER9LdrcOrk6et7z4XX3Tjx/UlSB731ykuZ03t6zPbMCl576QUdHbsd4T4ELByzvAA4\n2Ib9nm7OefCHG+phHo3WZ58PL38tXPWejgwpSZP1jqsv5xUXzWXu7HpezQqYO3sWH139Onp7Onsn\nejtuhewHbo2ITcAbgcOZ+Vgb9tvcG26GS18POz4Dz/0SfmcNvP5PYXZnrzxL0kRdMHc2d73/arY8\neJBtPxvmlRedy5+sWMhrLr2w42NHZtMzKP9fEHE3cA0wD/gV8LfAbIDM/GzjVshPU7+j5gjwZ5nZ\n8m/51mq19E/+StLERMTOzKy1qmt55J6ZN7XYnsBfTqA3SVKH+ecHJKlAhrskFchwl6QCGe6SVCDD\nXZIKZLhLUoEMd0kqkOEuSQUy3CWpQIa7JBXIcJekAhnuklQgw12SCmS4S1KBDHdJKpDhLkkFMtwl\nqUCGuyQVyHCXpAIZ7pJUIMNdkgpkuEtSgQx3SSqQ4S5JBTLcJalAhrskFchwl6QCGe6SVCDDXZIK\nVCncI2JlROyNiMGIuK3J9ssiYmtE7IqIhyJiVftblSRV1TLcI6IH2ABcDywFboqIpePK/gbYnJnL\ngbXAZ9rdqCSpuipH7iuAwczcl5kjwCZgzbiaBC5qPL4YONi+FiVJE9VboWY+cGDM8hDwxnE1Hwe+\nFREfAM4HrmtLd5KkSaly5B5N1uW45ZuAz2fmAmAVcFdEnLbviFgXEQMRMTA8PDzxbiVJlVQJ9yFg\n4ZjlBZx+2uUWYDNAZv4AmAvMG7+jzNyYmbXMrPX19U2uY0lSS1XCfQewJCIWR8Qc6hdM+8fV7Aeu\nBYiIK6mHu4fmktQlLcM9M08AtwL3Ag9Tvytmd0Ssj4jVjbIPAe+NiB8BdwPvzszxp24kSdOkygVV\nMnMLsGXcutvHPN4DvLm9rUmSJstPqEpSgQx3SSqQ4S5JBTLcJalAhrskFchwl6QCGe6SVCDDXZIK\nZLhLUoEMd0kqkOEuSQUy3CWpQIa7JBXIcJekAhnuklQgw12SCmS4S1KBDHdJKpDhLkkFMtwlqUCG\nuyQVyHCXpAIZ7pJUIMNdkgpkuEtSgQx3SSqQ4S5JBTLcJalAhrskFchwl6QCVQr3iFgZEXsjYjAi\nbjtDzY0RsScidkfEl9vbpiRpInpbFURED7ABeBswBOyIiP7M3DOmZgnwEeDNmXkoIl7RqYYlSa1V\nOXJfAQxm5r7MHAE2AWvG1bwX2JCZhwAy8/H2tilJmogq4T4fODBmeaixbqwrgCsiYltEbI+Ile1q\nUJI0cS1PywDRZF022c8S4BpgAfD9iFiWmU+/aEcR64B1AJdddtmEm5UkVVPlyH0IWDhmeQFwsEnN\n1zNzNDMfAfZSD/sXycyNmVnLzFpfX99ke5YktVAl3HcASyJicUTMAdYC/eNqvga8FSAi5lE/TbOv\nnY1KkqprGe6ZeQK4FbgXeBjYnJm7I2J9RKxulN0LPBkRe4CtwIcz88lONS1JOrvIHH/6fHrUarUc\nGBjoytiSNFNFxM7MrLWq8xOqklQgw12SCmS4S1KBDHdJKpDhLkkFMtwlqUCGuyQVyHCXpAIZ7pJU\nIMNdkgpkuEtSgQx3SSqQ4S5JBTLcJalAhrskFchwl6QCGe6SVCDDXZIKZLhLUoEMd0kqkOEuSQUy\n3CWpQIa7JBXIcJekAhnuklQgw12SCmS4S1KBDHdJKpDhLkkFMtwlqUCVwj0iVkbE3ogYjIjbzlJ3\nQ0RkRNTa16IkaaJahntE9AAbgOuBpcBNEbG0Sd2FwF8B97e7SUnSxFQ5cl8BDGbmvswcATYBa5rU\nfQK4AzjWxv4kSZNQJdznAwfGLA811r0gIpYDCzPzG2fbUUSsi4iBiBgYHh6ecLOSpGqqhHs0WZcv\nbIyYBXwK+FCrHWXmxsysZWatr6+vepeSpAmpEu5DwMIxywuAg2OWLwSWAfdFxC+ANwH9XlSVpO6p\nEu47gCURsTgi5gBrgf5fb8zMw5k5LzMXZeYiYDuwOjMHOtKxJKmlluGemSeAW4F7gYeBzZm5OyLW\nR8TqTjcoSZq43ipFmbkF2DJu3e1nqL1m6m1JkqbCT6hKUoEMd0kqkOEuSQUy3CWpQIa7JBXIcJek\nAhnuklQgw12SCmS4S1KBDHdJKpDhLkkFMtwlqUCGuyQVyHCXpAIZ7pJUIMNdkgpkuEtSgQx3SSqQ\n4S5JBTLcJalAhrskFchwl6QCGe6SVCDDXZIKZLhLUoEMd0kqkOEuSQUy3CWpQIa7JBXIcJekAlUK\n94hYGRF7I2IwIm5rsv2DEbEnIh6KiO9ExOXtb1WSVFXLcI+IHmADcD2wFLgpIpaOK9sF1DLz9cA9\nwB3tblSSVF2VI/cVwGBm7svMEWATsGZsQWZuzcwjjcXtwIL2tilJmogq4T4fODBmeaix7kxuAb7Z\nbENErIuIgYgYGB4ert6lJGlCqoR7NFmXTQsj3gnUgE82256ZGzOzlpm1vr6+6l1Kkiakt0LNELBw\nzPIC4OD4ooi4DvgY8JbMPN6e9iRJk1HlyH0HsCQiFkfEHGAt0D+2ICKWA58DVmfm4+1vU5I0ES3D\nPTNPALcC9wIPA5szc3dErI+I1Y2yTwIXAF+NiAcjov8Mu5MkTYMqp2XIzC3AlnHrbh/z+Lo29yVJ\nmgI/oSpJBTLcJalAhrskFchwl6QCGe6SVCDDXZIKZLhLUoEMd0kqkOEuSQUy3CWpQIa7JBXIcJek\nAhnuklQgw12SCmS4S1KBDHdJKpDhLkkFMtwlqUCGuyQVyHCXpAIZ7pJUIMNdkgpkuEtSgQx3SSqQ\n4S5JBTLcJalAhrskFchwl6QCGe6SVKBK4R4RKyNib0QMRsRtTbafExFfaWy/PyIWtbvRsQ4fGeGe\nB/Zz530/58FHD5GZnRxOkiYvEx7ZCveth4HPwdGnp2XY3lYFEdEDbADeBgwBOyKiPzP3jCm7BTiU\nma+NiLXAPwLv6ETDOx95ig996YckycjoKeb+dw+/+5pL+Pt3vIGeWdGJISVpck6OwpdWwdB2GHke\nZp8L3/owvOvbsOCNHR26ypH7CmAwM/dl5giwCVgzrmYN8IXG43uAayOi7Ul74uQpPrr5QY6NnuT4\n6CkSODp6kgd+/iTf+vFj7R5OkqZm50Y48D8w8hyQMHoERp6FzTfUj+g7qEq4zwcOjFkeaqxrWpOZ\nJ4DDwCXtaHCshw8+w+iJU6etPzZ6km/s+t92DydJU7PrP+qBPt7RQ/D47o4OXSXcmx2Bj/9fTpUa\nImJdRAxExMDw8HCV/loOUmWbJHXF2U5gtP/kxotUCfchYOGY5QXAwTPVREQvcDHw1PgdZebGzKxl\nZq2vr2/CzV45/2Lm9J7e8rmze/jjq8a/mZCkLlv+5zD7vNPXn3cJ9C3t6NBVwn0HsCQiFkfEHGAt\n0D+uph+4ufH4BuC72YFbWHpmBf+wdjnnzulh7uweegLmzu7h6iXzeNuyV7V7OEmamqveA5e/BWaf\nD9FT/+85F8GN/9nxI/eoksERsQr4F6AHuDMz/y4i1gMDmdkfEXOBu4Dl1I/Y12bmvrPts1ar5cDA\nwKSafvboKN/Z/UueOTrKVYtfzuvmX0wHrt9K0tRlwv5tsP/7cP6lsPQGmHvRpHcXETszs9ayrlv3\niE8l3CXppapquPsJVUkqkOEuSQUy3CWpQIa7JBXIcJekAhnuklQgw12SCtS1+9wjYhh4dIq7mQc8\n0YZ2ZgrnW76X2pyd78Rdnpkt/35L18K9HSJioMrN/KVwvuV7qc3Z+XaOp2UkqUCGuyQVaKaH+8Zu\nNzDNnG/5Xmpzdr4dMqPPuUuSmpvpR+6SpCZmRLhHxMqI2BsRgxFxW5Pt50TEVxrb74+IRdPfZftU\nmO8HI2JPRDwUEd+JiMu70We7tJrvmLobIiIjYkbfXVFlvhFxY+M53h0RX57uHtupwuv5sojYGhG7\nGq/pVd3os10i4s6IeDwifnKG7RER/9b493goIq7qSCOZ+Rv9Q/0LQn4OvBqYA/wIWDqu5i+AzzYe\nrwW+0u2+OzzftwLnNR6/v/T5NuouBL4HbAdq3e67w8/vEmAX8FuN5Vd0u+8Oz3cj8P7G46XAL7rd\n9xTn/AfAVcBPzrB9FfBN6l/9/Cbg/k70MROO3FcAg5m5LzNHgE3AmnE1a4AvNB7fA1wbM/ermVrO\nNzO3Zuavv1J9O/XvtZ2pqjy/AJ8A7gCOTWdzHVBlvu8FNmTmIYDMfHyae2ynKvNN4NdfTXQxp39H\n84ySmd+jyXdIj7EG+GLWbQdeFhFt/57QmRDu84EDY5aHGuua1mTmCeAwcMm0dNd+VeY71i3UjwJm\nqpbzjYjlwMLM/MZ0NtYhVZ7fK4ArImJbRGyPiJXT1l37VZnvx4F3RsQQsAX4wPS01jUT/R2flN52\n77ADmh2Bj7/Fp0rNTFF5LhHxTqAGvKWjHXXWWecbEbOATwHvnq6GOqzK89tL/dTMNdTflX0/IpZl\n5tMd7q0Tqsz3JuDzmflPEXE1cFdjvqc6315XTEtezYQj9yFg4ZjlBZz+tu2Fmojopf7W7mxvi36T\nVZkvEXEd8DFgdWYen6beOqHVfC8ElgH3RcQvqJ+j7J/BF1Wrvp6/npmjmfkIsJd62M9EVeZ7C7AZ\nIDN/AMyl/jdYSlXpd3yqZkK47wCWRMTiiJhD/YJp/7iafuDmxuMbgO9m48rFDNRyvo3TFJ+jHuwz\n+XwstJhvZh7OzHmZuSgzF1G/xrA6M2fqt6tXeT1/jfpFcyJiHvXTNPumtcv2qTLf/cC1ABFxJfVw\nH57WLqdXP/Cuxl0zbwIOZ+ZjbR+l21eWK159XgX8lPpV94811q2n/ksO9RfDV4FB4AHg1d3uucPz\n/S/gV8CDjZ/+bvfcyfmOq72PGXy3TMXnN4B/BvYAPwbWdrvnDs93KbCN+p00DwJv73bPU5zv3cBj\nwCj1o/RbgPcB7xvz/G5o/Hv8uFOvZz+hKkkFmgmnZSRJE2S4S1KBDHdJKpDhLkkFMtwlqUCGuyQV\nyHCXpAIZ7pJUoP8DB5Pp1pzNGvgAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "def relu(x):\n", " return np.maximum(x, 0)\n", "\n", "w1 = np.ones((2,2))\n", "b1 = np.array([0, -1])\n", "w2 = np.array([1, -2])\n", "b2 = 0\n", "\n", "y_pred = relu(X.dot(w1) + b1).dot(w2) + b2\n", "\n", "# plot the output generated by the network:\n", "y_pred = np.array(y_pred, dtype='int')\n", "plt.scatter(X[:, 0], X[:, 1], color=colors[y_pred])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at the representation that was used to classify the data:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "h = relu(X.dot(w1) + b1)\n", "plt.scatter(h[:, 0], h[:, 1], color=colors[y])" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "class NeuralNetwork :\n", " def __init__(self, architecture, activation='logistic') :\n", " self.architecture = architecture\n", " if activation == 'logistic':\n", " self.activation = logistic\n", " self.activation_deriv = logistic_deriv\n", " elif activation == 'tanh':\n", " self.activation = tanh\n", " self.activation_deriv = tanh_deriv\n", " else :\n", " raise ValueError('Activation does not match options')\n", " self.initialize_weights()\n", " \n", " def initialize_weights(self) :\n", " W = {}\n", " b = {}\n", " for l in range(1, len(self.architecture)):\n", " W[l] = np.random.random((self.architecture[l], self.architecture[l-1]))\n", " b[l] = np.random.random((self.architecture[l],))\n", " #W[l] = np.random.randn(self.architecture[l], self.architecture[l-1])\n", " #b[l] = np.random.randn(self.architecture[l])\n", " self.W, self.b = W, b\n", "\n", " def forward(self, x):\n", " h = {1: x}\n", " s = {}\n", " for l in range(1, len(self.W) + 1):\n", " s[l+1] = self.W[l].dot(h[l]) + self.b[l]\n", " h[l+1] = self.activation(s[l+1])\n", " return h, s\n", " \n", " def init_delta_values(self):\n", " delta_W = {}\n", " delta_b = {}\n", " for l in range(1, len(self.architecture)):\n", " delta_W[l] = np.zeros((self.architecture[l], self.architecture[l-1]))\n", " delta_b[l] = np.zeros((self.architecture[l],))\n", " return delta_W, delta_b\n", "\n", " def calculate_output_layer_delta(self, y, h_out, s_out):\n", " return -(y-h_out) * self.activation_deriv(s_out)\n", "\n", " def calculate_hidden_delta(self, delta_plus_1, w_l, s_l):\n", " # delta^(l) = (transpose(W^(l)) * delta^(l+1)) * f'(s^(l))\n", " return np.dot(np.transpose(w_l), delta_plus_1) * self.activation_deriv(s_l)\n", "\n", " def fit(self, X, y, num_iterations=3000, alpha=0.25):\n", " iterations = 0\n", " N = len(y)\n", " avg_cost_func = []\n", " print('Starting gradient descent for {} iterations'.format(num_iterations))\n", " while iterations < num_iterations :\n", " if iterations%100 == 0:\n", " print('Iteration {} of {}'.format(iterations, num_iterations))\n", " if len(avg_cost_func) > 0 :\n", " print('cost: ', avg_cost_func[-1])\n", " delta_W, delta_b = self.init_delta_values()\n", " avg_cost = 0\n", " for i in range(len(y)):\n", " delta = {}\n", " # perform the feed forward pass and return the stored h and z values, to be used in the\n", " # gradient descent step\n", " h, s = self.forward(X[i, :])\n", " # backpropagate the errors\n", " for l in range(len(self.architecture), 0, -1):\n", " if l == len(self.architecture):\n", " delta[l] = self.calculate_output_layer_delta(y[i,:], h[l], s[l])\n", " avg_cost += (np.linalg.norm((y[i,:]-h[l])) / N)\n", " else:\n", " if l > 1:\n", " delta[l] = self.calculate_hidden_delta(delta[l+1], self.W[l], s[l])\n", " delta_W[l] += np.dot(delta[l+1][:,np.newaxis], np.transpose(h[l][:,np.newaxis]))\n", " delta_b[l] += delta[l+1]\n", " # perform the gradient descent step for the weights in each layer\n", " for l in range(len(self.architecture) - 1, 0, -1):\n", " self.W[l] += -alpha * (1.0/N * delta_W[l])\n", " self.b[l] += -alpha * (1.0/N * delta_b[l])\n", " # complete the average cost calculation\n", " avg_cost_func.append(avg_cost)\n", " iterations += 1\n", " return avg_cost_func\n", "\n", " def predict(self, X):\n", " N = X.shape[0]\n", " y = np.zeros((N,))\n", " for i in range(N):\n", " h, _ = self.forward(X[i, :])\n", " y[i] = np.argmax(h[len(self.architecture)])\n", " return y\n", "\n", " def decision_function(self, X):\n", " N = X.shape[0]\n", " scores = np.zeros((N,self.architecture[-1]))\n", " for i in range(N):\n", " h, _ = self.forward(X[i, :])\n", " scores[i]=h[len(self.architecture)]\n", " return scores\n" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(10, 2)\n", "(10, 2)\n" ] }, { "data": { "text/plain": [ "array([[ 0.83997171, 0.80862343],\n", " [ 0.77539435, 0.77146198],\n", " [ 0.7585131 , 0.76352457],\n", " [ 0.77129192, 0.77047476],\n", " [ 0.73082053, 0.72970056],\n", " [ 0.79830232, 0.78025445],\n", " [ 0.80332407, 0.78607616],\n", " [ 0.86150465, 0.82762999],\n", " [ 0.80025889, 0.78521383],\n", " [ 0.78597356, 0.75506333]])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "architecture = [2, 3, 2]\n", "network = NeuralNetwork(architecture)\n", "X = np.random.randn(10, 2)\n", "network.decision_function(X)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's apply the network to a digit recognition problem. But before we do so, let's see how well we can do with an SVM..." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "//anaconda/lib/python3.5/site-packages/sklearn/utils/fixes.py:313: FutureWarning: numpy not_equal will not check object identity in the future. The comparison did not return the same result as suggested by the identity (`is`)) and will change.\n", " _nan_object_mask = _nan_object_array != _nan_object_array\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP4AAAECCAYAAADesWqHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAC+9JREFUeJzt3V+InPUVxvHn6RqJ/0JiNxVx1e1C\nCYhQE5dQCUibuKJV7E2VBBQqLelFK4YWjPameKc3Yi+KIFErGJVEDRRprYKKCK12N8YaTSwmRtxG\nzQYjUYsNxtOLeVNi2Lrvrvv77cye7weGndmdnXP2zzO/d2beeY8jQgBy+cZcNwCgPoIPJETwgYQI\nPpAQwQcSIvhAQl0RfNtX2H7T9lu2by1c637bB2zvLFnnuHrn2n7O9i7br9u+uXC9hbZftv1qU+/2\nkvWamn22X7H9ZOlaTb19tl+zvcP2aOFai20/Znt38ze8pGCtZc3PdOx02PaGIsUiYk5Pkvok7ZE0\nJOlkSa9KuqBgvUslrZC0s9LPd7akFc35MyT9s/DPZ0mnN+cXSHpJ0vcK/4y/kvSwpCcr/U73Seqv\nVOtBST9rzp8saXGlun2S3pd0fonb74YVf6WktyJib0QckfSopB+VKhYRL0j6sNTtT1LvvYjY3pz/\nWNIuSecUrBcR8UlzcUFzKraXlu0BSVdJ2lSqxlyxvUidheI+SYqIIxHxUaXyayTtiYh3Stx4NwT/\nHEnvHnd5XAWDMZdsD0pars4qXLJOn+0dkg5IeiYiSta7W9Itkr4oWONEIelp22O21xesMyRpQtID\nzUOZTbZPK1jveGslPVLqxrsh+J7kc/NuP2Lbp0t6XNKGiDhcslZEHI2IiyQNSFpp+8ISdWxfLelA\nRIyVuP2vsCoiVki6UtIvbF9aqM5J6jwsvCcilkv6VFLR56AkyfbJkq6RtLVUjW4I/rikc4+7PCBp\n/xz1UoTtBeqEfnNEPFGrbrNZ+rykKwqVWCXpGtv71HmIttr2Q4Vq/U9E7G8+HpC0TZ2HiyWMSxo/\nbovpMXXuCEq7UtL2iPigVIFuCP7fJX3H9rebe7q1kv44xz3NGttW5zHiroi4q0K9pbYXN+dPkXSZ\npN0lakXEbRExEBGD6vzdno2I60vUOsb2abbPOHZe0uWSirxCExHvS3rX9rLmU2skvVGi1gnWqeBm\n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\nIYIPJPRfwIPOarFTewYAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "//anaconda/lib/python3.5/site-packages/sklearn/model_selection/_search.py:841: DeprecationWarning: The default of the `iid` parameter will change from True to False in version 0.22 and will be removed in 0.24. This will change numeric results when test-set sizes are unequal.\n", " DeprecationWarning)\n" ] }, { "data": { "text/plain": [ "0.95331503132520745" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.datasets import load_digits\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.model_selection import cross_validate\n", "from sklearn import svm\n", "from sklearn import metrics\n", "\n", "digits = load_digits()\n", "\n", "plt.matshow(digits.images[0], cmap=plt.cm.gray_r)\n", "plt.show()\n", "\n", "digits = load_digits()\n", "X_scale = StandardScaler()\n", "#X = X_scale.fit_transform(digits.data)\n", "X = digits.data / digits.data.max()\n", "y = digits.target\n", "\n", "from sklearn.model_selection import GridSearchCV\n", "C_list = np.logspace(-2, 2, 10)\n", "classifier = GridSearchCV(svm.SVC(kernel='linear'), dict(C=C_list), cv=5)\n", "cv_results_nested = cross_validate(classifier, X, y, cv=5, scoring='accuracy')\n", "np.mean(cv_results_nested['test_score'])\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import load_digits\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import accuracy_score\n", "\n", "def y_to_vect(y):\n", " y_vect = np.zeros((len(y), 10))\n", " for i in range(len(y)):\n", " y_vect[i, y[i]] = 1\n", " return y_vect\n", "\n", "digits = load_digits()\n", "X_scale = StandardScaler()\n", "X = X_scale.fit_transform(digits.data)\n", "#X = digits.data / digits.data.max()\n", "y = digits.target\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4)\n", "# convert labels to vectors\n", "y_vec_train = y_to_vect(y_train)\n", "y_vec_test = y_to_vect(y_test)\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Starting gradient descent for 4000 iterations\n", "Iteration 0 of 4000\n", "Iteration 100 of 4000\n", "cost: 2.57537345395\n", "Iteration 200 of 4000\n", "cost: 2.18130487651\n", "Iteration 300 of 4000\n", "cost: 1.39322466988\n", "Iteration 400 of 4000\n", "cost: 0.91675175766\n", "Iteration 500 of 4000\n", "cost: 0.896294919991\n", "Iteration 600 of 4000\n", "cost: 0.875248649357\n", "Iteration 700 of 4000\n", "cost: 0.853556450919\n", "Iteration 800 of 4000\n", "cost: 0.831206649849\n", "Iteration 900 of 4000\n", "cost: 0.808409560832\n", "Iteration 1000 of 4000\n", "cost: 0.785314116242\n", "Iteration 1100 of 4000\n", "cost: 0.762069879728\n", "Iteration 1200 of 4000\n", "cost: 0.738954628916\n", "Iteration 1300 of 4000\n", "cost: 0.716239757337\n", "Iteration 1400 of 4000\n", "cost: 0.694048380588\n", "Iteration 1500 of 4000\n", "cost: 0.672417383751\n", "Iteration 1600 of 4000\n", "cost: 0.651396671924\n", "Iteration 1700 of 4000\n", "cost: 0.631071663657\n", "Iteration 1800 of 4000\n", "cost: 0.611523173857\n", "Iteration 1900 of 4000\n", "cost: 0.592791512152\n", "Iteration 2000 of 4000\n", "cost: 0.574934823047\n", "Iteration 2100 of 4000\n", "cost: 0.558021500537\n", "Iteration 2200 of 4000\n", "cost: 0.542031571625\n", "Iteration 2300 of 4000\n", "cost: 0.526913371074\n", "Iteration 2400 of 4000\n", "cost: 0.5126048701\n", "Iteration 2500 of 4000\n", "cost: 0.499040260894\n", "Iteration 2600 of 4000\n", "cost: 0.486159406177\n", "Iteration 2700 of 4000\n", "cost: 0.473912157258\n", "Iteration 2800 of 4000\n", "cost: 0.462255630165\n", "Iteration 2900 of 4000\n", "cost: 0.451149453357\n", "Iteration 3000 of 4000\n", "cost: 0.440555103145\n", "Iteration 3100 of 4000\n", "cost: 0.430439017608\n", "Iteration 3200 of 4000\n", "cost: 0.420773232112\n", "Iteration 3300 of 4000\n", "cost: 0.411530756284\n", "Iteration 3400 of 4000\n", "cost: 0.4026794059\n", "Iteration 3500 of 4000\n", "cost: 0.394186489876\n", "Iteration 3600 of 4000\n", "cost: 0.386041608596\n", "Iteration 3700 of 4000\n", "cost: 0.378280784085\n", "Iteration 3800 of 4000\n", "cost: 0.37088390664\n", "Iteration 3900 of 4000\n", "cost: 0.363820171413\n", "Prediction accuracy is 88.73435326842836%\n" ] }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "Text(0,0.5,'Average loss')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "Text(0.5,0,'Iteration number')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# the NN architecture\n", "architecture = [64, 30, 10]\n", "# train the NN\n", "network = NeuralNetwork(architecture, 'logistic')\n", "cost_func = network.fit(X_train, y_vec_train, 4000)\n", "y_pred = network.predict(X_test)\n", "print('Prediction accuracy is {}%'.format(accuracy_score(y_test, y_pred) * 100))\n", "\n", "# plot the avg_cost_func\n", "plt.plot(cost_func)\n", "plt.ylabel('Average loss')\n", "plt.xlabel('Iteration number')\n" ] } ], "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.5.5" } }, "nbformat": 4, "nbformat_minor": 1 }