Multi-Layer-Neural-Networks / develop_neural_network.ipynb
develop_neural_network.ipynb
Raw
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Implement a Neural Network\n",
    "\n",
    "This notebook contains useful information and testing code to help you to develop a neural network by implementing the forward pass and backpropagation algorithm in the `models/neural_net.py` file. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "from models.neural_net import NeuralNetwork\n",
    "\n",
    "%matplotlib inline\n",
    "plt.rcParams['figure.figsize'] = (10.0, 8.0)  # set default size of plots\n",
    "\n",
    "# For auto-reloading external modules\n",
    "# See http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython\n",
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "def rel_error(x, y):\n",
    "    \"\"\"Returns relative error\"\"\"\n",
    "    return np.max(np.abs(x - y) / (np.maximum(1e-8, np.abs(x) + np.abs(y))))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You will implement your network in the class `NeuralNetwork` inside the file `models/neural_net.py` to represent instances of the network. The network parameters are stored in the instance variable `self.params` where keys are string parameter names and values are numpy arrays.\n",
    "\n",
    "The cell below initializes a toy dataset and corresponding model which will allow you to check your forward and backward pass by using a numeric gradient check."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create a small net and some toy data to check your implementations.\n",
    "# Note that we set the random seed for repeatable experiments.\n",
    "\n",
    "input_size = 4\n",
    "hidden_size = 5\n",
    "num_classes = 3\n",
    "num_inputs = 5\n",
    "\n",
    "\n",
    "def init_toy_model(num_layers):\n",
    "    np.random.seed(0)\n",
    "    hidden_sizes = [hidden_size] * (num_layers - 1)\n",
    "    return NeuralNetwork(input_size, hidden_sizes, num_classes, num_layers)\n",
    "\n",
    "def init_toy_data():\n",
    "    np.random.seed(0)\n",
    "    X = 10 * np.random.randn(num_inputs, input_size)\n",
    "#    y = np.array([0, 1, 2, 2, 1]) # (C,)\n",
    "    y = np.random.randint(num_classes, size=num_inputs)\n",
    "    return X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# net = init_toy_model(2)\n",
    "# X, y = init_toy_data()\n",
    "# print(X)\n",
    "# scores=net.forward(X)\n",
    "# print(scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Implement forward and backward pass\n",
    "\n",
    "The first thing you will do is implement the forward pass of your neural network along with the loss calculation. The forward pass should be implemented in the `forward` function. You can use helper functions like `linear`, `relu`, and `softmax` to help organize your code.\n",
    "\n",
    "Next, you will implement the backward pass using the backpropagation algorithm. Backpropagation will compute the gradient of the loss with respect to the model parameters `W1`, `b1`, ... etc. Use a softmax fuction with cross entropy loss for loss calcuation. Fill in the code blocks in `NeuralNetwork.backward`. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Train the network\n",
    "To train the network we will use stochastic gradient descent (SGD), similar to the SVM and Softmax classifiers you trained. This should be similar to the training procedure you used for the SVM and Softmax classifiers.\n",
    "\n",
    "Once you have implemented SGD, run the code below to train a two-layer network on toy data. You should achieve a training loss less than 0.2 using a two-layer network with relu activation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Hyperparameters\n",
    "input_size = 4\n",
    "hidden_size = 5\n",
    "num_classes = 3\n",
    "num_inputs = 5\n",
    "\n",
    "\n",
    "epochs = 500#100\n",
    "batch_size = 1\n",
    "learning_rate = 1e-2\n",
    "learning_rate_decay = 0.95\n",
    "regularization =5e-6#0.09 #\n",
    "\n",
    "# Initialize a new neural network model\n",
    "net = init_toy_model(3)\n",
    "\n",
    "X, y= init_toy_data()\n",
    "# print(X)\n",
    "#print(X.shape, y.shape)\n",
    "# Variables to store performance for each epoch\n",
    "train_loss = np.zeros(epochs)\n",
    "train_accuracy = np.zeros(epochs)\n",
    "\n",
    "# For each epoch...\n",
    "for epoch in range(epochs): \n",
    "    scores=net.forward(X)\n",
    "#     print(scores)\n",
    "#     print()\n",
    "    y_pred = np.argmax(scores, axis=1)\n",
    "    #print(\"y_pred\",y_pred)\n",
    "    #print(\"y_actual\",y)\n",
    "    train_accuracy[epoch] = (np.sum(y==y_pred)/len(y))\n",
    "    \n",
    "    # Run the forward pass of the model to get a prediction and compute the accuracy\n",
    "    # Run the backward pass of the model to update the weights and compute the loss\n",
    "    \n",
    "    train_loss[epoch],_=net.backward(X,y,\"SGD\",learning_rate,regularization)  \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.71160664 1.19447489 0.84228145 0.78094819 0.75656102 0.73364339\n",
      " 0.71330759 0.69511702 0.67749643 0.66096199 0.64567992 0.63087822\n",
      " 0.61692832 0.60374883 0.59108207 0.57909891 0.56760112 0.55666277\n",
      " 0.54617023 0.53613973 0.52653433 0.5173223  0.50847589 0.4999706\n",
      " 0.49178469 0.48389866 0.47629497 0.46895771 0.46187239 0.45502573\n",
      " 0.45030083 0.44900411 0.43833874 0.43320147 0.43332431 0.42295032\n",
      " 0.41883799 0.4183316  0.40854689 0.40595836 0.40412592 0.39505082\n",
      " 0.39405146 0.39076544 0.38376585 0.38404575 0.37530196 0.37458112\n",
      " 0.37126373 0.36539509 0.36511662 0.35768095 0.35873265 0.35096842\n",
      " 0.35001708 0.34721579 0.34199963 0.34177059 0.33520272 0.33610852\n",
      " 0.32942698 0.32837909 0.32591951 0.32123385 0.32107859 0.31526243\n",
      " 0.31462537 0.31190532 0.30794384 0.30744494 0.3022725  0.30177031\n",
      " 0.29904386 0.29563123 0.29496148 0.29035119 0.29063026 0.28599801\n",
      " 0.28482759 0.28291855 0.27924855 0.27911989 0.27495904 0.27380246\n",
      " 0.27197447 0.26847148 0.26833271 0.26458264 0.26310978 0.26161926\n",
      " 0.25833508 0.25724321 0.25540794 0.25227064 0.25139375 0.24939934\n",
      " 0.24642576 0.24602229 0.24282877 0.24117025 0.23990825 0.23701928\n",
      " 0.23555711 0.23410722 0.23136592 0.2298314  0.22843801 0.22575736\n",
      " 0.22417577 0.22268554 0.21758607 0.21280212 0.20868023 0.20503003\n",
      " 0.20022854 0.19639372 0.19311524 0.18866058 0.18775713 0.18491384\n",
      " 0.18342773 0.18187414 0.18066043 0.17717459 0.17735266 0.17314705\n",
      " 0.17257691 0.16991321 0.16917376 0.16751736 0.16539878 0.16286308\n",
      " 0.16258098 0.16059502 0.15843273 0.15778541 0.15485309 0.1538432\n",
      " 0.15166707 0.15082267 0.14909069 0.14860329 0.14551451 0.14598558\n",
      " 0.14242643 0.14220086 0.14010415 0.13942705 0.13812383 0.13615243\n",
      " 0.13573227 0.13320311 0.13327858 0.13049375 0.12999026 0.12795275\n",
      " 0.1278469  0.12619924 0.12492655 0.12408978 0.12233023 0.1211392\n",
      " 0.11985643 0.11895319 0.11791898 0.11717066 0.11530556 0.11520673\n",
      " 0.1129439  0.11252972 0.11096721 0.11026934 0.10913037 0.10843899\n",
      " 0.10749774 0.1061061  0.10576177 0.10394068 0.10395165 0.10194578\n",
      " 0.10155984 0.10025005 0.09954166 0.09864124 0.09791315 0.09718039\n",
      " 0.09587541 0.09565518 0.09396719 0.09406441 0.09237628 0.09182299\n",
      " 0.09090766 0.09002835 0.08946549 0.08829605 0.08799749 0.08692431\n",
      " 0.08676674 0.08537622 0.08484571 0.08437521 0.08323046 0.08300994\n",
      " 0.08168249 0.0817329  0.0801343  0.08045857 0.07888134 0.07861555\n",
      " 0.07783598 0.07725441 0.07677213 0.0757353  0.07567445 0.07439185\n",
      " 0.07415899 0.07334902 0.0727537  0.07225594 0.07163538 0.07131159\n",
      " 0.07027547 0.07027079 0.06919657 0.06880791 0.06825643 0.0675477\n",
      " 0.06724823 0.06637532 0.06630784 0.06543366 0.06518618 0.06468958\n",
      " 0.0639827  0.06380945 0.06286491 0.0628989  0.06184429 0.06176501\n",
      " 0.06112313 0.06074493 0.06035121 0.05965843 0.05958164 0.05864816\n",
      " 0.05855438 0.05793004 0.05764477 0.05725765 0.05661996 0.05651629\n",
      " 0.055691   0.05560411 0.05502279 0.05474995 0.05436799 0.0538025\n",
      " 0.05369292 0.05294868 0.05284004 0.05233093 0.05206347 0.05170763\n",
      " 0.05118333 0.05109066 0.05039097 0.05029263 0.04980968 0.04955047\n",
      " 0.04925585 0.04874486 0.04868978 0.0480162  0.04792206 0.04749238\n",
      " 0.04721412 0.04697538 0.04646505 0.04644904 0.04581782 0.04578462\n",
      " 0.04535969 0.04501814 0.04486669 0.04434837 0.04431524 0.04386036\n",
      " 0.04367675 0.0434311  0.04312391 0.04300414 0.0424858  0.04256101\n",
      " 0.04202048 0.04195246 0.04167967 0.04129284 0.04121257 0.04080914\n",
      " 0.04069414 0.04048859 0.0401542  0.04000817 0.03964914 0.03964369\n",
      " 0.0391734  0.03906593 0.03883351 0.03855278 0.03851353 0.03804701\n",
      " 0.03808865 0.03775564 0.03751987 0.03735921 0.03702998 0.03701761\n",
      " 0.03665555 0.03655118 0.03631673 0.03610951 0.03600849 0.0356354\n",
      " 0.03558937 0.03534576 0.03515698 0.03504498 0.03469103 0.0346779\n",
      " 0.03436212 0.03426892 0.0341087  0.03383241 0.03375238 0.03345054\n",
      " 0.03338849 0.03320444 0.03297961 0.03287339 0.03260039 0.0326162\n",
      " 0.03227467 0.03217288 0.03202543 0.03178983 0.03178685 0.03145104\n",
      " 0.03144053 0.03122914 0.03101787 0.03098392 0.03067071 0.03068492\n",
      " 0.03045522 0.03027999 0.03017619 0.02994562 0.0299463  0.02966546\n",
      " 0.02958226 0.02944882 0.02924317 0.02923175 0.02894586 0.02890569\n",
      " 0.02873878 0.0285691  0.02852878 0.02826264 0.0282631  0.02807509\n",
      " 0.02791323 0.02783175 0.02762218 0.02762726 0.02738637 0.02729672\n",
      " 0.02718792 0.02700747 0.02699189 0.02675373 0.02671837 0.02657672\n",
      " 0.02639603 0.02635562 0.02615844 0.02611881 0.02598976 0.02582067\n",
      " 0.02577438 0.02558349 0.02553754 0.02539603 0.02529313 0.02521509\n",
      " 0.02501787 0.02499234 0.024848   0.02472788 0.02468915 0.02447551\n",
      " 0.02448571 0.02432407 0.02420642 0.02413256 0.02397847 0.02397496\n",
      " 0.02378482 0.02371359 0.02362536 0.02348076 0.02347308 0.02328252\n",
      " 0.02323491 0.02313427 0.02299925 0.02298831 0.02280785 0.02276762\n",
      " 0.02267545 0.02253203 0.02250054 0.02234687 0.02230793 0.02219853\n",
      " 0.02209658 0.02206339 0.02189541 0.02186953 0.02175927 0.02165034\n",
      " 0.0216277  0.02146417 0.02145382 0.02133932 0.02122918 0.02118919\n",
      " 0.02104852 0.02102386 0.02091383 0.02082734 0.0207986  0.02063825\n",
      " 0.02062764 0.02052058 0.02042788 0.02040192 0.02024949 0.02025056\n",
      " 0.02013704 0.02004029 0.02000242 0.01987058 0.01985973 0.01975822\n",
      " 0.01968476 0.01963996 0.01950221 0.01950536 0.01939783 0.01931618\n",
      " 0.01928388 0.01915085 0.01913957 0.01904754 0.01896039 0.01892856\n",
      " 0.01880364 0.0188177  0.01868898 0.01863843 0.01859184 0.01846655\n",
      " 0.01846752 0.01837243 0.01829918 0.01825771 0.01814767 0.01815478\n",
      " 0.01803396 0.01799435 0.0179434  0.01782748 0.01782941 0.01772537\n",
      " 0.01767203 0.01762634 0.01753253 0.01752936 0.01741993 0.01738116\n",
      " 0.01733158 0.01722837 0.01723392 0.01712839 0.01708069 0.01703938\n",
      " 0.01693879 0.01693194]\n",
      "[0.4 0.4 0.4 0.6 0.6 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8\n",
      " 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8\n",
      " 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8\n",
      " 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8\n",
      " 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 1.  0.8 1.  0.8 1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1. ]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the loss function and train / validation accuracies\n",
    "print(train_loss)\n",
    "print(train_accuracy)\n",
    "plt.subplot(2, 1, 1)\n",
    "plt.plot(train_loss)\n",
    "plt.title('Loss history')\n",
    "plt.xlabel('Iteration')\n",
    "plt.ylabel('Loss')\n",
    "\n",
    "plt.subplot(2, 1, 2)\n",
    "plt.plot(train_accuracy)\n",
    "plt.title('Classification accuracy history')\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('Classification accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Hyperparameters\n",
    "mean_image = np.mean(X, axis=0)\n",
    "X -= mean_image\n",
    "#+++++++++++++++++++++++++++++++++++++++++++++\n",
    "def set_zero(dictio):\n",
    "    new_dictio={}\n",
    "    for wx in dictio:\n",
    "        new_dictio[wx]=np.zeros(dictio[wx].shape)\n",
    "    return new_dictio\n",
    "def dict_x_ele(dict1, ele):\n",
    "    new_dictio={}\n",
    "    for wx in dict1:\n",
    "        new_dictio[wx]=np.multiply(dict1[wx],ele)\n",
    "    return new_dictio\n",
    "def dict_by_ele(dict1, ele): \n",
    "    new_dictio={}\n",
    "    for wx in dict1:\n",
    "        new_dictio[wx]=np.divide(dict1[wx],ele)\n",
    "    return new_dictio    \n",
    "def dict_sqr(dict1): \n",
    "    new_dictio={}\n",
    "    for wx in dict1:\n",
    "        new_dictio[wx]=np.square(dict1[wx])\n",
    "    return new_dictio        \n",
    "def dict_sqrt(dict1): \n",
    "    new_dictio={}\n",
    "    for wx in dict1:\n",
    "        new_dictio[wx]=np.sqrt(dict1[wx])\n",
    "    return new_dictio   \n",
    "def dict_add_ele(dict1,ele): \n",
    "    new_dictio={}\n",
    "    for wx in dict1:\n",
    "        new_dictio[wx]=dict1[wx]+ele\n",
    "    return new_dictio     \n",
    "def dict_by_dict(dict1,dict2): \n",
    "    new_dictio={}\n",
    "    for wx in dict1:\n",
    "        new_dictio[wx]=dict1[wx]/dict2[wx]\n",
    "    return new_dictio \n",
    "def dict_minus_dict(dict1,dict2): \n",
    "    new_dictio={}\n",
    "    for wx in dict1:\n",
    "        new_dictio[wx]=dict1[wx]-dict2[wx]\n",
    "    return new_dictio \n",
    "def dict_add_dict(dict1,dict2): \n",
    "    new_dictio={}\n",
    "    for wx in dict1:\n",
    "        new_dictio[wx]=dict1[wx]+dict2[wx]\n",
    "    return new_dictio \n",
    "import copy\n",
    "epochs = 100#100\n",
    "batch_size = 1\n",
    "learning_rate = 0.05#1e-3\n",
    "learning_rate_decay = 0.95\n",
    "regularization =0.025 #5e-6 # #\n",
    "betas=(0.9, 0.999)\n",
    "epsilon=1e-8\n",
    "# Initialize a new neural network model\n",
    "net = init_toy_model(2)\n",
    "\n",
    "X, y= init_toy_data()\n",
    "# print(X)\n",
    "#print(X.shape, y.shape)\n",
    "# Variables to store performance for each epoch\n",
    "train_loss = np.zeros(epochs)\n",
    "train_accuracy = np.zeros(epochs)\n",
    "w = copy.copy(net.params)\n",
    "m = set_zero(w) #creates a new dictionary which has the same size/elemets as the one passesed all set to zero\n",
    "v = set_zero(w)\n",
    "w_prev=copy.deepcopy(net.params)\n",
    "v_prev=set_zero(w)\n",
    "m_prev=set_zero(w)\n",
    "train_loss_adam = np.zeros(epochs)\n",
    "train_accuracy_adam = np.zeros(epochs)\n",
    "# For each epoch...\n",
    "for epoch in range(epochs):\n",
    "        \n",
    "        scores=net.forward(X)\n",
    "        y_pred=np.argmax(scores, axis=1)\n",
    "        train_accuracy_adam[epoch] += (np.sum(y==y_pred)/len(y))\n",
    "        \n",
    "        # Run the backward pass of the model to update the weights and compute the loss\n",
    "        loss, gradients=net.backward(X,y,learning_rate,regularization)\n",
    "        \n",
    "        m=dict_add_dict(dict_x_ele(m_prev,betas[0]),dict_x_ele(gradients,(1-betas[0])))\n",
    "        #m=betas[0]*m_prev+(1-betas[0])*gradient_loss(pnts[data,3], pnts[data,:3], w_prev)\n",
    "        \n",
    "        v=dict_add_dict(dict_x_ele(v_prev,betas[1]),dict_x_ele(dict_sqr(gradients),(1-betas[1])))\n",
    "        \n",
    "        #v=betas[1]*v_prev+(1-betas[1])*(gradient_loss(pnts[data,3], pnts[data,:3], w_prev))**2\n",
    "        \n",
    "        m_new=dict_by_ele(m,(1-betas[0]))\n",
    "        v_new=dict_by_ele(v,(1-betas[1]))\n",
    "#         m_new=m/(1-betas[0])\n",
    "#         v_new=v/(1-betas[1])\n",
    "        \n",
    "        w=dict_minus_dict(w_prev,dict_by_dict(dict_x_ele(m_new,learning_rate),(dict_add_ele(dict_sqrt(v_new),epsilon))))\n",
    "        net.params=copy.copy(w)\n",
    "        #w=w_prev-(alpha*m_new/(np.sqrt(v_new)+epsilon))\n",
    "        \n",
    "        w_prev=copy.copy(w)\n",
    "        v_prev=copy.copy(v)\n",
    "        m_prev=copy.copy(m)\n",
    "\n",
    "        train_loss_adam[epoch]+=loss    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.26322338e+01 8.36293605e+00 4.80967297e+00 3.40966175e+00\n",
      " 3.80155087e+00 3.45677951e+00 2.80491091e+00 3.09474568e+00\n",
      " 2.78714955e+00 2.00547310e+00 1.38990564e+00 1.01073193e+00\n",
      " 7.25033433e-01 5.86671959e-01 1.01253767e+00 6.70870100e-01\n",
      " 2.04300719e-01 2.15608821e-01 2.88228335e-01 3.51809407e-01\n",
      " 3.82433019e-01 3.73283935e-01 3.26531080e-01 2.57288597e-01\n",
      " 1.92411810e-01 1.43350875e-01 1.06511763e-01 8.07162498e-02\n",
      " 6.32776410e-02 5.17429257e-02 4.46587300e-02 4.16690935e-02\n",
      " 4.30930418e-02 4.85284204e-02 5.45129069e-02 5.50725508e-02\n",
      " 4.80283644e-02 3.76379876e-02 2.87017281e-02 2.27005806e-02\n",
      " 1.90647967e-02 1.69024116e-02 1.55762420e-02 1.47115245e-02\n",
      " 1.40980915e-02 1.36203765e-02 1.32130713e-02 1.28385424e-02\n",
      " 1.24750536e-02 1.21104823e-02 1.17387970e-02 1.13579389e-02\n",
      " 1.09684470e-02 1.05725025e-02 1.01732372e-02 9.77422413e-03\n",
      " 9.37910757e-03 8.99134470e-03 8.61403648e-03 8.24983010e-03\n",
      " 7.90087617e-03 7.56882623e-03 7.25485770e-03 6.95971621e-03\n",
      " 6.68376683e-03 6.42704852e-03 6.18932730e-03 5.97014568e-03\n",
      " 5.76886681e-03 5.58471291e-03 5.41679802e-03 5.26445779e-03\n",
      " 5.12689165e-03 5.00252305e-03 4.89025735e-03 4.78899682e-03\n",
      " 4.69765368e-03 4.61516222e-03 4.54049021e-03 4.47264963e-03\n",
      " 4.41185262e-03 4.35633517e-03 4.30514075e-03 4.25752107e-03\n",
      " 4.21280870e-03 4.17042024e-03 4.12985721e-03 4.09070444e-03\n",
      " 4.05262644e-03 4.01536166e-03 3.97871531e-03 3.94255107e-03\n",
      " 3.90678211e-03 3.87136209e-03 3.83627628e-03 3.80153340e-03\n",
      " 3.76715827e-03 3.73318549e-03 3.69965416e-03 3.66660383e-03]\n",
      "[0.2 0.2 0.4 0.6 0.4 0.6 0.8 0.6 0.4 0.6 0.8 0.8 0.8 0.8 0.4 0.6 1.  1.\n",
      " 0.8 0.8 0.8 0.8 0.8 0.8 0.8 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.\n",
      " 1.  1.  1.  1.  1.  1.  1.  1.  1.  1. ]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the loss function and train / validation accuracies\n",
    "print(train_loss_adam)\n",
    "print(train_accuracy_adam)\n",
    "plt.subplot(2, 1, 1)\n",
    "plt.plot(train_loss_adam)\n",
    "plt.title('Loss history')\n",
    "plt.xlabel('Iteration')\n",
    "plt.ylabel('Loss')\n",
    "\n",
    "plt.subplot(2, 1, 2)\n",
    "plt.plot(train_accuracy_adam)\n",
    "plt.title('Classification accuracy history')\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('Classification accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}