{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "NeuralNetworkKoban.ipynb", "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "Ehv_8ofH3wco" }, "source": [ "Extend Digits network to hhandwritten characters\n", "\n", "Use NIST dataset: EMNIST Letters: 145,600 characters. 26 balanced classes. https://www.nist.gov/itl/products-and-services/emnist-dataset\n", "\n", "Play with NN configurations -- number of layers, ssize of layers\n", "Please try to break it\n", "Throw in some random noise\n", "Replace tangent with another function (logit/ sigmioid???)" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "-i1JDBQJ3veh", "outputId": "193137f8-6091-4c30-b3e0-64b213920924" }, "source": [ "# Mount data drive\n", "from google.colab import drive\n", "drive.mount('/data/')\n", "data_dir = '/data/My Drive/EMSE 6575/NeuralNetworkHomework'" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Drive already mounted at /data/; to attempt to forcibly remount, call drive.mount(\"/data/\", force_remount=True).\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "fKaykgHh_Q1x" }, "source": [ "Import the custom built classes that Maks made in last class" ] }, { "cell_type": "code", "metadata": { "id": "bKAKfUAe_IGn" }, "source": [ "import sys\n", "sys.path.append(data_dir)\n", "#import util as maksNN\n", "from util import Network, FCLayer, ActivationLayer, FCLayer, ActivationLayer, mse, mse_prime\n", "import numpy as np\n", "import pandas as pd" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "DZfMNkq__Oe8" }, "source": [ "x_train = np.array([[[0,0]], [[0,1]], [[1,0]], [[1,1]]])\n", "y_train = np.array([[[0]], [[1]], [[1]], [[0]]])\n", "\n", "net = Network()\n", "net.add(FCLayer(2,5))\n", "net.add(ActivationLayer())\n", "net.add(FCLayer(5,1))\n", "net.add(ActivationLayer())\n", "net.use(mse, mse_prime)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "yKC76TeS_oDK", "outputId": "f6bc7e56-602b-4b79-a44b-c986331a23e7" }, "source": [ "err = net.fit(x_train, y_train, epochs=1000, learning_rate=0.1)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "epoch 1/1000 error=1.582005\n", "epoch 2/1000 error=1.205938\n", "epoch 3/1000 error=1.151335\n", "epoch 4/1000 error=1.136419\n", "epoch 5/1000 error=1.129774\n", "epoch 6/1000 error=1.125437\n", "epoch 7/1000 error=1.121853\n", "epoch 8/1000 error=1.118520\n", "epoch 9/1000 error=1.115250\n", "epoch 10/1000 error=1.111960\n", "epoch 11/1000 error=1.108613\n", "epoch 12/1000 error=1.105192\n", "epoch 13/1000 error=1.101689\n", "epoch 14/1000 error=1.098100\n", "epoch 15/1000 error=1.094424\n", "epoch 16/1000 error=1.090662\n", "epoch 17/1000 error=1.086817\n", "epoch 18/1000 error=1.082892\n", "epoch 19/1000 error=1.078891\n", "epoch 20/1000 error=1.074818\n", "epoch 21/1000 error=1.070680\n", "epoch 22/1000 error=1.066483\n", "epoch 23/1000 error=1.062233\n", "epoch 24/1000 error=1.057938\n", "epoch 25/1000 error=1.053605\n", "epoch 26/1000 error=1.049243\n", "epoch 27/1000 error=1.044859\n", "epoch 28/1000 error=1.040462\n", "epoch 29/1000 error=1.036062\n", "epoch 30/1000 error=1.031665\n", "epoch 31/1000 error=1.027280\n", "epoch 32/1000 error=1.022916\n", "epoch 33/1000 error=1.018579\n", "epoch 34/1000 error=1.014277\n", "epoch 35/1000 error=1.010016\n", "epoch 36/1000 error=1.005803\n", "epoch 37/1000 error=1.001642\n", "epoch 38/1000 error=0.997538\n", "epoch 39/1000 error=0.993495\n", "epoch 40/1000 error=0.989516\n", "epoch 41/1000 error=0.985604\n", "epoch 42/1000 error=0.981760\n", "epoch 43/1000 error=0.977986\n", "epoch 44/1000 error=0.974281\n", "epoch 45/1000 error=0.970646\n", "epoch 46/1000 error=0.967080\n", "epoch 47/1000 error=0.963581\n", "epoch 48/1000 error=0.960149\n", "epoch 49/1000 error=0.956780\n", "epoch 50/1000 error=0.953473\n", "epoch 51/1000 error=0.950226\n", "epoch 52/1000 error=0.947034\n", "epoch 53/1000 error=0.943896\n", "epoch 54/1000 error=0.940807\n", "epoch 55/1000 error=0.937765\n", "epoch 56/1000 error=0.934766\n", "epoch 57/1000 error=0.931807\n", "epoch 58/1000 error=0.928883\n", "epoch 59/1000 error=0.925993\n", "epoch 60/1000 error=0.923131\n", "epoch 61/1000 error=0.920295\n", "epoch 62/1000 error=0.917480\n", "epoch 63/1000 error=0.914684\n", "epoch 64/1000 error=0.911903\n", "epoch 65/1000 error=0.909132\n", "epoch 66/1000 error=0.906370\n", "epoch 67/1000 error=0.903611\n", "epoch 68/1000 error=0.900853\n", "epoch 69/1000 error=0.898091\n", "epoch 70/1000 error=0.895323\n", "epoch 71/1000 error=0.892545\n", "epoch 72/1000 error=0.889752\n", "epoch 73/1000 error=0.886942\n", "epoch 74/1000 error=0.884110\n", "epoch 75/1000 error=0.881252\n", "epoch 76/1000 error=0.878366\n", "epoch 77/1000 error=0.875446\n", "epoch 78/1000 error=0.872490\n", "epoch 79/1000 error=0.869492\n", "epoch 80/1000 error=0.866448\n", "epoch 81/1000 error=0.863355\n", "epoch 82/1000 error=0.860208\n", "epoch 83/1000 error=0.857003\n", "epoch 84/1000 error=0.853734\n", "epoch 85/1000 error=0.850397\n", "epoch 86/1000 error=0.846987\n", "epoch 87/1000 error=0.843499\n", "epoch 88/1000 error=0.839928\n", "epoch 89/1000 error=0.836268\n", "epoch 90/1000 error=0.832513\n", "epoch 91/1000 error=0.828657\n", "epoch 92/1000 error=0.824694\n", "epoch 93/1000 error=0.820618\n", "epoch 94/1000 error=0.816420\n", "epoch 95/1000 error=0.812096\n", "epoch 96/1000 error=0.807635\n", "epoch 97/1000 error=0.803032\n", "epoch 98/1000 error=0.798276\n", "epoch 99/1000 error=0.793360\n", "epoch 100/1000 error=0.788273\n", "epoch 101/1000 error=0.783007\n", "epoch 102/1000 error=0.777549\n", "epoch 103/1000 error=0.771890\n", "epoch 104/1000 error=0.766018\n", "epoch 105/1000 error=0.759920\n", "epoch 106/1000 error=0.753584\n", "epoch 107/1000 error=0.746995\n", "epoch 108/1000 error=0.740139\n", "epoch 109/1000 error=0.733002\n", "epoch 110/1000 error=0.725567\n", "epoch 111/1000 error=0.717817\n", "epoch 112/1000 error=0.709737\n", "epoch 113/1000 error=0.701307\n", "epoch 114/1000 error=0.692511\n", "epoch 115/1000 error=0.683328\n", "epoch 116/1000 error=0.673741\n", "epoch 117/1000 error=0.663730\n", "epoch 118/1000 error=0.653277\n", "epoch 119/1000 error=0.642363\n", "epoch 120/1000 error=0.630972\n", "epoch 121/1000 error=0.619087\n", "epoch 122/1000 error=0.606694\n", "epoch 123/1000 error=0.593782\n", "epoch 124/1000 error=0.580343\n", "epoch 125/1000 error=0.566371\n", "epoch 126/1000 error=0.551867\n", "epoch 127/1000 error=0.536839\n", "epoch 128/1000 error=0.521298\n", "epoch 129/1000 error=0.505266\n", "epoch 130/1000 error=0.488773\n", "epoch 131/1000 error=0.471858\n", "epoch 132/1000 error=0.454571\n", "epoch 133/1000 error=0.436971\n", "epoch 134/1000 error=0.419130\n", "epoch 135/1000 error=0.401127\n", "epoch 136/1000 error=0.383052\n", "epoch 137/1000 error=0.365001\n", "epoch 138/1000 error=0.347073\n", "epoch 139/1000 error=0.329371\n", "epoch 140/1000 error=0.311996\n", "epoch 141/1000 error=0.295045\n", "epoch 142/1000 error=0.278605\n", "epoch 143/1000 error=0.262755\n", "epoch 144/1000 error=0.247560\n", "epoch 145/1000 error=0.233070\n", "epoch 146/1000 error=0.219321\n", "epoch 147/1000 error=0.206335\n", "epoch 148/1000 error=0.194119\n", "epoch 149/1000 error=0.182666\n", "epoch 150/1000 error=0.171963\n", "epoch 151/1000 error=0.161985\n", "epoch 152/1000 error=0.152700\n", "epoch 153/1000 error=0.144075\n", "epoch 154/1000 error=0.136071\n", "epoch 155/1000 error=0.128648\n", "epoch 156/1000 error=0.121766\n", "epoch 157/1000 error=0.115387\n", "epoch 158/1000 error=0.109473\n", "epoch 159/1000 error=0.103988\n", "epoch 160/1000 error=0.098897\n", "epoch 161/1000 error=0.094169\n", "epoch 162/1000 error=0.089774\n", "epoch 163/1000 error=0.085684\n", "epoch 164/1000 error=0.081875\n", "epoch 165/1000 error=0.078324\n", "epoch 166/1000 error=0.075008\n", "epoch 167/1000 error=0.071910\n", "epoch 168/1000 error=0.069011\n", "epoch 169/1000 error=0.066295\n", "epoch 170/1000 error=0.063748\n", "epoch 171/1000 error=0.061357\n", "epoch 172/1000 error=0.059109\n", "epoch 173/1000 error=0.056993\n", "epoch 174/1000 error=0.054999\n", "epoch 175/1000 error=0.053119\n", "epoch 176/1000 error=0.051343\n", "epoch 177/1000 error=0.049664\n", "epoch 178/1000 error=0.048076\n", "epoch 179/1000 error=0.046571\n", "epoch 180/1000 error=0.045144\n", "epoch 181/1000 error=0.043789\n", "epoch 182/1000 error=0.042503\n", "epoch 183/1000 error=0.041279\n", "epoch 184/1000 error=0.040114\n", "epoch 185/1000 error=0.039005\n", "epoch 186/1000 error=0.037947\n", "epoch 187/1000 error=0.036937\n", "epoch 188/1000 error=0.035973\n", "epoch 189/1000 error=0.035052\n", "epoch 190/1000 error=0.034171\n", "epoch 191/1000 error=0.033327\n", "epoch 192/1000 error=0.032519\n", "epoch 193/1000 error=0.031744\n", "epoch 194/1000 error=0.031001\n", "epoch 195/1000 error=0.030288\n", "epoch 196/1000 error=0.029603\n", "epoch 197/1000 error=0.028945\n", "epoch 198/1000 error=0.028312\n", "epoch 199/1000 error=0.027702\n", "epoch 200/1000 error=0.027116\n", "epoch 201/1000 error=0.026551\n", "epoch 202/1000 error=0.026006\n", "epoch 203/1000 error=0.025481\n", "epoch 204/1000 error=0.024974\n", "epoch 205/1000 error=0.024485\n", "epoch 206/1000 error=0.024012\n", "epoch 207/1000 error=0.023556\n", "epoch 208/1000 error=0.023114\n", "epoch 209/1000 error=0.022687\n", "epoch 210/1000 error=0.022274\n", "epoch 211/1000 error=0.021874\n", "epoch 212/1000 error=0.021486\n", "epoch 213/1000 error=0.021111\n", "epoch 214/1000 error=0.020747\n", "epoch 215/1000 error=0.020394\n", "epoch 216/1000 error=0.020052\n", "epoch 217/1000 error=0.019720\n", "epoch 218/1000 error=0.019397\n", "epoch 219/1000 error=0.019084\n", "epoch 220/1000 error=0.018780\n", "epoch 221/1000 error=0.018484\n", "epoch 222/1000 error=0.018197\n", "epoch 223/1000 error=0.017917\n", "epoch 224/1000 error=0.017645\n", "epoch 225/1000 error=0.017381\n", "epoch 226/1000 error=0.017123\n", "epoch 227/1000 error=0.016873\n", "epoch 228/1000 error=0.016628\n", "epoch 229/1000 error=0.016390\n", "epoch 230/1000 error=0.016158\n", "epoch 231/1000 error=0.015932\n", "epoch 232/1000 error=0.015712\n", "epoch 233/1000 error=0.015497\n", "epoch 234/1000 error=0.015287\n", "epoch 235/1000 error=0.015082\n", "epoch 236/1000 error=0.014883\n", "epoch 237/1000 error=0.014687\n", "epoch 238/1000 error=0.014497\n", "epoch 239/1000 error=0.014311\n", "epoch 240/1000 error=0.014129\n", "epoch 241/1000 error=0.013951\n", "epoch 242/1000 error=0.013778\n", "epoch 243/1000 error=0.013608\n", "epoch 244/1000 error=0.013442\n", "epoch 245/1000 error=0.013279\n", "epoch 246/1000 error=0.013120\n", "epoch 247/1000 error=0.012965\n", "epoch 248/1000 error=0.012813\n", "epoch 249/1000 error=0.012664\n", "epoch 250/1000 error=0.012518\n", "epoch 251/1000 error=0.012375\n", "epoch 252/1000 error=0.012235\n", "epoch 253/1000 error=0.012098\n", "epoch 254/1000 error=0.011964\n", "epoch 255/1000 error=0.011832\n", "epoch 256/1000 error=0.011703\n", "epoch 257/1000 error=0.011577\n", "epoch 258/1000 error=0.011453\n", "epoch 259/1000 error=0.011331\n", "epoch 260/1000 error=0.011212\n", "epoch 261/1000 error=0.011095\n", "epoch 262/1000 error=0.010980\n", "epoch 263/1000 error=0.010867\n", "epoch 264/1000 error=0.010757\n", "epoch 265/1000 error=0.010648\n", "epoch 266/1000 error=0.010542\n", "epoch 267/1000 error=0.010437\n", "epoch 268/1000 error=0.010334\n", "epoch 269/1000 error=0.010233\n", "epoch 270/1000 error=0.010134\n", "epoch 271/1000 error=0.010037\n", "epoch 272/1000 error=0.009941\n", "epoch 273/1000 error=0.009847\n", "epoch 274/1000 error=0.009755\n", "epoch 275/1000 error=0.009664\n", "epoch 276/1000 error=0.009574\n", "epoch 277/1000 error=0.009487\n", "epoch 278/1000 error=0.009400\n", "epoch 279/1000 error=0.009315\n", "epoch 280/1000 error=0.009232\n", "epoch 281/1000 error=0.009149\n", "epoch 282/1000 error=0.009069\n", "epoch 283/1000 error=0.008989\n", "epoch 284/1000 error=0.008911\n", "epoch 285/1000 error=0.008834\n", "epoch 286/1000 error=0.008758\n", "epoch 287/1000 error=0.008683\n", "epoch 288/1000 error=0.008610\n", "epoch 289/1000 error=0.008537\n", "epoch 290/1000 error=0.008466\n", "epoch 291/1000 error=0.008396\n", "epoch 292/1000 error=0.008327\n", "epoch 293/1000 error=0.008259\n", "epoch 294/1000 error=0.008192\n", "epoch 295/1000 error=0.008126\n", "epoch 296/1000 error=0.008060\n", "epoch 297/1000 error=0.007996\n", "epoch 298/1000 error=0.007933\n", "epoch 299/1000 error=0.007871\n", "epoch 300/1000 error=0.007809\n", "epoch 301/1000 error=0.007749\n", "epoch 302/1000 error=0.007689\n", "epoch 303/1000 error=0.007630\n", "epoch 304/1000 error=0.007572\n", "epoch 305/1000 error=0.007515\n", "epoch 306/1000 error=0.007459\n", "epoch 307/1000 error=0.007403\n", "epoch 308/1000 error=0.007348\n", "epoch 309/1000 error=0.007294\n", "epoch 310/1000 error=0.007240\n", "epoch 311/1000 error=0.007188\n", "epoch 312/1000 error=0.007136\n", "epoch 313/1000 error=0.007084\n", "epoch 314/1000 error=0.007034\n", "epoch 315/1000 error=0.006984\n", "epoch 316/1000 error=0.006934\n", "epoch 317/1000 error=0.006886\n", "epoch 318/1000 error=0.006838\n", "epoch 319/1000 error=0.006790\n", "epoch 320/1000 error=0.006743\n", "epoch 321/1000 error=0.006697\n", "epoch 322/1000 error=0.006651\n", "epoch 323/1000 error=0.006606\n", "epoch 324/1000 error=0.006562\n", "epoch 325/1000 error=0.006518\n", "epoch 326/1000 error=0.006474\n", "epoch 327/1000 error=0.006431\n", "epoch 328/1000 error=0.006389\n", "epoch 329/1000 error=0.006347\n", "epoch 330/1000 error=0.006306\n", "epoch 331/1000 error=0.006265\n", "epoch 332/1000 error=0.006224\n", "epoch 333/1000 error=0.006184\n", "epoch 334/1000 error=0.006145\n", "epoch 335/1000 error=0.006106\n", "epoch 336/1000 error=0.006067\n", "epoch 337/1000 error=0.006029\n", "epoch 338/1000 error=0.005992\n", "epoch 339/1000 error=0.005954\n", "epoch 340/1000 error=0.005918\n", "epoch 341/1000 error=0.005881\n", "epoch 342/1000 error=0.005845\n", "epoch 343/1000 error=0.005810\n", "epoch 344/1000 error=0.005775\n", "epoch 345/1000 error=0.005740\n", "epoch 346/1000 error=0.005705\n", "epoch 347/1000 error=0.005671\n", "epoch 348/1000 error=0.005638\n", "epoch 349/1000 error=0.005605\n", "epoch 350/1000 error=0.005572\n", "epoch 351/1000 error=0.005539\n", "epoch 352/1000 error=0.005507\n", "epoch 353/1000 error=0.005475\n", "epoch 354/1000 error=0.005443\n", "epoch 355/1000 error=0.005412\n", "epoch 356/1000 error=0.005381\n", "epoch 357/1000 error=0.005351\n", "epoch 358/1000 error=0.005321\n", "epoch 359/1000 error=0.005291\n", "epoch 360/1000 error=0.005261\n", "epoch 361/1000 error=0.005232\n", "epoch 362/1000 error=0.005203\n", "epoch 363/1000 error=0.005174\n", "epoch 364/1000 error=0.005146\n", "epoch 365/1000 error=0.005118\n", "epoch 366/1000 error=0.005090\n", "epoch 367/1000 error=0.005062\n", "epoch 368/1000 error=0.005035\n", "epoch 369/1000 error=0.005008\n", "epoch 370/1000 error=0.004981\n", "epoch 371/1000 error=0.004955\n", "epoch 372/1000 error=0.004929\n", "epoch 373/1000 error=0.004903\n", "epoch 374/1000 error=0.004877\n", "epoch 375/1000 error=0.004851\n", "epoch 376/1000 error=0.004826\n", "epoch 377/1000 error=0.004801\n", "epoch 378/1000 error=0.004777\n", "epoch 379/1000 error=0.004752\n", "epoch 380/1000 error=0.004728\n", "epoch 381/1000 error=0.004704\n", "epoch 382/1000 error=0.004680\n", "epoch 383/1000 error=0.004656\n", "epoch 384/1000 error=0.004633\n", "epoch 385/1000 error=0.004610\n", "epoch 386/1000 error=0.004587\n", "epoch 387/1000 error=0.004564\n", "epoch 388/1000 error=0.004542\n", "epoch 389/1000 error=0.004519\n", "epoch 390/1000 error=0.004497\n", "epoch 391/1000 error=0.004475\n", "epoch 392/1000 error=0.004454\n", "epoch 393/1000 error=0.004432\n", "epoch 394/1000 error=0.004411\n", "epoch 395/1000 error=0.004390\n", "epoch 396/1000 error=0.004369\n", "epoch 397/1000 error=0.004348\n", "epoch 398/1000 error=0.004327\n", "epoch 399/1000 error=0.004307\n", "epoch 400/1000 error=0.004287\n", "epoch 401/1000 error=0.004267\n", "epoch 402/1000 error=0.004247\n", "epoch 403/1000 error=0.004227\n", "epoch 404/1000 error=0.004208\n", "epoch 405/1000 error=0.004188\n", "epoch 406/1000 error=0.004169\n", "epoch 407/1000 error=0.004150\n", "epoch 408/1000 error=0.004131\n", "epoch 409/1000 error=0.004112\n", "epoch 410/1000 error=0.004094\n", "epoch 411/1000 error=0.004075\n", "epoch 412/1000 error=0.004057\n", "epoch 413/1000 error=0.004039\n", "epoch 414/1000 error=0.004021\n", "epoch 415/1000 error=0.004003\n", "epoch 416/1000 error=0.003986\n", "epoch 417/1000 error=0.003968\n", "epoch 418/1000 error=0.003951\n", "epoch 419/1000 error=0.003933\n", "epoch 420/1000 error=0.003916\n", "epoch 421/1000 error=0.003899\n", "epoch 422/1000 error=0.003883\n", "epoch 423/1000 error=0.003866\n", "epoch 424/1000 error=0.003849\n", "epoch 425/1000 error=0.003833\n", "epoch 426/1000 error=0.003817\n", "epoch 427/1000 error=0.003800\n", "epoch 428/1000 error=0.003784\n", "epoch 429/1000 error=0.003768\n", "epoch 430/1000 error=0.003753\n", "epoch 431/1000 error=0.003737\n", "epoch 432/1000 error=0.003721\n", "epoch 433/1000 error=0.003706\n", "epoch 434/1000 error=0.003691\n", "epoch 435/1000 error=0.003676\n", "epoch 436/1000 error=0.003661\n", "epoch 437/1000 error=0.003646\n", "epoch 438/1000 error=0.003631\n", "epoch 439/1000 error=0.003616\n", "epoch 440/1000 error=0.003601\n", "epoch 441/1000 error=0.003587\n", "epoch 442/1000 error=0.003572\n", "epoch 443/1000 error=0.003558\n", "epoch 444/1000 error=0.003544\n", "epoch 445/1000 error=0.003530\n", "epoch 446/1000 error=0.003516\n", "epoch 447/1000 error=0.003502\n", "epoch 448/1000 error=0.003488\n", "epoch 449/1000 error=0.003475\n", "epoch 450/1000 error=0.003461\n", "epoch 451/1000 error=0.003448\n", "epoch 452/1000 error=0.003434\n", "epoch 453/1000 error=0.003421\n", "epoch 454/1000 error=0.003408\n", "epoch 455/1000 error=0.003395\n", "epoch 456/1000 error=0.003382\n", "epoch 457/1000 error=0.003369\n", "epoch 458/1000 error=0.003356\n", "epoch 459/1000 error=0.003343\n", "epoch 460/1000 error=0.003331\n", "epoch 461/1000 error=0.003318\n", "epoch 462/1000 error=0.003305\n", "epoch 463/1000 error=0.003293\n", "epoch 464/1000 error=0.003281\n", "epoch 465/1000 error=0.003269\n", "epoch 466/1000 error=0.003257\n", "epoch 467/1000 error=0.003244\n", "epoch 468/1000 error=0.003233\n", "epoch 469/1000 error=0.003221\n", "epoch 470/1000 error=0.003209\n", "epoch 471/1000 error=0.003197\n", "epoch 472/1000 error=0.003186\n", "epoch 473/1000 error=0.003174\n", "epoch 474/1000 error=0.003163\n", "epoch 475/1000 error=0.003151\n", "epoch 476/1000 error=0.003140\n", "epoch 477/1000 error=0.003129\n", "epoch 478/1000 error=0.003117\n", "epoch 479/1000 error=0.003106\n", "epoch 480/1000 error=0.003095\n", "epoch 481/1000 error=0.003084\n", "epoch 482/1000 error=0.003073\n", "epoch 483/1000 error=0.003063\n", "epoch 484/1000 error=0.003052\n", "epoch 485/1000 error=0.003041\n", "epoch 486/1000 error=0.003031\n", "epoch 487/1000 error=0.003020\n", "epoch 488/1000 error=0.003010\n", "epoch 489/1000 error=0.002999\n", "epoch 490/1000 error=0.002989\n", "epoch 491/1000 error=0.002979\n", "epoch 492/1000 error=0.002969\n", "epoch 493/1000 error=0.002958\n", "epoch 494/1000 error=0.002948\n", "epoch 495/1000 error=0.002938\n", "epoch 496/1000 error=0.002928\n", "epoch 497/1000 error=0.002919\n", "epoch 498/1000 error=0.002909\n", "epoch 499/1000 error=0.002899\n", "epoch 500/1000 error=0.002889\n", "epoch 501/1000 error=0.002880\n", "epoch 502/1000 error=0.002870\n", "epoch 503/1000 error=0.002861\n", "epoch 504/1000 error=0.002851\n", "epoch 505/1000 error=0.002842\n", "epoch 506/1000 error=0.002832\n", "epoch 507/1000 error=0.002823\n", "epoch 508/1000 error=0.002814\n", "epoch 509/1000 error=0.002805\n", "epoch 510/1000 error=0.002796\n", "epoch 511/1000 error=0.002787\n", "epoch 512/1000 error=0.002778\n", "epoch 513/1000 error=0.002769\n", "epoch 514/1000 error=0.002760\n", "epoch 515/1000 error=0.002751\n", "epoch 516/1000 error=0.002742\n", "epoch 517/1000 error=0.002733\n", "epoch 518/1000 error=0.002725\n", "epoch 519/1000 error=0.002716\n", "epoch 520/1000 error=0.002708\n", "epoch 521/1000 error=0.002699\n", "epoch 522/1000 error=0.002691\n", "epoch 523/1000 error=0.002682\n", "epoch 524/1000 error=0.002674\n", "epoch 525/1000 error=0.002665\n", "epoch 526/1000 error=0.002657\n", "epoch 527/1000 error=0.002649\n", "epoch 528/1000 error=0.002641\n", "epoch 529/1000 error=0.002633\n", "epoch 530/1000 error=0.002624\n", "epoch 531/1000 error=0.002616\n", "epoch 532/1000 error=0.002608\n", "epoch 533/1000 error=0.002600\n", "epoch 534/1000 error=0.002593\n", "epoch 535/1000 error=0.002585\n", "epoch 536/1000 error=0.002577\n", "epoch 537/1000 error=0.002569\n", "epoch 538/1000 error=0.002561\n", "epoch 539/1000 error=0.002554\n", "epoch 540/1000 error=0.002546\n", "epoch 541/1000 error=0.002538\n", "epoch 542/1000 error=0.002531\n", "epoch 543/1000 error=0.002523\n", "epoch 544/1000 error=0.002516\n", "epoch 545/1000 error=0.002508\n", "epoch 546/1000 error=0.002501\n", "epoch 547/1000 error=0.002494\n", "epoch 548/1000 error=0.002486\n", "epoch 549/1000 error=0.002479\n", "epoch 550/1000 error=0.002472\n", "epoch 551/1000 error=0.002465\n", "epoch 552/1000 error=0.002458\n", "epoch 553/1000 error=0.002450\n", "epoch 554/1000 error=0.002443\n", "epoch 555/1000 error=0.002436\n", "epoch 556/1000 error=0.002429\n", "epoch 557/1000 error=0.002422\n", "epoch 558/1000 error=0.002415\n", "epoch 559/1000 error=0.002409\n", "epoch 560/1000 error=0.002402\n", "epoch 561/1000 error=0.002395\n", "epoch 562/1000 error=0.002388\n", "epoch 563/1000 error=0.002381\n", "epoch 564/1000 error=0.002375\n", "epoch 565/1000 error=0.002368\n", "epoch 566/1000 error=0.002361\n", "epoch 567/1000 error=0.002355\n", "epoch 568/1000 error=0.002348\n", "epoch 569/1000 error=0.002342\n", "epoch 570/1000 error=0.002335\n", "epoch 571/1000 error=0.002329\n", "epoch 572/1000 error=0.002322\n", "epoch 573/1000 error=0.002316\n", "epoch 574/1000 error=0.002309\n", "epoch 575/1000 error=0.002303\n", "epoch 576/1000 error=0.002297\n", "epoch 577/1000 error=0.002291\n", "epoch 578/1000 error=0.002284\n", "epoch 579/1000 error=0.002278\n", "epoch 580/1000 error=0.002272\n", "epoch 581/1000 error=0.002266\n", "epoch 582/1000 error=0.002260\n", "epoch 583/1000 error=0.002254\n", "epoch 584/1000 error=0.002248\n", "epoch 585/1000 error=0.002242\n", "epoch 586/1000 error=0.002236\n", "epoch 587/1000 error=0.002230\n", "epoch 588/1000 error=0.002224\n", "epoch 589/1000 error=0.002218\n", "epoch 590/1000 error=0.002212\n", "epoch 591/1000 error=0.002206\n", "epoch 592/1000 error=0.002200\n", "epoch 593/1000 error=0.002194\n", "epoch 594/1000 error=0.002189\n", "epoch 595/1000 error=0.002183\n", "epoch 596/1000 error=0.002177\n", "epoch 597/1000 error=0.002172\n", "epoch 598/1000 error=0.002166\n", "epoch 599/1000 error=0.002160\n", "epoch 600/1000 error=0.002155\n", "epoch 601/1000 error=0.002149\n", "epoch 602/1000 error=0.002144\n", "epoch 603/1000 error=0.002138\n", "epoch 604/1000 error=0.002133\n", "epoch 605/1000 error=0.002127\n", "epoch 606/1000 error=0.002122\n", "epoch 607/1000 error=0.002116\n", "epoch 608/1000 error=0.002111\n", "epoch 609/1000 error=0.002106\n", "epoch 610/1000 error=0.002100\n", "epoch 611/1000 error=0.002095\n", "epoch 612/1000 error=0.002090\n", "epoch 613/1000 error=0.002084\n", "epoch 614/1000 error=0.002079\n", "epoch 615/1000 error=0.002074\n", "epoch 616/1000 error=0.002069\n", "epoch 617/1000 error=0.002064\n", "epoch 618/1000 error=0.002059\n", "epoch 619/1000 error=0.002053\n", "epoch 620/1000 error=0.002048\n", "epoch 621/1000 error=0.002043\n", "epoch 622/1000 error=0.002038\n", "epoch 623/1000 error=0.002033\n", "epoch 624/1000 error=0.002028\n", "epoch 625/1000 error=0.002023\n", "epoch 626/1000 error=0.002018\n", "epoch 627/1000 error=0.002013\n", "epoch 628/1000 error=0.002009\n", "epoch 629/1000 error=0.002004\n", "epoch 630/1000 error=0.001999\n", "epoch 631/1000 error=0.001994\n", "epoch 632/1000 error=0.001989\n", "epoch 633/1000 error=0.001984\n", "epoch 634/1000 error=0.001980\n", "epoch 635/1000 error=0.001975\n", "epoch 636/1000 error=0.001970\n", "epoch 637/1000 error=0.001965\n", "epoch 638/1000 error=0.001961\n", "epoch 639/1000 error=0.001956\n", "epoch 640/1000 error=0.001951\n", "epoch 641/1000 error=0.001947\n", "epoch 642/1000 error=0.001942\n", "epoch 643/1000 error=0.001938\n", "epoch 644/1000 error=0.001933\n", "epoch 645/1000 error=0.001929\n", "epoch 646/1000 error=0.001924\n", "epoch 647/1000 error=0.001920\n", "epoch 648/1000 error=0.001915\n", "epoch 649/1000 error=0.001911\n", "epoch 650/1000 error=0.001906\n", "epoch 651/1000 error=0.001902\n", "epoch 652/1000 error=0.001897\n", "epoch 653/1000 error=0.001893\n", "epoch 654/1000 error=0.001889\n", "epoch 655/1000 error=0.001884\n", "epoch 656/1000 error=0.001880\n", "epoch 657/1000 error=0.001876\n", "epoch 658/1000 error=0.001871\n", "epoch 659/1000 error=0.001867\n", "epoch 660/1000 error=0.001863\n", "epoch 661/1000 error=0.001859\n", "epoch 662/1000 error=0.001854\n", "epoch 663/1000 error=0.001850\n", "epoch 664/1000 error=0.001846\n", "epoch 665/1000 error=0.001842\n", "epoch 666/1000 error=0.001838\n", "epoch 667/1000 error=0.001834\n", "epoch 668/1000 error=0.001829\n", "epoch 669/1000 error=0.001825\n", "epoch 670/1000 error=0.001821\n", "epoch 671/1000 error=0.001817\n", "epoch 672/1000 error=0.001813\n", "epoch 673/1000 error=0.001809\n", "epoch 674/1000 error=0.001805\n", "epoch 675/1000 error=0.001801\n", "epoch 676/1000 error=0.001797\n", "epoch 677/1000 error=0.001793\n", "epoch 678/1000 error=0.001789\n", "epoch 679/1000 error=0.001785\n", "epoch 680/1000 error=0.001781\n", "epoch 681/1000 error=0.001778\n", "epoch 682/1000 error=0.001774\n", "epoch 683/1000 error=0.001770\n", "epoch 684/1000 error=0.001766\n", "epoch 685/1000 error=0.001762\n", "epoch 686/1000 error=0.001758\n", "epoch 687/1000 error=0.001754\n", "epoch 688/1000 error=0.001751\n", "epoch 689/1000 error=0.001747\n", "epoch 690/1000 error=0.001743\n", "epoch 691/1000 error=0.001739\n", "epoch 692/1000 error=0.001736\n", "epoch 693/1000 error=0.001732\n", "epoch 694/1000 error=0.001728\n", "epoch 695/1000 error=0.001725\n", "epoch 696/1000 error=0.001721\n", "epoch 697/1000 error=0.001717\n", "epoch 698/1000 error=0.001714\n", "epoch 699/1000 error=0.001710\n", "epoch 700/1000 error=0.001706\n", "epoch 701/1000 error=0.001703\n", "epoch 702/1000 error=0.001699\n", "epoch 703/1000 error=0.001696\n", "epoch 704/1000 error=0.001692\n", "epoch 705/1000 error=0.001689\n", "epoch 706/1000 error=0.001685\n", "epoch 707/1000 error=0.001682\n", "epoch 708/1000 error=0.001678\n", "epoch 709/1000 error=0.001675\n", "epoch 710/1000 error=0.001671\n", "epoch 711/1000 error=0.001668\n", "epoch 712/1000 error=0.001664\n", "epoch 713/1000 error=0.001661\n", "epoch 714/1000 error=0.001657\n", "epoch 715/1000 error=0.001654\n", "epoch 716/1000 error=0.001651\n", "epoch 717/1000 error=0.001647\n", "epoch 718/1000 error=0.001644\n", "epoch 719/1000 error=0.001641\n", "epoch 720/1000 error=0.001637\n", "epoch 721/1000 error=0.001634\n", "epoch 722/1000 error=0.001631\n", "epoch 723/1000 error=0.001627\n", "epoch 724/1000 error=0.001624\n", "epoch 725/1000 error=0.001621\n", "epoch 726/1000 error=0.001617\n", "epoch 727/1000 error=0.001614\n", "epoch 728/1000 error=0.001611\n", "epoch 729/1000 error=0.001608\n", "epoch 730/1000 error=0.001605\n", "epoch 731/1000 error=0.001601\n", "epoch 732/1000 error=0.001598\n", "epoch 733/1000 error=0.001595\n", "epoch 734/1000 error=0.001592\n", "epoch 735/1000 error=0.001589\n", "epoch 736/1000 error=0.001586\n", "epoch 737/1000 error=0.001582\n", "epoch 738/1000 error=0.001579\n", "epoch 739/1000 error=0.001576\n", "epoch 740/1000 error=0.001573\n", "epoch 741/1000 error=0.001570\n", "epoch 742/1000 error=0.001567\n", "epoch 743/1000 error=0.001564\n", "epoch 744/1000 error=0.001561\n", "epoch 745/1000 error=0.001558\n", "epoch 746/1000 error=0.001555\n", "epoch 747/1000 error=0.001552\n", "epoch 748/1000 error=0.001549\n", "epoch 749/1000 error=0.001546\n", "epoch 750/1000 error=0.001543\n", "epoch 751/1000 error=0.001540\n", "epoch 752/1000 error=0.001537\n", "epoch 753/1000 error=0.001534\n", "epoch 754/1000 error=0.001531\n", "epoch 755/1000 error=0.001528\n", "epoch 756/1000 error=0.001525\n", "epoch 757/1000 error=0.001522\n", "epoch 758/1000 error=0.001519\n", "epoch 759/1000 error=0.001516\n", "epoch 760/1000 error=0.001514\n", "epoch 761/1000 error=0.001511\n", "epoch 762/1000 error=0.001508\n", "epoch 763/1000 error=0.001505\n", "epoch 764/1000 error=0.001502\n", "epoch 765/1000 error=0.001499\n", "epoch 766/1000 error=0.001497\n", "epoch 767/1000 error=0.001494\n", "epoch 768/1000 error=0.001491\n", "epoch 769/1000 error=0.001488\n", "epoch 770/1000 error=0.001485\n", "epoch 771/1000 error=0.001483\n", "epoch 772/1000 error=0.001480\n", "epoch 773/1000 error=0.001477\n", "epoch 774/1000 error=0.001474\n", "epoch 775/1000 error=0.001472\n", "epoch 776/1000 error=0.001469\n", "epoch 777/1000 error=0.001466\n", "epoch 778/1000 error=0.001463\n", "epoch 779/1000 error=0.001461\n", "epoch 780/1000 error=0.001458\n", "epoch 781/1000 error=0.001455\n", "epoch 782/1000 error=0.001453\n", "epoch 783/1000 error=0.001450\n", "epoch 784/1000 error=0.001447\n", "epoch 785/1000 error=0.001445\n", "epoch 786/1000 error=0.001442\n", "epoch 787/1000 error=0.001440\n", "epoch 788/1000 error=0.001437\n", "epoch 789/1000 error=0.001434\n", "epoch 790/1000 error=0.001432\n", "epoch 791/1000 error=0.001429\n", "epoch 792/1000 error=0.001427\n", "epoch 793/1000 error=0.001424\n", "epoch 794/1000 error=0.001422\n", "epoch 795/1000 error=0.001419\n", "epoch 796/1000 error=0.001416\n", "epoch 797/1000 error=0.001414\n", "epoch 798/1000 error=0.001411\n", "epoch 799/1000 error=0.001409\n", "epoch 800/1000 error=0.001406\n", "epoch 801/1000 error=0.001404\n", "epoch 802/1000 error=0.001401\n", "epoch 803/1000 error=0.001399\n", "epoch 804/1000 error=0.001396\n", "epoch 805/1000 error=0.001394\n", "epoch 806/1000 error=0.001392\n", "epoch 807/1000 error=0.001389\n", "epoch 808/1000 error=0.001387\n", "epoch 809/1000 error=0.001384\n", "epoch 810/1000 error=0.001382\n", "epoch 811/1000 error=0.001379\n", "epoch 812/1000 error=0.001377\n", "epoch 813/1000 error=0.001375\n", "epoch 814/1000 error=0.001372\n", "epoch 815/1000 error=0.001370\n", "epoch 816/1000 error=0.001367\n", "epoch 817/1000 error=0.001365\n", "epoch 818/1000 error=0.001363\n", "epoch 819/1000 error=0.001360\n", "epoch 820/1000 error=0.001358\n", "epoch 821/1000 error=0.001356\n", "epoch 822/1000 error=0.001353\n", "epoch 823/1000 error=0.001351\n", "epoch 824/1000 error=0.001349\n", "epoch 825/1000 error=0.001346\n", "epoch 826/1000 error=0.001344\n", "epoch 827/1000 error=0.001342\n", "epoch 828/1000 error=0.001340\n", "epoch 829/1000 error=0.001337\n", "epoch 830/1000 error=0.001335\n", "epoch 831/1000 error=0.001333\n", "epoch 832/1000 error=0.001330\n", "epoch 833/1000 error=0.001328\n", "epoch 834/1000 error=0.001326\n", "epoch 835/1000 error=0.001324\n", "epoch 836/1000 error=0.001322\n", "epoch 837/1000 error=0.001319\n", "epoch 838/1000 error=0.001317\n", "epoch 839/1000 error=0.001315\n", "epoch 840/1000 error=0.001313\n", "epoch 841/1000 error=0.001310\n", "epoch 842/1000 error=0.001308\n", "epoch 843/1000 error=0.001306\n", "epoch 844/1000 error=0.001304\n", "epoch 845/1000 error=0.001302\n", "epoch 846/1000 error=0.001300\n", "epoch 847/1000 error=0.001297\n", "epoch 848/1000 error=0.001295\n", "epoch 849/1000 error=0.001293\n", "epoch 850/1000 error=0.001291\n", "epoch 851/1000 error=0.001289\n", "epoch 852/1000 error=0.001287\n", "epoch 853/1000 error=0.001285\n", "epoch 854/1000 error=0.001283\n", "epoch 855/1000 error=0.001280\n", "epoch 856/1000 error=0.001278\n", "epoch 857/1000 error=0.001276\n", "epoch 858/1000 error=0.001274\n", "epoch 859/1000 error=0.001272\n", "epoch 860/1000 error=0.001270\n", "epoch 861/1000 error=0.001268\n", "epoch 862/1000 error=0.001266\n", "epoch 863/1000 error=0.001264\n", "epoch 864/1000 error=0.001262\n", "epoch 865/1000 error=0.001260\n", "epoch 866/1000 error=0.001258\n", "epoch 867/1000 error=0.001256\n", "epoch 868/1000 error=0.001254\n", "epoch 869/1000 error=0.001252\n", "epoch 870/1000 error=0.001250\n", "epoch 871/1000 error=0.001248\n", "epoch 872/1000 error=0.001246\n", "epoch 873/1000 error=0.001244\n", "epoch 874/1000 error=0.001242\n", "epoch 875/1000 error=0.001240\n", "epoch 876/1000 error=0.001238\n", "epoch 877/1000 error=0.001236\n", "epoch 878/1000 error=0.001234\n", "epoch 879/1000 error=0.001232\n", "epoch 880/1000 error=0.001230\n", "epoch 881/1000 error=0.001228\n", "epoch 882/1000 error=0.001226\n", "epoch 883/1000 error=0.001224\n", "epoch 884/1000 error=0.001222\n", "epoch 885/1000 error=0.001220\n", "epoch 886/1000 error=0.001219\n", "epoch 887/1000 error=0.001217\n", "epoch 888/1000 error=0.001215\n", "epoch 889/1000 error=0.001213\n", "epoch 890/1000 error=0.001211\n", "epoch 891/1000 error=0.001209\n", "epoch 892/1000 error=0.001207\n", "epoch 893/1000 error=0.001205\n", "epoch 894/1000 error=0.001203\n", "epoch 895/1000 error=0.001202\n", "epoch 896/1000 error=0.001200\n", "epoch 897/1000 error=0.001198\n", "epoch 898/1000 error=0.001196\n", "epoch 899/1000 error=0.001194\n", "epoch 900/1000 error=0.001192\n", "epoch 901/1000 error=0.001191\n", "epoch 902/1000 error=0.001189\n", "epoch 903/1000 error=0.001187\n", "epoch 904/1000 error=0.001185\n", "epoch 905/1000 error=0.001183\n", "epoch 906/1000 error=0.001181\n", "epoch 907/1000 error=0.001180\n", "epoch 908/1000 error=0.001178\n", "epoch 909/1000 error=0.001176\n", "epoch 910/1000 error=0.001174\n", "epoch 911/1000 error=0.001173\n", "epoch 912/1000 error=0.001171\n", "epoch 913/1000 error=0.001169\n", "epoch 914/1000 error=0.001167\n", "epoch 915/1000 error=0.001165\n", "epoch 916/1000 error=0.001164\n", "epoch 917/1000 error=0.001162\n", "epoch 918/1000 error=0.001160\n", "epoch 919/1000 error=0.001158\n", "epoch 920/1000 error=0.001157\n", "epoch 921/1000 error=0.001155\n", "epoch 922/1000 error=0.001153\n", "epoch 923/1000 error=0.001152\n", "epoch 924/1000 error=0.001150\n", "epoch 925/1000 error=0.001148\n", "epoch 926/1000 error=0.001146\n", "epoch 927/1000 error=0.001145\n", "epoch 928/1000 error=0.001143\n", "epoch 929/1000 error=0.001141\n", "epoch 930/1000 error=0.001140\n", "epoch 931/1000 error=0.001138\n", "epoch 932/1000 error=0.001136\n", "epoch 933/1000 error=0.001135\n", "epoch 934/1000 error=0.001133\n", "epoch 935/1000 error=0.001131\n", "epoch 936/1000 error=0.001130\n", "epoch 937/1000 error=0.001128\n", "epoch 938/1000 error=0.001126\n", "epoch 939/1000 error=0.001125\n", "epoch 940/1000 error=0.001123\n", "epoch 941/1000 error=0.001121\n", "epoch 942/1000 error=0.001120\n", "epoch 943/1000 error=0.001118\n", "epoch 944/1000 error=0.001117\n", "epoch 945/1000 error=0.001115\n", "epoch 946/1000 error=0.001113\n", "epoch 947/1000 error=0.001112\n", "epoch 948/1000 error=0.001110\n", "epoch 949/1000 error=0.001109\n", "epoch 950/1000 error=0.001107\n", "epoch 951/1000 error=0.001105\n", "epoch 952/1000 error=0.001104\n", "epoch 953/1000 error=0.001102\n", "epoch 954/1000 error=0.001101\n", "epoch 955/1000 error=0.001099\n", "epoch 956/1000 error=0.001098\n", "epoch 957/1000 error=0.001096\n", "epoch 958/1000 error=0.001094\n", "epoch 959/1000 error=0.001093\n", "epoch 960/1000 error=0.001091\n", "epoch 961/1000 error=0.001090\n", "epoch 962/1000 error=0.001088\n", "epoch 963/1000 error=0.001087\n", "epoch 964/1000 error=0.001085\n", "epoch 965/1000 error=0.001084\n", "epoch 966/1000 error=0.001082\n", "epoch 967/1000 error=0.001081\n", "epoch 968/1000 error=0.001079\n", "epoch 969/1000 error=0.001078\n", "epoch 970/1000 error=0.001076\n", "epoch 971/1000 error=0.001075\n", "epoch 972/1000 error=0.001073\n", "epoch 973/1000 error=0.001072\n", "epoch 974/1000 error=0.001070\n", "epoch 975/1000 error=0.001069\n", "epoch 976/1000 error=0.001067\n", "epoch 977/1000 error=0.001066\n", "epoch 978/1000 error=0.001064\n", "epoch 979/1000 error=0.001063\n", "epoch 980/1000 error=0.001061\n", "epoch 981/1000 error=0.001060\n", "epoch 982/1000 error=0.001058\n", "epoch 983/1000 error=0.001057\n", "epoch 984/1000 error=0.001055\n", "epoch 985/1000 error=0.001054\n", "epoch 986/1000 error=0.001052\n", "epoch 987/1000 error=0.001051\n", "epoch 988/1000 error=0.001049\n", "epoch 989/1000 error=0.001048\n", "epoch 990/1000 error=0.001047\n", "epoch 991/1000 error=0.001045\n", "epoch 992/1000 error=0.001044\n", "epoch 993/1000 error=0.001042\n", "epoch 994/1000 error=0.001041\n", "epoch 995/1000 error=0.001040\n", "epoch 996/1000 error=0.001038\n", "epoch 997/1000 error=0.001037\n", "epoch 998/1000 error=0.001035\n", "epoch 999/1000 error=0.001034\n", "epoch 1000/1000 error=0.001032\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 282 }, "id": "Fauzzw5I_u_M", "outputId": "0c0dba6d-5eed-46b4-e430-8167e133f037" }, "source": [ "pd.DataFrame(err).plot()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "<matplotlib.axes._subplots.AxesSubplot at 0x7f9b851f9690>" ] }, "metadata": { "tags": [] }, "execution_count": 21 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "he82H9gJ_6cZ", "outputId": "41dba651-6b4f-4823-ed58-8e11701997e4" }, "source": [ "out = net.predict(x_train)\n", "print(x_train, out)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "[[[0 0]]\n", "\n", " [[0 1]]\n", "\n", " [[1 0]]\n", "\n", " [[1 1]]] [array([[0.00077615]]), array([[0.97744331]]), array([[0.97686514]]), array([[-0.00192492]])]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "ullcFFfiACSV" }, "source": [ "from keras.datasets import mnist\n", "from keras.utils import np_utils\n", "\n", "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n", "x_train = x_train.reshape(x_train.shape[0], 1, 28*28).astype('float32')/255\n", "y_train = np_utils.to_categorical(y_train)\n", "\n", "x_test = x_test.reshape(x_test.shape[0], 1, 28*28).astype('float32')/255\n", "y_test = np_utils.to_categorical(y_test)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "uhA3QgDlAIAb", "outputId": "08275b95-6843-4920-eb9b-fec50da23b09" }, "source": [ "net = Network()\n", "net.add(FCLayer(28*28, 100))\n", "net.add(ActivationLayer())\n", "net.add(FCLayer(100, 50)) \n", "net.add(ActivationLayer())\n", "net.add(FCLayer(50, 10)) \n", "net.add(ActivationLayer())\n", "net.use(mse, mse_prime)\n", "\n", "errors = net.fit(x_train[0:5000], y_train[0:5000], epochs=35, learning_rate=0.1)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "epoch 1/35 error=566.724942\n", "epoch 2/35 error=260.354678\n", "epoch 3/35 error=193.446988\n", "epoch 4/35 error=156.475195\n", "epoch 5/35 error=132.408712\n", "epoch 6/35 error=116.610002\n", "epoch 7/35 error=104.013661\n", "epoch 8/35 error=94.216744\n", "epoch 9/35 error=85.762633\n", "epoch 10/35 error=78.746741\n", "epoch 11/35 error=72.836185\n", "epoch 12/35 error=67.864431\n", "epoch 13/35 error=63.404471\n", "epoch 14/35 error=59.213118\n", "epoch 15/35 error=55.701315\n", "epoch 16/35 error=52.567835\n", "epoch 17/35 error=49.948048\n", "epoch 18/35 error=47.599637\n", "epoch 19/35 error=45.246757\n", "epoch 20/35 error=43.319814\n", "epoch 21/35 error=41.587987\n", "epoch 22/35 error=40.430929\n", "epoch 23/35 error=38.700389\n", "epoch 24/35 error=37.469956\n", "epoch 25/35 error=35.925683\n", "epoch 26/35 error=35.044230\n", "epoch 27/35 error=33.750856\n", "epoch 28/35 error=33.149231\n", "epoch 29/35 error=32.035628\n", "epoch 30/35 error=31.672004\n", "epoch 31/35 error=30.374019\n", "epoch 32/35 error=30.145715\n", "epoch 33/35 error=29.162458\n", "epoch 34/35 error=28.668528\n", "epoch 35/35 error=28.126894\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "xh5wkPogAlBF", "outputId": "2af331a8-870f-4d42-96b0-73ced7722548" }, "source": [ "errors=[]\n", "for i in range(1000):\n", " out=sum((net.predict(x_test[i]) - y_test[i])[0][0])\n", " errors.append(0 if out<0.5 else 1)\n", "np.mean(errors)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.038" ] }, "metadata": { "tags": [] }, "execution_count": 39 } ] }, { "cell_type": "markdown", "metadata": { "id": "t_RY2CECCcYe" }, "source": [ "# Don't really understand what the errors is telling me here ^^^. So going to do this with Tensor Flow" ] }, { "cell_type": "code", "metadata": { "id": "JUElhuNZ8ACe" }, "source": [ "import pandas as pd\n", "\n", "testing_letter = pd.read_csv(data_dir + '/emnist-letters-test.csv')\n", "training_letter = pd.read_csv(data_dir + '/emnist-letters-train.csv')" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Edu1WG1IDJJQ", "outputId": "fab9c666-caa3-428d-97b7-4c0e308f373b" }, "source": [ "print(training_letter.shape)\n", "print(testing_letter.shape)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "(88799, 785)\n", "(14799, 785)\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "k-mKGg01DMN7", "outputId": "d9262ebe-b310-4161-d483-400620376748" }, "source": [ "#training_letters\n", "y1 = np.array(training_letter.iloc[:,0].values)\n", "x1 = np.array(training_letter.iloc[:,1:].values)\n", "#testing_labels\n", "y2 = np.array(testing_letter.iloc[:,0].values)\n", "x2 = np.array(testing_letter.iloc[:,1:].values)\n", "print(y1.shape)\n", "print(x1.shape)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "(88799,)\n", "(88799, 784)\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 453 }, "id": "-5ev_QUnDQUg", "outputId": "7298aeb5-3501-489b-f0b4-a446daa05e1e" }, "source": [ "import matplotlib.pyplot as plt \n", "fig,axes = plt.subplots(3,5,figsize=(10,8))\n", "for i,ax in enumerate(axes.flat):\n", " ax.imshow(x1[i].reshape([28,28]))" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "<Figure size 720x576 with 15 Axes>" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "id": "7UMH9CcSDWJN" }, "source": [ "import tensorflow as tf" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "w2rgZRdLDazK" }, "source": [ "## Normalize and reshape data" ] }, { "cell_type": "code", "metadata": { "id": "OCnvzxBsDaGB" }, "source": [ "# Normalise and reshape data\n", "train_images = x1 / 255.0\n", "test_images = x2 / 255.0\n", "\n", "train_images_number = train_images.shape[0]\n", "train_images_height = 28\n", "train_images_width = 28\n", "train_images_size = train_images_height*train_images_width\n", "\n", "train_images = train_images.reshape(train_images_number, train_images_height, train_images_width, 1)\n", "\n", "test_images_number = test_images.shape[0]\n", "test_images_height = 28\n", "test_images_width = 28\n", "test_images_size = test_images_height*test_images_width\n", "\n", "test_images = test_images.reshape(test_images_number, test_images_height, test_images_width, 1)\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "v6dnjPMdDgpG" }, "source": [ "# Transform labels\n", "number_of_classes = 37\n", "\n", "y1 = tf.keras.utils.to_categorical(y1, number_of_classes)\n", "y2 = tf.keras.utils.to_categorical(y2, number_of_classes)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "y8Gd_1ccDjTw" }, "source": [ "## Create a CNN for classification" ] }, { "cell_type": "code", "metadata": { "id": "hC-x0PD8DoMT" }, "source": [ "from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau,ModelCheckpoint\n", "from sklearn.model_selection import train_test_split" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "GdxqLnZ4DqGp" }, "source": [ "train_x,test_x,train_y,test_y = train_test_split(train_images,y1,test_size=0.2,random_state = 42)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "ZM1N1p3aDvSC" }, "source": [ "model = tf.keras.Sequential([ \n", " tf.keras.layers.Conv2D(32,3,input_shape=(28,28,1)),\n", " tf.keras.layers.MaxPooling2D(2,2),\n", " tf.keras.layers.Flatten(input_shape=(28,28,1)),\n", " tf.keras.layers.Dense(512,activation='relu'),\n", " tf.keras.layers.Dense(128,activation='relu'),\n", " tf.keras.layers.Dense(number_of_classes,activation='softmax')\n", "])" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "TUfRv8rzDyD6" }, "source": [ "model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "kfppOyvbDzji" }, "source": [ "## Add callback API's to save best weights and change learning rate" ] }, { "cell_type": "code", "metadata": { "id": "Jwf1iDjVD423" }, "source": [ "MCP = ModelCheckpoint('Best_points.h5',verbose=1,save_best_only=True,monitor='val_accuracy',mode='max')\n", "ES = EarlyStopping(monitor='val_accuracy',min_delta=0,verbose=0,restore_best_weights = True,patience=3,mode='max')\n", "RLP = ReduceLROnPlateau(monitor='val_loss',patience=3,factor=0.2,min_lr=0.0001)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "csy2_A42D8u0", "outputId": "9a67e566-019c-47e0-bf56-c9bf5aef2e6f" }, "source": [ "history = model.fit(train_x,train_y,epochs=10,validation_data=(test_x,test_y),callbacks=[MCP,ES,RLP])" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Epoch 1/10\n", "2220/2220 [==============================] - 106s 47ms/step - loss: 0.8956 - accuracy: 0.7322 - val_loss: 0.3438 - val_accuracy: 0.8902\n", "\n", "Epoch 00001: val_accuracy improved from -inf to 0.89020, saving model to Best_points.h5\n", "Epoch 2/10\n", "2220/2220 [==============================] - 104s 47ms/step - loss: 0.2892 - accuracy: 0.9054 - val_loss: 0.3492 - val_accuracy: 0.8941\n", "\n", "Epoch 00002: val_accuracy improved from 0.89020 to 0.89409, saving model to Best_points.h5\n", "Epoch 3/10\n", "2220/2220 [==============================] - 104s 47ms/step - loss: 0.2145 - accuracy: 0.9277 - val_loss: 0.3322 - val_accuracy: 0.8988\n", "\n", "Epoch 00003: val_accuracy improved from 0.89409 to 0.89876, saving model to Best_points.h5\n", "Epoch 4/10\n", "2220/2220 [==============================] - 107s 48ms/step - loss: 0.1805 - accuracy: 0.9395 - val_loss: 0.3638 - val_accuracy: 0.8962\n", "\n", "Epoch 00004: val_accuracy did not improve from 0.89876\n", "Epoch 5/10\n", "2220/2220 [==============================] - 105s 47ms/step - loss: 0.1672 - accuracy: 0.9432 - val_loss: 0.3687 - val_accuracy: 0.8984\n", "\n", "Epoch 00005: val_accuracy did not improve from 0.89876\n", "Epoch 6/10\n", "2220/2220 [==============================] - 106s 48ms/step - loss: 0.1581 - accuracy: 0.9466 - val_loss: 0.6642 - val_accuracy: 0.8886\n", "\n", "Epoch 00006: val_accuracy did not improve from 0.89876\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "FDWICHyPEFzn" }, "source": [ "## Plot accuracy vs Val_accuract " ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 296 }, "id": "Tu8ScdPlEMZg", "outputId": "c3d5b6ce-ff89-4909-a0dd-1881603de793" }, "source": [ "import seaborn as sns\n", "\n", "q = len(history.history['accuracy'])\n", "\n", "plt.figsize=(10,10)\n", "sns.lineplot(x = range(1,1+q),y = history.history['accuracy'], label='Accuracy')\n", "sns.lineplot(x = range(1,1+q),y = history.history['val_accuracy'], label='Val_Accuracy')\n", "plt.xlabel('epochs')\n", "plt.ylabel('Accuray')" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Text(0, 0.5, 'Accuray')" ] }, "metadata": { "tags": [] }, "execution_count": 54 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "zCBvFloCH1S6" }, "source": [ "## Tensor flow was fire. Now to play with layers and activation functions..." ] }, { "cell_type": "markdown", "metadata": { "id": "HxCYFfutI9YM" }, "source": [ "https://www.tensorflow.org/api_docs/python/tf/keras/activations\n", "\n", "Changed the middle activation functions from relu to tanh\n", "Changed the final activation function from softmax to sigmoid.\n" ] }, { "cell_type": "code", "metadata": { "id": "BIOlv-2zH7y9" }, "source": [ "model = tf.keras.Sequential([ \n", " tf.keras.layers.Conv2D(32,3,input_shape=(28,28,1)),\n", " tf.keras.layers.MaxPooling2D(2,2),\n", " tf.keras.layers.Flatten(input_shape=(28,28,1)),\n", " tf.keras.layers.Dense(512,activation='tanh'),\n", " tf.keras.layers.Dense(128,activation='tanh'),\n", " tf.keras.layers.Dense(number_of_classes,activation='sigmoid')\n", "])" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "HLaOFSjgJXDk", "outputId": "1f63ca84-7ba9-4a21-8b89-cbe3dc2ae90f" }, "source": [ "model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])\n", "MCP = ModelCheckpoint('Best_points.h5',verbose=1,save_best_only=True,monitor='val_accuracy',mode='max')\n", "ES = EarlyStopping(monitor='val_accuracy',min_delta=0,verbose=0,restore_best_weights = True,patience=3,mode='max')\n", "RLP = ReduceLROnPlateau(monitor='val_loss',patience=3,factor=0.2,min_lr=0.0001)\n", "history = model.fit(train_x,train_y,epochs=10,validation_data=(test_x,test_y),callbacks=[MCP,ES,RLP])" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Epoch 1/10\n", "2220/2220 [==============================] - 103s 46ms/step - loss: 0.8980 - accuracy: 0.7351 - val_loss: 0.3919 - val_accuracy: 0.8739\n", "\n", "Epoch 00001: val_accuracy improved from -inf to 0.87387, saving model to Best_points.h5\n", "Epoch 2/10\n", "2220/2220 [==============================] - 103s 46ms/step - loss: 0.3119 - accuracy: 0.8962 - val_loss: 0.3087 - val_accuracy: 0.8992\n", "\n", "Epoch 00002: val_accuracy improved from 0.87387 to 0.89916, saving model to Best_points.h5\n", "Epoch 3/10\n", "2220/2220 [==============================] - 103s 46ms/step - loss: 0.2266 - accuracy: 0.9247 - val_loss: 0.2862 - val_accuracy: 0.9088\n", "\n", "Epoch 00003: val_accuracy improved from 0.89916 to 0.90878, saving model to Best_points.h5\n", "Epoch 4/10\n", "2220/2220 [==============================] - 103s 47ms/step - loss: 0.1772 - accuracy: 0.9380 - val_loss: 0.3258 - val_accuracy: 0.8936\n", "\n", "Epoch 00004: val_accuracy did not improve from 0.90878\n", "Epoch 5/10\n", "2220/2220 [==============================] - 103s 47ms/step - loss: 0.1430 - accuracy: 0.9503 - val_loss: 0.3208 - val_accuracy: 0.8991\n", "\n", "Epoch 00005: val_accuracy did not improve from 0.90878\n", "Epoch 6/10\n", "2220/2220 [==============================] - 103s 47ms/step - loss: 0.1156 - accuracy: 0.9587 - val_loss: 0.3003 - val_accuracy: 0.9082\n", "\n", "Epoch 00006: val_accuracy did not improve from 0.90878\n" ], "name": "stdout" } ] } ] }