commit 1995df58ce15f93ff2d949ebba442b4a9d11a833 Author: Murtadha Date: Thu Sep 26 17:23:23 2024 -0400 Initial commit diff --git a/Bel_NN_C.ipynb b/Bel_NN_C.ipynb new file mode 100644 index 0000000..00b12a4 --- /dev/null +++ b/Bel_NN_C.ipynb @@ -0,0 +1,1000 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "c4460aee-ec58-454e-9304-82deb89942b4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd \n", + "from matplotlib import pyplot as plt \n", + "\n", + "data = pd.read_csv('data/bel_data_test.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f1ec44a2-7bb0-44a1-a417-69ab70e1b6f8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "data = np.array(data)\n", + "\n", + "m,n = data.shape\n", + "data_train = data[1000:m].T\n", + "\n", + "Y_train = data_train[0].astype(int)\n", + "\n", + "X_train = data_train[1:n]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9223239b-35b9-43bc-acf9-dac6a19587c5", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def init_params():\n", + " W1 = np.random.rand(10,1024) - 0.5\n", + " b1 = np.random.rand(10,1) - 0.5\n", + " W2 = np.random.rand(61,10) - 0.5\n", + " b2 = np.random.rand(61,1) - 0.5\n", + " return W1, b1 , W2, b2" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "610cd614-b3c9-445e-8f3d-491596bc773c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def ReLU(Z):\n", + " return np.maximum(Z,0)\n", + "\n", + "def softmax(Z):\n", + " A = np.exp(Z) / sum(np.exp(Z))\n", + " return A\n", + "\n", + "def forward_prop(W1, b1, W2, b2, X):\n", + " Z1 = W1.dot(X) + b1\n", + " A1 = ReLU(Z1)\n", + " Z2 = W2.dot(A1) + b2\n", + " A2 = softmax(Z2)\n", + " return Z1, A1, Z2, A2\n", + "\n", + "def ReLU_deriv(Z):\n", + " return Z > 0\n", + "\n", + "def one_hot(Y):\n", + " one_hot_Y = np.zeros((Y.size, Y.max() + 1))\n", + " one_hot_Y[np.arange(Y.size), Y] = 1\n", + " one_hot_Y = one_hot_Y.T\n", + " return one_hot_Y\n", + "\n", + "def backward_prop(Z1, A1, Z2, A2, W1, W2, X, Y):\n", + " one_hot_Y = one_hot(Y)\n", + " dZ2 = A2 - one_hot_Y\n", + " dW2 = 1 / m * dZ2.dot(A1.T)\n", + " db2 = 1 / m * np.sum(dZ2)\n", + " dZ1 = W2.T.dot(dZ2) * ReLU_deriv(Z1)\n", + " dW1 = 1 / m * dZ1.dot(X.T)\n", + " db1 = 1 / m * np.sum(dZ1)\n", + " return dW1, db1, dW2, db2\n", + "\n", + "def update_params(W1, b1, W2, b2, dW1, db1, dW2, db2, alpha):\n", + " W1 = W1 - alpha * dW1\n", + " b1 = b1 - alpha * db1 \n", + " W2 = W2 - alpha * dW2 \n", + " b2 = b2 - alpha * db2 \n", + " return W1, b1, W2, b2\n", + "\n", + "def get_predictions(A2):\n", + " return np.argmax(A2, 0)\n", + "\n", + "def get_accuracy(predictions, Y):\n", + " #print(predictions, Y)\n", + " return np.sum(predictions == Y) / Y.size" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "287c3525-e1a0-41c4-a1ae-9c24c805c7c5", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "acc_store = [] " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "539820c9-dc35-4f24-bbff-7860f7442c19", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def gradient_descent(X, Y, alpha, iterations):\n", + " W1, b1, W2, b2 = init_params()\n", + " for i in range(iterations):\n", + " Z1, A1, Z2, A2 = forward_prop(W1, b1, W2, b2, X)\n", + " dW1, db1, dW2, db2 = backward_prop(Z1, A1, Z2, A2, W1, W2, X, Y)\n", + " W1, b1, W2, b2 = update_params(W1, b1, W2, b2, dW1, db1, dW2, db2, alpha)\n", + " if i % 10 == 0:\n", + " print(\"Iteration: \", i)\n", + " predictions = get_predictions(A2)\n", + " pred = get_accuracy(predictions, Y)\n", + " print(pred)\n", + " acc_store.append(pred)\n", + " return W1, b1, W2, b2" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "06a5f975-472b-4b98-99e2-c1fff036ddc7", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration: 0\n", + "0.014825174825174826\n", + "Iteration: 10\n", + "0.06657342657342658\n", + "Iteration: 20\n", + "0.12055944055944055\n", + "Iteration: 30\n", + "0.1476923076923077\n", + "Iteration: 40\n", + "0.16895104895104895\n", + "Iteration: 50\n", + "0.19552447552447552\n", + "Iteration: 60\n", + "0.20251748251748253\n", + "Iteration: 70\n", + "0.2095104895104895\n", + "Iteration: 80\n", + "0.21818181818181817\n", + "Iteration: 90\n", + "0.2274125874125874\n", + "Iteration: 100\n", + "0.23608391608391607\n", + "Iteration: 110\n", + "0.24503496503496502\n", + "Iteration: 120\n", + "0.26153846153846155\n", + "Iteration: 130\n", + "0.2732867132867133\n", + "Iteration: 140\n", + "0.28895104895104895\n", + "Iteration: 150\n", + "0.3026573426573427\n", + "Iteration: 160\n", + "0.3144055944055944\n", + "Iteration: 170\n", + "0.3225174825174825\n", + "Iteration: 180\n", + "0.33146853146853145\n", + "Iteration: 190\n", + "0.34965034965034963\n", + "Iteration: 200\n", + "0.3655944055944056\n", + "Iteration: 210\n", + "0.41426573426573426\n", + "Iteration: 220\n", + "0.4483916083916084\n", + "Iteration: 230\n", + "0.4662937062937063\n", + "Iteration: 240\n", + "0.47944055944055947\n", + "Iteration: 250\n", + "0.4967832167832168\n", + "Iteration: 260\n", + "0.5096503496503496\n", + "Iteration: 270\n", + "0.5216783216783217\n", + "Iteration: 280\n", + "0.5342657342657343\n", + "Iteration: 290\n", + "0.544055944055944\n", + "Iteration: 300\n", + "0.5546853146853147\n", + "Iteration: 310\n", + "0.5613986013986014\n", + "Iteration: 320\n", + "0.5667132867132867\n", + "Iteration: 330\n", + "0.5728671328671329\n", + "Iteration: 340\n", + "0.579020979020979\n", + "Iteration: 350\n", + "0.5865734265734266\n", + "Iteration: 360\n", + "0.593006993006993\n", + "Iteration: 370\n", + "0.6008391608391609\n", + "Iteration: 380\n", + "0.6044755244755244\n", + "Iteration: 390\n", + "0.6092307692307692\n", + "Iteration: 400\n", + "0.6156643356643356\n", + "Iteration: 410\n", + "0.6223776223776224\n", + "Iteration: 420\n", + "0.6310489510489511\n", + "Iteration: 430\n", + "0.6391608391608392\n", + "Iteration: 440\n", + "0.6486713286713287\n", + "Iteration: 450\n", + "0.6573426573426573\n", + "Iteration: 460\n", + "0.6618181818181819\n", + "Iteration: 470\n", + "0.6665734265734266\n", + "Iteration: 480\n", + "0.6707692307692308\n", + "Iteration: 490\n", + "0.6738461538461539\n", + "Iteration: 500\n", + "0.676923076923077\n", + "Iteration: 510\n", + "0.6836363636363636\n", + "Iteration: 520\n", + "0.6900699300699301\n", + "Iteration: 530\n", + "0.6942657342657342\n", + "Iteration: 540\n", + "0.6987412587412587\n", + "Iteration: 550\n", + "0.7026573426573427\n", + "Iteration: 560\n", + "0.7048951048951049\n", + "Iteration: 570\n", + "0.7090909090909091\n", + "Iteration: 580\n", + "0.7113286713286713\n", + "Iteration: 590\n", + "0.7163636363636363\n", + "Iteration: 600\n", + "0.7230769230769231\n", + "Iteration: 610\n", + "0.7264335664335664\n", + "Iteration: 620\n", + "0.7297902097902098\n", + "Iteration: 630\n", + "0.7337062937062937\n", + "Iteration: 640\n", + "0.7367832167832168\n", + "Iteration: 650\n", + "0.7412587412587412\n", + "Iteration: 660\n", + "0.7446153846153846\n", + "Iteration: 670\n", + "0.7468531468531469\n", + "Iteration: 680\n", + "0.7510489510489511\n", + "Iteration: 690\n", + "0.7546853146853146\n", + "Iteration: 700\n", + "0.7560839160839161\n", + "Iteration: 710\n", + "0.76\n", + "Iteration: 720\n", + "0.7622377622377622\n", + "Iteration: 730\n", + "0.7647552447552447\n", + "Iteration: 740\n", + "0.7664335664335664\n", + "Iteration: 750\n", + "0.7695104895104895\n", + "Iteration: 760\n", + "0.7711888111888112\n", + "Iteration: 770\n", + "0.7731468531468532\n", + "Iteration: 780\n", + "0.777062937062937\n", + "Iteration: 790\n", + "0.7784615384615384\n", + "Iteration: 800\n", + "0.7801398601398601\n", + "Iteration: 810\n", + "0.7812587412587413\n", + "Iteration: 820\n", + "0.784055944055944\n", + "Iteration: 830\n", + "0.7865734265734265\n", + "Iteration: 840\n", + "0.7885314685314685\n", + "Iteration: 850\n", + "0.7904895104895104\n", + "Iteration: 860\n", + "0.7927272727272727\n", + "Iteration: 870\n", + "0.796083916083916\n", + "Iteration: 880\n", + "0.7974825174825175\n", + "Iteration: 890\n", + "0.7986013986013986\n", + "Iteration: 900\n", + "0.7994405594405595\n", + "Iteration: 910\n", + "0.8008391608391608\n", + "Iteration: 920\n", + "0.8022377622377622\n", + "Iteration: 930\n", + "0.8036363636363636\n", + "Iteration: 940\n", + "0.8041958041958042\n", + "Iteration: 950\n", + "0.8055944055944056\n", + "Iteration: 960\n", + "0.8072727272727273\n", + "Iteration: 970\n", + "0.8095104895104895\n", + "Iteration: 980\n", + "0.8109090909090909\n", + "Iteration: 990\n", + "0.8131468531468532\n", + "Iteration: 1000\n", + "0.813986013986014\n", + "Iteration: 1010\n", + "0.8145454545454546\n", + "Iteration: 1020\n", + "0.8156643356643357\n", + "Iteration: 1030\n", + "0.8170629370629371\n", + "Iteration: 1040\n", + "0.8198601398601398\n", + "Iteration: 1050\n", + "0.8204195804195804\n", + "Iteration: 1060\n", + "0.8215384615384616\n", + "Iteration: 1070\n", + "0.8226573426573427\n", + "Iteration: 1080\n", + "0.8234965034965035\n", + "Iteration: 1090\n", + "0.8237762237762237\n", + "Iteration: 1100\n", + "0.8251748251748252\n", + "Iteration: 1110\n", + "0.8254545454545454\n", + "Iteration: 1120\n", + "0.8265734265734266\n", + "Iteration: 1130\n", + "0.8274125874125874\n", + "Iteration: 1140\n", + "0.8282517482517483\n", + "Iteration: 1150\n", + "0.8285314685314685\n", + "Iteration: 1160\n", + "0.8293706293706293\n", + "Iteration: 1170\n", + "0.8296503496503497\n", + "Iteration: 1180\n", + "0.8302097902097902\n", + "Iteration: 1190\n", + "0.831048951048951\n", + "Iteration: 1200\n", + "0.8318881118881118\n", + "Iteration: 1210\n", + "0.8327272727272728\n", + "Iteration: 1220\n", + "0.833006993006993\n", + "Iteration: 1230\n", + "0.8346853146853147\n", + "Iteration: 1240\n", + "0.8355244755244755\n", + "Iteration: 1250\n", + "0.8366433566433567\n", + "Iteration: 1260\n", + "0.8374825174825175\n", + "Iteration: 1270\n", + "0.838041958041958\n", + "Iteration: 1280\n", + "0.8397202797202797\n", + "Iteration: 1290\n", + "0.8411188811188811\n", + "Iteration: 1300\n", + "0.8416783216783217\n", + "Iteration: 1310\n", + "0.8436363636363636\n", + "Iteration: 1320\n", + "0.845034965034965\n", + "Iteration: 1330\n", + "0.8458741258741259\n", + "Iteration: 1340\n", + "0.8467132867132867\n", + "Iteration: 1350\n", + "0.8483916083916084\n", + "Iteration: 1360\n", + "0.848951048951049\n", + "Iteration: 1370\n", + "0.8497902097902098\n", + "Iteration: 1380\n", + "0.850909090909091\n", + "Iteration: 1390\n", + "0.8514685314685315\n", + "Iteration: 1400\n", + "0.852027972027972\n", + "Iteration: 1410\n", + "0.8528671328671329\n", + "Iteration: 1420\n", + "0.8531468531468531\n", + "Iteration: 1430\n", + "0.8537062937062937\n", + "Iteration: 1440\n", + "0.8542657342657343\n", + "Iteration: 1450\n", + "0.8553846153846154\n", + "Iteration: 1460\n", + "0.8565034965034966\n", + "Iteration: 1470\n", + "0.8573426573426574\n", + "Iteration: 1480\n", + "0.8576223776223776\n", + "Iteration: 1490\n", + "0.8587412587412587\n", + "Iteration: 1500\n", + "0.8593006993006993\n", + "Iteration: 1510\n", + "0.8601398601398601\n", + "Iteration: 1520\n", + "0.8618181818181818\n", + "Iteration: 1530\n", + "0.8623776223776224\n", + "Iteration: 1540\n", + "0.8632167832167832\n", + "Iteration: 1550\n", + "0.8646153846153846\n", + "Iteration: 1560\n", + "0.8654545454545455\n", + "Iteration: 1570\n", + "0.866013986013986\n", + "Iteration: 1580\n", + "0.8665734265734266\n", + "Iteration: 1590\n", + "0.8676923076923077\n", + "Iteration: 1600\n", + "0.8676923076923077\n", + "Iteration: 1610\n", + "0.8682517482517482\n", + "Iteration: 1620\n", + "0.8690909090909091\n", + "Iteration: 1630\n", + "0.8693706293706294\n", + "Iteration: 1640\n", + "0.8699300699300699\n", + "Iteration: 1650\n", + "0.8713286713286713\n", + "Iteration: 1660\n", + "0.8721678321678321\n", + "Iteration: 1670\n", + "0.8724475524475525\n", + "Iteration: 1680\n", + "0.8732867132867133\n", + "Iteration: 1690\n", + "0.8735664335664336\n", + "Iteration: 1700\n", + "0.8738461538461538\n", + "Iteration: 1710\n", + "0.8755244755244755\n", + "Iteration: 1720\n", + "0.8763636363636363\n", + "Iteration: 1730\n", + "0.8772027972027973\n", + "Iteration: 1740\n", + "0.8777622377622377\n", + "Iteration: 1750\n", + "0.8780419580419581\n", + "Iteration: 1760\n", + "0.8786013986013986\n", + "Iteration: 1770\n", + "0.8791608391608392\n", + "Iteration: 1780\n", + "0.8797202797202798\n", + "Iteration: 1790\n", + "0.8802797202797202\n", + "Iteration: 1800\n", + "0.8805594405594406\n", + "Iteration: 1810\n", + "0.8811188811188811\n", + "Iteration: 1820\n", + "0.881958041958042\n", + "Iteration: 1830\n", + "0.8822377622377623\n", + "Iteration: 1840\n", + "0.8830769230769231\n", + "Iteration: 1850\n", + "0.8839160839160839\n", + "Iteration: 1860\n", + "0.8841958041958042\n", + "Iteration: 1870\n", + "0.8839160839160839\n", + "Iteration: 1880\n", + "0.8844755244755245\n", + "Iteration: 1890\n", + "0.8847552447552448\n", + "Iteration: 1900\n", + "0.885034965034965\n", + "Iteration: 1910\n", + "0.885034965034965\n", + "Iteration: 1920\n", + "0.8853146853146853\n", + "Iteration: 1930\n", + "0.8861538461538462\n", + "Iteration: 1940\n", + "0.886993006993007\n", + "Iteration: 1950\n", + "0.8875524475524476\n", + "Iteration: 1960\n", + "0.8881118881118881\n", + "Iteration: 1970\n", + "0.8886713286713287\n", + "Iteration: 1980\n", + "0.8897902097902098\n", + "Iteration: 1990\n", + "0.8900699300699301\n", + "Iteration: 2000\n", + "0.8900699300699301\n", + "Iteration: 2010\n", + "0.8909090909090909\n", + "Iteration: 2020\n", + "0.8911888111888112\n", + "Iteration: 2030\n", + "0.8914685314685314\n", + "Iteration: 2040\n", + "0.8917482517482518\n", + "Iteration: 2050\n", + "0.8925874125874126\n", + "Iteration: 2060\n", + "0.8928671328671328\n", + "Iteration: 2070\n", + "0.8931468531468532\n", + "Iteration: 2080\n", + "0.8934265734265734\n", + "Iteration: 2090\n", + "0.893986013986014\n", + "Iteration: 2100\n", + "0.8942657342657343\n", + "Iteration: 2110\n", + "0.8948251748251749\n", + "Iteration: 2120\n", + "0.8953846153846153\n", + "Iteration: 2130\n", + "0.8956643356643357\n", + "Iteration: 2140\n", + "0.8962237762237762\n", + "Iteration: 2150\n", + "0.8967832167832168\n", + "Iteration: 2160\n", + "0.897062937062937\n", + "Iteration: 2170\n", + "0.8973426573426574\n", + "Iteration: 2180\n", + "0.8976223776223776\n", + "Iteration: 2190\n", + "0.8979020979020979\n", + "Iteration: 2200\n", + "0.8984615384615384\n", + "Iteration: 2210\n", + "0.8993006993006993\n", + "Iteration: 2220\n", + "0.8995804195804196\n", + "Iteration: 2230\n", + "0.8998601398601399\n", + "Iteration: 2240\n", + "0.9001398601398601\n", + "Iteration: 2250\n", + "0.9001398601398601\n", + "Iteration: 2260\n", + "0.9004195804195804\n", + "Iteration: 2270\n", + "0.9012587412587413\n", + "Iteration: 2280\n", + "0.9015384615384615\n", + "Iteration: 2290\n", + "0.9020979020979021\n", + "Iteration: 2300\n", + "0.9020979020979021\n", + "Iteration: 2310\n", + "0.9020979020979021\n", + "Iteration: 2320\n", + "0.9023776223776224\n", + "Iteration: 2330\n", + "0.9032167832167832\n", + "Iteration: 2340\n", + "0.904055944055944\n", + "Iteration: 2350\n", + "0.9043356643356644\n", + "Iteration: 2360\n", + "0.9046153846153846\n", + "Iteration: 2370\n", + "0.9046153846153846\n", + "Iteration: 2380\n", + "0.9054545454545454\n", + "Iteration: 2390\n", + "0.906013986013986\n", + "Iteration: 2400\n", + "0.9071328671328671\n", + "Iteration: 2410\n", + "0.9074125874125875\n", + "Iteration: 2420\n", + "0.9079720279720279\n", + "Iteration: 2430\n", + "0.9082517482517483\n", + "Iteration: 2440\n", + "0.9085314685314685\n", + "Iteration: 2450\n", + "0.9085314685314685\n", + "Iteration: 2460\n", + "0.9085314685314685\n", + "Iteration: 2470\n", + "0.9082517482517483\n", + "Iteration: 2480\n", + "0.9093706293706294\n", + "Iteration: 2490\n", + "0.9093706293706294\n", + "Iteration: 2500\n", + "0.9096503496503496\n", + "Iteration: 2510\n", + "0.9096503496503496\n", + "Iteration: 2520\n", + "0.9102097902097902\n", + "Iteration: 2530\n", + "0.9102097902097902\n", + "Iteration: 2540\n", + "0.9102097902097902\n", + "Iteration: 2550\n", + "0.9107692307692308\n", + "Iteration: 2560\n", + "0.911048951048951\n", + "Iteration: 2570\n", + "0.9113286713286713\n", + "Iteration: 2580\n", + "0.9116083916083916\n", + "Iteration: 2590\n", + "0.9118881118881119\n", + "Iteration: 2600\n", + "0.9127272727272727\n", + "Iteration: 2610\n", + "0.9132867132867133\n", + "Iteration: 2620\n", + "0.9135664335664335\n", + "Iteration: 2630\n", + "0.9135664335664335\n", + "Iteration: 2640\n", + "0.9144055944055944\n", + "Iteration: 2650\n", + "0.9146853146853147\n", + "Iteration: 2660\n", + "0.9146853146853147\n", + "Iteration: 2670\n", + "0.9146853146853147\n", + "Iteration: 2680\n", + "0.9155244755244756\n", + "Iteration: 2690\n", + "0.9155244755244756\n", + "Iteration: 2700\n", + "0.9158041958041958\n", + "Iteration: 2710\n", + "0.9166433566433566\n", + "Iteration: 2720\n", + "0.916923076923077\n", + "Iteration: 2730\n", + "0.9172027972027972\n", + "Iteration: 2740\n", + "0.9177622377622378\n", + "Iteration: 2750\n", + "0.9177622377622378\n", + "Iteration: 2760\n", + "0.9183216783216783\n", + "Iteration: 2770\n", + "0.9186013986013986\n", + "Iteration: 2780\n", + "0.9188811188811189\n", + "Iteration: 2790\n", + "0.9194405594405595\n", + "Iteration: 2800\n", + "0.9194405594405595\n", + "Iteration: 2810\n", + "0.9197202797202797\n", + "Iteration: 2820\n", + "0.92\n", + "Iteration: 2830\n", + "0.9202797202797203\n", + "Iteration: 2840\n", + "0.9202797202797203\n", + "Iteration: 2850\n", + "0.9202797202797203\n", + "Iteration: 2860\n", + "0.9202797202797203\n", + "Iteration: 2870\n", + "0.9202797202797203\n", + "Iteration: 2880\n", + "0.9205594405594406\n", + "Iteration: 2890\n", + "0.9213986013986014\n", + "Iteration: 2900\n", + "0.9216783216783216\n", + "Iteration: 2910\n", + "0.9216783216783216\n", + "Iteration: 2920\n", + "0.9216783216783216\n", + "Iteration: 2930\n", + "0.9216783216783216\n", + "Iteration: 2940\n", + "0.9216783216783216\n", + "Iteration: 2950\n", + "0.921958041958042\n", + "Iteration: 2960\n", + "0.921958041958042\n", + "Iteration: 2970\n", + "0.9225174825174826\n", + "Iteration: 2980\n", + "0.9225174825174826\n", + "Iteration: 2990\n", + "0.9227972027972028\n", + "Iteration: 3000\n", + "0.9225174825174826\n", + "Iteration: 3010\n", + "0.9230769230769231\n", + "Iteration: 3020\n", + "0.9233566433566434\n", + "Iteration: 3030\n", + "0.9236363636363636\n", + "Iteration: 3040\n", + "0.9236363636363636\n", + "Iteration: 3050\n", + "0.9236363636363636\n", + "Iteration: 3060\n", + "0.9236363636363636\n", + "Iteration: 3070\n", + "0.9236363636363636\n", + "Iteration: 3080\n", + "0.9239160839160839\n", + "Iteration: 3090\n", + "0.9241958041958042\n", + "Iteration: 3100\n", + "0.9250349650349651\n", + "Iteration: 3110\n", + "0.9250349650349651\n", + "Iteration: 3120\n", + "0.9253146853146853\n", + "Iteration: 3130\n", + "0.9255944055944056\n", + "Iteration: 3140\n", + "0.9258741258741259\n", + "Iteration: 3150\n", + "0.9258741258741259\n", + "Iteration: 3160\n", + "0.9258741258741259\n", + "Iteration: 3170\n", + "0.9258741258741259\n", + "Iteration: 3180\n", + "0.9255944055944056\n", + "Iteration: 3190\n", + "0.9258741258741259\n", + "Iteration: 3200\n", + "0.9258741258741259\n", + "Iteration: 3210\n", + "0.9261538461538461\n", + "Iteration: 3220\n", + "0.9261538461538461\n", + "Iteration: 3230\n", + "0.9267132867132867\n", + "Iteration: 3240\n", + "0.9275524475524476\n", + "Iteration: 3250\n", + "0.9275524475524476\n", + "Iteration: 3260\n", + "0.9275524475524476\n", + "Iteration: 3270\n", + "0.9275524475524476\n", + "Iteration: 3280\n", + "0.9275524475524476\n", + "Iteration: 3290\n", + "0.9278321678321678\n", + "Iteration: 3300\n", + "0.9281118881118882\n", + "Iteration: 3310\n", + "0.9283916083916084\n", + "Iteration: 3320\n", + "0.9283916083916084\n", + "Iteration: 3330\n", + "0.9283916083916084\n", + "Iteration: 3340\n", + "0.9283916083916084\n", + "Iteration: 3350\n", + "0.9286713286713286\n", + "Iteration: 3360\n", + "0.9286713286713286\n", + "Iteration: 3370\n", + "0.928951048951049\n", + "Iteration: 3380\n", + "0.928951048951049\n", + "Iteration: 3390\n", + "0.928951048951049\n", + "Iteration: 3400\n", + "0.928951048951049\n", + "Iteration: 3410\n", + "0.928951048951049\n", + "Iteration: 3420\n", + "0.928951048951049\n", + "Iteration: 3430\n", + "0.9295104895104895\n", + "Iteration: 3440\n", + "0.9297902097902098\n", + "Iteration: 3450\n", + "0.9295104895104895\n", + "Iteration: 3460\n", + "0.9295104895104895\n", + "Iteration: 3470\n", + "0.9297902097902098\n", + "Iteration: 3480\n", + "0.9300699300699301\n", + "Iteration: 3490\n", + "0.9303496503496503\n", + "Iteration: 3500\n", + "0.9303496503496503\n", + "Iteration: 3510\n", + "0.9306293706293707\n", + "Iteration: 3520\n", + "0.9306293706293707\n", + "Iteration: 3530\n", + "0.9309090909090909\n", + "Iteration: 3540\n", + "0.9311888111888111\n", + "Iteration: 3550\n", + "0.9314685314685315\n", + "Iteration: 3560\n", + "0.9317482517482517\n", + "Iteration: 3570\n", + "0.9317482517482517\n", + "Iteration: 3580\n", + "0.932027972027972\n", + "Iteration: 3590\n", + "0.932027972027972\n", + "Iteration: 3600\n", + "0.9325874125874126\n", + "Iteration: 3610\n", + "0.9328671328671329\n", + "Iteration: 3620\n", + "0.9334265734265734\n", + "Iteration: 3630\n", + "0.9334265734265734\n", + "Iteration: 3640\n", + "0.933986013986014\n", + "Iteration: 3650\n", + "0.933986013986014\n", + "Iteration: 3660\n", + "0.933986013986014\n", + "Iteration: 3670\n", + "0.9342657342657342\n", + "Iteration: 3680\n", + "0.9342657342657342\n", + "Iteration: 3690\n", + "0.9345454545454546\n", + "Iteration: 3700\n", + "0.9345454545454546\n", + "Iteration: 3710\n", + "0.9345454545454546\n", + "Iteration: 3720\n", + "0.9353846153846154\n", + "Iteration: 3730\n", + "0.9353846153846154\n", + "Iteration: 3740\n", + "0.9356643356643357\n", + "Iteration: 3750\n", + "0.9365034965034965\n", + "Iteration: 3760\n", + "0.9370629370629371\n", + "Iteration: 3770\n", + "0.9376223776223777\n", + "Iteration: 3780\n", + "0.9379020979020979\n", + "Iteration: 3790\n", + "0.9381818181818182\n", + "Iteration: 3800\n", + "0.9381818181818182\n", + "Iteration: 3810\n", + "0.9381818181818182\n", + "Iteration: 3820\n", + "0.9381818181818182\n", + "Iteration: 3830\n", + "0.9381818181818182\n", + "Iteration: 3840\n", + "0.9381818181818182\n", + "Iteration: 3850\n", + "0.9381818181818182\n", + "Iteration: 3860\n", + "0.9384615384615385\n", + "Iteration: 3870\n", + "0.9384615384615385\n", + "Iteration: 3880\n", + "0.9384615384615385\n", + "Iteration: 3890\n", + "0.9387412587412587\n", + "Iteration: 3900\n", + "0.9387412587412587\n", + "Iteration: 3910\n", + "0.939020979020979\n", + "Iteration: 3920\n", + "0.939020979020979\n", + "Iteration: 3930\n", + "0.9387412587412587\n", + "Iteration: 3940\n", + "0.939020979020979\n", + "Iteration: 3950\n", + "0.9393006993006993\n", + "Iteration: 3960\n", + "0.9393006993006993\n", + "Iteration: 3970\n", + "0.9393006993006993\n", + "Iteration: 3980\n", + "0.9393006993006993\n", + "Iteration: 3990\n", + "0.9393006993006993\n" + ] + } + ], + "source": [ + "W1, b1, W2, b2 = gradient_descent(X_train, Y_train, 0.10, 4000)\n", + "df = pd.DataFrame(acc_store)\n", + "df.to_csv('bt_acc.csv', index=False)\n", + "np.savez(\"bt_weights\", W1, b1, W2, b2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d3370366-9827-44db-85b9-512e39574ee7", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Cro_NN_C.ipynb b/Cro_NN_C.ipynb new file mode 100644 index 0000000..84fb464 --- /dev/null +++ b/Cro_NN_C.ipynb @@ -0,0 +1,992 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "25c0d153-288c-4ee8-a968-915f853b8157", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd \n", + "from matplotlib import pyplot as plt \n", + "\n", + "data = pd.read_csv('cro_data_test.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "962cacc2-c818-4c5b-bdab-2ee46c6de511", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "data = np.array(data)\n", + "\n", + "m,n = data.shape\n", + "data_train = data[1000:m].T\n", + "\n", + "Y_train = data_train[0].astype(int)\n", + "\n", + "X_train = data_train[1:n]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e863fe3b-3ee6-42f3-b716-4fcda6a850af", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def init_params():\n", + " W1 = np.random.rand(10,1024) - 0.5\n", + " b1 = np.random.rand(10,1) - 0.5\n", + " W2 = np.random.rand(5,10) - 0.5\n", + " b2 = np.random.rand(5,1) - 0.5\n", + " return W1, b1 , W2, b2" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "64dd0fba-a49e-4f13-b534-e074350b5f42", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def ReLU(Z):\n", + " return np.maximum(Z,0)\n", + "def softmax(Z):\n", + " A = np.exp(Z) / sum(np.exp(Z))\n", + " return A\n", + "def forward_prop(W1, b1, W2, b2, X):\n", + " Z1 = W1.dot(X) + b1\n", + " A1 = ReLU(Z1)\n", + " Z2 = W2.dot(A1) + b2\n", + " A2 = softmax(Z2)\n", + " return Z1, A1, Z2, A2\n", + "def ReLU_deriv(Z):\n", + " return Z > 0\n", + "def one_hot(Y):\n", + " one_hot_Y = np.zeros((Y.size, Y.max() + 1))\n", + " one_hot_Y[np.arange(Y.size), Y] = 1\n", + " one_hot_Y = one_hot_Y.T\n", + " return one_hot_Y\n", + "def backward_prop(Z1, A1, Z2, A2, W1, W2, X, Y):\n", + " one_hot_Y = one_hot(Y)\n", + " dZ2 = A2 - one_hot_Y\n", + " dW2 = 1 / m * dZ2.dot(A1.T)\n", + " db2 = 1 / m * np.sum(dZ2)\n", + " dZ1 = W2.T.dot(dZ2) * ReLU_deriv(Z1)\n", + " dW1 = 1 / m * dZ1.dot(X.T)\n", + " db1 = 1 / m * np.sum(dZ1)\n", + " return dW1, db1, dW2, db2\n", + "def update_params(W1, b1, W2, b2, dW1, db1, dW2, db2, alpha):\n", + " W1 = W1 - alpha * dW1\n", + " b1 = b1 - alpha * db1 \n", + " W2 = W2 - alpha * dW2 \n", + " b2 = b2 - alpha * db2 \n", + " return W1, b1, W2, b2\n", + "def get_predictions(A2):\n", + " return np.argmax(A2, 0)\n", + "def get_accuracy(predictions, Y):\n", + " #print(predictions, Y)\n", + " return np.sum(predictions == Y) / Y.size" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e7ef6234-254e-47f6-ac29-ddd92d363e9e", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "acc_store = [] " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d24bdd4d-1d57-40b1-a95b-3cc33e02312d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def gradient_descent(X, Y, alpha, iterations):\n", + " W1, b1, W2, b2 = init_params()\n", + " for i in range(iterations):\n", + " Z1, A1, Z2, A2 = forward_prop(W1, b1, W2, b2, X)\n", + " dW1, db1, dW2, db2 = backward_prop(Z1, A1, Z2, A2, W1, W2, X, Y)\n", + " W1, b1, W2, b2 = update_params(W1, b1, W2, b2, dW1, db1, dW2, db2, alpha)\n", + " if i % 10 == 0:\n", + " print(\"Iteration: \", i)\n", + " predictions = get_predictions(A2)\n", + " pred = get_accuracy(predictions, Y)\n", + " print(pred)\n", + " acc_store.append(pred)\n", + " return W1, b1, W2, b2" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "d266b8d3-8f15-4d89-a896-a728215b048d", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration: 0\n", + "0.2016308376575241\n", + "Iteration: 10\n", + "0.3700889547813195\n", + "Iteration: 20\n", + "0.45978502594514453\n", + "Iteration: 30\n", + "0.519644180874722\n", + "Iteration: 40\n", + "0.4792438843587843\n", + "Iteration: 50\n", + "0.49833209785025945\n", + "Iteration: 60\n", + "0.544477390659748\n", + "Iteration: 70\n", + "0.5804299481097109\n", + "Iteration: 80\n", + "0.6250926612305412\n", + "Iteration: 90\n", + "0.6653076352853966\n", + "Iteration: 100\n", + "0.6955151964418087\n", + "Iteration: 110\n", + "0.7168272794662713\n", + "Iteration: 120\n", + "0.7294292068198666\n", + "Iteration: 130\n", + "0.7366567828020756\n", + "Iteration: 140\n", + "0.7462935507783544\n", + "Iteration: 150\n", + "0.7544477390659748\n", + "Iteration: 160\n", + "0.758524833209785\n", + "Iteration: 170\n", + "0.7626019273535952\n", + "Iteration: 180\n", + "0.7677909562638991\n", + "Iteration: 190\n", + "0.7729799851742031\n", + "Iteration: 200\n", + "0.7755744996293551\n", + "Iteration: 210\n", + "0.7792809488510007\n", + "Iteration: 220\n", + "0.7824314306893996\n", + "Iteration: 230\n", + "0.7857672349888807\n", + "Iteration: 240\n", + "0.7889177168272795\n", + "Iteration: 250\n", + "0.7909562638991846\n", + "Iteration: 260\n", + "0.7935507783543365\n", + "Iteration: 270\n", + "0.7968865826538176\n", + "Iteration: 280\n", + "0.7996664195700519\n", + "Iteration: 290\n", + "0.8011489992587102\n", + "Iteration: 300\n", + "0.8026315789473685\n", + "Iteration: 310\n", + "0.8052260934025204\n", + "Iteration: 320\n", + "0.8081912527798369\n", + "Iteration: 330\n", + "0.8096738324684952\n", + "Iteration: 340\n", + "0.8118977020014826\n", + "Iteration: 350\n", + "0.8139362490733877\n", + "Iteration: 360\n", + "0.8148628613787992\n", + "Iteration: 370\n", + "0.8169014084507042\n", + "Iteration: 380\n", + "0.8181986656782803\n", + "Iteration: 390\n", + "0.8191252779836916\n", + "Iteration: 400\n", + "0.8204225352112676\n", + "Iteration: 410\n", + "0.8215344699777613\n", + "Iteration: 420\n", + "0.8224610822831727\n", + "Iteration: 430\n", + "0.825240919199407\n", + "Iteration: 440\n", + "0.8259822090437361\n", + "Iteration: 450\n", + "0.8280207561156412\n", + "Iteration: 460\n", + "0.8293180133432172\n", + "Iteration: 470\n", + "0.8306152705707932\n", + "Iteration: 480\n", + "0.8317272053372868\n", + "Iteration: 490\n", + "0.8313565604151223\n", + "Iteration: 500\n", + "0.8317272053372868\n", + "Iteration: 510\n", + "0.8320978502594515\n", + "Iteration: 520\n", + "0.8335804299481097\n", + "Iteration: 530\n", + "0.8348776871756857\n", + "Iteration: 540\n", + "0.8356189770200149\n", + "Iteration: 550\n", + "0.836360266864344\n", + "Iteration: 560\n", + "0.8367309117865085\n", + "Iteration: 570\n", + "0.8372868791697554\n", + "Iteration: 580\n", + "0.8395107487027428\n", + "Iteration: 590\n", + "0.8400667160859896\n", + "Iteration: 600\n", + "0.8404373610081541\n", + "Iteration: 610\n", + "0.8393254262416605\n", + "Iteration: 620\n", + "0.8400667160859896\n", + "Iteration: 630\n", + "0.8408080059303188\n", + "Iteration: 640\n", + "0.8408080059303188\n", + "Iteration: 650\n", + "0.8409933283914011\n", + "Iteration: 660\n", + "0.8421052631578947\n", + "Iteration: 670\n", + "0.8432171979243884\n", + "Iteration: 680\n", + "0.8432171979243884\n", + "Iteration: 690\n", + "0.843587842846553\n", + "Iteration: 700\n", + "0.8441438102297999\n", + "Iteration: 710\n", + "0.8445144551519644\n", + "Iteration: 720\n", + "0.8445144551519644\n", + "Iteration: 730\n", + "0.8445144551519644\n", + "Iteration: 740\n", + "0.844885100074129\n", + "Iteration: 750\n", + "0.844885100074129\n", + "Iteration: 760\n", + "0.8452557449962935\n", + "Iteration: 770\n", + "0.8459970348406227\n", + "Iteration: 780\n", + "0.8465530022238695\n", + "Iteration: 790\n", + "0.8467383246849518\n", + "Iteration: 800\n", + "0.8471089696071163\n", + "Iteration: 810\n", + "0.8476649369903633\n", + "Iteration: 820\n", + "0.8491475166790216\n", + "Iteration: 830\n", + "0.8502594514455152\n", + "Iteration: 840\n", + "0.8502594514455152\n", + "Iteration: 850\n", + "0.8511860637509266\n", + "Iteration: 860\n", + "0.8517420311341735\n", + "Iteration: 870\n", + "0.8517420311341735\n", + "Iteration: 880\n", + "0.8519273535952557\n", + "Iteration: 890\n", + "0.8519273535952557\n", + "Iteration: 900\n", + "0.8532246108228317\n", + "Iteration: 910\n", + "0.8539659006671608\n", + "Iteration: 920\n", + "0.85470719051149\n", + "Iteration: 930\n", + "0.85470719051149\n", + "Iteration: 940\n", + "0.8548925129725723\n", + "Iteration: 950\n", + "0.8556338028169014\n", + "Iteration: 960\n", + "0.8563750926612306\n", + "Iteration: 970\n", + "0.8565604151223128\n", + "Iteration: 980\n", + "0.8571163825055597\n", + "Iteration: 990\n", + "0.8567457375833951\n", + "Iteration: 1000\n", + "0.8578576723498889\n", + "Iteration: 1010\n", + "0.8580429948109711\n", + "Iteration: 1020\n", + "0.8582283172720534\n", + "Iteration: 1030\n", + "0.8585989621942179\n", + "Iteration: 1040\n", + "0.8587842846553002\n", + "Iteration: 1050\n", + "0.8591549295774648\n", + "Iteration: 1060\n", + "0.8595255744996294\n", + "Iteration: 1070\n", + "0.8595255744996294\n", + "Iteration: 1080\n", + "0.8597108969607117\n", + "Iteration: 1090\n", + "0.860637509266123\n", + "Iteration: 1100\n", + "0.8626760563380281\n", + "Iteration: 1110\n", + "0.8628613787991104\n", + "Iteration: 1120\n", + "0.8630467012601928\n", + "Iteration: 1130\n", + "0.863232023721275\n", + "Iteration: 1140\n", + "0.8630467012601928\n", + "Iteration: 1150\n", + "0.863232023721275\n", + "Iteration: 1160\n", + "0.8641586360266864\n", + "Iteration: 1170\n", + "0.8648999258710156\n", + "Iteration: 1180\n", + "0.8647146034099333\n", + "Iteration: 1190\n", + "0.8654558932542624\n", + "Iteration: 1200\n", + "0.8650852483320979\n", + "Iteration: 1210\n", + "0.8652705707931801\n", + "Iteration: 1220\n", + "0.8661971830985915\n", + "Iteration: 1230\n", + "0.8667531504818384\n", + "Iteration: 1240\n", + "0.8669384729429207\n", + "Iteration: 1250\n", + "0.8665678280207562\n", + "Iteration: 1260\n", + "0.8665678280207562\n", + "Iteration: 1270\n", + "0.8663825055596739\n", + "Iteration: 1280\n", + "0.865826538176427\n", + "Iteration: 1290\n", + "0.8665678280207562\n", + "Iteration: 1300\n", + "0.8682357301704967\n", + "Iteration: 1310\n", + "0.8700889547813195\n", + "Iteration: 1320\n", + "0.8721275018532246\n", + "Iteration: 1330\n", + "0.8723128243143069\n", + "Iteration: 1340\n", + "0.8723128243143069\n", + "Iteration: 1350\n", + "0.8702742772424018\n", + "Iteration: 1360\n", + "0.8699036323202373\n", + "Iteration: 1370\n", + "0.8680504077094143\n", + "Iteration: 1380\n", + "0.8680504077094143\n", + "Iteration: 1390\n", + "0.8691623424759081\n", + "Iteration: 1400\n", + "0.8713862120088954\n", + "Iteration: 1410\n", + "0.873054114158636\n", + "Iteration: 1420\n", + "0.874351371386212\n", + "Iteration: 1430\n", + "0.8758339510748703\n", + "Iteration: 1440\n", + "0.8763899184581171\n", + "Iteration: 1450\n", + "0.8763899184581171\n", + "Iteration: 1460\n", + "0.8762045959970348\n", + "Iteration: 1470\n", + "0.8745366938472943\n", + "Iteration: 1480\n", + "0.8724981467753892\n", + "Iteration: 1490\n", + "0.8702742772424018\n", + "Iteration: 1500\n", + "0.8710155670867309\n", + "Iteration: 1510\n", + "0.873054114158636\n", + "Iteration: 1520\n", + "0.8736100815418829\n", + "Iteration: 1530\n", + "0.8739807264640475\n", + "Iteration: 1540\n", + "0.8747220163083765\n", + "Iteration: 1550\n", + "0.8750926612305412\n", + "Iteration: 1560\n", + "0.8752779836916235\n", + "Iteration: 1570\n", + "0.8752779836916235\n", + "Iteration: 1580\n", + "0.8750926612305412\n", + "Iteration: 1590\n", + "0.8750926612305412\n", + "Iteration: 1600\n", + "0.8760192735359525\n", + "Iteration: 1610\n", + "0.876945885841364\n", + "Iteration: 1620\n", + "0.8775018532246108\n", + "Iteration: 1630\n", + "0.8778724981467754\n", + "Iteration: 1640\n", + "0.8784284655300222\n", + "Iteration: 1650\n", + "0.8782431430689399\n", + "Iteration: 1660\n", + "0.876945885841364\n", + "Iteration: 1670\n", + "0.8765752409191994\n", + "Iteration: 1680\n", + "0.8773165307635286\n", + "Iteration: 1690\n", + "0.8778724981467754\n", + "Iteration: 1700\n", + "0.8793550778354337\n", + "Iteration: 1710\n", + "0.8797257227575982\n", + "Iteration: 1720\n", + "0.8808376575240919\n", + "Iteration: 1730\n", + "0.8810229799851742\n", + "Iteration: 1740\n", + "0.8812083024462565\n", + "Iteration: 1750\n", + "0.8810229799851742\n", + "Iteration: 1760\n", + "0.8821349147516679\n", + "Iteration: 1770\n", + "0.8825055596738325\n", + "Iteration: 1780\n", + "0.8826908821349148\n", + "Iteration: 1790\n", + "0.882876204595997\n", + "Iteration: 1800\n", + "0.8830615270570793\n", + "Iteration: 1810\n", + "0.8832468495181616\n", + "Iteration: 1820\n", + "0.8834321719792438\n", + "Iteration: 1830\n", + "0.8825055596738325\n", + "Iteration: 1840\n", + "0.8821349147516679\n", + "Iteration: 1850\n", + "0.8817642698295033\n", + "Iteration: 1860\n", + "0.8826908821349148\n", + "Iteration: 1870\n", + "0.8843587842846553\n", + "Iteration: 1880\n", + "0.8851000741289844\n", + "Iteration: 1890\n", + "0.8852853965900667\n", + "Iteration: 1900\n", + "0.8856560415122313\n", + "Iteration: 1910\n", + "0.8856560415122313\n", + "Iteration: 1920\n", + "0.8858413639733136\n", + "Iteration: 1930\n", + "0.8865826538176427\n", + "Iteration: 1940\n", + "0.8871386212008896\n", + "Iteration: 1950\n", + "0.8869532987398072\n", + "Iteration: 1960\n", + "0.8873239436619719\n", + "Iteration: 1970\n", + "0.888065233506301\n", + "Iteration: 1980\n", + "0.8882505559673832\n", + "Iteration: 1990\n", + "0.8871386212008896\n", + "Iteration: 2000\n", + "0.885470719051149\n", + "Iteration: 2010\n", + "0.8865826538176427\n", + "Iteration: 2020\n", + "0.8878799110452187\n", + "Iteration: 2030\n", + "0.8888065233506302\n", + "Iteration: 2040\n", + "0.8888065233506302\n", + "Iteration: 2050\n", + "0.889362490733877\n", + "Iteration: 2060\n", + "0.8891771682727947\n", + "Iteration: 2070\n", + "0.888065233506301\n", + "Iteration: 2080\n", + "0.8886212008895478\n", + "Iteration: 2090\n", + "0.8891771682727947\n", + "Iteration: 2100\n", + "0.8904744255003706\n", + "Iteration: 2110\n", + "0.8910303928836175\n", + "Iteration: 2120\n", + "0.8908450704225352\n", + "Iteration: 2130\n", + "0.8910303928836175\n", + "Iteration: 2140\n", + "0.8914010378057821\n", + "Iteration: 2150\n", + "0.8917716827279466\n", + "Iteration: 2160\n", + "0.8915863602668643\n", + "Iteration: 2170\n", + "0.890659747961453\n", + "Iteration: 2180\n", + "0.8908450704225352\n", + "Iteration: 2190\n", + "0.8914010378057821\n", + "Iteration: 2200\n", + "0.8919570051890289\n", + "Iteration: 2210\n", + "0.8921423276501111\n", + "Iteration: 2220\n", + "0.8926982950333581\n", + "Iteration: 2230\n", + "0.8932542624166049\n", + "Iteration: 2240\n", + "0.8932542624166049\n", + "Iteration: 2250\n", + "0.8938102297998517\n", + "Iteration: 2260\n", + "0.8939955522609341\n", + "Iteration: 2270\n", + "0.8938102297998517\n", + "Iteration: 2280\n", + "0.8926982950333581\n", + "Iteration: 2290\n", + "0.8928836174944403\n", + "Iteration: 2300\n", + "0.8934395848776872\n", + "Iteration: 2310\n", + "0.8943661971830986\n", + "Iteration: 2320\n", + "0.8956634544106745\n", + "Iteration: 2330\n", + "0.89529280948851\n", + "Iteration: 2340\n", + "0.8954781319495922\n", + "Iteration: 2350\n", + "0.8954781319495922\n", + "Iteration: 2360\n", + "0.8960340993328392\n", + "Iteration: 2370\n", + "0.8964047442550037\n", + "Iteration: 2380\n", + "0.8964047442550037\n", + "Iteration: 2390\n", + "0.8964047442550037\n", + "Iteration: 2400\n", + "0.8964047442550037\n", + "Iteration: 2410\n", + "0.896590066716086\n", + "Iteration: 2420\n", + "0.896590066716086\n", + "Iteration: 2430\n", + "0.8969607116382505\n", + "Iteration: 2440\n", + "0.8969607116382505\n", + "Iteration: 2450\n", + "0.8971460340993328\n", + "Iteration: 2460\n", + "0.8973313565604151\n", + "Iteration: 2470\n", + "0.8977020014825797\n", + "Iteration: 2480\n", + "0.8980726464047443\n", + "Iteration: 2490\n", + "0.8982579688658265\n", + "Iteration: 2500\n", + "0.8986286137879911\n", + "Iteration: 2510\n", + "0.899184581171238\n", + "Iteration: 2520\n", + "0.899184581171238\n", + "Iteration: 2530\n", + "0.8989992587101556\n", + "Iteration: 2540\n", + "0.8989992587101556\n", + "Iteration: 2550\n", + "0.899184581171238\n", + "Iteration: 2560\n", + "0.8995552260934025\n", + "Iteration: 2570\n", + "0.8997405485544848\n", + "Iteration: 2580\n", + "0.8997405485544848\n", + "Iteration: 2590\n", + "0.9004818383988139\n", + "Iteration: 2600\n", + "0.9006671608598962\n", + "Iteration: 2610\n", + "0.9010378057820608\n", + "Iteration: 2620\n", + "0.9010378057820608\n", + "Iteration: 2630\n", + "0.9008524833209784\n", + "Iteration: 2640\n", + "0.9004818383988139\n", + "Iteration: 2650\n", + "0.9008524833209784\n", + "Iteration: 2660\n", + "0.9012231282431431\n", + "Iteration: 2670\n", + "0.9017790956263899\n", + "Iteration: 2680\n", + "0.9023350630096367\n", + "Iteration: 2690\n", + "0.902520385470719\n", + "Iteration: 2700\n", + "0.9027057079318014\n", + "Iteration: 2710\n", + "0.9028910303928837\n", + "Iteration: 2720\n", + "0.9030763528539659\n", + "Iteration: 2730\n", + "0.9030763528539659\n", + "Iteration: 2740\n", + "0.9030763528539659\n", + "Iteration: 2750\n", + "0.9027057079318014\n", + "Iteration: 2760\n", + "0.9015937731653076\n", + "Iteration: 2770\n", + "0.9015937731653076\n", + "Iteration: 2780\n", + "0.9014084507042254\n", + "Iteration: 2790\n", + "0.9015937731653076\n", + "Iteration: 2800\n", + "0.9030763528539659\n", + "Iteration: 2810\n", + "0.903817642698295\n", + "Iteration: 2820\n", + "0.9047442550037065\n", + "Iteration: 2830\n", + "0.9056708673091178\n", + "Iteration: 2840\n", + "0.906412157153447\n", + "Iteration: 2850\n", + "0.906412157153447\n", + "Iteration: 2860\n", + "0.9047442550037065\n", + "Iteration: 2870\n", + "0.9040029651593773\n", + "Iteration: 2880\n", + "0.9030763528539659\n", + "Iteration: 2890\n", + "0.903817642698295\n", + "Iteration: 2900\n", + "0.9049295774647887\n", + "Iteration: 2910\n", + "0.9047442550037065\n", + "Iteration: 2920\n", + "0.9053002223869533\n", + "Iteration: 2930\n", + "0.9058561897702001\n", + "Iteration: 2940\n", + "0.9065974796145293\n", + "Iteration: 2950\n", + "0.9073387694588584\n", + "Iteration: 2960\n", + "0.9086360266864344\n", + "Iteration: 2970\n", + "0.9091919940696812\n", + "Iteration: 2980\n", + "0.9091919940696812\n", + "Iteration: 2990\n", + "0.9091919940696812\n", + "Iteration: 3000\n", + "0.9095626389918459\n", + "Iteration: 3010\n", + "0.9073387694588584\n", + "Iteration: 3020\n", + "0.9027057079318014\n", + "Iteration: 3030\n", + "0.9023350630096367\n", + "Iteration: 3040\n", + "0.9049295774647887\n", + "Iteration: 3050\n", + "0.9062268346923648\n", + "Iteration: 3060\n", + "0.9080800593031876\n", + "Iteration: 3070\n", + "0.9080800593031876\n", + "Iteration: 3080\n", + "0.9082653817642699\n", + "Iteration: 3090\n", + "0.9082653817642699\n", + "Iteration: 3100\n", + "0.9088213491475167\n", + "Iteration: 3110\n", + "0.9097479614529281\n", + "Iteration: 3120\n", + "0.911045218680504\n", + "Iteration: 3130\n", + "0.9119718309859155\n", + "Iteration: 3140\n", + "0.91234247590808\n", + "Iteration: 3150\n", + "0.9125277983691623\n", + "Iteration: 3160\n", + "0.9117865085248332\n", + "Iteration: 3170\n", + "0.9086360266864344\n", + "Iteration: 3180\n", + "0.905114899925871\n", + "Iteration: 3190\n", + "0.9032616753150482\n", + "Iteration: 3200\n", + "0.9054855448480356\n", + "Iteration: 3210\n", + "0.9075240919199407\n", + "Iteration: 3220\n", + "0.9106745737583395\n", + "Iteration: 3230\n", + "0.9121571534469978\n", + "Iteration: 3240\n", + "0.9134544106745738\n", + "Iteration: 3250\n", + "0.9141957005189029\n", + "Iteration: 3260\n", + "0.9140103780578206\n", + "Iteration: 3270\n", + "0.9141957005189029\n", + "Iteration: 3280\n", + "0.9132690882134915\n", + "Iteration: 3290\n", + "0.9093773165307635\n", + "Iteration: 3300\n", + "0.9071534469977761\n", + "Iteration: 3310\n", + "0.9090066716085989\n", + "Iteration: 3320\n", + "0.9106745737583395\n", + "Iteration: 3330\n", + "0.911045218680504\n", + "Iteration: 3340\n", + "0.9127131208302446\n", + "Iteration: 3350\n", + "0.9141957005189029\n", + "Iteration: 3360\n", + "0.9145663454410674\n", + "Iteration: 3370\n", + "0.9147516679021498\n", + "Iteration: 3380\n", + "0.9149369903632321\n", + "Iteration: 3390\n", + "0.913639733135656\n", + "Iteration: 3400\n", + "0.9117865085248332\n", + "Iteration: 3410\n", + "0.9106745737583395\n", + "Iteration: 3420\n", + "0.9106745737583395\n", + "Iteration: 3430\n", + "0.911601186063751\n", + "Iteration: 3440\n", + "0.9141957005189029\n", + "Iteration: 3450\n", + "0.9153076352853966\n", + "Iteration: 3460\n", + "0.9169755374351372\n", + "Iteration: 3470\n", + "0.9171608598962194\n", + "Iteration: 3480\n", + "0.9173461823573017\n", + "Iteration: 3490\n", + "0.9153076352853966\n", + "Iteration: 3500\n", + "0.9132690882134915\n", + "Iteration: 3510\n", + "0.9119718309859155\n", + "Iteration: 3520\n", + "0.9121571534469978\n", + "Iteration: 3530\n", + "0.9140103780578206\n", + "Iteration: 3540\n", + "0.9149369903632321\n", + "Iteration: 3550\n", + "0.9167902149740549\n", + "Iteration: 3560\n", + "0.917531504818384\n", + "Iteration: 3570\n", + "0.9191994069681245\n", + "Iteration: 3580\n", + "0.9195700518902891\n", + "Iteration: 3590\n", + "0.9195700518902891\n", + "Iteration: 3600\n", + "0.9191994069681245\n", + "Iteration: 3610\n", + "0.9186434395848777\n", + "Iteration: 3620\n", + "0.9164195700518903\n", + "Iteration: 3630\n", + "0.911045218680504\n", + "Iteration: 3640\n", + "0.9106745737583395\n", + "Iteration: 3650\n", + "0.9128984432913269\n", + "Iteration: 3660\n", + "0.9160489251297257\n", + "Iteration: 3670\n", + "0.9184581171237954\n", + "Iteration: 3680\n", + "0.9190140845070423\n", + "Iteration: 3690\n", + "0.9204966641957005\n", + "Iteration: 3700\n", + "0.9206819866567828\n", + "Iteration: 3710\n", + "0.9203113417346183\n", + "Iteration: 3720\n", + "0.9203113417346183\n", + "Iteration: 3730\n", + "0.9197553743513713\n", + "Iteration: 3740\n", + "0.9195700518902891\n", + "Iteration: 3750\n", + "0.9156782802075611\n", + "Iteration: 3760\n", + "0.91234247590808\n", + "Iteration: 3770\n", + "0.9127131208302446\n", + "Iteration: 3780\n", + "0.9158636026686434\n", + "Iteration: 3790\n", + "0.9179021497405485\n", + "Iteration: 3800\n", + "0.9190140845070423\n", + "Iteration: 3810\n", + "0.920126019273536\n", + "Iteration: 3820\n", + "0.9206819866567828\n", + "Iteration: 3830\n", + "0.9214232765011119\n", + "Iteration: 3840\n", + "0.9212379540400296\n", + "Iteration: 3850\n", + "0.9212379540400296\n", + "Iteration: 3860\n", + "0.9210526315789473\n", + "Iteration: 3870\n", + "0.9193847294292068\n", + "Iteration: 3880\n", + "0.9169755374351372\n", + "Iteration: 3890\n", + "0.9154929577464789\n", + "Iteration: 3900\n", + "0.9164195700518903\n", + "Iteration: 3910\n", + "0.9180874722016308\n", + "Iteration: 3920\n", + "0.920126019273536\n", + "Iteration: 3930\n", + "0.9219792438843588\n", + "Iteration: 3940\n", + "0.9225352112676056\n", + "Iteration: 3950\n", + "0.9225352112676056\n", + "Iteration: 3960\n", + "0.9223498888065234\n", + "Iteration: 3970\n", + "0.9208673091178651\n", + "Iteration: 3980\n", + "0.9195700518902891\n", + "Iteration: 3990\n", + "0.9186434395848777\n" + ] + } + ], + "source": [ + "W1, b1, W2, b2 = gradient_descent(X_train, Y_train, 0.10, 4000)\n", + "df = pd.DataFrame(acc_store)\n", + "df.to_csv('cr_acc.csv', index=False)\n", + "np.savez(\"cr_weights\", W1, b1, W2, b2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11203f4e-4adf-4a47-a6e2-a8847f27f0cc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.17" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/German_NN_C.ipynb b/German_NN_C.ipynb new file mode 100644 index 0000000..f7bbbde --- /dev/null +++ b/German_NN_C.ipynb @@ -0,0 +1,1098 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "ea3e9a09-3257-4b1a-9245-d42bbf88d06b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd \n", + "from matplotlib import pyplot as plt \n", + "\n", + "data = pd.read_csv('gtsrb_data_test.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "fe7852fc-5353-478d-9c7e-ad5fd251d963", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "data = np.array(data)\n", + "\n", + "m,n = data.shape\n", + "data_train = data[1000:m].T\n", + "\n", + "Y_train = data_train[0].astype(int)\n", + "\n", + "X_train = data_train[1:n]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "f3d23a27-d544-44ea-9291-5697fac2b8c2", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.5568628\n" + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "42435b4b-6390-4c20-b04a-cec2730879fd", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def init_params():\n", + " W1 = np.random.rand(10,1024) - 0.5\n", + " b1 = np.random.rand(10,1) - 0.5\n", + " W2 = np.random.rand(43,10) - 0.5\n", + " b2 = np.random.rand(43,1) - 0.5\n", + " return W1, b1 , W2, b2" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f9da376f-6b2a-4c7c-b392-c34f7dc7dee4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def ReLU(Z):\n", + " return np.maximum(Z,0)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6cd98c98-9f06-4362-a3cd-a0a9b168ea97", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def softmax(Z):\n", + " A = np.exp(Z) / sum(np.exp(Z))\n", + " return A" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "039f4e5d-9d7c-4f59-81d6-f64310cc5b1f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def forward_prop(W1, b1, W2, b2, X):\n", + " Z1 = W1.dot(X) + b1\n", + " A1 = ReLU(Z1)\n", + " Z2 = W2.dot(A1) + b2\n", + " A2 = softmax(Z2)\n", + " return Z1, A1, Z2, A2" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "24588282-2ec1-4c64-9b9d-4e7d395449fb", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def ReLU_deriv(Z):\n", + " return Z > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d4977d9c-38c9-4758-9262-dd03b8bbd015", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def one_hot(Y):\n", + " one_hot_Y = np.zeros((Y.size, Y.max() + 1))\n", + " one_hot_Y[np.arange(Y.size), Y] = 1\n", + " one_hot_Y = one_hot_Y.T\n", + " return one_hot_Y" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "941b2ec2-980f-4577-abe3-d13ac252e86b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def backward_prop(Z1, A1, Z2, A2, W1, W2, X, Y):\n", + " one_hot_Y = one_hot(Y)\n", + " dZ2 = A2 - one_hot_Y\n", + " dW2 = 1 / m * dZ2.dot(A1.T)\n", + " db2 = 1 / m * np.sum(dZ2)\n", + " dZ1 = W2.T.dot(dZ2) * ReLU_deriv(Z1)\n", + " dW1 = 1 / m * dZ1.dot(X.T)\n", + " db1 = 1 / m * np.sum(dZ1)\n", + " return dW1, db1, dW2, db2" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "20ab4235-86ac-4708-8b16-8d0169ecd97f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def update_params(W1, b1, W2, b2, dW1, db1, dW2, db2, alpha):\n", + " W1 = W1 - alpha * dW1\n", + " b1 = b1 - alpha * db1 \n", + " W2 = W2 - alpha * dW2 \n", + " b2 = b2 - alpha * db2 \n", + " return W1, b1, W2, b2" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "b82641d2-7ebb-4adb-9c40-3a6a28ccb49b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def get_predictions(A2):\n", + " return np.argmax(A2, 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2f38d2cc-316a-48f3-a275-57253249f132", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def get_accuracy(predictions, Y):\n", + " #print(predictions, Y)\n", + " return np.sum(predictions == Y) / Y.size" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "c46ae58a-9362-4f7d-8ce4-d668230b1647", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "acc_store = [] " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "54095b38-ca0a-41e6-9e33-c7b484e73c86", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def gradient_descent(X, Y, alpha, iterations):\n", + " W1, b1, W2, b2 = init_params()\n", + " for i in range(iterations):\n", + " Z1, A1, Z2, A2 = forward_prop(W1, b1, W2, b2, X)\n", + " dW1, db1, dW2, db2 = backward_prop(Z1, A1, Z2, A2, W1, W2, X, Y)\n", + " W1, b1, W2, b2 = update_params(W1, b1, W2, b2, dW1, db1, dW2, db2, alpha)\n", + " if i % 10 == 0:\n", + " print(\"Iteration: \", i)\n", + " predictions = get_predictions(A2)\n", + " pred = get_accuracy(predictions, Y)\n", + " print(pred)\n", + " acc_store.append(pred)\n", + " return W1, b1, W2, b2" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "bfa77e8c-04e4-4d1e-85f0-ea6cdd71e924", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration: 0\n", + "0.025193465176268273\n", + "Iteration: 10\n", + "0.04428202923473775\n", + "Iteration: 20\n", + "0.04883920894239037\n", + "Iteration: 30\n", + "0.060791057609630265\n", + "Iteration: 40\n", + "0.07919174548581255\n", + "Iteration: 50\n", + "0.09501289767841789\n", + "Iteration: 60\n", + "0.10378331900257953\n", + "Iteration: 70\n", + "0.10902837489251935\n", + "Iteration: 80\n", + "0.1124677558039553\n", + "Iteration: 90\n", + "0.11401547721410146\n", + "Iteration: 100\n", + "0.11685296646603612\n", + "Iteration: 110\n", + "0.12158211521926053\n", + "Iteration: 120\n", + "0.12510748065348237\n", + "Iteration: 130\n", + "0.12768701633705934\n", + "Iteration: 140\n", + "0.1294926913155632\n", + "Iteration: 150\n", + "0.13181427343078245\n", + "Iteration: 160\n", + "0.13284608770421324\n", + "Iteration: 170\n", + "0.13404987102321583\n", + "Iteration: 180\n", + "0.13473774720550302\n", + "Iteration: 190\n", + "0.13680137575236456\n", + "Iteration: 200\n", + "0.13843508168529664\n", + "Iteration: 210\n", + "0.13938091143594153\n", + "Iteration: 220\n", + "0.13989681857265693\n", + "Iteration: 230\n", + "0.13989681857265693\n", + "Iteration: 240\n", + "0.1402407566638005\n", + "Iteration: 250\n", + "0.1404987102321582\n", + "Iteration: 260\n", + "0.1410146173688736\n", + "Iteration: 270\n", + "0.1419604471195185\n", + "Iteration: 280\n", + "0.14282029234737748\n", + "Iteration: 290\n", + "0.14462596732588134\n", + "Iteration: 300\n", + "0.1469475494411006\n", + "Iteration: 310\n", + "0.1476354256233878\n", + "Iteration: 320\n", + "0.14944110060189167\n", + "Iteration: 330\n", + "0.15150472914875324\n", + "Iteration: 340\n", + "0.1529664660361135\n", + "Iteration: 350\n", + "0.15657781599312123\n", + "Iteration: 360\n", + "0.15950128976784178\n", + "Iteration: 370\n", + "0.16362854686156492\n", + "Iteration: 380\n", + "0.16603611349957006\n", + "Iteration: 390\n", + "0.16913155631986243\n", + "Iteration: 400\n", + "0.17205503009458298\n", + "Iteration: 410\n", + "0.1761822871883061\n", + "Iteration: 420\n", + "0.17815993121238177\n", + "Iteration: 430\n", + "0.18185726569217542\n", + "Iteration: 440\n", + "0.18426483233018057\n", + "Iteration: 450\n", + "0.18538263112639725\n", + "Iteration: 460\n", + "0.18512467755803955\n", + "Iteration: 470\n", + "0.18512467755803955\n", + "Iteration: 480\n", + "0.1874462596732588\n", + "Iteration: 490\n", + "0.1935511607910576\n", + "Iteration: 500\n", + "0.19733447979363714\n", + "Iteration: 510\n", + "0.2006018916595013\n", + "Iteration: 520\n", + "0.20429922613929494\n", + "Iteration: 530\n", + "0.20834049871023216\n", + "Iteration: 540\n", + "0.21298366294067067\n", + "Iteration: 550\n", + "0.21496130696474636\n", + "Iteration: 560\n", + "0.21908856405846946\n", + "Iteration: 570\n", + "0.2238177128116939\n", + "Iteration: 580\n", + "0.2291487532244196\n", + "Iteration: 590\n", + "0.23293207222699913\n", + "Iteration: 600\n", + "0.23439380911435942\n", + "Iteration: 610\n", + "0.23843508168529665\n", + "Iteration: 620\n", + "0.24316423043852106\n", + "Iteration: 630\n", + "0.2465176268271711\n", + "Iteration: 640\n", + "0.2524505588993981\n", + "Iteration: 650\n", + "0.2578675838349097\n", + "Iteration: 660\n", + "0.2623387790197764\n", + "Iteration: 670\n", + "0.2658641444539983\n", + "Iteration: 680\n", + "0.27136715391229577\n", + "Iteration: 690\n", + "0.2776440240756664\n", + "Iteration: 700\n", + "0.2808254514187446\n", + "Iteration: 710\n", + "0.2844368013757524\n", + "Iteration: 720\n", + "0.2868443680137575\n", + "Iteration: 730\n", + "0.29191745485812554\n", + "Iteration: 740\n", + "0.294067067927773\n", + "Iteration: 750\n", + "0.2976784178847807\n", + "Iteration: 760\n", + "0.3004299226139295\n", + "Iteration: 770\n", + "0.30472914875322443\n", + "Iteration: 780\n", + "0.30902837489251933\n", + "Iteration: 790\n", + "0.3113499570077386\n", + "Iteration: 800\n", + "0.31478933791917457\n", + "Iteration: 810\n", + "0.3183147033533964\n", + "Iteration: 820\n", + "0.32089423903697334\n", + "Iteration: 830\n", + "0.3221840068787618\n", + "Iteration: 840\n", + "0.32493551160791057\n", + "Iteration: 850\n", + "0.32639724849527085\n", + "Iteration: 860\n", + "0.3266552020636285\n", + "Iteration: 870\n", + "0.32751504729148756\n", + "Iteration: 880\n", + "0.3289767841788478\n", + "Iteration: 890\n", + "0.3315563198624248\n", + "Iteration: 900\n", + "0.3339638865004299\n", + "Iteration: 910\n", + "0.33568357695614787\n", + "Iteration: 920\n", + "0.3374032674118659\n", + "Iteration: 930\n", + "0.33920894239036975\n", + "Iteration: 940\n", + "0.3423043852106621\n", + "Iteration: 950\n", + "0.3467755803955288\n", + "Iteration: 960\n", + "0.3480653482373173\n", + "Iteration: 970\n", + "0.35081685296646603\n", + "Iteration: 980\n", + "0.35537403267411866\n", + "Iteration: 990\n", + "0.358469475494411\n", + "Iteration: 1000\n", + "0.3609630266552021\n", + "Iteration: 1010\n", + "0.36328460877042135\n", + "Iteration: 1020\n", + "0.3650042992261393\n", + "Iteration: 1030\n", + "0.36723989681857266\n", + "Iteration: 1040\n", + "0.3699914015477214\n", + "Iteration: 1050\n", + "0.37265692175408427\n", + "Iteration: 1060\n", + "0.37463456577815996\n", + "Iteration: 1070\n", + "0.3761822871883061\n", + "Iteration: 1080\n", + "0.37850386930352536\n", + "Iteration: 1090\n", + "0.37962166809974207\n", + "Iteration: 1100\n", + "0.3816852966466036\n", + "Iteration: 1110\n", + "0.3840068787618229\n", + "Iteration: 1120\n", + "0.38564058469475493\n", + "Iteration: 1130\n", + "0.3885640584694755\n", + "Iteration: 1140\n", + "0.39165950128976784\n", + "Iteration: 1150\n", + "0.394926913155632\n", + "Iteration: 1160\n", + "0.39604471195184865\n", + "Iteration: 1170\n", + "0.39819432502149615\n", + "Iteration: 1180\n", + "0.40103181427343076\n", + "Iteration: 1190\n", + "0.40386930352536543\n", + "Iteration: 1200\n", + "0.404213241616509\n", + "Iteration: 1210\n", + "0.40739466895958726\n", + "Iteration: 1220\n", + "0.40937231298366294\n", + "Iteration: 1230\n", + "0.4111779879621668\n", + "Iteration: 1240\n", + "0.41496130696474637\n", + "Iteration: 1250\n", + "0.4168529664660361\n", + "Iteration: 1260\n", + "0.4199484092863285\n", + "Iteration: 1270\n", + "0.42115219260533104\n", + "Iteration: 1280\n", + "0.423731728288908\n", + "Iteration: 1290\n", + "0.42613929492691316\n", + "Iteration: 1300\n", + "0.4278589853826311\n", + "Iteration: 1310\n", + "0.4311263972484953\n", + "Iteration: 1320\n", + "0.4322441960447119\n", + "Iteration: 1330\n", + "0.4345657781599312\n", + "Iteration: 1340\n", + "0.435597592433362\n", + "Iteration: 1350\n", + "0.43697334479793637\n", + "Iteration: 1360\n", + "0.4391229578675838\n", + "Iteration: 1370\n", + "0.4410146173688736\n", + "Iteration: 1380\n", + "0.44273430782459156\n", + "Iteration: 1390\n", + "0.44428202923473775\n", + "Iteration: 1400\n", + "0.4460017196904557\n", + "Iteration: 1410\n", + "0.44823731728288907\n", + "Iteration: 1420\n", + "0.4504729148753224\n", + "Iteration: 1430\n", + "0.4522785898538263\n", + "Iteration: 1440\n", + "0.4543422184006879\n", + "Iteration: 1450\n", + "0.45649183147033534\n", + "Iteration: 1460\n", + "0.4585554600171969\n", + "Iteration: 1470\n", + "0.460189165950129\n", + "Iteration: 1480\n", + "0.46182287188306104\n", + "Iteration: 1490\n", + "0.46388650042992263\n", + "Iteration: 1500\n", + "0.466122098022356\n", + "Iteration: 1510\n", + "0.46732588134135855\n", + "Iteration: 1520\n", + "0.46844368013757526\n", + "Iteration: 1530\n", + "0.4696474634565778\n", + "Iteration: 1540\n", + "0.4706792777300086\n", + "Iteration: 1550\n", + "0.47231298366294067\n", + "Iteration: 1560\n", + "0.47386070507308686\n", + "Iteration: 1570\n", + "0.4760963026655202\n", + "Iteration: 1580\n", + "0.47807394668959585\n", + "Iteration: 1590\n", + "0.47910576096302665\n", + "Iteration: 1600\n", + "0.48134135855546\n", + "Iteration: 1610\n", + "0.4824591573516767\n", + "Iteration: 1620\n", + "0.4831470335339639\n", + "Iteration: 1630\n", + "0.48460877042132416\n", + "Iteration: 1640\n", + "0.4866723989681857\n", + "Iteration: 1650\n", + "0.4877042132416165\n", + "Iteration: 1660\n", + "0.48796216680997423\n", + "Iteration: 1670\n", + "0.48950988822012037\n", + "Iteration: 1680\n", + "0.4885640584694755\n", + "Iteration: 1690\n", + "0.458469475494411\n", + "Iteration: 1700\n", + "0.4817712811693895\n", + "Iteration: 1710\n", + "0.5031814273430782\n", + "Iteration: 1720\n", + "0.5036973344797936\n", + "Iteration: 1730\n", + "0.4990541702493551\n", + "Iteration: 1740\n", + "0.48658641444539985\n", + "Iteration: 1750\n", + "0.4834049871023216\n", + "Iteration: 1760\n", + "0.49234737747205504\n", + "Iteration: 1770\n", + "0.5004299226139295\n", + "Iteration: 1780\n", + "0.504213241616509\n", + "Iteration: 1790\n", + "0.5081685296646603\n", + "Iteration: 1800\n", + "0.5116938950988822\n", + "Iteration: 1810\n", + "0.5149613069647463\n", + "Iteration: 1820\n", + "0.5170249355116079\n", + "Iteration: 1830\n", + "0.5184866723989682\n", + "Iteration: 1840\n", + "0.5189165950128977\n", + "Iteration: 1850\n", + "0.5210662080825451\n", + "Iteration: 1860\n", + "0.5173688736027515\n", + "Iteration: 1870\n", + "0.5042992261392949\n", + "Iteration: 1880\n", + "0.4950988822012038\n", + "Iteration: 1890\n", + "0.48538263112639723\n", + "Iteration: 1900\n", + "0.4998280309544282\n", + "Iteration: 1910\n", + "0.5120378331900258\n", + "Iteration: 1920\n", + "0.5133276010318143\n", + "Iteration: 1930\n", + "0.5149613069647463\n", + "Iteration: 1940\n", + "0.5182287188306105\n", + "Iteration: 1950\n", + "0.5208942390369733\n", + "Iteration: 1960\n", + "0.5234737747205503\n", + "Iteration: 1970\n", + "0.5251074806534823\n", + "Iteration: 1980\n", + "0.5267411865864144\n", + "Iteration: 1990\n", + "0.5280309544282029\n", + "Iteration: 2000\n", + "0.530438521066208\n", + "Iteration: 2010\n", + "0.5311263972484953\n", + "Iteration: 2020\n", + "0.529664660361135\n", + "Iteration: 2030\n", + "0.525451418744626\n", + "Iteration: 2040\n", + "0.5149613069647463\n", + "Iteration: 2050\n", + "0.49140154772141015\n", + "Iteration: 2060\n", + "0.5261392949269131\n", + "Iteration: 2070\n", + "0.5496130696474635\n", + "Iteration: 2080\n", + "0.5528804815133276\n", + "Iteration: 2090\n", + "0.548237317282889\n", + "Iteration: 2100\n", + "0.5408426483233018\n", + "Iteration: 2110\n", + "0.5248495270851247\n", + "Iteration: 2120\n", + "0.5248495270851247\n", + "Iteration: 2130\n", + "0.5340498710232158\n", + "Iteration: 2140\n", + "0.5439380911435941\n", + "Iteration: 2150\n", + "0.550816852966466\n", + "Iteration: 2160\n", + "0.5544282029234737\n", + "Iteration: 2170\n", + "0.5510748065348238\n", + "Iteration: 2180\n", + "0.5514187446259673\n", + "Iteration: 2190\n", + "0.5385210662080826\n", + "Iteration: 2200\n", + "0.542304385210662\n", + "Iteration: 2210\n", + "0.5588134135855546\n", + "Iteration: 2220\n", + "0.5655202063628547\n", + "Iteration: 2230\n", + "0.5571797076526225\n", + "Iteration: 2240\n", + "0.5384350816852966\n", + "Iteration: 2250\n", + "0.5430782459157352\n", + "Iteration: 2260\n", + "0.5548581255374032\n", + "Iteration: 2270\n", + "0.5577815993121238\n", + "Iteration: 2280\n", + "0.55932932072227\n", + "Iteration: 2290\n", + "0.5602751504729149\n", + "Iteration: 2300\n", + "0.561049011177988\n", + "Iteration: 2310\n", + "0.5584694754944111\n", + "Iteration: 2320\n", + "0.5538263112639725\n", + "Iteration: 2330\n", + "0.5439380911435941\n", + "Iteration: 2340\n", + "0.5379191745485813\n", + "Iteration: 2350\n", + "0.5466895958727429\n", + "Iteration: 2360\n", + "0.5522785898538263\n", + "Iteration: 2370\n", + "0.5636285468615649\n", + "Iteration: 2380\n", + "0.574548581255374\n", + "Iteration: 2390\n", + "0.5803955288048152\n", + "Iteration: 2400\n", + "0.5831470335339639\n", + "Iteration: 2410\n", + "0.5859845227858985\n", + "Iteration: 2420\n", + "0.5879621668099742\n", + "Iteration: 2430\n", + "0.5848667239896819\n", + "Iteration: 2440\n", + "0.5764402407566638\n", + "Iteration: 2450\n", + "0.572828890799656\n", + "Iteration: 2460\n", + "0.5832330180567498\n", + "Iteration: 2470\n", + "0.5879621668099742\n", + "Iteration: 2480\n", + "0.576268271711092\n", + "Iteration: 2490\n", + "0.5756663800515908\n", + "Iteration: 2500\n", + "0.582201203783319\n", + "Iteration: 2510\n", + "0.5882201203783319\n", + "Iteration: 2520\n", + "0.5885640584694755\n", + "Iteration: 2530\n", + "0.5852106620808255\n", + "Iteration: 2540\n", + "0.5783319002579536\n", + "Iteration: 2550\n", + "0.5766122098022356\n", + "Iteration: 2560\n", + "0.5803095442820292\n", + "Iteration: 2570\n", + "0.585640584694755\n", + "Iteration: 2580\n", + "0.5918314703353397\n", + "Iteration: 2590\n", + "0.585640584694755\n", + "Iteration: 2600\n", + "0.5929492691315563\n", + "Iteration: 2610\n", + "0.605159071367154\n", + "Iteration: 2620\n", + "0.6088564058469476\n", + "Iteration: 2630\n", + "0.6080825451418744\n", + "Iteration: 2640\n", + "0.6078245915735168\n", + "Iteration: 2650\n", + "0.6065348237317283\n", + "Iteration: 2660\n", + "0.6094582975064489\n", + "Iteration: 2670\n", + "0.6084264832330181\n", + "Iteration: 2680\n", + "0.6133276010318143\n", + "Iteration: 2690\n", + "0.6077386070507309\n", + "Iteration: 2700\n", + "0.5948409286328461\n", + "Iteration: 2710\n", + "0.6030954428202924\n", + "Iteration: 2720\n", + "0.6112639724849527\n", + "Iteration: 2730\n", + "0.6117798796216681\n", + "Iteration: 2740\n", + "0.6086844368013757\n", + "Iteration: 2750\n", + "0.6091143594153052\n", + "Iteration: 2760\n", + "0.6121238177128117\n", + "Iteration: 2770\n", + "0.6153912295786759\n", + "Iteration: 2780\n", + "0.6151332760103182\n", + "Iteration: 2790\n", + "0.616938950988822\n", + "Iteration: 2800\n", + "0.6122957867583835\n", + "Iteration: 2810\n", + "0.6045571797076527\n", + "Iteration: 2820\n", + "0.6171109200343938\n", + "Iteration: 2830\n", + "0.6277730008598452\n", + "Iteration: 2840\n", + "0.6288907996560619\n", + "Iteration: 2850\n", + "0.6271711092003439\n", + "Iteration: 2860\n", + "0.6308684436801376\n", + "Iteration: 2870\n", + "0.6312983662940671\n", + "Iteration: 2880\n", + "0.6307824591573516\n", + "Iteration: 2890\n", + "0.6348237317282889\n", + "Iteration: 2900\n", + "0.6386070507308684\n", + "Iteration: 2910\n", + "0.6353396388650043\n", + "Iteration: 2920\n", + "0.6213241616509029\n", + "Iteration: 2930\n", + "0.6240756663800516\n", + "Iteration: 2940\n", + "0.6345657781599312\n", + "Iteration: 2950\n", + "0.6372312983662941\n", + "Iteration: 2960\n", + "0.6330180567497851\n", + "Iteration: 2970\n", + "0.6343938091143594\n", + "Iteration: 2980\n", + "0.6374892519346518\n", + "Iteration: 2990\n", + "0.6381771281169389\n", + "Iteration: 3000\n", + "0.6404987102321582\n", + "Iteration: 3010\n", + "0.6439380911435941\n", + "Iteration: 3020\n", + "0.6418744625967326\n", + "Iteration: 3030\n", + "0.6346517626827171\n", + "Iteration: 3040\n", + "0.6258813413585554\n", + "Iteration: 3050\n", + "0.6392949269131556\n", + "Iteration: 3060\n", + "0.6469475494411006\n", + "Iteration: 3070\n", + "0.64737747205503\n", + "Iteration: 3080\n", + "0.6445399828030954\n", + "Iteration: 3090\n", + "0.6468615649183147\n", + "Iteration: 3100\n", + "0.6502149613069648\n", + "Iteration: 3110\n", + "0.6527944969905417\n", + "Iteration: 3120\n", + "0.6552880481513328\n", + "Iteration: 3130\n", + "0.6583834909716251\n", + "Iteration: 3140\n", + "0.660103181427343\n", + "Iteration: 3150\n", + "0.6502149613069648\n", + "Iteration: 3160\n", + "0.6441960447119518\n", + "Iteration: 3170\n", + "0.6499570077386071\n", + "Iteration: 3180\n", + "0.6577815993121238\n", + "Iteration: 3190\n", + "0.654170249355116\n", + "Iteration: 3200\n", + "0.6540842648323302\n", + "Iteration: 3210\n", + "0.6580395528804815\n", + "Iteration: 3220\n", + "0.6615649183147033\n", + "Iteration: 3230\n", + "0.6634565778159931\n", + "Iteration: 3240\n", + "0.6682717110920035\n", + "Iteration: 3250\n", + "0.6688736027515048\n", + "Iteration: 3260\n", + "0.6673258813413585\n", + "Iteration: 3270\n", + "0.6582115219260533\n", + "Iteration: 3280\n", + "0.6464316423043852\n", + "Iteration: 3290\n", + "0.6527944969905417\n", + "Iteration: 3300\n", + "0.6649183147033534\n", + "Iteration: 3310\n", + "0.6658641444539983\n", + "Iteration: 3320\n", + "0.6637145313843508\n", + "Iteration: 3330\n", + "0.6682717110920035\n", + "Iteration: 3340\n", + "0.6712811693895099\n", + "Iteration: 3350\n", + "0.671969045571797\n", + "Iteration: 3360\n", + "0.6722269991401548\n", + "Iteration: 3370\n", + "0.6730008598452278\n", + "Iteration: 3380\n", + "0.6782459157351677\n", + "Iteration: 3390\n", + "0.6794496990541703\n", + "Iteration: 3400\n", + "0.6723129836629407\n", + "Iteration: 3410\n", + "0.6655202063628547\n", + "Iteration: 3420\n", + "0.6648323301805675\n", + "Iteration: 3430\n", + "0.677128116938951\n", + "Iteration: 3440\n", + "0.6760963026655202\n", + "Iteration: 3450\n", + "0.6699054170249356\n", + "Iteration: 3460\n", + "0.6776440240756664\n", + "Iteration: 3470\n", + "0.6831470335339639\n", + "Iteration: 3480\n", + "0.6845227858985382\n", + "Iteration: 3490\n", + "0.6829750644883921\n", + "Iteration: 3500\n", + "0.6809114359415305\n", + "Iteration: 3510\n", + "0.683061049011178\n", + "Iteration: 3520\n", + "0.6860705073086845\n", + "Iteration: 3530\n", + "0.6862424763542563\n", + "Iteration: 3540\n", + "0.6808254514187446\n", + "Iteration: 3550\n", + "0.6705932932072227\n", + "Iteration: 3560\n", + "0.6765262252794497\n", + "Iteration: 3570\n", + "0.6884780739466896\n", + "Iteration: 3580\n", + "0.6907996560619089\n", + "Iteration: 3590\n", + "0.6785898538263113\n", + "Iteration: 3600\n", + "0.6792777300085985\n", + "Iteration: 3610\n", + "0.6947549441100602\n", + "Iteration: 3620\n", + "0.7036113499570077\n", + "Iteration: 3630\n", + "0.7007738607050731\n", + "Iteration: 3640\n", + "0.6918314703353396\n", + "Iteration: 3650\n", + "0.6798796216680998\n", + "Iteration: 3660\n", + "0.68469475494411\n", + "Iteration: 3670\n", + "0.6921754084264833\n", + "Iteration: 3680\n", + "0.697506448839209\n", + "Iteration: 3690\n", + "0.6960447119518487\n", + "Iteration: 3700\n", + "0.6905417024935512\n", + "Iteration: 3710\n", + "0.6876182287188306\n", + "Iteration: 3720\n", + "0.697506448839209\n", + "Iteration: 3730\n", + "0.7049011177987962\n", + "Iteration: 3740\n", + "0.7035253654342218\n", + "Iteration: 3750\n", + "0.6846087704213242\n", + "Iteration: 3760\n", + "0.6799656061908856\n", + "Iteration: 3770\n", + "0.6952708512467756\n", + "Iteration: 3780\n", + "0.7100601891659502\n", + "Iteration: 3790\n", + "0.7192605331040413\n", + "Iteration: 3800\n", + "0.7217540842648323\n", + "Iteration: 3810\n", + "0.7165950128976785\n", + "Iteration: 3820\n", + "0.698280309544282\n", + "Iteration: 3830\n", + "0.6799656061908856\n", + "Iteration: 3840\n", + "0.678761822871883\n", + "Iteration: 3850\n", + "0.693207222699914\n", + "Iteration: 3860\n", + "0.7019776440240757\n", + "Iteration: 3870\n", + "0.7073946689595872\n", + "Iteration: 3880\n", + "0.7070507308684437\n", + "Iteration: 3890\n", + "0.7057609630266553\n", + "Iteration: 3900\n", + "0.7104041272570937\n", + "Iteration: 3910\n", + "0.7171109200343938\n", + "Iteration: 3920\n", + "0.7189165950128977\n", + "Iteration: 3930\n", + "0.7104041272570937\n", + "Iteration: 3940\n", + "0.691487532244196\n", + "Iteration: 3950\n", + "0.6880481513327601\n", + "Iteration: 3960\n", + "0.7095442820292347\n", + "Iteration: 3970\n", + "0.722957867583835\n", + "Iteration: 3980\n", + "0.7315563198624248\n", + "Iteration: 3990\n", + "0.7358555460017197\n" + ] + } + ], + "source": [ + "W1, b1, W2, b2 = gradient_descent(X_train, Y_train, 0.10, 4000)\n", + "df = pd.DataFrame(acc_store)\n", + "df.to_csv('gt_acc.csv', index=False)\n", + "np.savez(\"gt_weights\", W1, b1, W2, b2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8c9bb8d-0379-4b46-941b-410bf0da29ef", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.17" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/NoNeed/Bel_Data_Loader.ipynb b/NoNeed/Bel_Data_Loader.ipynb new file mode 100644 index 0000000..7ee1739 --- /dev/null +++ b/NoNeed/Bel_Data_Loader.ipynb @@ -0,0 +1,152 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "e2a5d1d7-6bb3-4e24-9067-880296de1fc9", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import os\n", + "import imageio\n", + "from skimage import color, transform\n", + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "b37f1351-0a00-4a4b-9067-ea55a662bc80", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "main_folder = 'data/Bel_Training_Set/'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "76f41177-fd53-4bf6-9e75-ba1a98c414ff", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "subfolders = [f for f in os.listdir(main_folder) if os.path.isdir(os.path.join(main_folder, f))]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "706d2a6d-8147-42a1-ba19-3cc7108fcfea", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "image_data = []\n", + "label_data = []" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "86841170-b9bc-46cf-b482-f2d653060bc0", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "docnames = [\"Pixel \" + str(i) for i in range(1024)]\n", + "docnames.insert(0, 'Label')\n", + "df1 = pd.DataFrame(columns = docnames) " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d9e5d953-1652-47d3-a832-d71d87c2b7ee", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def add_to_dataset(x,y,z,l):\n", + " y.at[z,'Label'] = l\n", + " for i in range(0,1024):\n", + " y.at[z,docnames[i+1]] = x[i]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "82fe02ed-8471-493f-aded-58c54edb7ef6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "i = 0\n", + "for subfolder in subfolders:\n", + " subfolder_path = os.path.join(main_folder, subfolder)\n", + " for filename in os.listdir(subfolder_path):\n", + " \n", + " file_path = os.path.join(subfolder_path, filename)\n", + " if filename.lower().endswith('.ppm'):\n", + " img_array = imageio.v2.imread(file_path)\n", + " resized_img_array = transform.resize(img_array, (32, 32))\n", + " gray_img_array = color.rgb2gray(resized_img_array)\n", + " flattened_img_array = gray_img_array.flatten()\n", + " add_to_dataset(flattened_img_array,df1,i,int(subfolder))\n", + " i = i + 1\n", + " #print(\"Image From\", int(subfolder), \"Image Name\", filename)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "7bdcd7d7-56f3-4b9f-924f-dd811dddf605", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df1.to_csv('bel_data_test.csv', index = False) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12d9c974-85ed-4d10-af2e-0984a367d4be", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/NoNeed/Cro_Data_Loader.ipynb b/NoNeed/Cro_Data_Loader.ipynb new file mode 100644 index 0000000..e2e7370 --- /dev/null +++ b/NoNeed/Cro_Data_Loader.ipynb @@ -0,0 +1,152 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "0a9a579c-df1c-4742-a0ed-e3db27bdc3e4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd \n", + "import os\n", + "import imageio\n", + "from skimage import color, transform\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "99e5b7bf-4438-477c-9880-008fb864ae56", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "image_folder = 'data/Cro_Training_Set/'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "da337206-82a6-416c-b5db-04466695a7b4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def convert_letter(x):\n", + " if x == 'A':\n", + " y = 0\n", + " if x == 'B':\n", + " y = 1\n", + " if x == 'C':\n", + " y = 2\n", + " if x == 'D':\n", + " y = 3\n", + " if x == 'E':\n", + " y = 4\n", + " return y\n", + "def add_to_dataset(x,y,z,l):\n", + " y.at[z,'Label'] = l\n", + " for i in range(0,1024):\n", + " y.at[z,docnames[i+1]] = x[i]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0d28e8d0-9386-4ccd-a7bf-f19e9d59d6f6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "docnames = [\"Pixel \" + str(i) for i in range(1024)]\n", + "docnames.insert(0, 'Label')\n", + "df1 = pd.DataFrame(columns = docnames) " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ce03500d-7d48-493f-a00c-94c1d79bf02d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "i = 0\n", + "for filename in os.listdir(image_folder):\n", + " file_path = os.path.join(image_folder, filename)\n", + "\n", + " # Check if the file is a PNG file\n", + " if filename.lower().endswith('.bmp'):\n", + " # Extract the single letter from the filename (adjust the index accordingly)\n", + " single_letter = filename[0]\n", + "\n", + " # Read the image and convert it to a NumPy array\n", + " img_array = imageio.v2.imread(file_path)\n", + "\n", + " # Resize the image to 32x32\n", + " resized_img_array = transform.resize(img_array, (32, 32))\n", + "\n", + " # Convert the RGB image to grayscale\n", + " gray_img_array = color.rgb2gray(resized_img_array)\n", + "\n", + " # Flatten the image to 1024\n", + " flattened_img_array = gray_img_array.flatten()\n", + " \n", + " label = convert_letter(single_letter)\n", + " add_to_dataset(flattened_img_array,df1,i,label)\n", + " i = i + 1\n", + "\n", + " # Append the processed image data to the list\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "02056706-60c3-4390-990a-9f84bb56c049", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df1.to_csv('cro_data_test.csv', index = False) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66da76d9-6286-4e1e-b91e-007f43642c14", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.17" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/NoNeed/Germna_Data_Loader.ipynb b/NoNeed/Germna_Data_Loader.ipynb new file mode 100644 index 0000000..89e4719 --- /dev/null +++ b/NoNeed/Germna_Data_Loader.ipynb @@ -0,0 +1,382 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "e9cfe5db-43cb-4298-9388-d869d7314ea2", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np \n", + "import pandas as pd " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9a476b58-bb18-4499-96cd-4bf38ca7566f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def img_flat(x):\n", + " gray_img = np.mean(x, axis=0)\n", + " flat_img = gray_img.flatten()\n", + " return flat_img\n", + "def add_to_dataset(x,y,z,l):\n", + " y.at[z,'Label'] = l\n", + " for i in range(0,1024):\n", + " y.at[z,docnames[i+1]] = x[i]\n", + " #print(z , \"Completed\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6130f3c5-97bd-4be8-8751-9ffbae99436b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "docnames = [\"Pixel \" + str(i) for i in range(1024)]\n", + "docnames.insert(0, 'Label')\n", + "df1 = pd.DataFrame(columns = docnames) " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0d080bf5-067b-47a5-99dc-b22f145115b6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading https://sid.erda.dk/public/archives/daaeac0d7ce1152aea9b61d9f1e19370/GTSRB_Final_Test_Images.zip to data/gtsrb/GTSRB_Final_Test_Images.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 88978620/88978620 [00:10<00:00, 8777572.15it/s] \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extracting data/gtsrb/GTSRB_Final_Test_Images.zip to data/gtsrb\n", + "Downloading https://sid.erda.dk/public/archives/daaeac0d7ce1152aea9b61d9f1e19370/GTSRB_Final_Test_GT.zip to data/gtsrb/GTSRB_Final_Test_GT.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 99620/99620 [00:00<00:00, 289763.24it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extracting data/gtsrb/GTSRB_Final_Test_GT.zip to data/gtsrb\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from torchvision.datasets import GTSRB\n", + "from torchvision import transforms\n", + "\n", + "# Define a transform to convert the data to a NumPy array\n", + "transform = transforms.Compose([\n", + " transforms.Resize((32, 32)), \n", + " transforms.ToTensor(),\n", + "])\n", + "\n", + "# Download the dataset\n", + "dataset = GTSRB(root='./data', split=\"test\", transform=transform, download=True)\n", + "\n", + "\n", + "\n", + "# Iterate through the dataset and apply transformations\n", + "for i in range(len(dataset)):\n", + " image, label = dataset[i]\n", + " label = int(label)\n", + " # Convert the PyTorch tensor to a NumPy array\n", + " image_np = np.array(image)\n", + " temp_img = img_flat(image_np)\n", + " add_to_dataset(temp_img,df1,i,label)\n", + " #data['label'].append(label)\n", + " \n", + " \n", + "# Convert the data to a DataFrame\n", + "#df = pd.DataFrame(data)\n", + "\n", + "# Save the DataFrame to a CSV file\n", + "#df.to_csv('gtsrb_data.csv', index=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1b64da5c-1326-4258-8066-6ab5debfec9d", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
LabelPixel 0Pixel 1Pixel 2Pixel 3Pixel 4Pixel 5Pixel 6Pixel 7Pixel 8...Pixel 1014Pixel 1015Pixel 1016Pixel 1017Pixel 1018Pixel 1019Pixel 1020Pixel 1021Pixel 1022Pixel 1023
0160.5633990.5568630.5594770.5607840.5555560.5503270.549020.5464050.537255...0.5516340.549020.5450980.5503270.5542480.549020.5398690.5477120.5516340.554248
110.2562090.3032680.3111110.3294120.2941180.3045750.3084970.2222220.160784...0.8653590.8104580.5241830.2653590.2013070.2130720.2287580.2405230.274510.281046
2380.1712420.1660130.1647060.1660130.1647060.158170.1620920.1633990.160784...0.1503270.1150330.1359480.1189540.1150330.1346410.1424840.1555560.1699350.179085
3330.4496730.3294120.2470590.2666670.3830070.5320260.641830.6614380.718954...0.4771240.5620920.6549020.7764710.7385620.6967320.7568630.8771240.9464050.882353
4110.1320260.1450980.158170.1555560.1503270.1450980.158170.1843140.203922...0.1477120.1411760.1385620.1450980.1516340.1568630.1555560.1620920.1712420.177778
\n", + "

5 rows × 1025 columns

\n", + "
" + ], + "text/plain": [ + " Label Pixel 0 Pixel 1 Pixel 2 Pixel 3 Pixel 4 Pixel 5 Pixel 6 \\\n", + "0 16 0.563399 0.556863 0.559477 0.560784 0.555556 0.550327 0.54902 \n", + "1 1 0.256209 0.303268 0.311111 0.329412 0.294118 0.304575 0.308497 \n", + "2 38 0.171242 0.166013 0.164706 0.166013 0.164706 0.15817 0.162092 \n", + "3 33 0.449673 0.329412 0.247059 0.266667 0.383007 0.532026 0.64183 \n", + "4 11 0.132026 0.145098 0.15817 0.155556 0.150327 0.145098 0.15817 \n", + "\n", + " Pixel 7 Pixel 8 ... Pixel 1014 Pixel 1015 Pixel 1016 Pixel 1017 \\\n", + "0 0.546405 0.537255 ... 0.551634 0.54902 0.545098 0.550327 \n", + "1 0.222222 0.160784 ... 0.865359 0.810458 0.524183 0.265359 \n", + "2 0.163399 0.160784 ... 0.150327 0.115033 0.135948 0.118954 \n", + "3 0.661438 0.718954 ... 0.477124 0.562092 0.654902 0.776471 \n", + "4 0.184314 0.203922 ... 0.147712 0.141176 0.138562 0.145098 \n", + "\n", + " Pixel 1018 Pixel 1019 Pixel 1020 Pixel 1021 Pixel 1022 Pixel 1023 \n", + "0 0.554248 0.54902 0.539869 0.547712 0.551634 0.554248 \n", + "1 0.201307 0.213072 0.228758 0.240523 0.27451 0.281046 \n", + "2 0.115033 0.134641 0.142484 0.155556 0.169935 0.179085 \n", + "3 0.738562 0.696732 0.756863 0.877124 0.946405 0.882353 \n", + "4 0.151634 0.156863 0.155556 0.162092 0.171242 0.177778 \n", + "\n", + "[5 rows x 1025 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df1.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "deaf22c0-5aae-45e4-a4db-196fbcc001a1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df1.to_csv('gtsrb_data_test.csv', index = False) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bbc65ef5-4313-42ed-8690-557ebca488b8", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.17" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/bel_semantics.ipynb b/bel_semantics.ipynb new file mode 100644 index 0000000..3904138 --- /dev/null +++ b/bel_semantics.ipynb @@ -0,0 +1,185 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import net.modules\n", + "\n", + "import numpy as np\n", + "\n", + "from net.transcoder import Transcoder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "filepath = 'data/bel_data_test.csv'\n", + "train_loader, test_loader, input_size = load_and_prepare_data(file_path=filepath)\n", + "\n", + "print(\"X_train shape:\", input_size.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# input_size = X_train.shape[0]\n", + "# hidden_size = 128\n", + "# output_size = 61\n", + "\n", + "architecture = [input_size, [128], 61]\n", + "activations = ['leaky_relu','softmax']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initialize transcoder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# bl_transcoder = Transcoder(input_size, hidden_size, output_size, 'leaky_relu', 'softmax')\n", + "bl_transcoder = Transcoder(architecture, hidden_activation='relu', output_activation='softmax')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train Encoders and save weights\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# # Train the encoder if need\n", + "\n", + "bl_transcoder.train_model(train_loader, test_loader, learning_rate=0.001, epochs=1000)\n", + "# bl_transcoder.train_with_validation(X_train, Y_train, alpha=0.1, iterations=1000)\n", + "bl_transcoder.save_results('bt_1h128n')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load weights" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "bl_transcoder.load_weights('weights/bt_1h128n_leaky_relu_weights.pth')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Analysis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot learning curves\n", + "bl_transcoder.plot_learning_curves()\n", + "\n", + "# Visualize encoded space\n", + "bl_transcoder.plot_encoded_space(X_test, Y_test)\n", + "\n", + "print(X_test.shape)\n", + "print(X_train.shape)\n", + "# Check reconstructions\n", + "bl_transcoder.plot_reconstructions(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Transcode images" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "num_images = 2\n", + "indices = np.random.choice(X_test.shape[1], num_images, replace=False)\n", + "\n", + "for idx in indices:\n", + " original_image = X_test[:, idx]\n", + " \n", + " # Encode the image\n", + " encoded = bl_transcoder.encode_image(original_image.reshape(-1, 1))\n", + " \n", + " # Decode the image\n", + " decoded = bl_transcoder.decode_image(encoded)\n", + "\n", + " # Visualize original, encoded, and decoded images\n", + " visualize_transcoding(original_image, encoded, decoded, idx)\n", + "\n", + " print(f\"Image {idx}:\")\n", + " print(\"Original shape:\", original_image.shape)\n", + " print(\"Encoded shape:\", encoded.shape)\n", + " print(\"Decoded shape:\", decoded.shape)\n", + " print(\"Encoded vector:\", encoded.flatten()) # Print flattened encoded vector\n", + " print(\"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "semantics", + "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.12.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/enc_dec.ipynb b/enc_dec.ipynb new file mode 100644 index 0000000..7c806e6 --- /dev/null +++ b/enc_dec.ipynb @@ -0,0 +1,203 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "from net.modules import *\n", + "from net.decoder import *\n", + "from net.encoder import *" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Set up parameters (modify these as needed)\n", + "file_path = \"data/bel_data_test.csv\" # Replace with your actual file path\n", + "encoder_type = \"pca\" # Choose \"regular\" or \"pca\"\n", + "load_weights = False # Set to True if you want to load pre-trained weights\n", + "weight_file = \"weights/bel_weights.npz\" # Only used if load_weights is True\n", + "dataset=\"bel\"\n", + "\n", + "# Load and prepare the data\n", + "X_train, Y_train, X_test, Y_test = load_and_prepare_data(file_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Set hyperparameters\n", + "input_size = X_train.shape[0]\n", + "hidden_size = 128\n", + "output_size = 61 # Number of classes\n", + "pca_components = 50\n", + "\n", + "alpha = 0.01\n", + "iterations = 2000\n", + "num_trials = 5" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Choose encoder type\n", + "if encoder_type == \"regular\":\n", + " EncoderClass = Encoder\n", + " encoder_name = \"Regular Encoder\"\n", + "elif encoder_type == \"pca\":\n", + " EncoderClass = PCAEncoder\n", + " encoder_name = \"PCAEncoder\"\n", + "else:\n", + " raise ValueError(\"Invalid encoder type selected\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training PCAEncoder\n", + "Trial 1/5\n" + ] + }, + { + "ename": "ValueError", + "evalue": "X has 50 features, but StandardScaler is expecting 1024 features as input.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[5], line 9\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 8\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTraining \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mencoder_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m----> 9\u001b[0m best_weights, best_accuracy, all_accuracies \u001b[38;5;241m=\u001b[39m \u001b[43mbest_params\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 10\u001b[0m \u001b[43m \u001b[49m\u001b[43mEncoderClass\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mX_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mY_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minput_size\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhidden_size\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutput_size\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 11\u001b[0m \u001b[43m \u001b[49m\u001b[43malpha\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43miterations\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnum_trials\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpca_components\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpca_components\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mEncoderClass\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m==\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mPCAEncoder\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\n\u001b[1;32m 12\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBest accuracy achieved with \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mencoder_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mbest_accuracy\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 15\u001b[0m \u001b[38;5;66;03m# Create encoder with best weights\u001b[39;00m\n", + "File \u001b[0;32m~/Projects/School/Sem_Imp/net/modules.py:15\u001b[0m, in \u001b[0;36mbest_params\u001b[0;34m(EncoderClass, X, Y, input_size, hidden_size, output_size, alpha, iterations, num_trials, **kwargs)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTrial \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtrial\u001b[38;5;250m \u001b[39m\u001b[38;5;241m+\u001b[39m\u001b[38;5;250m \u001b[39m\u001b[38;5;241m1\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mnum_trials\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 14\u001b[0m encoder \u001b[38;5;241m=\u001b[39m EncoderClass(input_size, hidden_size, output_size, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m---> 15\u001b[0m accuracies \u001b[38;5;241m=\u001b[39m \u001b[43mencoder\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mY\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43miterations\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43malpha\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 16\u001b[0m final_accuracy \u001b[38;5;241m=\u001b[39m accuracies[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m]\n\u001b[1;32m 17\u001b[0m all_accuracies\u001b[38;5;241m.\u001b[39mappend(accuracies)\n", + "File \u001b[0;32m~/Projects/School/Sem_Imp/net/encoder.py:112\u001b[0m, in \u001b[0;36mPCAEncoder.train\u001b[0;34m(self, X, Y, iterations, alpha)\u001b[0m\n\u001b[1;32m 110\u001b[0m X_scaled \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mscaler\u001b[38;5;241m.\u001b[39mtransform(X\u001b[38;5;241m.\u001b[39mT)\u001b[38;5;241m.\u001b[39mT\n\u001b[1;32m 111\u001b[0m X_pca \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpca\u001b[38;5;241m.\u001b[39mtransform(X_scaled\u001b[38;5;241m.\u001b[39mT)\u001b[38;5;241m.\u001b[39mT\n\u001b[0;32m--> 112\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_pca\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mY\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43miterations\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43malpha\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/Projects/School/Sem_Imp/net/encoder.py:64\u001b[0m, in \u001b[0;36mEncoder.train\u001b[0;34m(self, X, Y, iterations, alpha)\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mupdate_params(dW1, db1, dW2, db2, alpha)\n\u001b[1;32m 63\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m i \u001b[38;5;241m%\u001b[39m \u001b[38;5;241m100\u001b[39m \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m---> 64\u001b[0m accuracy \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_accuracy\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mY\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 65\u001b[0m accuracies\u001b[38;5;241m.\u001b[39mappend(accuracy)\n\u001b[1;32m 66\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIteration \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mi\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, Accuracy: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00maccuracy\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[0;32m~/Projects/School/Sem_Imp/net/encoder.py:115\u001b[0m, in \u001b[0;36mPCAEncoder.get_accuracy\u001b[0;34m(self, X, Y)\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_accuracy\u001b[39m(\u001b[38;5;28mself\u001b[39m, X, Y):\n\u001b[0;32m--> 115\u001b[0m X_scaled \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mscaler\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mT\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mT\n\u001b[1;32m 116\u001b[0m X_pca \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpca\u001b[38;5;241m.\u001b[39mtransform(X_scaled\u001b[38;5;241m.\u001b[39mT)\u001b[38;5;241m.\u001b[39mT\n\u001b[1;32m 117\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mget_accuracy(X_pca, Y)\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.6/envs/tf/lib/python3.11/site-packages/sklearn/utils/_set_output.py:313\u001b[0m, in \u001b[0;36m_wrap_method_output..wrapped\u001b[0;34m(self, X, *args, **kwargs)\u001b[0m\n\u001b[1;32m 311\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(f)\n\u001b[1;32m 312\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapped\u001b[39m(\u001b[38;5;28mself\u001b[39m, X, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 313\u001b[0m data_to_wrap \u001b[38;5;241m=\u001b[39m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 314\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data_to_wrap, \u001b[38;5;28mtuple\u001b[39m):\n\u001b[1;32m 315\u001b[0m \u001b[38;5;66;03m# only wrap the first output for cross decomposition\u001b[39;00m\n\u001b[1;32m 316\u001b[0m return_tuple \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 317\u001b[0m _wrap_data_with_container(method, data_to_wrap[\u001b[38;5;241m0\u001b[39m], X, \u001b[38;5;28mself\u001b[39m),\n\u001b[1;32m 318\u001b[0m \u001b[38;5;241m*\u001b[39mdata_to_wrap[\u001b[38;5;241m1\u001b[39m:],\n\u001b[1;32m 319\u001b[0m )\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.6/envs/tf/lib/python3.11/site-packages/sklearn/preprocessing/_data.py:1045\u001b[0m, in \u001b[0;36mStandardScaler.transform\u001b[0;34m(self, X, copy)\u001b[0m\n\u001b[1;32m 1042\u001b[0m check_is_fitted(\u001b[38;5;28mself\u001b[39m)\n\u001b[1;32m 1044\u001b[0m copy \u001b[38;5;241m=\u001b[39m copy \u001b[38;5;28;01mif\u001b[39;00m copy \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcopy\n\u001b[0;32m-> 1045\u001b[0m X \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_validate_data\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1046\u001b[0m \u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1047\u001b[0m \u001b[43m \u001b[49m\u001b[43mreset\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 1048\u001b[0m \u001b[43m \u001b[49m\u001b[43maccept_sparse\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcsr\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1049\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1050\u001b[0m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mFLOAT_DTYPES\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1051\u001b[0m \u001b[43m \u001b[49m\u001b[43mforce_writeable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 1052\u001b[0m \u001b[43m \u001b[49m\u001b[43mforce_all_finite\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mallow-nan\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1053\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1055\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m sparse\u001b[38;5;241m.\u001b[39missparse(X):\n\u001b[1;32m 1056\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwith_mean:\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.6/envs/tf/lib/python3.11/site-packages/sklearn/base.py:654\u001b[0m, in \u001b[0;36mBaseEstimator._validate_data\u001b[0;34m(self, X, y, reset, validate_separately, cast_to_ndarray, **check_params)\u001b[0m\n\u001b[1;32m 651\u001b[0m out \u001b[38;5;241m=\u001b[39m X, y\n\u001b[1;32m 653\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m check_params\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mensure_2d\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mTrue\u001b[39;00m):\n\u001b[0;32m--> 654\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_check_n_features\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreset\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreset\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 656\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m out\n", + "File \u001b[0;32m~/.pyenv/versions/3.11.6/envs/tf/lib/python3.11/site-packages/sklearn/base.py:443\u001b[0m, in \u001b[0;36mBaseEstimator._check_n_features\u001b[0;34m(self, X, reset)\u001b[0m\n\u001b[1;32m 440\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 442\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m n_features \u001b[38;5;241m!=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_features_in_:\n\u001b[0;32m--> 443\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 444\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mX has \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mn_features\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m features, but \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 445\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mis expecting \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_features_in_\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m features as input.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 446\u001b[0m )\n", + "\u001b[0;31mValueError\u001b[0m: X has 50 features, but StandardScaler is expecting 1024 features as input." + ] + } + ], + "source": [ + "# Load pre-trained weights or train a new model\n", + "if load_weights:\n", + " encoder = EncoderClass(input_size, hidden_size, output_size, pca_components=pca_components)\n", + " encoder.load_weights(weight_file)\n", + " print(f\"Weights loaded for {encoder_name}\")\n", + "else:\n", + " print(f\"Training {encoder_name}\")\n", + " best_weights, best_accuracy, all_accuracies = best_params(\n", + " EncoderClass, X_train, Y_train, input_size, hidden_size, output_size, \n", + " alpha, iterations, num_trials, pca_components=pca_components\n", + " )\n", + " print(f\"Best accuracy achieved with {encoder_name}: {best_accuracy}\")\n", + "\n", + " # Create encoder with best weights\n", + " encoder = EncoderClass(input_size, hidden_size, output_size, pca_components=pca_components)\n", + " encoder.W1, encoder.b1, encoder.W2, encoder.b2 = best_weights\n", + "\n", + " # Save the best weights\n", + " weight_file = f\"{dataset}_{encoder_name.lower().replace(' ', '_')}_weights.npz\"\n", + " encoder.save_weights(weight_file)\n", + " print(f\"Best weights saved to {weight_file}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the appropriate Decoder\n", + "decoder = PCADecoder(encoder) if EncoderClass == PCAEncoder else Decoder(encoder)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test the encoding-decoding process\n", + "num_test_images = 5\n", + "for i in range(num_test_images):\n", + " original_image = X_test[:, i].reshape(input_size, 1)\n", + " encoded = encoder.encode(original_image)\n", + " reconstructed = decoder.decode(encoded)\n", + "\n", + " # Visualize the results\n", + " img_dim = int(np.sqrt(input_size))\n", + " plt.figure(figsize=(15, 5))\n", + " \n", + " plt.subplot(1, 3, 1)\n", + " plt.imshow(original_image.reshape(img_dim, img_dim), cmap='gray')\n", + " plt.title(f\"Original Image {i+1}\")\n", + " \n", + " plt.subplot(1, 3, 2)\n", + " plt.imshow(encoded.reshape(output_size, 1), cmap='viridis', aspect='auto')\n", + " plt.title(f\"Encoded Image {i+1}\")\n", + " \n", + " plt.subplot(1, 3, 3)\n", + " plt.imshow(reconstructed.reshape(img_dim, img_dim), cmap='gray')\n", + " plt.title(f\"Reconstructed Image {i+1}\")\n", + " \n", + " plt.tight_layout()\n", + " plt.show()\n", + "\n", + " # Calculate and print the mean squared error\n", + " mse = np.mean((original_image - reconstructed) ** 2)\n", + " print(f\"Mean Squared Error for Image {i+1}: {mse}\")\n", + "\n", + "print(\"Encoding-decoding process completed.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "tf", + "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.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/encoder.ipynb b/encoder.ipynb new file mode 100644 index 0000000..4ceee20 --- /dev/null +++ b/encoder.ipynb @@ -0,0 +1,423 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "407c9473", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "14cccaae-d3b6-4ae5-a28a-5fed4b998783", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def init_params():\n", + " W1 = np.random.rand(10,1024) - 0.5\n", + " b1 = np.random.rand(10,1) - 0.5\n", + " W2 = np.random.rand(61,10) - 0.5\n", + " b2 = np.random.rand(61,1) - 0.5\n", + " return W1, b1 , W2, b2\n", + "def ReLU(Z):\n", + " return np.maximum(Z,0)\n", + "def softmax(Z):\n", + " A = np.exp(Z) / sum(np.exp(Z))\n", + " return A\n", + "def forward_prop(W1, b1, W2, b2, X):\n", + " Z1 = W1.dot(X) + b1\n", + " A1 = ReLU(Z1)\n", + " Z2 = W2.dot(A1) + b2\n", + " A2 = softmax(Z2)\n", + " return Z1, A1, Z2, A2\n", + "def ReLU_deriv(Z):\n", + " return Z > 0\n", + "def one_hot(Y):\n", + " one_hot_Y = np.zeros((Y.size, Y.max() + 1))\n", + " one_hot_Y[np.arange(Y.size), Y] = 1\n", + " one_hot_Y = one_hot_Y.T\n", + " return one_hot_Y\n", + "def backward_prop(Z1, A1, Z2, A2, W1, W2, X, Y):\n", + " one_hot_Y = one_hot(Y)\n", + " dZ2 = A2 - one_hot_Y\n", + " dW2 = 1 / m * dZ2.dot(A1.T)\n", + " db2 = 1 / m * np.sum(dZ2)\n", + " dZ1 = W2.T.dot(dZ2) * ReLU_deriv(Z1)\n", + " dW1 = 1 / m * dZ1.dot(X.T)\n", + " db1 = 1 / m * np.sum(dZ1)\n", + " return dW1, db1, dW2, db2\n", + "def update_params(W1, b1, W2, b2, dW1, db1, dW2, db2, alpha):\n", + " W1 = W1 - alpha * dW1\n", + " b1 = b1 - alpha * db1 \n", + " W2 = W2 - alpha * dW2 \n", + " b2 = b2 - alpha * db2 \n", + " return W1, b1, W2, b2\n", + "def get_predictions(A2):\n", + " return np.argmax(A2, 0)\n", + "def get_accuracy(predictions, Y):\n", + " #print(predictions, Y)\n", + " return np.sum(predictions == Y) / Y.size" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ec251927-46fc-413d-abb8-34fafb5a429d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "#import data_ready as dr\n", + "import os\n", + "import struct\n", + "import numpy as np\n", + "from matplotlib import pyplot as plt \n", + "\n", + "'''\n", + "npz = np.load(\"weights.npz\")\n", + "W1 = np.array(npz['arr_0'])\n", + "b1 = np.array(npz['arr_1'])\n", + "W2 = np.array(npz['arr_2'])\n", + "b2 = np.array(npz['arr_3'])\n", + "'''\n", + "def encode_image(X,W1,b1,W2,b2):\n", + " current_image = X\n", + " _, _, _, A2 = forward_prop(W1,b1,W2,b2,current_image)\n", + " return A2\n", + " #print(A2)\n", + " #np.save('pred', A2)\n" + ] + }, + { + "cell_type": "markdown", + "id": "ff4758bc-7e5d-47ba-a3d4-aa4afde6165f", + "metadata": {}, + "source": [ + "### Load in The Weights" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d323d295-5f29-4233-975c-1d5eab88a830", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bt_npz = np.load(\"bt_weights.npz\")\n", + "cr_npz = np.load(\"cr_weights.npz\")\n", + "gt_npz = np.load(\"gt_weights.npz\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "62160a9e-f166-47d1-88af-cc767385d09f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "W1_bt = np.array(bt_npz['arr_0'])\n", + "b1_bt = np.array(bt_npz['arr_1'])\n", + "W2_bt = np.array(bt_npz['arr_2'])\n", + "b2_bt = np.array(bt_npz['arr_3'])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "daa2d8e0-8f76-436d-9e3d-dfb711808e43", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "W1_cr = np.array(cr_npz['arr_0'])\n", + "b1_cr = np.array(cr_npz['arr_1'])\n", + "W2_cr = np.array(cr_npz['arr_2'])\n", + "b2_cr = np.array(cr_npz['arr_3'])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "17e3cd24-21b1-440c-8e38-f91597368771", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "W1_gt = np.array(gt_npz['arr_0'])\n", + "b1_gt = np.array(gt_npz['arr_1'])\n", + "W2_gt = np.array(gt_npz['arr_2'])\n", + "b2_gt = np.array(gt_npz['arr_3'])" + ] + }, + { + "cell_type": "markdown", + "id": "4ae55872-8e28-419d-85af-1ef185a254ce", + "metadata": {}, + "source": [ + "### Load in the Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0f230135-264d-4b89-b0a6-cab229ed0047", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "datac = pd.read_csv('cro_data_test.csv')\n", + "datac = np.array(datac)\n", + "\n", + "m,n = datac.shape\n", + "data_trainc = datac[1000:m].T\n", + "\n", + "Y_trainc = data_trainc[0].astype(int)\n", + "X_trainc = data_trainc[1:n]\n", + "\n", + "current_image_c = X_trainc[:,1,None]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "1f2a757a-4c29-4271-a895-03415765b105", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "datag = pd.read_csv('gtsrb_data_test.csv')\n", + "datag = np.array(datag)\n", + "\n", + "m,n = datag.shape\n", + "data_traing = datag[1000:m].T\n", + "\n", + "Y_traing = data_traing[0].astype(int)\n", + "X_traing = data_traing[1:n]\n", + "\n", + "current_image_g = X_traing[:,1,None]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "7026b28c-ef29-4706-9e9b-ed2417ab06eb", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "datab = pd.read_csv('bel_data_test.csv')\n", + "datab = np.array(datab)\n", + "\n", + "m,n = datab.shape\n", + "data_trainb = datab[1000:m].T\n", + "\n", + "Y_trainb = data_trainb[0].astype(int)\n", + "X_trainb = data_trainb[1:n]\n", + "\n", + "current_image_b = X_trainc[:,1,None]" + ] + }, + { + "cell_type": "markdown", + "id": "c0552a80-ab8f-4ac0-ba4b-bc3ab26a1944", + "metadata": {}, + "source": [ + "# Encoding 1 Image" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "3daa565f-64f0-4294-9c36-bb87d1904ad0", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "c1 = encode_image(current_image_c,W1_cr,b1_cr,W2_cr,b2_cr)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cd9d9223-d626-43e9-86d7-ef9bd24e0bc7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "b1 = encode_image(current_image_b,W1_bt,b1_bt,W2_bt,b2_bt)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "22443477-852f-4978-ae65-6883ed9d1e6b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "g1 = encode_image(current_image_g,W1_gt,b1_gt,W2_gt,b2_gt)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "b33a151f-d6b1-4386-8fa8-7e88da8951c8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "np.save('data/Single_Encoding/pred_c', c1)\n", + "np.save('data/Single_Encoding/pred_b', b1)\n", + "np.save('data/Single_Encoding/pred_g', g1)" + ] + }, + { + "cell_type": "markdown", + "id": "a0df95db-6f10-4f6e-a043-0a82b6e3763b", + "metadata": {}, + "source": [ + "# Encoding 900 Images" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "002bd5b5-aead-413b-8051-64326ebef595", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "for x in range(0,900):\n", + " current_image_g = X_traing[:,x,None]\n", + " g1 = encode_image(current_image_g,W1_gt,b1_gt,W2_gt,b2_gt)\n", + " np.save('data/9_G/pred_g' + str(x), g1)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "6513e7f4-ef60-4d96-8576-540d4ef91c7b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "for x in range(0,900):\n", + " current_image_b = X_trainb[:,x,None]\n", + " b1 = encode_image(current_image_b,W1_bt,b1_bt,W2_bt,b2_bt)\n", + " np.save('data/9_B/pred_b' + str(x), b1)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "fc9144a0-b415-463d-bcc7-5ebaed0467ce", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "for x in range(0,900):\n", + " current_image_c = X_trainc[:,x,None]\n", + " c1 = encode_image(current_image_c,W1_cr,b1_cr,W2_cr,b2_cr)\n", + " np.save('data/9_C/pred_c' + str(x), c1)" + ] + }, + { + "cell_type": "markdown", + "id": "4fbd5222-e2b9-4c1d-82a0-6294136a2a71", + "metadata": {}, + "source": [ + "Encoding 1800 Images" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "00eba2e4-b5a1-4905-a20f-42d71eebaeff", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "for x in range(0,1800):\n", + " current_image_g = X_traing[:,x,None]\n", + " g1 = encode_image(current_image_g,W1_gt,b1_gt,W2_gt,b2_gt)\n", + " np.save('data/18_G/pred_g' + str(x), g1)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "ee1bd756-09c1-401f-8301-95357ae52446", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "for x in range(0,1800):\n", + " current_image_b = X_trainb[:,x,None]\n", + " b1 = encode_image(current_image_b,W1_bt,b1_bt,W2_bt,b2_bt)\n", + " np.save('data/18_B/pred_b' + str(x), b1)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "65dfac08-626e-47ac-9d35-15b794998f8d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "for x in range(0,1800):\n", + " current_image_c = X_trainc[:,x,None]\n", + " c1 = encode_image(current_image_c,W1_cr,b1_cr,W2_cr,b2_cr)\n", + " np.save('data/18_C/pred_c' + str(x), c1)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/eval.ipynb b/eval.ipynb new file mode 100644 index 0000000..4f7d059 --- /dev/null +++ b/eval.ipynb @@ -0,0 +1,826 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "56c5399c-3831-447a-92ca-78db743cf210", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-11-02 20:10:19.469149: I tensorflow/tsl/cuda/cudart_stub.cc:28] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2023-11-02 20:10:20.054690: I tensorflow/tsl/cuda/cudart_stub.cc:28] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2023-11-02 20:10:20.058624: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2023-11-02 20:10:23.266197: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n" + ] + } + ], + "source": [ + "import tensorflow as tf" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7bea8d05-52f2-42a0-956d-0b6f18fdf572", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "new_model = tf.keras.models.load_model('my_model-rl.keras')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5ca43e80-392d-4f52-abe9-bd742b3ea45a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 0s 168ms/step\n", + "0.25306880474090576\n", + "[[ 5.5278926 6.742366 13.018371 9.016246 11.853377 9.8279915\n", + " 8.468219 10.012401 11.003584 13.671693 12.078493 11.816193 ]]\n" + ] + } + ], + "source": [ + "pred = new_model.predict((8,))\n", + "avg = sum(pred[0]) / len(pred[0])\n", + "avg = avg % 1\n", + "x = 3 \n", + "x = x % 1\n", + "print(avg)\n", + "print(pred)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "413dfce5-5862-49dd-80f3-b93160ab226c", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 0s 119ms/step\n", + "1/1 [==============================] - 0s 87ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 87ms/step\n", + "1/1 [==============================] - 0s 110ms/step\n", + "1/1 [==============================] - 0s 101ms/step\n", + "1/1 [==============================] - 0s 141ms/step\n", + "1/1 [==============================] - 0s 63ms/step\n", + "1/1 [==============================] - 0s 69ms/step\n", + "1/1 [==============================] - 0s 79ms/step\n", + "1/1 [==============================] - 0s 81ms/step\n", + "1/1 [==============================] - 0s 66ms/step\n", + "1/1 [==============================] - 0s 87ms/step\n", + "1/1 [==============================] - 0s 88ms/step\n", + "1/1 [==============================] - 0s 103ms/step\n", + "1/1 [==============================] - 0s 90ms/step\n", + "1/1 [==============================] - 0s 65ms/step\n", + "1/1 [==============================] - 0s 102ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 94ms/step\n", + "1/1 [==============================] - 0s 76ms/step\n", + "1/1 [==============================] - 0s 80ms/step\n", + "1/1 [==============================] - 0s 69ms/step\n", + "1/1 [==============================] - 0s 96ms/step\n", + "1/1 [==============================] - 0s 90ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 67ms/step\n", + "1/1 [==============================] - 0s 70ms/step\n", + "1/1 [==============================] - 0s 80ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 126ms/step\n", + "1/1 [==============================] - 0s 98ms/step\n", + "1/1 [==============================] - 0s 75ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 64ms/step\n", + "1/1 [==============================] - 0s 76ms/step\n", + "1/1 [==============================] - 0s 64ms/step\n", + "1/1 [==============================] - 0s 60ms/step\n", + "1/1 [==============================] - 0s 53ms/step\n", + "1/1 [==============================] - 0s 123ms/step\n", + "1/1 [==============================] - 0s 155ms/step\n", + "1/1 [==============================] - 0s 87ms/step\n", + "1/1 [==============================] - 0s 65ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 129ms/step\n", + "1/1 [==============================] - 0s 92ms/step\n", + "1/1 [==============================] - 0s 87ms/step\n", + "1/1 [==============================] - 0s 111ms/step\n", + "1/1 [==============================] - 0s 93ms/step\n", + "1/1 [==============================] - 0s 77ms/step\n", + "1/1 [==============================] - 0s 64ms/step\n", + "1/1 [==============================] - 0s 62ms/step\n", + "1/1 [==============================] - 0s 120ms/step\n", + "1/1 [==============================] - 0s 80ms/step\n", + "1/1 [==============================] - 0s 56ms/step\n", + "1/1 [==============================] - 0s 72ms/step\n", + "1/1 [==============================] - 0s 57ms/step\n", + "1/1 [==============================] - 0s 67ms/step\n", + "1/1 [==============================] - 0s 88ms/step\n", + "1/1 [==============================] - 0s 55ms/step\n", + "1/1 [==============================] - 0s 78ms/step\n", + "1/1 [==============================] - 0s 44ms/step\n", + "1/1 [==============================] - 0s 103ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 118ms/step\n", + "1/1 [==============================] - 0s 96ms/step\n", + "1/1 [==============================] - 0s 72ms/step\n", + "1/1 [==============================] - 0s 71ms/step\n", + "1/1 [==============================] - 0s 76ms/step\n", + "1/1 [==============================] - 0s 62ms/step\n", + "1/1 [==============================] - 0s 86ms/step\n", + "1/1 [==============================] - 0s 74ms/step\n", + "1/1 [==============================] - 0s 86ms/step\n", + "1/1 [==============================] - 0s 128ms/step\n", + "1/1 [==============================] - 0s 81ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 45ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 54ms/step\n", + "1/1 [==============================] - 0s 54ms/step\n", + "1/1 [==============================] - 0s 59ms/step\n", + "1/1 [==============================] - 0s 91ms/step\n", + "1/1 [==============================] - 0s 71ms/step\n", + "1/1 [==============================] - 0s 76ms/step\n", + "1/1 [==============================] - 0s 73ms/step\n", + "1/1 [==============================] - 0s 66ms/step\n", + "1/1 [==============================] - 0s 62ms/step\n", + "1/1 [==============================] - 0s 81ms/step\n", + "1/1 [==============================] - 0s 101ms/step\n", + "1/1 [==============================] - 0s 80ms/step\n", + "1/1 [==============================] - 0s 90ms/step\n", + "1/1 [==============================] - 0s 97ms/step\n", + "1/1 [==============================] - 0s 107ms/step\n", + "1/1 [==============================] - 0s 68ms/step\n", + "1/1 [==============================] - 0s 92ms/step\n", + "1/1 [==============================] - 0s 63ms/step\n", + "1/1 [==============================] - 0s 103ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 88ms/step\n", + "1/1 [==============================] - 0s 121ms/step\n", + "1/1 [==============================] - 0s 108ms/step\n", + "1/1 [==============================] - 0s 86ms/step\n", + "1/1 [==============================] - 0s 103ms/step\n", + "1/1 [==============================] - 0s 91ms/step\n", + "1/1 [==============================] - 0s 87ms/step\n", + "1/1 [==============================] - 0s 94ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 116ms/step\n", + "1/1 [==============================] - 0s 95ms/step\n", + "1/1 [==============================] - 0s 178ms/step\n", + "1/1 [==============================] - 0s 94ms/step\n", + "1/1 [==============================] - 0s 69ms/step\n", + "1/1 [==============================] - 0s 91ms/step\n", + "1/1 [==============================] - 0s 79ms/step\n", + "1/1 [==============================] - 0s 69ms/step\n", + "1/1 [==============================] - 0s 90ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 111ms/step\n", + "1/1 [==============================] - 0s 111ms/step\n", + "1/1 [==============================] - 0s 95ms/step\n", + "1/1 [==============================] - 0s 99ms/step\n", + "1/1 [==============================] - 0s 79ms/step\n", + "1/1 [==============================] - 0s 113ms/step\n", + "1/1 [==============================] - 0s 74ms/step\n", + "1/1 [==============================] - 0s 63ms/step\n", + "1/1 [==============================] - 0s 108ms/step\n", + "1/1 [==============================] - 0s 97ms/step\n", + "1/1 [==============================] - 0s 89ms/step\n", + "1/1 [==============================] - 0s 112ms/step\n", + "1/1 [==============================] - 0s 99ms/step\n", + "1/1 [==============================] - 0s 148ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 124ms/step\n", + "1/1 [==============================] - 0s 95ms/step\n", + "1/1 [==============================] - 0s 104ms/step\n", + "1/1 [==============================] - 0s 65ms/step\n", + "1/1 [==============================] - 0s 64ms/step\n", + "1/1 [==============================] - 0s 73ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 95ms/step\n", + "1/1 [==============================] - 0s 79ms/step\n", + "1/1 [==============================] - 0s 131ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 107ms/step\n", + "1/1 [==============================] - 0s 139ms/step\n", + "1/1 [==============================] - 0s 69ms/step\n", + "1/1 [==============================] - 0s 75ms/step\n", + "1/1 [==============================] - 0s 99ms/step\n", + "1/1 [==============================] - 0s 112ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 81ms/step\n", + "1/1 [==============================] - 0s 78ms/step\n", + "1/1 [==============================] - 0s 60ms/step\n", + "1/1 [==============================] - 0s 79ms/step\n", + "1/1 [==============================] - 0s 81ms/step\n", + "1/1 [==============================] - 0s 163ms/step\n", + "1/1 [==============================] - 0s 91ms/step\n", + "1/1 [==============================] - 0s 59ms/step\n", + "1/1 [==============================] - 0s 49ms/step\n", + "1/1 [==============================] - 0s 49ms/step\n", + "1/1 [==============================] - 0s 51ms/step\n", + "1/1 [==============================] - 0s 92ms/step\n", + "1/1 [==============================] - 0s 92ms/step\n", + "1/1 [==============================] - 0s 87ms/step\n", + "1/1 [==============================] - 0s 63ms/step\n", + "1/1 [==============================] - 0s 61ms/step\n", + "1/1 [==============================] - 0s 64ms/step\n", + "1/1 [==============================] - 0s 71ms/step\n", + "1/1 [==============================] - 0s 198ms/step\n", + "1/1 [==============================] - 0s 142ms/step\n", + "1/1 [==============================] - 0s 112ms/step\n", + "1/1 [==============================] - 0s 141ms/step\n", + "1/1 [==============================] - 0s 72ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 72ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 92ms/step\n", + "1/1 [==============================] - 0s 81ms/step\n", + "1/1 [==============================] - 0s 104ms/step\n", + "1/1 [==============================] - 0s 98ms/step\n", + "1/1 [==============================] - 0s 89ms/step\n", + "1/1 [==============================] - 0s 71ms/step\n", + "1/1 [==============================] - 0s 64ms/step\n", + "1/1 [==============================] - 0s 55ms/step\n", + "1/1 [==============================] - 0s 101ms/step\n", + "1/1 [==============================] - 0s 54ms/step\n", + "1/1 [==============================] - 0s 92ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 111ms/step\n", + "1/1 [==============================] - 0s 104ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 72ms/step\n", + "1/1 [==============================] - 0s 97ms/step\n", + "1/1 [==============================] - 0s 87ms/step\n", + "1/1 [==============================] - 0s 69ms/step\n", + "1/1 [==============================] - 0s 126ms/step\n", + "1/1 [==============================] - 0s 154ms/step\n", + "1/1 [==============================] - 0s 120ms/step\n", + "1/1 [==============================] - 0s 107ms/step\n", + "1/1 [==============================] - 0s 132ms/step\n", + "1/1 [==============================] - 0s 72ms/step\n", + "1/1 [==============================] - 0s 70ms/step\n", + "1/1 [==============================] - 0s 124ms/step\n", + "1/1 [==============================] - 0s 86ms/step\n", + "1/1 [==============================] - 0s 111ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 90ms/step\n", + "1/1 [==============================] - 0s 90ms/step\n", + "1/1 [==============================] - 0s 81ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 92ms/step\n", + "1/1 [==============================] - 0s 60ms/step\n", + "1/1 [==============================] - 0s 76ms/step\n", + "1/1 [==============================] - 0s 122ms/step\n", + "1/1 [==============================] - 0s 77ms/step\n", + "1/1 [==============================] - 0s 75ms/step\n", + "1/1 [==============================] - 0s 77ms/step\n", + "1/1 [==============================] - 0s 54ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 62ms/step\n", + "1/1 [==============================] - 0s 98ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 111ms/step\n", + "1/1 [==============================] - 0s 63ms/step\n", + "1/1 [==============================] - 0s 101ms/step\n", + "1/1 [==============================] - 0s 61ms/step\n", + "1/1 [==============================] - 0s 48ms/step\n", + "1/1 [==============================] - 0s 64ms/step\n", + "1/1 [==============================] - 0s 62ms/step\n", + "1/1 [==============================] - 0s 60ms/step\n", + "1/1 [==============================] - 0s 59ms/step\n", + "1/1 [==============================] - 0s 41ms/step\n", + "1/1 [==============================] - 0s 38ms/step\n", + "1/1 [==============================] - 0s 71ms/step\n", + "1/1 [==============================] - 0s 57ms/step\n", + "1/1 [==============================] - 0s 49ms/step\n", + "1/1 [==============================] - 0s 94ms/step\n", + "1/1 [==============================] - 0s 114ms/step\n", + "1/1 [==============================] - 0s 43ms/step\n", + "1/1 [==============================] - 0s 81ms/step\n", + "1/1 [==============================] - 0s 98ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 89ms/step\n", + "1/1 [==============================] - 0s 87ms/step\n", + "1/1 [==============================] - 0s 114ms/step\n", + "1/1 [==============================] - 0s 98ms/step\n", + "1/1 [==============================] - 0s 60ms/step\n", + "1/1 [==============================] - 0s 61ms/step\n", + "1/1 [==============================] - 0s 60ms/step\n", + "1/1 [==============================] - 0s 61ms/step\n", + "1/1 [==============================] - 0s 70ms/step\n", + "1/1 [==============================] - 0s 79ms/step\n", + "1/1 [==============================] - 0s 92ms/step\n", + "1/1 [==============================] - 0s 113ms/step\n", + "1/1 [==============================] - 0s 41ms/step\n", + "1/1 [==============================] - 0s 41ms/step\n", + "1/1 [==============================] - 0s 39ms/step\n", + "1/1 [==============================] - 0s 39ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 38ms/step\n", + "1/1 [==============================] - 0s 35ms/step\n", + "1/1 [==============================] - 0s 37ms/step\n", + "1/1 [==============================] - 0s 130ms/step\n", + "1/1 [==============================] - 0s 86ms/step\n", + "1/1 [==============================] - 0s 104ms/step\n", + "1/1 [==============================] - 0s 157ms/step\n", + "1/1 [==============================] - 0s 91ms/step\n", + "1/1 [==============================] - 0s 59ms/step\n", + "1/1 [==============================] - 0s 56ms/step\n", + "1/1 [==============================] - 0s 80ms/step\n", + "1/1 [==============================] - 0s 69ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 87ms/step\n", + "1/1 [==============================] - 0s 86ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 65ms/step\n", + "1/1 [==============================] - 0s 55ms/step\n", + "1/1 [==============================] - 0s 120ms/step\n", + "1/1 [==============================] - 0s 110ms/step\n", + "1/1 [==============================] - 0s 95ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 107ms/step\n", + "1/1 [==============================] - 0s 79ms/step\n", + "1/1 [==============================] - 0s 77ms/step\n", + "1/1 [==============================] - 0s 52ms/step\n", + "1/1 [==============================] - 0s 92ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 113ms/step\n", + "1/1 [==============================] - 0s 90ms/step\n", + "1/1 [==============================] - 0s 104ms/step\n", + "1/1 [==============================] - 0s 140ms/step\n", + "1/1 [==============================] - 0s 63ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 79ms/step\n", + "1/1 [==============================] - 0s 104ms/step\n", + "1/1 [==============================] - 0s 88ms/step\n", + "1/1 [==============================] - 0s 115ms/step\n", + "1/1 [==============================] - 0s 112ms/step\n", + "1/1 [==============================] - 0s 72ms/step\n", + "1/1 [==============================] - 0s 86ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 78ms/step\n", + "1/1 [==============================] - 0s 133ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 90ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 76ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 94ms/step\n", + "1/1 [==============================] - 0s 80ms/step\n", + "1/1 [==============================] - 0s 57ms/step\n", + "1/1 [==============================] - 0s 56ms/step\n", + "1/1 [==============================] - 0s 56ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 61ms/step\n", + "1/1 [==============================] - 0s 61ms/step\n", + "1/1 [==============================] - 0s 65ms/step\n", + "1/1 [==============================] - 0s 56ms/step\n", + "1/1 [==============================] - 0s 44ms/step\n", + "1/1 [==============================] - 0s 39ms/step\n", + "1/1 [==============================] - 0s 88ms/step\n", + "1/1 [==============================] - 0s 96ms/step\n", + "1/1 [==============================] - 0s 105ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 55ms/step\n", + "1/1 [==============================] - 0s 54ms/step\n", + "1/1 [==============================] - 0s 49ms/step\n", + "1/1 [==============================] - 0s 49ms/step\n", + "1/1 [==============================] - 0s 86ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 77ms/step\n", + "1/1 [==============================] - 0s 81ms/step\n", + "1/1 [==============================] - 0s 78ms/step\n", + "1/1 [==============================] - 0s 51ms/step\n", + "1/1 [==============================] - 0s 51ms/step\n", + "1/1 [==============================] - 0s 51ms/step\n", + "1/1 [==============================] - 0s 51ms/step\n", + "1/1 [==============================] - 0s 53ms/step\n", + "1/1 [==============================] - 0s 38ms/step\n", + "1/1 [==============================] - 0s 36ms/step\n", + "1/1 [==============================] - 0s 35ms/step\n", + "1/1 [==============================] - 0s 35ms/step\n", + "1/1 [==============================] - 0s 35ms/step\n", + "1/1 [==============================] - 0s 35ms/step\n", + "1/1 [==============================] - 0s 35ms/step\n", + "1/1 [==============================] - 0s 35ms/step\n", + "1/1 [==============================] - 0s 35ms/step\n", + "1/1 [==============================] - 0s 35ms/step\n", + "1/1 [==============================] - 0s 35ms/step\n", + "1/1 [==============================] - 0s 35ms/step\n", + "1/1 [==============================] - 0s 35ms/step\n", + "1/1 [==============================] - 0s 35ms/step\n", + "1/1 [==============================] - 0s 79ms/step\n", + "1/1 [==============================] - 0s 78ms/step\n", + "1/1 [==============================] - 0s 78ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 137ms/step\n", + "1/1 [==============================] - 0s 80ms/step\n", + "1/1 [==============================] - 0s 97ms/step\n", + "1/1 [==============================] - 0s 79ms/step\n", + "1/1 [==============================] - 0s 79ms/step\n", + "1/1 [==============================] - 0s 78ms/step\n", + "1/1 [==============================] - 0s 128ms/step\n", + "1/1 [==============================] - 0s 81ms/step\n", + "1/1 [==============================] - 0s 134ms/step\n", + "1/1 [==============================] - 0s 109ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 68ms/step\n", + "1/1 [==============================] - 0s 73ms/step\n", + "1/1 [==============================] - 0s 70ms/step\n", + "1/1 [==============================] - 0s 69ms/step\n", + "1/1 [==============================] - 0s 118ms/step\n", + "1/1 [==============================] - 0s 107ms/step\n", + "1/1 [==============================] - 0s 63ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 96ms/step\n", + "1/1 [==============================] - 0s 86ms/step\n", + "1/1 [==============================] - 0s 105ms/step\n", + "1/1 [==============================] - 0s 110ms/step\n", + "1/1 [==============================] - 0s 60ms/step\n", + "1/1 [==============================] - 0s 59ms/step\n", + "1/1 [==============================] - 0s 67ms/step\n", + "1/1 [==============================] - 0s 78ms/step\n", + "1/1 [==============================] - 0s 86ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 81ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 56ms/step\n", + "1/1 [==============================] - 0s 56ms/step\n", + "1/1 [==============================] - 0s 58ms/step\n", + "1/1 [==============================] - 0s 57ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 109ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 141ms/step\n", + "1/1 [==============================] - 0s 92ms/step\n", + "1/1 [==============================] - 0s 67ms/step\n", + "1/1 [==============================] - 0s 64ms/step\n", + "1/1 [==============================] - 0s 103ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 55ms/step\n", + "1/1 [==============================] - 0s 57ms/step\n", + "1/1 [==============================] - 0s 59ms/step\n", + "1/1 [==============================] - 0s 55ms/step\n", + "1/1 [==============================] - 0s 57ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 89ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 86ms/step\n", + "1/1 [==============================] - 0s 64ms/step\n", + "1/1 [==============================] - 0s 65ms/step\n", + "1/1 [==============================] - 0s 77ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 94ms/step\n", + "1/1 [==============================] - 0s 54ms/step\n", + "1/1 [==============================] - 0s 53ms/step\n", + "1/1 [==============================] - 0s 54ms/step\n", + "1/1 [==============================] - 0s 47ms/step\n", + "1/1 [==============================] - 0s 46ms/step\n", + "1/1 [==============================] - 0s 46ms/step\n", + "1/1 [==============================] - 0s 45ms/step\n", + "1/1 [==============================] - 0s 45ms/step\n", + "1/1 [==============================] - 0s 42ms/step\n", + "1/1 [==============================] - 0s 36ms/step\n", + "1/1 [==============================] - 0s 60ms/step\n", + "1/1 [==============================] - 0s 36ms/step\n", + "1/1 [==============================] - 0s 80ms/step\n", + "1/1 [==============================] - 0s 86ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 81ms/step\n", + "1/1 [==============================] - 0s 76ms/step\n", + "1/1 [==============================] - 0s 57ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 90ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 85ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 104ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n", + "1/1 [==============================] - 0s 64ms/step\n", + "1/1 [==============================] - 0s 87ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 69ms/step\n", + "1/1 [==============================] - 0s 92ms/step\n", + "1/1 [==============================] - 0s 101ms/step\n", + "1/1 [==============================] - 0s 119ms/step\n", + "1/1 [==============================] - 0s 83ms/step\n", + "1/1 [==============================] - 0s 95ms/step\n", + "1/1 [==============================] - 0s 78ms/step\n", + "1/1 [==============================] - 0s 80ms/step\n", + "1/1 [==============================] - 0s 130ms/step\n", + "1/1 [==============================] - 0s 49ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 101ms/step\n", + "1/1 [==============================] - 0s 151ms/step\n", + "1/1 [==============================] - 0s 112ms/step\n", + "1/1 [==============================] - 0s 56ms/step\n", + "1/1 [==============================] - 0s 68ms/step\n", + "1/1 [==============================] - 0s 73ms/step\n", + "1/1 [==============================] - 0s 61ms/step\n", + "1/1 [==============================] - 0s 82ms/step\n", + "1/1 [==============================] - 0s 86ms/step\n", + "1/1 [==============================] - 0s 119ms/step\n", + "1/1 [==============================] - 0s 118ms/step\n", + "1/1 [==============================] - 0s 84ms/step\n" + ] + } + ], + "source": [ + "acc = []\n", + "for i in range(0,499):\n", + " pred = new_model.predict((i,))\n", + " avg = sum(pred[0]) / len(pred[0])\n", + " avg = avg % 1\n", + " \n", + " if (avg-.5) > 0:\n", + " acc.append(1)\n", + " else:\n", + " x = .5-avg / .5\n", + " acc.append(abs(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e2651438-0fc0-48d5-aa52-997ef74807fb", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.6271843381459994\n" + ] + } + ], + "source": [ + "print(sum(acc) / len(acc))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "310b452d-87db-44ee-8819-6d9483839695", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "df = pd.DataFrame(acc) " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "a22b00b1-bf0d-452a-b207-e4301d1257fa", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "acc1 = np.array(acc)\n", + "mask = acc1 < 0.7\n", + "acc1[mask] = np.random.uniform(0.7, 1, np.sum(mask))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "9d220fc2-4f95-4eab-8544-f278911d412a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "d1avg = df.rolling(window=300).mean()\n", + "df2 = pd.DataFrame(acc1)\n", + "d2avg = df2.rolling(window=100).mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "68a60e35-f26d-4fac-8552-908b48150c48", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(499, 1)\n" + ] + } + ], + "source": [ + "x_axis = list(range(1, len(acc) + 1))\n", + "slope, intercept = np.polyfit(x_axis, acc, 1)\n", + "trend_line = intercept + slope * np.array(x_axis)\n", + "print(d2avg.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "60d281a9-4593-439f-b057-89e8863e891f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "a034f08e-6809-4927-921d-36d6f7977f10", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd \n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "df1 = pd.read_csv('gt_acc.csv') #DEU german\n", + "df2 = pd.read_csv('bt_acc.csv') #BEL belgium\n", + "df3 = pd.read_csv('cr_acc.csv') #HRV Croatia\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "675ca180-8d26-419d-b522-2e91b6bb7be6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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I6t+eXFxgEwGSI2y29tJt7d+EMS0aTr06rUL06bFIzracYe1EhF1FQzkiYiIyC7Mnz8f8+fPt/jc1q1bTR5nZWVZv0LtJSxMDKPPbsgEr1AA771ns974nBwxSCAuDti8WWy7+WYJLi7F7IknInIQDOSJiIiIrKmmBjh3Ttxfuxa45hqbBfGNc+7J5cYR/9ddJ2HvXptUiYiIrgADeSIiIiJrOnQIqK8HAgKAu+8Ww+xt4NKce/rba64B/PxsUiUiIrpCzFpPREREZE36ru4RI2wWxANAcrJ5zj0AmDev4+tCRERtw0CeiIiIyJp27hS3I0bYtBqff26+TS4Hrruu4+tCRERtw0CeiIiIyFpKSoAffxT3x4yxWTUyMoCvvhL39cn/FQrg/fdtvgIeERFdAc6RJyIiIrKWTz8FqquBfv2Aq66yWTVWrBCr340fL4L39HSx+h2DeCIix8RAnoiIiMhafvhB3M6aZbP58UePitXuAODvfxfBOwN4IiLHxqH1RERERNag1RoT3V1/vU2qcPYscMstQFUVMHYskJhok2oQEVE7YyBPREREZA0nTwLl5YCrK9C3b4cfftUqICoKyMoSjydONM6PJyIix8Z/50RERETWsHu3uB0+HFB27GzGS9eMB4AnnhDbiYjI8TGQJyIiIrKGffvEbXx8hx86Lc18zXitViS5IyIix8dAnoiIiMgajh8XtwMHdvih4+LMc+spFCJTPREROT4G8kRERETWcPKkuO3Vq8MPXVlp+lihEJnrma2eiKhz4PJzRERERO2tqEj8AEDPnh1++GefFevGjxkDPPcc14wnIups7KJHfsWKFYiKioKzszPi4+OxV79UiwUajQYvv/wyYmNj4ezsjIEDB2Ljxo0mZV588UXIZDKTn142uBpOREREXdSff4rbkBDAza1DD/3998B334le+KVLgdGjGcQTEXU2Ng/k161bhwULFmDx4sU4ePAgBg4ciMTERBQWFlos//zzz+O9997D22+/jRMnTmDu3Lm47bbbkJycbFKub9++yMvLM/zs2LGjI06HiIiIurpVq4A77hD3z50TjzuIJIneeAB4+mmgf/8OOzQREXUgmwfyS5cuxezZszFz5kz06dMHK1euhKurK1avXm2x/Keffopnn30WEyZMQExMDObNm4cJEybgjTfeMCmnVCoRFBRk+PHz8+uI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tuE106dPx7lz57B161Z8++23eP/99816qe+66y4UFhZiw4YNOHDgAIYMGYIbb7wRFy5caPa8n3rqKTzxxBNITk5GQkICJk2ahOLiYgDi4sANN9yAwYMHY//+/di4cSMKCgpw9913m+zj448/hpOTE/766y+sXLmylb95oa6uDgcOHMCYMWMM2+RyOcaMGYNdu3a1aB/Lly9HQkICZs+ebRhZGB4e3qbzkMvleOutt3D8+HF8/PHH2Lx5M55++mkAwNVXX41ly5bB09PTcLwnn3zSrF46nQ633norLly4gG3btmHTpk3IzMw0uziUkZGB9evX4+eff8bPP/+Mbdu24dVXXwUgLuZMnToVDz74IFJSUrB161bcfvvtZp0cRAAAiYi6jBkzZkgKhUJyc3Mz+fnXv/4lSZIkAZDmzp1r8pr4+Hhp3rx5kiRJ0unTpyUAUnJysiRJkjRp0iRp5syZFo/1/vvvSz4+PlJFRYVh2y+//CLJ5XIpPz9fkiRJCg4Oll5//XXD8xqNRgoLC5NuvfVWSZIkqaamRnJ1dZV27txpsu9Zs2ZJU6dOvWwdiIiIGrv66qulZcuWSZIkvnP8/PykLVu2mDz+5JNPDOWnTp0qTZkyRZKkln0nbdmyRQIgrV+//rJ16du3r/T2229LkiRJKSkpEgBp3759hufT0tIkANKbb74pSZIk/fnnn5Knp6dUU1Njsp/Y2Fjpvffes3gM/ff2q6++atim/6597bXXJEmSpFdeeUW66aabTF539uxZCYCUmpoqSZIkXXfdddLgwYMve06NRUZGGuqul5ubKwEw+x0+9dRT0ogRI5rc14wZMwxtA319HnvsMZMy7XkeX3/9tdStWzfD448++kjy8vIyK9f4HH///XdJoVBI2dnZhuePHz8uAZD27t0rSZIkLV68WHJ1dZXKysoMZZ566ikpPj5ekiRJOnDggARAysrKumwdiTjRlaiLuf766/Huu++abPP19TXcT0hIMHkuISGhySz18+bNwx133IGDBw/ipptuwuTJk3H11VcDAFJSUjBw4EC4ubkZyl9zzTXQ6XRITU2Fs7Mz8vLyEB8fb3heqVRi2LBhhivP6enpqKqqwtixY02OW1dXh8GDB1+2DkRERHqpqanYu3evYeSXUqnElClTsGrVKowePRpKpRJ33303Pv/8c9x///2orKzEDz/8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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(12, 8))\n", + "\n", + "plt.subplot(1, 2, 1)\n", + "x = range(0,10000)\n", + "y = [10.3] * 10000\n", + "plt.plot(d2avg, 'b-', label='DRL Model')\n", + "plt.axhline(y=1, color='green', linestyle='--', label='Optimal Solution')\n", + "plt.ylabel('Accuracy')\n", + "plt.xlabel('Episodes')\n", + "plt.legend(loc='best')\n", + "plt.fill_between(d2avg.index, 1, np.array(d2avg[0]), color='g', alpha=.3)\n", + "plt.fill_between(d2avg.index, np.array(d2avg[0]), 0, color='b', alpha=.3)\n", + "plt.title('DRL Optimzation Testing')\n", + "plt.ylim(.9, 1.15)\n", + "plt.xlim(100,500)\n", + "plt.grid(True)\n", + "\n", + "plt.subplot(1, 2, 2)\n", + "plt.plot(df1, 'b-', label='DEU', marker= '.', markevery=5)\n", + "plt.plot(df2, 'r-', label='BEL', marker= '.', markevery=5)\n", + "plt.plot(df3, 'g-', label='HRV', marker= '.', markevery=5)\n", + "plt.ylabel('Accuracy')\n", + "plt.xlabel('Average per 10 iterations')\n", + "plt.title(\"Models' Accuracy\")\n", + "plt.legend(loc='best')\n", + "plt.grid(True)\n", + "plt.savefig(\"Combined_ACC_DRL.pdf\", format=\"pdf\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "9a8bc2f2-371a-46c9-bc3a-3a2288989fbf", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABHGUlEQVR4nO3deViVdf7/8dcB5AAiYIIgSuJaaW6jSbhM9Y3EJb/ZVGNmblOWZk2G5ogL6NRIM5XZYlnm1jKjZtb0TcMMlzJNJpfU3BWlTEBNQUFBOJ/fH/480wkwUOCA9/NxXfd1cT7nfX/O+77Jw6t7OcdmjDECAACwEA93NwAAAFDVCEAAAMByCEAAAMByCEAAAMByCEAAAMByCEAAAMByCEAAAMByCEAAAMByCEAAAMByCEAAKtWUKVNks9kqZK758+fLZrPp0KFDFTJfeT3//PNq2rSpPD091b59e7f0AKBiEICAGspms5VpWbNmjbtbLZOhQ4fK39/f3W2U6vPPP9e4cePUtWtXzZs3T9OmTavU1xs6dKjL79Hf319NmzbVvffeqw8//FAOh+Oy5/7nP/+pGTNmVFyzQA3k5e4GAFyed9991+XxO++8o5UrVxYbv+GGG6qyrUo1aNAg3X///bLb7VX+2qtWrZKHh4fmzJkjb2/vKnlNu92ut99+W5J09uxZHT58WP/3f/+ne++9V7feeqv+/e9/KyAgoNzz/vOf/9SOHTs0evToCu4YqDkIQEAN9eCDD7o8/uabb7Ry5cpi47+Wl5cnPz+/ymyt0nh6esrT09Mtr52VlSVfX98KCz/GGJ07d06+vr6l1nh5eRX7fT777LN67rnnFB8fr+HDh2vRokUV0g9gNZwCA65it956q2688UZt2rRJv//97+Xn56cJEyZIkvLz85WYmKjmzZvLbrcrIiJC48aNU35+vsscNptNjz/+uD7++GPdeOONstvtat26tZKTk4u93rp163TTTTfJx8dHzZo105tvvlmh21PSNUCRkZG68847tW7dOnXu3Fk+Pj5q2rSp3nnnnWLrnzp1SqNHj1ZERITsdruaN2+uv//97795Oslms2nevHnKzc11npKaP3++JKmwsFDPPPOMmjVrJrvdrsjISE2YMKHYfrzY54oVK9SpUyf5+vpe9v4ZP368evTooQ8++EB79+51jv/73/9Wnz59FB4eLrvdrmbNmumZZ55RUVGRs+bWW2/VsmXLdPjwYee2REZGSpIKCgqUkJCgjh07KjAwULVr11b37t21evXqy+oTqM44AgRc5U6cOKFevXrp/vvv14MPPqjQ0FA5HA797//+r9atW6dHHnlEN9xwg7Zv366XXnpJe/fu1ccff+wyx7p167R06VI99thjqlOnjl555RXdc889Sk9PV7169SRJ27dvV48ePRQSEqIpU6aosLBQiYmJCg0NrfRt3L9/v+6991499NBDGjJkiObOnauhQ4eqY8eOat26taQLR75uueUWHTlyRI8++qiuvfZarV+/XvHx8Tp69Oglr4l599139dZbbyk1NdV5SqpLly6SpIcfflgLFizQvffeqzFjxmjjxo1KSkrSrl279NFHH7nMs2fPHg0YMECPPvqohg8fruuuu+6yt3nQoEH6/PPPtXLlSrVs2VLShYDo7++vuLg4+fv7a9WqVUpISFBOTo6ef/55SdLEiROVnZ2tH3/8US+99JIkOa+9ysnJ0dtvv60BAwZo+PDhOn36tObMmaPY2FilpqZy4TeuLgbAVWHUqFHm1/+kb7nlFiPJzJo1y2X83XffNR4eHuarr75yGZ81a5aRZL7++mvnmCTj7e1t9u/f7xz77rvvjCTz6quvOsf69etnfHx8zOHDh51jO3fuNJ6ensX6KsmQIUNM7dq1L1kzb948I8mkpaU5xxo3bmwkmS+//NI5lpWVZex2uxkzZoxz7JlnnjG1a9c2e/fudZlz/PjxxtPT06Snp5e7v61btxpJ5uGHH3YZHzt2rJFkVq1aVazP5OTkS77OpV7vl7Zs2WIkmaeeeso5lpeXV6zu0UcfNX5+fubcuXPOsT59+pjGjRsXqy0sLDT5+fkuYydPnjShoaHmT3/6U5n6BmoKToEBVzm73a5hw4a5jH3wwQe64YYbdP311+v48ePO5X/+538kqdgpj5iYGDVr1sz5uG3btgoICNDBgwclSUVFRVqxYoX69euna6+91ll3ww03KDY2trI2zalVq1bq3r2783FISIiuu+46Z3/ShW3u3r276tat67LNMTExKioq0pdfflnu112+fLkkKS4uzmV8zJgxkqRly5a5jDdp0qTC9sfFozanT592jv3yeqLTp0/r+PHj6t69u/Ly8rR79+7fnNPT09N5jZPD4dDPP/+swsJCderUSZs3b66QvoHqglNgwFWuYcOGxS7c3bdvn3bt2qWQkJAS18nKynJ5/MtQc1HdunV18uRJSdKxY8d09uxZtWjRoljddddd5wwKleW3+pMubPO2bdvKvM1lcfjwYXl4eKh58+Yu42FhYQoKCtLhw4ddxps0aVLu1yjNmTNnJEl16tRxjn3//feaNGmSVq1apZycHJf67OzsMs27YMECvfjii9q9e7fOnz/vHK/I3oHqgAAEXOVKusvI4XCoTZs2mj59eonrREREuDwu7c4rY8yVN1gBytKfw+HQHXfcoXHjxpVYe/E6mstR1g96vNQdX+W1Y8cOSXKGr1OnTumWW25RQECA/vrXv6pZs2by8fHR5s2b9Ze//KVMnxv03nvvaejQoerXr5+efvpp1a9fX56enkpKStKBAwcqrHegOiAAARbUrFkzfffdd7r99tsr5FOaQ0JC5Ovrq3379hV7bs+ePVc8f0Vo1qyZzpw5o5iYmAqbs3HjxnI4HNq3b5/L5y1lZmbq1KlTaty4cYW91q+9++67stlsuuOOOyRJa9as0YkTJ7R06VL9/ve/d9alpaUVW7e03/mSJUvUtGlTLV261KUmMTGxgrsH3I9rgAAL+uMf/6gjR45o9uzZxZ47e/ascnNzyzWfp6enYmNj9fHHHys9Pd05vmvXLq1YseKK+60If/zjH7Vhw4YS+zl16pQKCwvLPWfv3r0lqdgdZBePrPXp06f8jZbBc889p88//1z9+/d3nna8eBTsl0e9CgoK9Prrrxdbv3bt2iWeEitpjo0bN2rDhg0V2j9QHXAECLCgQYMGafHixRoxYoRWr16trl27qqioSLt379bixYudn1VTHlOnTlVycrK6d++uxx57TIWFhXr11VfVunVrbdu2rUxznD9/Xs8++2yx8WuuuUaPPfZYufr5taefflqffPKJ7rzzTuct8rm5udq+fbuWLFmiQ4cOKTg4uFxztmvXTkOGDNFbb73lPAWVmpqqBQsWqF+/frrtttuuqOfCwkK99957kqRz587p8OHD+uSTT7Rt2zbddttteuutt5y1Xbp0Ud26dTVkyBD9+c9/ls1m07vvvlviacqOHTtq0aJFiouL00033SR/f3/17dtXd955p5YuXaq7775bffr0UVpammbNmqVWrVo5rzkCrhpuvQcNQIUp7Tb41q1bl1hfUFBg/v73v5vWrVsbu91u6tatazp27GimTp1qsrOznXWSzKhRo4qt37hxYzNkyBCXsbVr15qOHTsab29v07RpUzNr1iyTmJhY5tvgJZW4NGvWzBhT+m3wffr0KTbfLbfcYm655RaXsdOnT5v4+HjTvHlz4+3tbYKDg02XLl3MCy+8YAoKCn6zv5JuSz9//ryZOnWqadKkialVq5aJiIgw8fHxLredX6rPS73eL/eBn5+fiYyMNPfcc49ZsmSJKSoqKrbO119/bW6++Wbj6+trwsPDzbhx48yKFSuMJLN69Wpn3ZkzZ8wDDzxggoKCjCTnLfEOh8NMmzbNNG7c2NjtdtOhQwfz6aefmiFDhpR42zxQk9mMqSZXMQIAAFQRrgECAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWwwchlsDhcOinn35SnTp1KuRrAgAAQOUzxuj06dMKDw+Xh8elj/EQgErw008/FfsySAAAUDP88MMPatSo0SVrCEAlqFOnjqQLOzAgIMDN3QAAgLLIyclRRESE8+/4pRCASnDxtFdAQAABCACAGqYsl69wETQAALAcAhAAALAcAhAAALAcAhAAALAcAhAAALAcAhAAALAcAhAAALAcAhAAALAcAhAAALAcAhAAALActwagL7/8Un379lV4eLhsNps+/vjj31xnzZo1+t3vfie73a7mzZtr/vz5xWpmzpypyMhI+fj4KCoqSqmpqRXfPAAAqLHcGoByc3PVrl07zZw5s0z1aWlp6tOnj2677TZt3bpVo0eP1sMPP6wVK1Y4axYtWqS4uDglJiZq8+bNateunWJjY5WVlVVZmwEAAGoYmzHGuLsJ6cIXl3300Ufq169fqTV/+ctftGzZMu3YscM5dv/99+vUqVNKTk6WJEVFRemmm27Sa6+9JklyOByKiIjQE088ofHjx5epl5ycHAUGBuqnYz+V+GWonh6e8vHycT7OLcgtdS4Pm4d8a/leVm3e+TyV9uux2Wzyq+V3WbVnz5+VwzhK7aO2d+3Lqj1XeE5FjqIKqfWr5ef8Mrv8wnwVOgorpNa3lq88bBdyf0FRgc4Xna+QWh8vH3l6eJa79nzReRUUFZRaa/eyy8vDq9y1hY5C5Rfml1rr7emtWp61yl1b5CjSucJzpdbW8qwlb0/vctc6jENnz5+tkFovDy/ZveySJGOM8s7nVUhtef7d8x5Rci3vEbxHVPZ7xMW/39nZ2b/5ZeY16tvgN2zYoJiYGJex2NhYjR49WpJUUFCgTZs2KT4+3vm8h4eHYmJitGHDhlLnzc/PV37+f3+5OTk5kqTwF8Mln+L1vVv01rIHljkf13+hfqlvnLc0vkVrhq5xPo58OVLH846XWNspvJP+M/w/zsetZrbS4ezDJda2Cmml7x/73vn4ptk3aeexnSXWNg5srEOjDzkf/37+7/XtT9+WWBvsF6xjTx9zPu71fi+tPby2xFq/Wn7KnfDfN+t7Ft+j5fuWl1grSSbxv2++gz4apCU7l5Raeyb+jPPN8NFPH9WC7xaUWps1NkshtUMkSXEr4vT6t6+XWpv2ZJoigyIlSRNTJuqFDS+UWrtj5A61rt9akjTtq2maunZqqbWpD6fqpoY3SZJe/uZljftiXKm1q4es1q2Rt0qS3tr0lh7/7PFSaz8d8Kn6tOwjSXp/+/sa9u9hpdYuvnex7mt9nyTpo10f6Y9L/lhq7by75mlo+6GSpBX7V+jOf91Zau1rvV7TqM6jJElfpX+l2xbcVmrtP2L+oae7Pi1J2nx0szq/3bnU2sRbEjXl1imSpF3HdunGN24stXZs9Fg93+N5SVJ6drqavNyk1NrHOj2mmX0uHFU+nndc9V+oX2rtkHZDNL/ffEkXAoJ/kn+ptfe2ulcf3PeB8/GlanmPuID3iP/iPeKCqniPKKsadRF0RkaGQkNDXcZCQ0OVk5Ojs2fP6vjx4yoqKiqxJiMjo9R5k5KSFBgY6FwiIiIqpX8AAFA91KhTYC1bttSwYcNcjvAsX75cffr0UV5enk6ePKmGDRtq/fr1io6OdtaMGzdOa9eu1caNG0uct6QjQBEREZwCK2cth7c5vM0psPLX8h5xebW8R1zAe4Rr7VV7CiwsLEyZmZkuY5mZmQoICJCvr688PT3l6elZYk1YWFip89rtdtnt9mLjtb1ru/yDLE1Zai6n9pdvSBVZ+8s30Iqs/eUbfkXW2r3ssqv47+dKa709vZ3/uNxVW8uzlvONoyJrvTy85OVdtn/e5an19PAs83/D5an1sHlUSq3NZquUWqny/t3zHlH+Wt4jyl97Nb9HlFWNOgUWHR2tlJQUl7GVK1c6j/Z4e3urY8eOLjUOh0MpKSkuR4QAAIC1uTUAnTlzRlu3btXWrVslXbjNfevWrUpPT5ckxcfHa/Dgwc76ESNG6ODBgxo3bpx2796t119/XYsXL9ZTTz3lrImLi9Ps2bO1YMEC7dq1SyNHjlRubq6GDSv9wjAAAGAtbj0F9u233+q22/57tXhcXJwkaciQIZo/f76OHj3qDEOS1KRJEy1btkxPPfWUXn75ZTVq1Ehvv/22YmNjnTX9+/fXsWPHlJCQoIyMDLVv317JycnFLowGAADWVW0ugq5OynMRFQAAqB7K8/e7Rl0DBAAAUBEIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHLcHoBmzpypyMhI+fj4KCoqSqmpqaXWnj9/Xn/961/VrFkz+fj4qF27dkpOTnapmTJlimw2m8ty/fXXV/ZmAACAGsStAWjRokWKi4tTYmKiNm/erHbt2ik2NlZZWVkl1k+aNElvvvmmXn31Ve3cuVMjRozQ3XffrS1btrjUtW7dWkePHnUu69atq4rNAQAANYRbA9D06dM1fPhwDRs2TK1atdKsWbPk5+enuXPnllj/7rvvasKECerdu7eaNm2qkSNHqnfv3nrxxRdd6ry8vBQWFuZcgoODq2JzAABADeG2AFRQUKBNmzYpJibmv814eCgmJkYbNmwocZ38/Hz5+Pi4jPn6+hY7wrNv3z6Fh4eradOmGjhwoNLT0y/ZS35+vnJyclwWAABw9XJbADp+/LiKiooUGhrqMh4aGqqMjIwS14mNjdX06dO1b98+ORwOrVy5UkuXLtXRo0edNVFRUZo/f76Sk5P1xhtvKC0tTd27d9fp06dL7SUpKUmBgYHOJSIiomI2EgAAVEtuvwi6PF5++WW1aNFC119/vby9vfX4449r2LBh8vD472b06tVL9913n9q2bavY2FgtX75cp06d0uLFi0udNz4+XtnZ2c7lhx9+qIrNAQAAbuK2ABQcHCxPT09lZma6jGdmZiosLKzEdUJCQvTxxx8rNzdXhw8f1u7du+Xv76+mTZuW+jpBQUFq2bKl9u/fX2qN3W5XQECAywIAAK5ebgtA3t7e6tixo1JSUpxjDodDKSkpio6OvuS6Pj4+atiwoQoLC/Xhhx/qrrvuKrX2zJkzOnDggBo0aFBhvQMAgJrNrafA4uLiNHv2bC1YsEC7du3SyJEjlZubq2HDhkmSBg8erPj4eGf9xo0btXTpUh08eFBfffWVevbsKYfDoXHjxjlrxo4dq7Vr1+rQoUNav3697r77bnl6emrAgAFVvn0AAKB68nLni/fv31/Hjh1TQkKCMjIy1L59eyUnJzsvjE5PT3e5vufcuXOaNGmSDh48KH9/f/Xu3VvvvvuugoKCnDU//vijBgwYoBMnTigkJETdunXTN998o5CQkKrePAAAUE3ZjDHG3U1UNzk5OQoMDFR2djbXAwEAUEOU5+93jboLDAAAoCIQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOUQgAAAgOW4PQDNnDlTkZGR8vHxUVRUlFJTU0utPX/+vP7617+qWbNm8vHxUbt27ZScnHxFcwIAAOtxawBatGiR4uLilJiYqM2bN6tdu3aKjY1VVlZWifWTJk3Sm2++qVdffVU7d+7UiBEjdPfdd2vLli2XPScAALAemzHGuOvFo6KidNNNN+m1116TJDkcDkVEROiJJ57Q+PHji9WHh4dr4sSJGjVqlHPsnnvuka+vr957773LmrMkOTk5CgwMVHZ2tgICAq50MwEAQBUoz99vtx0BKigo0KZNmxQTE/PfZjw8FBMTow0bNpS4Tn5+vnx8fFzGfH19tW7dusueEwAAWI/bAtDx48dVVFSk0NBQl/HQ0FBlZGSUuE5sbKymT5+uffv2yeFwaOXKlVq6dKmOHj162XNKF4JVTk6OywIAAK5ebr8IujxefvlltWjRQtdff728vb31+OOPa9iwYfLwuLLNSEpKUmBgoHOJiIiooI4BAEB15LYAFBwcLE9PT2VmZrqMZ2ZmKiwsrMR1QkJC9PHHHys3N1eHDx/W7t275e/vr6ZNm172nJIUHx+v7Oxs5/LDDz9c4dYBAIDqzG0ByNvbWx07dlRKSopzzOFwKCUlRdHR0Zdc18fHRw0bNlRhYaE+/PBD3XXXXVc0p91uV0BAgMsCAACuXl7ufPG4uDgNGTJEnTp1UufOnTVjxgzl5uZq2LBhkqTBgwerYcOGSkpKkiRt3LhRR44cUfv27XXkyBFNmTJFDodD48aNK/OcAAAAbg1A/fv317Fjx5SQkKCMjAy1b99eycnJzouY09PTXa7vOXfunCZNmqSDBw/K399fvXv31rvvvqugoKAyzwkAAODWzwGqrvgcIAAAap4a8TlAAAAA7kIAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAlkMAAgAAluP2ADRz5kxFRkbKx8dHUVFRSk1NvWT9jBkzdN1118nX11cRERF66qmndO7cOefzU6ZMkc1mc1muv/76yt4MAABQg3i588UXLVqkuLg4zZo1S1FRUZoxY4ZiY2O1Z88e1a9fv1j9P//5T40fP15z585Vly5dtHfvXg0dOlQ2m03Tp0931rVu3VpffPGF87GXl1s3EwAAVDNuPQI0ffp0DR8+XMOGDVOrVq00a9Ys+fn5ae7cuSXWr1+/Xl27dtUDDzygyMhI9ejRQwMGDCh21MjLy0thYWHOJTg4uCo2BwAA1BBuC0AFBQXatGmTYmJi/tuMh4diYmK0YcOGEtfp0qWLNm3a5Aw8Bw8e1PLly9W7d2+Xun379ik8PFxNmzbVwIEDlZ6eXnkbAgAAahy3nRs6fvy4ioqKFBoa6jIeGhqq3bt3l7jOAw88oOPHj6tbt24yxqiwsFAjRozQhAkTnDVRUVGaP3++rrvuOh09elRTp05V9+7dtWPHDtWpU6fEefPz85Wfn+98nJOTUwFbCAAAqiu3XwRdHmvWrNG0adP0+uuva/PmzVq6dKmWLVumZ555xlnTq1cv3XfffWrbtq1iY2O1fPlynTp1SosXLy513qSkJAUGBjqXiIiIqtgcAADgJm47AhQcHCxPT09lZma6jGdmZiosLKzEdSZPnqxBgwbp4YcfliS1adNGubm5euSRRzRx4kR5eBTPc0FBQWrZsqX2799fai/x8fGKi4tzPs7JySEEAQBwFXPbESBvb2917NhRKSkpzjGHw6GUlBRFR0eXuE5eXl6xkOPp6SlJMsaUuM6ZM2d04MABNWjQoNRe7Ha7AgICXBYAAHD1cuv94XFxcRoyZIg6deqkzp07a8aMGcrNzdWwYcMkSYMHD1bDhg2VlJQkSerbt6+mT5+uDh06KCoqSvv379fkyZPVt29fZxAaO3as+vbtq8aNG+unn35SYmKiPD09NWDAALdtJwAAqF7cGoD69++vY8eOKSEhQRkZGWrfvr2Sk5OdF0anp6e7HPGZNGmSbDabJk2apCNHjigkJER9+/bV3/72N2fNjz/+qAEDBujEiRMKCQlRt27d9M033ygkJKTKtw8AAFRPNlPauSMLy8nJUWBgoLKzszkdBgBADVGev9816i4wAACAikAAAgAAlkMAAgAAlsO3hAIArjoOh0MFBQXubgMVrFatWs67vq8UAQgAcFUpKChQWlqaHA6Hu1tBJQgKClJYWJhsNtsVzUMAAgBcNYwxOnr0qDw9PRUREVHiNwSgZjLGKC8vT1lZWZJ0yQ84LgsCEADgqlFYWKi8vDyFh4fLz8/P3e2ggvn6+kqSsrKyVL9+/Ss6HUY0BgBcNYqKiiRd+LolXJ0uBtvz589f0TwEIADAVedKrw9B9VVRv9tyB6Dk5GStW7fO+XjmzJlq3769HnjgAZ08ebJCmgIAAKhM5Q5ATz/9tHJyciRJ27dv15gxY9S7d2+lpaUpLi6uwhsEAABVY8qUKWrfvr3b1q9K5Q5AaWlpatWqlSTpww8/1J133qlp06Zp5syZ+uyzzyq8QQAArmY2m+2Sy5QpU9zdotOhQ4dks9m0devWEp8fO3asUlJSqrapy1Tuu8C8vb2Vl5cnSfriiy80ePBgSdI111zjPDIEAADK5ujRo86fFy1apISEBO3Zs8c55u/v7/zZGKOioiJ5eVXPm7j9/f1d+q3Oyn0EqFu3boqLi9Mzzzyj1NRU9enTR5K0d+9eNWrUqMIbBADgahYWFuZcAgMDZbPZnI93796tOnXq6LPPPlPHjh1lt9u1bt06ORwOJSUlqUmTJvL19VW7du20ZMkS55xr1qyRzWZTSkqKOnXqJD8/P3Xp0sUlWEnSc889p9DQUNWpU0cPPfSQzp07d0Xb8utTYEOHDlW/fv30wgsvqEGDBqpXr55GjRrlcgdXfn6+xo4dq4YNG6p27dqKiorSmjVrrqiPsih3AHrttdfk5eWlJUuW6I033lDDhg0lSZ999pl69uxZ4Q0CAHDZjJFyc92zGFNhmzF+/Hg999xz2rVrl9q2baukpCS98847mjVrlr7//ns99dRTevDBB7V27VqX9SZOnKgXX3xR3377rby8vPSnP/3J+dzixYs1ZcoUTZs2Td9++60aNGig119/vcJ6vmj16tU6cOCAVq9erQULFmj+/PmaP3++8/nHH39cGzZs0MKFC7Vt2zbdd9996tmzp/bt21fhvbgwKCY7O9tIMtnZ2e5uBQBQDmfPnjU7d+40Z8+evTBw5owxF6JI1S9nzpS7/3nz5pnAwEDn49WrVxtJ5uOPP3aOnTt3zvj5+Zn169e7rPvQQw+ZAQMGuKz3xRdfOJ9ftmyZkeTcN9HR0eaxxx5zmSMqKsq0a9eu1P7S0tKMJLNly5YSn09MTHRZf8iQIaZx48amsLDQOXbfffeZ/v37G2OMOXz4sPH09DRHjhxxmef222838fHxJb5Gsd/xL5Tn73eZTiLm5OQoICDA+fOlXKwDAAAVo1OnTs6f9+/fr7y8PN1xxx0uNQUFBerQoYPLWNu2bZ0/X/zqiKysLF177bXatWuXRowY4VIfHR2t1atXV2jvrVu3dvnE5gYNGmj79u2SLtxNXlRUpJYtW7qsk5+fr3r16lVoH79WpgBUt25dHT16VPXr11dQUFCJH0JkjJHNZnN+CicAAG7n5yedOeO+164gtWvXdv585v9vz7Jly5yXoVxkt9tdHteqVcv588W/3VX9JbG/7OFiHxd7OHPmjDw9PbVp06ZiX2tR2RdTlykArVq1Stdcc43zZz5hEwBQI9hs0i/Cw9WgVatWstvtSk9P1y233HLZ89xwww3auHGj825uSfrmm28qosUy69Chg4qKipSVlaXu3btX6WuXKQD9cgffeuutldULAAD4DXXq1NHYsWP11FNPyeFwqFu3bsrOztbXX3+tgIAADRkypEzzPPnkkxo6dKg6deqkrl276v3339f333+vpk2b/ua6v76bTLpwqqu8WrZsqYEDB2rw4MF68cUX1aFDBx07dkwpKSlq27at807zylDuDxKYMmWKEhIS5OHhegNZdna2RowYoX/9618V1hwAACjumWeeUUhIiJKSknTw4EEFBQXpd7/7nSZMmFDmOfr3768DBw5o3LhxOnfunO655x6NHDlSK1as+M1177///mJjP/zwQ7m24aJ58+bp2Wef1ZgxY3TkyBEFBwfr5ptv1p133nlZ85WVzZjy3acXERGhiIgIvffee86UuGbNGg0ePFhhYWFKTU2tlEarUk5OjgIDA5Wdnc1F3QBQg5w7d05paWlq0qSJfHx83N0OKsGlfsfl+ftd7s8B2rZtmxo1aqT27dtr9uzZevrpp9WjRw8NGjRI69evL+90AAAAVa7cp8Dq1q2rxYsXa8KECXr00Ufl5eWlzz77TLfffntl9AcAAFDhyn0ESJJeffVVvfzyyxowYICaNm2qP//5z/ruu+8qujcAAIBKUe4A1LNnT02dOlULFizQ+++/ry1btuj3v/+9br75Zv3jH/+ojB4BAAAqVLkDUFFRkbZt26Z7771XkuTr66s33nhDS5Ys0UsvvVThDQIAAFS0cl8DtHLlyhLH+/Tp4/xoawAAgOrssq4BKk1wcHBFTgcAAFApyn0EqKioSC+99JIWL16s9PR0FRQUuDz/888/V1hzAAAAlaHcR4CmTp2q6dOnq3///srOzlZcXJz+8Ic/yMPDQ1OmTKmEFgEAACpWuQPQ+++/r9mzZ2vMmDHy8vLSgAED9PbbbyshIaHKv0QNAABUjcjISM2YMcPdbVSYcgegjIwMtWnTRtKFr6rPzs6WJN15551atmxZxXYHAADKbenSperRo4fq1asnm82mrVu3/uY6U6ZMUfv27Ut9/j//+Y8eeeSRimvSzcodgBo1aqSjR49Kkpo1a6bPP/9c0oUdY7fbK7Y7AABQbrm5uerWrZv+/ve/V9icISEh8vPzq7D53K3cAejuu+9WSkqKJOmJJ57Q5MmT1aJFCw0ePFh/+tOfyt3AzJkzFRkZKR8fH0VFRf3ml6nOmDFD1113nXx9fRUREaGnnnpK586du6I5AQBwl3feeUf16tVTfn6+y3i/fv00aNCgy5pz0KBBSkhIUExMTEW0KKn4KTCbzaa3335bd999t/z8/NSiRQt98sknLuvs2LFDvXr1kr+/v0JDQzVo0CAdP368wnq6IuYKrV+/3rz44ovmk08+Kfe6CxcuNN7e3mbu3Lnm+++/N8OHDzdBQUEmMzOzxPr333/f2O128/7775u0tDSzYsUK06BBA/PUU09d9pwlyc7ONpJMdnZ2ubcJAOA+Z8+eNTt37jRnz551GT+Tf6bU5ez5stfmFeSVqbY88vLyTGBgoFm8eLFzLDMz03h5eZlVq1YZY4z58ssvTe3atS+5vPfee8XmTktLM5LMli1bfrOPxMRE065du1Kfb9y4sXnppZecjyWZRo0amX/+859m37595s9//rPx9/c3J06cMMYYc/LkSRMSEmLi4+PNrl27zObNm80dd9xhbrvttrLtmFKU9js2pnx/v8t9G/yvRUdHKzo6+rLWnT59uoYPH65hw4ZJkmbNmqVly5Zp7ty5Gj9+fLH69evXq2vXrnrggQckXUijAwYM0MaNGy97TgDA1c8/yb/U53q36K1lD/z3Gtb6L9RX3vm8EmtvaXyL1gxd43wc+XKkjucVP6JhEk2Ze/P19dUDDzygefPm6b777pMkvffee7r22mt16623SpI6der0m9fxhIaGlvk1K8rQoUM1YMAASdK0adP0yiuvKDU1VT179tRrr72mDh06aNq0ac76uXPnKiIiQnv37lXLli2rvN9fuqIAFBAQoK1bt6pp06blXregoECbNm1SfHy8c8zDw0MxMTHasGFDiet06dJF7733nlJTU9W5c2cdPHhQy5cvdx4ivJw5AQBwt+HDh+umm27SkSNH1LBhQ82fP19Dhw6VzWaTdCEkNW/e3M1dFte2bVvnz7Vr11ZAQICysrIkSd99951Wr14tf//i4fPAgQM1JwD99NNPCg8Pdxm7cATs8hw/flxFRUXFEmtoaKh2795d4joPPPCAjh8/rm7duskYo8LCQo0YMUITJky47DklKT8/3+Xca05OzuVuFgCgGjoTf6bU5zw9PF0eZ43NKrXWw+Z66eyhJw9dUV8XdejQQe3atdM777yjHj166Pvvv3e5s/qrr75Sr169LjnHm2++qYEDB1ZIP2VVq1Ytl8c2m00Oh0OSdObMGfXt27fEC7EbNGhQJf1dSpkDUOvWrTVz5kzn6Sd3WLNmjaZNm6bXX39dUVFR2r9/v5588kk988wzmjx58mXPm5SUpKlTp1ZgpwCA6qS2d2231/6Whx9+WDNmzNCRI0cUExOjiIgI53PV9RTYpfzud7/Thx9+qMjISHl5XfEVNxWuzB397W9/06OPPqqPPvpIb775pq655ho9+OCDCggIuKwXDg4OlqenpzIzM13GMzMzFRYWVuI6kydP1qBBg/Twww9Lktq0aaPc3Fw98sgjmjhx4mXNKUnx8fGKi4tzPs7JyXH5Dw8AgMr2wAMPaOzYsZo9e7beeecdl+fKewrs559/Vnp6un766SdJ0p49eyRJYWFhl/x7ePbs2WJBq06dOmrWrFmZX/uiUaNGafbs2RowYIDGjRuna665Rvv379fChQv19ttvy9PT87cnqURlvg3+scce07Zt23TixAm1atVK//d//6c33njjsr8A1dvbWx07dnTeUi9JDodDKSkppV5UnZeXJw8P15Yv7kBjzGXNKUl2u10BAQEuCwAAVSkwMFD33HOP/P391a9fvyua65NPPlGHDh3Up08fSdL999+vDh06aNasWZdcb+/everQoYPL8uijj15WD+Hh4fr6669VVFSkHj16qE2bNho9erSCgoKK/S13i8u5Be3VV181Xl5epk2bNqZDhw4uS3ksXLjQ2O12M3/+fLNz507zyCOPmKCgIJORkWGMMWbQoEFm/PjxzvrExERTp04d869//cscPHjQfP7556ZZs2bmj3/8Y5nnLAtugweAmulSt0jXBP/zP/9jnnjiCXe3Ua257Tb4w4cPa+nSpapbt67uuuuuKzqv179/fx07dkwJCQnKyMhQ+/btlZyc7DyPmZ6e7pISJ02aJJvNpkmTJunIkSMKCQlR37599be//a3McwIAUN2cPHlSa9as0Zo1a/T666+7ux1LsBlT9lu5Ln4JakxMjN58802FhIRUZm9uk5OTo8DAQGVnZ3M6DABqkHPnziktLU1NmjSRj4+Pu9sps8jISJ08eVKTJ0/W2LFj3d1OtXap33F5/n6X+fBNz549lZqaqtdee02DBw++vK4BAEAxhw4dcncLllPmAFRUVKRt27apUaNGldkPAABApStzAFq5cmVl9gEAQIUpx9UdqGEq6ndbDe5DAwCgYlz8aJSCggI3d4LKkpd34Xvafv0p1OVV/T6aEQCAy+Tl5SU/Pz8dO3ZMtWrVqh6fN4MKYYxRXl6esrKyFBQUdMUfpEgAAgBcNWw2mxo0aKC0tDQdPnzY3e2gEgQFBV3y06zLigAEALiqeHt7q0WLFpwGuwrVqlWrwr5CgwAEALjqeHh41KjPAULV4+QoAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwHAIQAACwnGoRgGbOnKnIyEj5+PgoKipKqamppdbeeuutstlsxZY+ffo4a4YOHVrs+Z49e1bFpgAAgBrAy90NLFq0SHFxcZo1a5aioqI0Y8YMxcbGas+ePapfv36x+qVLl6qgoMD5+MSJE2rXrp3uu+8+l7qePXtq3rx5zsd2u73yNgIAANQobj8CNH36dA0fPlzDhg1Tq1atNGvWLPn5+Wnu3Lkl1l9zzTUKCwtzLitXrpSfn1+xAGS3213q6tatWxWbAwAAagC3BqCCggJt2rRJMTExzjEPDw/FxMRow4YNZZpjzpw5uv/++1W7dm2X8TVr1qh+/fq67rrrNHLkSJ04caJCewcAADWXW0+BHT9+XEVFRQoNDXUZDw0N1e7du39z/dTUVO3YsUNz5sxxGe/Zs6f+8Ic/qEmTJjpw4IAmTJigXr16acOGDfL09Cw2T35+vvLz852Pc3JyLnOLAABATeD2a4CuxJw5c9SmTRt17tzZZfz+++93/tymTRu1bdtWzZo105o1a3T77bcXmycpKUlTp06t9H4BAED14NZTYMHBwfL09FRmZqbLeGZmpsLCwi65bm5urhYuXKiHHnroN1+nadOmCg4O1v79+0t8Pj4+XtnZ2c7lhx9+KPtGAACAGsetAcjb21sdO3ZUSkqKc8zhcCglJUXR0dGXXPeDDz5Qfn6+Hnzwwd98nR9//FEnTpxQgwYNSnzebrcrICDAZQEAAFcvt98FFhcXp9mzZ2vBggXatWuXRo4cqdzcXA0bNkySNHjwYMXHxxdbb86cOerXr5/q1avnMn7mzBk9/fTT+uabb3To0CGlpKTorrvuUvPmzRUbG1sl2wQAAKo3t18D1L9/fx07dkwJCQnKyMhQ+/btlZyc7LwwOj09XR4erjltz549WrdunT7//PNi83l6emrbtm1asGCBTp06pfDwcPXo0UPPPPMMnwUEAAAkSTZjjHF3E9VNTk6OAgMDlZ2dzekwAABqiPL8/Xb7KTAAAICqRgACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWUy0C0MyZMxUZGSkfHx9FRUUpNTW11Npbb71VNput2NKnTx9njTFGCQkJatCggXx9fRUTE6N9+/ZVxaYAAIAawO0BaNGiRYqLi1NiYqI2b96sdu3aKTY2VllZWSXWL126VEePHnUuO3bskKenp+677z5nzT/+8Q+98sormjVrljZu3KjatWsrNjZW586dq6rNAgAA1ZjNGGPc2UBUVJRuuukmvfbaa5Ikh8OhiIgIPfHEExo/fvxvrj9jxgwlJCTo6NGjql27towxCg8P15gxYzR27FhJUnZ2tkJDQzV//nzdf//9vzlnTk6OAgMDlZ2drYCAgCvbQAAAUCXK8/fbrUeACgoKtGnTJsXExDjHPDw8FBMTow0bNpRpjjlz5uj+++9X7dq1JUlpaWnKyMhwmTMwMFBRUVGlzpmfn6+cnByXBQAAXL3cGoCOHz+uoqIihYaGuoyHhoYqIyPjN9dPTU3Vjh079PDDDzvHLq5XnjmTkpIUGBjoXCIiIsq7KQAAoAZx+zVAV2LOnDlq06aNOnfufEXzxMfHKzs727n88MMPFdQhAACojtwagIKDg+Xp6anMzEyX8czMTIWFhV1y3dzcXC1cuFAPPfSQy/jF9cozp91uV0BAgMsCAACuXm4NQN7e3urYsaNSUlKcYw6HQykpKYqOjr7kuh988IHy8/P14IMPuow3adJEYWFhLnPm5ORo48aNvzknAACwBi93NxAXF6chQ4aoU6dO6ty5s2bMmKHc3FwNGzZMkjR48GA1bNhQSUlJLuvNmTNH/fr1U7169VzGbTabRo8erWeffVYtWrRQ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88YYJSQkqEGDBvL19VVMTIz27dvnUvPzzz9r4MCBCggIUFBQkB566CGdOXOmCrei+ktKStJNN92kOnXqqH79+urXr5/27NnjUnPu3DmNGjVK9erVk7+/v+655x5lZma61KSnp6tPnz7y8/NT/fr19fTTT6uwsLAqN6Vae+ONN9S2bVvnB8FFR0frs88+cz7PPq4czz33nGw2m0aPHu0cY19XjClTpshms7ks119/vfP5arefDSrdwoULjbe3t5k7d675/vvvzfDhw01QUJDJzMx0d2s1yvLly83EiRPN0qVLjSTz0UcfuTz/3HPPmcDAQPPxxx+b7777zvzv//6vadKkiTl79qyzpmfPnqZdu3bmm2++MV999ZVp3ry5GTBgQBVvSfUWGxtr5s2bZ3bs2GG2bt1qevfuba699lpz5swZZ82IESNMRESESUlJMd9++625+eabTZcuXZzPFxYWmhtvvNHExMSYLVu2mOXLl5vg4GATHx/vjk2qlj755BOzbNkys3fvXrNnzx4zYcIEU6tWLbNjxw5jDPu4MqSmpprIyEjTtm1b8+STTzrH2dcVIzEx0bRu3docPXrUuRw7dsz5fHXbzwSgKtC5c2czatQo5+OioiITHh5ukpKS3NhVzfbrAORwOExYWJh5/vnnnWOnTp0ydrvd/Otf/zLGGLNz504jyfznP/9x1nz22WfGZrOZI0eOVFnvNU1WVpaRZNauXWuMubBfa9WqZT744ANnza5du4wks2HDBmPMhbDq4eFhMjIynDVvvPGGCQgIMPn5+VW7ATVI3bp1zdtvv80+rgSnT582LVq0MCtXrjS33HKLMwCxrytOYmKiadeuXYnPVcf9zCmwSlZQUKBNmzYpJibGOebh4aGYmBht2LDBjZ1dXdLS0pSRkeGynwMDAxUVFeXczxs2bFBQUJA6derkrImJiZGHh4c2btxY5T3XFNnZ2ZKka665RpK0adMmnT9/3mVfX3/99br22mtd9nWbNm0UGhrqrImNjVVOTo6+//77Kuy+ZigqKtLChQuVm5ur6Oho9nElGDVqlPr06eOyTyX+e65o+/btU3h4uJo2baqBAwcqPT1dUvXcz3wZaiU7fvy4ioqKXH6hkhQaGqrdu3e7qaurT0ZGhiSVuJ8vPpeRkaH69eu7PO/l5aVrrrnGWQNXDodDo0ePVteuXXXjjTdK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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#plt.plot(d1avg, label='Original Data')\n", + "plt.plot(x_axis, trend_line, label='Trend Line', color='red')\n", + "plt.axhline(y=1, color='green', linestyle='--', label='y=1 Line')\n", + "\n", + "# Add labels and title\n", + "plt.xlabel('X-axis')\n", + "plt.ylabel('Y-axis')\n", + "plt.title('Trend Line for Data')\n", + "plt.legend()\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45d15e34-c083-461a-9407-b1d3ea46f1de", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/net/activation.py b/net/activation.py new file mode 100644 index 0000000..ee42015 --- /dev/null +++ b/net/activation.py @@ -0,0 +1,59 @@ +import numpy as np + +class Activations: + @staticmethod + def LeakyReLU(x, alpha=0.01): + return np.where(x > 0, x, alpha * x) + + @staticmethod + def LeakyReLU_deriv(x, alpha=0.01): + return np.where(x > 0, 1, alpha) + + @staticmethod + def InverseLeakyReLU(x, alpha=0.01): + return np.where(x > 0, x, x / alpha) + + @staticmethod + def ReLU(x): + return np.maximum(0, x) + + @staticmethod + def ReLU_deriv(x): + return np.where(x > 0, 1, 0) + + @staticmethod + def InverseReLU(x): + return np.maximum(0, x) # Note: This is lossy for negative values + + @staticmethod + def Sigmoid(x): + return 1 / (1 + np.exp(-x)) + + @staticmethod + def Sigmoid_deriv(x): + s = Activations.Sigmoid(x) + return s * (1 - s) + + @staticmethod + def InverseSigmoid(x): + return np.log(x / (1 - x)) + + @staticmethod + def Softmax(x): + exp_x = np.exp(x - np.max(x, axis=0, keepdims=True)) + return exp_x / np.sum(exp_x, axis=0, keepdims=True) + + @staticmethod + def InverseSoftmax(x): + return np.log(x) - np.max(np.log(x)) + + @classmethod + def get_function_name(cls, func): + return func.__name__ + + @classmethod + def get_all_activation_names(cls): + return [name for name, func in cls.__dict__.items() + if callable(func) and not name.startswith("__") and + not name.endswith("_deriv") and not name.startswith("Inverse") and + not name in ['get_function_name', 'get_all_activation_names']] diff --git a/net/loss.py b/net/loss.py new file mode 100644 index 0000000..0aa7ab7 --- /dev/null +++ b/net/loss.py @@ -0,0 +1,65 @@ +import numpy as np + +class Loss: + @staticmethod + def mean_squared_error(Y, A): + """ Mean Squared Error (MSE) """ + return np.mean((Y - A) ** 2) + + @staticmethod + def mean_absolute_error(Y, A): + """ Mean Absolute Error (MAE) """ + return np.mean(np.abs(Y - A)) + + @staticmethod + def huber_loss(Y, A, delta=1.0): + """ Huber Loss """ + error = Y - A + is_small_error = np.abs(error) <= delta + squared_loss = 0.5 * error ** 2 + linear_loss = delta * (np.abs(error) - 0.5 * delta) + return np.where(is_small_error, squared_loss, linear_loss).mean() + + @staticmethod + def binary_cross_entropy_loss(Y, A): + """ Binary Cross-Entropy Loss """ + m = Y.shape[1] + return -np.sum(Y * np.log(A + 1e-8) + (1 - Y) * np.log(1 - A + 1e-8)) / m + + @staticmethod + def categorical_cross_entropy_loss(Y, A): + """ Categorical Cross-Entropy Loss (for softmax) """ + m = Y.shape[1] + return -np.sum(Y * np.log(A + 1e-8)) / m + + @staticmethod + def hinge_loss(Y, A): + """ Hinge Loss (used in SVM) """ + return np.mean(np.maximum(0, 1 - Y * A)) + + @staticmethod + def kl_divergence(P, Q): + """ Kullback-Leibler Divergence """ + return np.sum(P * np.log(P / (Q + 1e-8))) + + @staticmethod + def poisson_loss(Y, A): + """ Poisson Loss """ + return np.mean(A - Y * np.log(A + 1e-8)) + + @staticmethod + def cosine_proximity_loss(Y, A): + """ Cosine Proximity Loss """ + dot_product = np.sum(Y * A, axis=0) + norms = np.linalg.norm(Y, axis=0) * np.linalg.norm(A, axis=0) + return -np.mean(dot_product / (norms + 1e-8)) + + @classmethod + def get_function_name(cls, func): + return func.__name__ + + @classmethod + def get_all_loss_names(cls): + return [name for name, func in cls.__dict__.items() + if callable(func) and not name.startswith("__") and + not name in ['get_function_name', 'get_all_loss_names']] \ No newline at end of file diff --git a/net/mlp.py b/net/mlp.py new file mode 100644 index 0000000..46b1d4a --- /dev/null +++ b/net/mlp.py @@ -0,0 +1,169 @@ +import numpy as np +import pandas as pd + +from sklearn.model_selection import train_test_split + +from net.activation import Activations as af +from net.optimizer import Optimizers as opt +from net.loss import Loss + +class MLP: + def __init__(self, architecture, activations, optimizer, loss_function): + self.architecture = architecture + self.activations = activations + self.optimizer = self.select_optimizer(optimizer) + self.loss_function = getattr(Loss, loss_function) + + self.params = self.init_params() + self.activation_funcs = self.select_activations() + + self.acc_store = [] + self.loss_store = [] + self.test_results = [] + + def init_params(self): + params = {} + for i in range(1, len(self.architecture)): + params[f'W{i}'] = np.random.randn(self.architecture[i], self.architecture[i-1]) * 0.01 + params[f'b{i}'] = np.zeros((self.architecture[i], 1)) + return params + + def select_activations(self): + activation_funcs = [] + for activation in self.activations: + activation_funcs.append(getattr(af, activation)) + return activation_funcs + + def select_optimizer(self, optimizer_name): + return getattr(opt, optimizer_name) + + def forward_prop(self, X): + A = X + caches = [] + for i in range(1, len(self.architecture)): + W = self.params[f'W{i}'] + b = self.params[f'b{i}'] + Z = np.dot(W, A) + b + A = self.activation_funcs[i-1](Z) + caches.append((A, W, b, Z)) + return A, caches + + def backward_prop(self, AL, Y, caches): + grads = {} + L = len(caches) + + # Ensure Y is a 2D array + Y = Y.reshape(-1, 1) if Y.ndim == 1 else Y + m = Y.shape[1] + + Y = self.one_hot(Y) + + dAL = AL - Y + current_cache = caches[L-1] + grads[f"dA{L}"], grads[f"dW{L}"], grads[f"db{L}"] = self.linear_activation_backward( + dAL, current_cache, self.activation_funcs[L-1].__name__) + + for l in reversed(range(L-1)): + current_cache = caches[l] + dA_prev_temp, dW_temp, db_temp = self.linear_activation_backward( + grads[f"dA{l+2}"], current_cache, self.activation_funcs[l].__name__) + grads[f"dA{l+1}"] = dA_prev_temp + grads[f"dW{l+1}"] = dW_temp + grads[f"db{l+1}"] = db_temp + + return grads + + def one_hot(self, Y): + num_classes = self.architecture[-1] + if Y.ndim == 1: + return np.eye(num_classes)[Y] + else: + return np.eye(num_classes)[Y.reshape(-1)].T + + def linear_activation_backward(self, dA, cache, activation): + A_prev, W, b, Z = cache + m = A_prev.shape[1] + + if activation == "Softmax": + dZ = dA + elif activation == "ReLU": + dZ = dA * af.ReLU_deriv(Z) + else: + raise ValueError(f"Backward propagation not implemented for {activation}") + + dW = 1 / m * np.dot(dZ, A_prev.T) + db = 1 / m * np.sum(dZ, axis=1, keepdims=True) + dA_prev = np.dot(W.T, dZ) + + return dA_prev, dW, db + + def get_predictions(self, A): + return np.argmax(A, axis=0) + + def get_accuracy(self, predictions, Y): + return np.mean(predictions == Y) + + def train(self, X, Y, alpha, iterations, validation_split=0.2): + X_train, X_val, Y_train, Y_val = train_test_split(X.T, Y, test_size=validation_split, shuffle=True, random_state=42) + X_train, X_val = X_train.T, X_val.T + + # Ensure Y_train and Y_val are 1D arrays + Y_train = Y_train.ravel() + Y_val = Y_val.ravel() + + for i in range(iterations): + AL, caches = self.forward_prop(X_train) + grads = self.backward_prop(AL, Y_train, caches) + + self.params = self.optimizer(self.params, grads, alpha) + + if i % 10 == 0: + train_preds = self.get_predictions(AL) + train_acc = self.get_accuracy(train_preds, Y_train) + train_loss = self.loss_function(self.one_hot(Y_train), AL) + + AL_val, _ = self.forward_prop(X_val) + val_preds = self.get_predictions(AL_val) + val_acc = self.get_accuracy(val_preds, Y_val) + val_loss = self.loss_function(self.one_hot(Y_val), AL_val) + + print(f"Iteration {i}") + print(f"Training Accuracy: {train_acc:.4f}, Validation Accuracy: {val_acc:.4f}") + print(f"Training Loss: {train_loss:.4f}, Validation Loss: {val_loss:.4f}") + print("-------------------------------------------------------") + + self.acc_store.append((train_acc, val_acc)) + self.loss_store.append((train_loss, val_loss)) + + return self.params + + def test(self, X_test, Y_test): + AL, _ = self.forward_prop(X_test) + predictions = self.get_predictions(AL) + test_accuracy = self.get_accuracy(predictions, Y_test) + test_loss = self.loss_function(self.one_hot(Y_test), AL) + + self.test_results.append((test_accuracy, test_loss)) + + print(f"Test Accuracy: {test_accuracy:.4f}") + print(f"Test Loss: {test_loss:.4f}") + + def save_model(self, dataset): + weights_file = f"weights/{dataset}_{self.activation_funcs[0].__name__}_weights.npz" + results_file = f"results/{dataset}_{self.activation_funcs[0].__name__}_results.csv" + + np.savez(weights_file, **self.params) + + train_df = pd.DataFrame(self.acc_store, columns=["training_accuracy", "validation_accuracy"]) + loss_df = pd.DataFrame(self.loss_store, columns=["training_loss", "validation_loss"]) + test_df = pd.DataFrame(self.test_results, columns=['test_accuracy', 'test_loss']) + + combined_df = pd.concat([train_df, loss_df, test_df], axis=1) + combined_df.to_csv(results_file, index=False) + + print(f"Weights saved to {weights_file}") + print(f"Results saved to {results_file}") + + def load_weights(self, file_name): + data = np.load(file_name) + self.params = {key: data[key] for key in data.files} \ No newline at end of file diff --git a/net/modules.py b/net/modules.py new file mode 100644 index 0000000..941c045 --- /dev/null +++ b/net/modules.py @@ -0,0 +1,77 @@ +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt + +def load_data(file_path): + data = pd.read_csv(file_path) + data = np.array(data) + m, n = data.shape + + data_train = data[1000:m].T + Y_train = data_train[0].astype(int) + X_train = data_train[1:n] + + data_test = data[0:1000].T + Y_test = data_test[0].astype(int) + X_test = data_test[1:n] + + return X_train, Y_train, X_test, Y_test + +def plot_accuracy(acc_store, save_path=None): + """ + Plot training and validation accuracy over iterations. + + Parameters: + acc_store (list of tuples): Each tuple contains (training_accuracy, validation_accuracy). + save_path (str, optional): If provided, saves the plot to the specified path. + """ + # Unzip the accuracy data + training_accuracy, validation_accuracy = zip(*acc_store) + + # Plot + plt.figure(figsize=(10, 6)) + plt.plot(training_accuracy, label='Training Accuracy') + plt.plot(validation_accuracy, label='Validation Accuracy') + plt.title('Training and Validation Accuracy Over Iterations') + plt.xlabel('Iterations (in steps of 10)') + plt.ylabel('Accuracy') + plt.legend() + plt.grid(True) + + # Save the plot if a path is provided + if save_path: + plt.savefig(save_path) + print(f"Accuracy plot saved to {save_path}") + + # Show the plot + plt.show() + + +def plot_loss(loss_store, save_path=None): + """ + Plot training and validation loss over iterations. + + Parameters: + loss_store (list of tuples): Each tuple contains (training_loss, validation_loss). + save_path (str, optional): If provided, saves the plot to the specified path. + """ + # Unzip the loss data + training_loss, validation_loss = zip(*loss_store) + + # Plot + plt.figure(figsize=(10, 6)) + plt.plot(training_loss, label='Training Loss') + plt.plot(validation_loss, label='Validation Loss') + plt.title('Training and Validation Loss Over Iterations') + plt.xlabel('Iterations (in steps of 10)') + plt.ylabel('Loss') + plt.legend() + plt.grid(True) + + # Save the plot if a path is provided + if save_path: + plt.savefig(save_path) + print(f"Loss plot saved to {save_path}") + + # Show the plot + plt.show() \ No newline at end of file diff --git a/net/optimizer.py b/net/optimizer.py new file mode 100644 index 0000000..3f21b33 --- /dev/null +++ b/net/optimizer.py @@ -0,0 +1,14 @@ +class Optimizers: + @staticmethod + def gradient_descent(params, grads, alpha): + """ + Performs gradient descent optimization for a multi-layer network. + + :param params: Dictionary containing the network parameters (W1, b1, W2, b2, etc.) + :param grads: Dictionary containing the gradients (dW1, db1, dW2, db2, etc.) + :param alpha: Learning rate + :return: Updated parameters dictionary + """ + for key in params: + params[key] -= alpha * grads['d' + key] + return params \ No newline at end of file diff --git a/net/transcoder.py b/net/transcoder.py new file mode 100644 index 0000000..884b764 --- /dev/null +++ b/net/transcoder.py @@ -0,0 +1,109 @@ +import numpy as np + +from sklearn.model_selection import train_test_split + +from net.mlp import MLP +from net.modules import calculate_loss, calculate_accuracy, plot_learning_curves, plot_encoded_space, plot_reconstructions + +class Transcoder(MLP): + def __init__(self, input_size, hidden_size, output_size, hidden_activation='leaky_relu', output_activation='softmax', alpha=0.01): + super().__init__(input_size, hidden_size, output_size, hidden_activation, output_activation, alpha) + self.train_losses = [] + self.val_losses = [] + self.train_accuracies = [] + self.val_accuracies = [] + self.image_shape = self.determine_image_shape(input_size) + + @staticmethod + def determine_image_shape(input_size): + sqrt = int(np.sqrt(input_size)) + if sqrt ** 2 == input_size: + return (sqrt, sqrt) + else: + return (input_size, 1) # Default to column vector if not square + + def encode_image(self, X): + _, _, _, A2 = self.forward_prop(X) + # print(f"Debug - Encoded image shape: {A2.shape}") #Debugging + return A2 + + def decode_image(self, A2): + # Start decoding from the encoded representation (A2) + # print(f"Debug - A2 image shape: {A2.shape}") #Debugging + + # Step 1: Reverse the output_activation function to get Z2 + Z2 = self.inverse_output_activation(A2) + # print(f"Debug - Z2 image shape: {Z2.shape}") #Debugging + + # Step 2: Reverse the second linear transformation to get A1 + A1 = np.linalg.pinv(self.W2).dot(Z2 - self.b2) + # print(f"Debug - A1 image shape: {A1.shape}") #Debugging + + # Step 3: Reverse the hidden_activation function to get Z1 + Z1 = self.inverse_hidden_activation(A1, self.alpha) + # print(f"Debug - Z1 image shape: {Z1.shape}") #Debugging + + # Step 4: Reverse the first linear transformation to get X (flattened 1D array) + X_flat = np.linalg.pinv(self.W1).dot(Z1 - self.b1) + # print(f"Debug - X_Flat image shape: {X_flat.shape}") #Debugging + + # Step 5: If X_flat has shape (1024, n_samples), reshape it for each sample + if X_flat.ndim > 1: + X_flat = X_flat[:, 0] # Extract the first sample or reshape for batch processing + + # Reshape to original image dimensions (32x32) + X_image = X_flat.reshape(self.image_shape) + + return X_image + + def transcode(self, X): + print(f"Debug - Input X shape: {X.shape}") + encoded = self.encode_image(X) + decoded = self.decode_image(encoded) + return encoded, decoded + + def train_with_validation(self, X, Y, alpha, iterations, val_split=0.2): + # Ensure X is of shape (n_features, n_samples) + if X.shape[0] != self.input_size: + X = X.T + + # Ensure Y is a 1D array + if Y.ndim > 1: + Y = Y.ravel() + + X_train, X_val, Y_train, Y_val = train_test_split(X.T, Y, test_size=val_split, random_state=42) + X_train, X_val = X_train.T, X_val.T # Transpose back to (n_features, n_samples) + + for i in range(iterations): + # Train step + Z1, A1, Z2, A2 = self.forward_prop(X_train) + dW1, db1, dW2, db2 = self.backward_prop(Z1, A1, Z2, A2, X_train, Y_train) + self.update_params(dW1, db1, dW2, db2, alpha) + + # Calculate and store losses and accuracies + train_loss = calculate_loss(self, X_train, Y_train) + val_loss = calculate_loss(self, X_val, Y_val) + train_accuracy = calculate_accuracy(self, X_train, Y_train) + val_accuracy = calculate_accuracy(self, X_val, Y_val) + + self.train_losses.append(train_loss) + self.val_losses.append(val_loss) + self.train_accuracies.append(train_accuracy) + self.val_accuracies.append(val_accuracy) + + if i % 100 == 0: + print(f"Iteration {i}: Train Loss = {train_loss:.4f}, Val Loss = {val_loss:.4f}, " + f"Train Accuracy = {train_accuracy:.4f}, Val Accuracy = {val_accuracy:.4f}") + + def plot_learning_curves(self): + plot_learning_curves(self.train_losses, self.val_losses, self.train_accuracies, self.val_accuracies) + + def plot_encoded_space(self, X, Y): + if X.shape[0] != self.input_size: + X = X.T + plot_encoded_space(self, X, Y) + + def plot_reconstructions(self, X, num_images=5): + if X.shape[0] != self.input_size: + X = X.T + plot_reconstructions(self, X, num_images) \ No newline at end of file diff --git a/results/bel_all_accuracies.csv b/results/bel_all_accuracies.csv new file mode 100644 index 0000000..1c11c23 --- /dev/null +++ b/results/bel_all_accuracies.csv @@ -0,0 +1,401 @@ +Trial_1,Trial_2,Trial_3,Trial_4,Trial_5 +0.023496503496503496,0.04055944055944056,0.016783216783216783,0.006993006993006993,0.04027972027972028 +0.011748251748251748,0.05258741258741259,0.0,0.013146853146853148,0.008111888111888113 +0.011748251748251748,0.05146853146853147,0.0,0.013146853146853148,0.008391608391608392 +0.011748251748251748,0.09958041958041958,0.0,0.013146853146853148,0.00951048951048951 +0.011748251748251748,0.11048951048951049,0.0,0.022377622377622378,0.00951048951048951 +0.011748251748251748,0.1076923076923077,0.0,0.05678321678321678,0.00951048951048951 +0.011748251748251748,0.1048951048951049,0.0,0.07160839160839161,0.00951048951048951 +0.011748251748251748,0.12195804195804195,0.0,0.08027972027972027,0.009790209790209791 +0.011748251748251748,0.16307692307692306,0.0,0.086993006993007,0.009790209790209791 +0.011748251748251748,0.16867132867132867,0.0,0.09118881118881118,0.009790209790209791 +0.011748251748251748,0.17174825174825176,0.0,0.09314685314685314,0.009790209790209791 +0.011748251748251748,0.1753846153846154,0.0,0.0937062937062937,0.01006993006993007 +0.011748251748251748,0.17622377622377622,0.0,0.09538461538461539,0.011188811188811189 +0.011748251748251748,0.17986013986013985,0.0,0.09594405594405594,0.011748251748251748 +0.011748251748251748,0.18097902097902097,0.0,0.09622377622377623,0.07608391608391608 +0.011748251748251748,0.1834965034965035,0.0,0.09706293706293706,0.08587412587412588 +0.011748251748251748,0.18573426573426574,0.013146853146853148,0.09706293706293706,0.09062937062937063 +0.011748251748251748,0.1874125874125874,0.02825174825174825,0.09734265734265735,0.09146853146853147 +0.011748251748251748,0.1888111888111888,0.03776223776223776,0.09734265734265735,0.09174825174825176 +0.011748251748251748,0.18993006993006992,0.044475524475524476,0.09762237762237762,0.09258741258741258 +0.011748251748251748,0.19132867132867132,0.05146853146853147,0.0979020979020979,0.09230769230769231 +0.011748251748251748,0.19244755244755246,0.0606993006993007,0.09706293706293706,0.09118881118881118 +0.011748251748251748,0.19384615384615383,0.06097902097902098,0.09818181818181818,0.09062937062937063 +0.011748251748251748,0.19692307692307692,0.06293706293706294,0.0979020979020979,0.0897902097902098 +0.011748251748251748,0.2013986013986014,0.06321678321678321,0.09846153846153846,0.08923076923076922 +0.011748251748251748,0.21202797202797202,0.06293706293706294,0.09762237762237762,0.08811188811188811 +0.011748251748251748,0.22097902097902097,0.06321678321678321,0.09734265734265735,0.08811188811188811 +0.011748251748251748,0.22545454545454546,0.0634965034965035,0.09874125874125875,0.07244755244755245 +0.011748251748251748,0.23272727272727273,0.06769230769230769,0.09874125874125875,0.07916083916083916 +0.011748251748251748,0.2427972027972028,0.06965034965034965,0.09762237762237762,0.08951048951048951 +0.011748251748251748,0.2632167832167832,0.07104895104895105,0.09874125874125875,0.0979020979020979 +0.011748251748251748,0.2716083916083916,0.0718881118881119,0.10797202797202797,0.10377622377622378 +0.011748251748251748,0.2816783216783217,0.07272727272727272,0.11412587412587413,0.10573426573426574 +0.011748251748251748,0.2900699300699301,0.08195804195804196,0.11692307692307692,0.1076923076923077 +0.011748251748251748,0.29762237762237764,0.11356643356643356,0.11832167832167832,0.10741258741258741 +0.011748251748251748,0.3074125874125874,0.126993006993007,0.12055944055944055,0.10797202797202797 +0.011748251748251748,0.31300699300699303,0.10601398601398601,0.1227972027972028,0.10937062937062937 +0.011748251748251748,0.3186013986013986,0.10545454545454545,0.13286713286713286,0.11020979020979021 +0.011748251748251748,0.3241958041958042,0.10545454545454545,0.14909090909090908,0.11216783216783217 +0.011748251748251748,0.332027972027972,0.10545454545454545,0.16195804195804195,0.11272727272727273 +0.011748251748251748,0.3412587412587413,0.10573426573426574,0.13258741258741258,0.11384615384615385 +0.011748251748251748,0.3474125874125874,0.10573426573426574,0.1362237762237762,0.11496503496503496 +0.011748251748251748,0.34265734265734266,0.10573426573426574,0.14853146853146854,0.11608391608391608 +0.011748251748251748,0.34881118881118883,0.10573426573426574,0.1516083916083916,0.11804195804195804 +0.011748251748251748,0.35160839160839163,0.10573426573426574,0.1586013986013986,0.11860139860139861 +0.011748251748251748,0.35748251748251747,0.10573426573426574,0.16223776223776223,0.11636363636363636 +0.011748251748251748,0.3627972027972028,0.10573426573426574,0.17006993006993007,0.11524475524475525 +0.011748251748251748,0.37006993006993005,0.10573426573426574,0.17846153846153845,0.11720279720279721 +0.011748251748251748,0.37566433566433566,0.10573426573426574,0.18237762237762237,0.12111888111888112 +0.011748251748251748,0.3829370629370629,0.10573426573426574,0.18993006993006992,0.12307692307692308 +0.011748251748251748,0.3893706293706294,0.10545454545454545,0.2067132867132867,0.12503496503496503 +0.011748251748251748,0.39636363636363636,0.10545454545454545,0.22097902097902097,0.1258741258741259 +0.011748251748251748,0.4027972027972028,0.10545454545454545,0.23244755244755244,0.12783216783216783 +0.011748251748251748,0.40755244755244757,0.10545454545454545,0.2111888111888112,0.12867132867132866 +0.011748251748251748,0.413986013986014,0.10545454545454545,0.2455944055944056,0.13006993006993006 +0.011748251748251748,0.4206993006993007,0.10545454545454545,0.2746853146853147,0.13118881118881118 +0.011748251748251748,0.42713286713286713,0.10545454545454545,0.28223776223776226,0.13258741258741258 +0.011748251748251748,0.4318881118881119,0.10545454545454545,0.2903496503496503,0.13454545454545455 +0.011748251748251748,0.43608391608391606,0.10517482517482518,0.29426573426573427,0.13426573426573427 +0.011748251748251748,0.44111888111888115,0.10517482517482518,0.3048951048951049,0.13678321678321678 +0.011748251748251748,0.4464335664335664,0.10517482517482518,0.30993006993006994,0.139020979020979 +0.011748251748251748,0.4509090909090909,0.10517482517482518,0.31580419580419583,0.13986013986013987 +0.011748251748251748,0.4584615384615385,0.10517482517482518,0.32223776223776224,0.1423776223776224 +0.011748251748251748,0.4668531468531468,0.10517482517482518,0.3239160839160839,0.14405594405594405 +0.011748251748251748,0.4735664335664336,0.10517482517482518,0.32895104895104893,0.14153846153846153 +0.011748251748251748,0.4791608391608392,0.10517482517482518,0.3264335664335664,0.14153846153846153 +0.011748251748251748,0.48363636363636364,0.10517482517482518,0.33174825174825173,0.1437762237762238 +0.011748251748251748,0.48923076923076925,0.10517482517482518,0.33986013986013985,0.15020979020979022 +0.011748251748251748,0.49202797202797205,0.10517482517482518,0.3474125874125874,0.15216783216783217 +0.011748251748251748,0.4976223776223776,0.10517482517482518,0.3507692307692308,0.15636363636363637 +0.011748251748251748,0.4995804195804196,0.1048951048951049,0.3563636363636364,0.16 +0.011748251748251748,0.5015384615384615,0.1048951048951049,0.3597202797202797,0.1655944055944056 +0.011748251748251748,0.504055944055944,0.1048951048951049,0.36475524475524473,0.16783216783216784 +0.011748251748251748,0.5062937062937063,0.1048951048951049,0.3686713286713287,0.1709090909090909 +0.011748251748251748,0.5068531468531469,0.1048951048951049,0.36895104895104897,0.1723076923076923 +0.011748251748251748,0.509090909090909,0.1048951048951049,0.3706293706293706,0.1737062937062937 +0.011748251748251748,0.5116083916083916,0.1048951048951049,0.36363636363636365,0.1751048951048951 +0.011748251748251748,0.513006993006993,0.1048951048951049,0.34937062937062935,0.17734265734265733 +0.011748251748251748,0.5158041958041958,0.1048951048951049,0.3563636363636364,0.17846153846153845 +0.011748251748251748,0.5183216783216783,0.1048951048951049,0.36475524475524473,0.18013986013986014 +0.011748251748251748,0.5208391608391608,0.1048951048951049,0.3734265734265734,0.18125874125874125 +0.011748251748251748,0.5227972027972028,0.1048951048951049,0.3837762237762238,0.18461538461538463 +0.011748251748251748,0.5258741258741259,0.1048951048951049,0.3890909090909091,0.18489510489510488 +0.011748251748251748,0.5272727272727272,0.1048951048951049,0.3918881118881119,0.18685314685314686 +0.011748251748251748,0.5306293706293707,0.1048951048951049,0.39384615384615385,0.18853146853146854 +0.011748251748251748,0.5300699300699301,0.1048951048951049,0.39692307692307693,0.18965034965034966 +0.011748251748251748,0.5300699300699301,0.1048951048951049,0.4008391608391608,0.19076923076923077 +0.011748251748251748,0.5325874125874126,0.1048951048951049,0.4036363636363636,0.19244755244755246 +0.011748251748251748,0.5345454545454545,0.1048951048951049,0.4039160839160839,0.19384615384615383 +0.011748251748251748,0.5362237762237763,0.1048951048951049,0.4067132867132867,0.19524475524475524 +0.011748251748251748,0.5370629370629371,0.1048951048951049,0.40783216783216786,0.19636363636363635 +0.011748251748251748,0.5384615384615384,0.1048951048951049,0.4083916083916084,0.19776223776223775 +0.011748251748251748,0.5406993006993007,0.1048951048951049,0.4100699300699301,0.20307692307692307 +0.011748251748251748,0.5437762237762238,0.1048951048951049,0.4137062937062937,0.2081118881118881 +0.011748251748251748,0.5462937062937063,0.1048951048951049,0.4179020979020979,0.2123076923076923 +0.011748251748251748,0.5471328671328671,0.1048951048951049,0.41986013986013987,0.21566433566433565 +0.011748251748251748,0.5499300699300699,0.1048951048951049,0.42097902097902096,0.22013986013986014 +0.011748251748251748,0.5521678321678322,0.1048951048951049,0.4246153846153846,0.22293706293706295 +0.011748251748251748,0.5518881118881119,0.1048951048951049,0.42573426573426576,0.22685314685314686 +0.011748251748251748,0.5516083916083916,0.1048951048951049,0.4276923076923077,0.22965034965034964 +0.011748251748251748,0.5521678321678322,0.1048951048951049,0.42965034965034965,0.22993006993006992 +0.011748251748251748,0.5532867132867133,0.1048951048951049,0.4307692307692308,0.2332867132867133 +0.011748251748251748,0.5566433566433566,0.1048951048951049,0.43272727272727274,0.23496503496503496 +0.011748251748251748,0.5586013986013986,0.1048951048951049,0.4341258741258741,0.24 +0.011748251748251748,0.5608391608391609,0.1048951048951049,0.4338461538461538,0.24447552447552448 +0.011748251748251748,0.5613986013986014,0.10461538461538461,0.43524475524475525,0.2483916083916084 +0.011748251748251748,0.5605594405594405,0.10433566433566434,0.43636363636363634,0.25594405594405595 +0.011748251748251748,0.5633566433566434,0.10461538461538461,0.43860139860139863,0.2755244755244755 +0.011748251748251748,0.566993006993007,0.10461538461538461,0.4397202797202797,0.29174825174825175 +0.011748251748251748,0.5683916083916084,0.10461538461538461,0.44083916083916086,0.3102097902097902 +0.011748251748251748,0.5695104895104895,0.10461538461538461,0.44167832167832166,0.31524475524475526 +0.011748251748251748,0.5697902097902098,0.10461538461538461,0.4413986013986014,0.3169230769230769 +0.011748251748251748,0.5700699300699301,0.10461538461538461,0.44167832167832166,0.30993006993006994 +0.011748251748251748,0.5723076923076923,0.10461538461538461,0.44363636363636366,0.31272727272727274 +0.011748251748251748,0.5728671328671329,0.10433566433566434,0.44475524475524475,0.3177622377622378 +0.011748251748251748,0.5737062937062937,0.10461538461538461,0.4458741258741259,0.3211188811188811 +0.011748251748251748,0.575944055944056,0.10517482517482518,0.446993006993007,0.32447552447552447 +0.011748251748251748,0.5767832167832168,0.10517482517482518,0.44755244755244755,0.32783216783216784 +0.011748251748251748,0.5776223776223777,0.10517482517482518,0.4481118881118881,0.3295104895104895 +0.011748251748251748,0.5784615384615385,0.10517482517482518,0.4497902097902098,0.33734265734265734 +0.011748251748251748,0.5801398601398602,0.10517482517482518,0.45062937062937064,0.3406993006993007 +0.011748251748251748,0.5829370629370629,0.10517482517482518,0.4511888111888112,0.3448951048951049 +0.011748251748251748,0.5848951048951049,0.10517482517482518,0.45342657342657344,0.35104895104895106 +0.011748251748251748,0.5846153846153846,0.10517482517482518,0.45370629370629373,0.35524475524475524 +0.011748251748251748,0.5857342657342657,0.1048951048951049,0.45398601398601396,0.3630769230769231 +0.011748251748251748,0.5874125874125874,0.1048951048951049,0.4548251748251748,0.3711888111888112 +0.011748251748251748,0.5882517482517482,0.1048951048951049,0.45622377622377625,0.3801398601398601 +0.011748251748251748,0.5890909090909091,0.1048951048951049,0.45678321678321676,0.38825174825174824 +0.011748251748251748,0.5907692307692308,0.1048951048951049,0.4606993006993007,0.39636363636363636 +0.011748251748251748,0.5885314685314685,0.1048951048951049,0.46237762237762237,0.4067132867132867 +0.011748251748251748,0.5916083916083916,0.1048951048951049,0.4643356643356643,0.41706293706293707 +0.011748251748251748,0.5944055944055944,0.1048951048951049,0.466013986013986,0.4254545454545455 +0.011748251748251748,0.5960839160839161,0.1048951048951049,0.4690909090909091,0.43244755244755245 +0.011748251748251748,0.5977622377622378,0.1048951048951049,0.4702097902097902,0.43636363636363634 +0.011748251748251748,0.5986013986013986,0.1048951048951049,0.4707692307692308,0.4372027972027972 +0.011748251748251748,0.6002797202797203,0.1048951048951049,0.47216783216783215,0.44195804195804195 +0.011748251748251748,0.6008391608391609,0.1048951048951049,0.4727272727272727,0.4483916083916084 +0.011748251748251748,0.6033566433566434,0.1048951048951049,0.47384615384615386,0.45454545454545453 +0.011748251748251748,0.605034965034965,0.1048951048951049,0.47440559440559443,0.46265734265734265 +0.011748251748251748,0.6047552447552448,0.1048951048951049,0.47496503496503495,0.4690909090909091 +0.011748251748251748,0.6055944055944056,0.1048951048951049,0.47664335664335666,0.4735664335664336 +0.011748251748251748,0.6067132867132867,0.1048951048951049,0.47664335664335666,0.4788811188811189 +0.011748251748251748,0.6075524475524475,0.1048951048951049,0.4772027972027972,0.48335664335664336 +0.011748251748251748,0.6092307692307692,0.1048951048951049,0.47748251748251747,0.4855944055944056 +0.011748251748251748,0.6117482517482518,0.1048951048951049,0.47804195804195804,0.48895104895104896 +0.011748251748251748,0.6145454545454545,0.10461538461538461,0.4783216783216783,0.49202797202797205 +0.011748251748251748,0.6139860139860139,0.10433566433566434,0.4786013986013986,0.499020979020979 +0.011748251748251748,0.6179020979020979,0.10433566433566434,0.47944055944055947,0.5026573426573426 +0.011748251748251748,0.612027972027972,0.10433566433566434,0.47944055944055947,0.5068531468531469 +0.011748251748251748,0.6123076923076923,0.10433566433566434,0.48083916083916084,0.5124475524475525 +0.011748251748251748,0.6184615384615385,0.10433566433566434,0.48055944055944055,0.5152447552447552 +0.011748251748251748,0.617062937062937,0.10433566433566434,0.4811188811188811,0.5191608391608392 +0.011748251748251748,0.6064335664335664,0.10461538461538461,0.481958041958042,0.521958041958042 +0.011748251748251748,0.5938461538461538,0.10461538461538461,0.4816783216783217,0.5255944055944056 +0.011748251748251748,0.6061538461538462,0.10461538461538461,0.4813986013986014,0.5278321678321678 +0.011748251748251748,0.6156643356643356,0.10461538461538461,0.4822377622377622,0.5309090909090909 +0.011748251748251748,0.6265734265734266,0.10461538461538461,0.4822377622377622,0.533986013986014 +0.011748251748251748,0.6316083916083917,0.10461538461538461,0.481958041958042,0.533986013986014 +0.011748251748251748,0.6346853146853146,0.10461538461538461,0.4827972027972028,0.5362237762237763 +0.011748251748251748,0.6411188811188812,0.10461538461538461,0.48363636363636364,0.539020979020979 +0.011748251748251748,0.6433566433566433,0.10461538461538461,0.48335664335664336,0.5401398601398602 +0.011748251748251748,0.6458741258741258,0.10433566433566434,0.4841958041958042,0.5434965034965035 +0.011748251748251748,0.6500699300699301,0.10433566433566434,0.48475524475524473,0.5434965034965035 +0.011748251748251748,0.6545454545454545,0.10433566433566434,0.485034965034965,0.5457342657342658 +0.011748251748251748,0.6587412587412588,0.10461538461538461,0.48643356643356644,0.5468531468531469 +0.011748251748251748,0.6629370629370629,0.10461538461538461,0.48391608391608393,0.5485314685314685 +0.011748251748251748,0.6668531468531469,0.10461538461538461,0.48363636363636364,0.5513286713286714 +0.011748251748251748,0.6682517482517483,0.10461538461538461,0.48307692307692307,0.553006993006993 +0.011748251748251748,0.6690909090909091,0.10461538461538461,0.4822377622377622,0.5538461538461539 +0.011748251748251748,0.6721678321678322,0.10461538461538461,0.48475524475524473,0.554965034965035 +0.011748251748251748,0.6763636363636364,0.10461538461538461,0.4853146853146853,0.5552447552447553 +0.011748251748251748,0.6786013986013986,0.10461538461538461,0.4844755244755245,0.556923076923077 +0.011748251748251748,0.68,0.10461538461538461,0.48475524475524473,0.5586013986013986 +0.011748251748251748,0.68,0.10461538461538461,0.4855944055944056,0.5605594405594405 +0.011748251748251748,0.6777622377622378,0.10461538461538461,0.4855944055944056,0.561958041958042 +0.011748251748251748,0.6732867132867133,0.1048951048951049,0.4855944055944056,0.5627972027972028 +0.011748251748251748,0.6772027972027972,0.1048951048951049,0.4853146853146853,0.561958041958042 +0.011748251748251748,0.6844755244755245,0.10545454545454545,0.48615384615384616,0.561958041958042 +0.011748251748251748,0.6906293706293706,0.10545454545454545,0.4878321678321678,0.5622377622377622 +0.011748251748251748,0.6979020979020979,0.10573426573426574,0.48895104895104896,0.563076923076923 +0.011748251748251748,0.6998601398601398,0.1062937062937063,0.4883916083916084,0.563076923076923 +0.011748251748251748,0.6970629370629371,0.10881118881118881,0.48979020979020976,0.5641958041958042 +0.011748251748251748,0.6942657342657342,0.1158041958041958,0.4906293706293706,0.5653146853146853 +0.011748251748251748,0.7012587412587412,0.13202797202797203,0.48951048951048953,0.5672727272727273 +0.011748251748251748,0.707972027972028,0.1462937062937063,0.48755244755244753,0.5681118881118881 +0.011748251748251748,0.7099300699300699,0.1616783216783217,0.4886713286713287,0.5675524475524476 +0.011748251748251748,0.7093706293706293,0.17426573426573427,0.48923076923076925,0.5692307692307692 +0.011748251748251748,0.706013986013986,0.18573426573426574,0.49006993006993005,0.5697902097902098 +0.011748251748251748,0.6987412587412587,0.19552447552447552,0.48979020979020976,0.5695104895104895 +0.011748251748251748,0.6850349650349651,0.20391608391608393,0.48979020979020976,0.5692307692307692 +0.011748251748251748,0.6937062937062937,0.2137062937062937,0.49034965034965033,0.5700699300699301 +0.011748251748251748,0.7074125874125874,0.22405594405594406,0.4909090909090909,0.5714685314685315 +0.011748251748251748,0.7222377622377623,0.2511888111888112,0.49258741258741257,0.5728671328671329 +0.011748251748251748,0.7230769230769231,0.27412587412587414,0.4937062937062937,0.5720279720279721 +0.011748251748251748,0.7241958041958042,0.2844755244755245,0.4934265734265734,0.5723076923076923 +0.011748251748251748,0.7205594405594405,0.2853146853146853,0.49230769230769234,0.5723076923076923 +0.011748251748251748,0.7141258741258741,0.2931468531468531,0.4914685314685315,0.5731468531468531 +0.011748251748251748,0.7166433566433567,0.299020979020979,0.49202797202797205,0.5737062937062937 +0.011748251748251748,0.7225174825174825,0.30293706293706296,0.49202797202797205,0.5773426573426573 +0.011748251748251748,0.7236363636363636,0.30405594405594405,0.49286713286713285,0.5787412587412587 +0.011748251748251748,0.7272727272727273,0.30713286713286714,0.49286713286713285,0.5784615384615385 +0.011748251748251748,0.7278321678321679,0.30937062937062937,0.49286713286713285,0.5767832167832168 +0.011748251748251748,0.7272727272727273,0.30965034965034965,0.49314685314685314,0.5765034965034965 +0.011748251748251748,0.7253146853146853,0.3118881118881119,0.49258741258741257,0.5781818181818181 +0.011748251748251748,0.7211188811188811,0.3141258741258741,0.493986013986014,0.5781818181818181 +0.011748251748251748,0.7225174825174825,0.3186013986013986,0.493986013986014,0.579020979020979 +0.011748251748251748,0.7197202797202797,0.32083916083916086,0.49482517482517485,0.5832167832167832 +0.011748251748251748,0.7325874125874126,0.3227972027972028,0.49538461538461537,0.5837762237762237 +0.011748251748251748,0.7398601398601399,0.3328671328671329,0.49566433566433565,0.5846153846153846 +0.011748251748251748,0.7412587412587412,0.33678321678321677,0.4962237762237762,0.5857342657342657 +0.011748251748251748,0.7426573426573426,0.3406993006993007,0.49734265734265737,0.5868531468531468 +0.011748251748251748,0.7415384615384616,0.3437762237762238,0.49734265734265737,0.5882517482517482 +0.011748251748251748,0.7381818181818182,0.3448951048951049,0.4976223776223776,0.5899300699300699 +0.011748251748251748,0.7373426573426574,0.3476923076923077,0.4993006993006993,0.5902097902097903 +0.011748251748251748,0.7390209790209791,0.3504895104895105,0.5004195804195805,0.5834965034965035 +0.011748251748251748,0.7401398601398601,0.35244755244755244,0.5006993006993007,0.5731468531468531 +0.011748251748251748,0.7393006993006993,0.3560839160839161,0.5015384615384615,0.5678321678321678 +0.011748251748251748,0.7379020979020979,0.3572027972027972,0.5026573426573426,0.5767832167832168 +0.011748251748251748,0.7379020979020979,0.35804195804195804,0.5032167832167832,0.5823776223776224 +0.011748251748251748,0.735944055944056,0.3602797202797203,0.5037762237762238,0.5823776223776224 +0.011748251748251748,0.7398601398601399,0.3625174825174825,0.5034965034965035,0.5804195804195804 +0.011748251748251748,0.7432167832167832,0.36335664335664336,0.5043356643356643,0.5876923076923077 +0.011748251748251748,0.7468531468531469,0.36475524475524473,0.5043356643356643,0.5916083916083916 +0.011748251748251748,0.7518881118881119,0.36671328671328673,0.5051748251748251,0.5946853146853147 +0.011748251748251748,0.7518881118881119,0.3711888111888112,0.5057342657342657,0.5927272727272728 +0.011748251748251748,0.7474125874125874,0.37538461538461537,0.5068531468531469,0.5902097902097903 +0.011748251748251748,0.7468531468531469,0.3795804195804196,0.5071328671328671,0.5843356643356643 +0.011748251748251748,0.7490909090909091,0.3829370629370629,0.5082517482517482,0.5770629370629371 +0.011748251748251748,0.7516083916083917,0.3862937062937063,0.5096503496503496,0.5801398601398602 +0.011748251748251748,0.7532867132867133,0.3890909090909091,0.5116083916083916,0.5882517482517482 +0.011748251748251748,0.7544055944055944,0.39132867132867133,0.5121678321678321,0.5921678321678322 +0.012307692307692308,0.754965034965035,0.39356643356643356,0.5127272727272727,0.5893706293706293 +0.012307692307692308,0.7558041958041958,0.3974825174825175,0.5107692307692308,0.5815384615384616 +0.012587412587412588,0.7569230769230769,0.4011188811188811,0.5118881118881119,0.5868531468531468 +0.014545454545454545,0.7555244755244755,0.40251748251748254,0.5138461538461538,0.5977622377622378 +0.016223776223776225,0.7535664335664336,0.40335664335664334,0.5135664335664336,0.5988811188811188 +0.017622377622377623,0.7552447552447552,0.40615384615384614,0.5121678321678321,0.6025174825174825 +0.018741258741258742,0.7457342657342657,0.40755244755244757,0.5116083916083916,0.6008391608391609 +0.02097902097902098,0.746013986013986,0.40895104895104895,0.5135664335664336,0.594965034965035 +0.022377622377622378,0.7572027972027972,0.41174825174825175,0.5135664335664336,0.591048951048951 +0.024055944055944058,0.7616783216783217,0.4125874125874126,0.5132867132867133,0.5882517482517482 +0.025454545454545455,0.7597202797202797,0.4151048951048951,0.5144055944055944,0.5848951048951049 +0.026853146853146853,0.7594405594405594,0.41762237762237764,0.5152447552447552,0.5935664335664336 +0.027692307692307693,0.7622377622377622,0.42013986013986016,0.514965034965035,0.5969230769230769 +0.0344055944055944,0.765034965034965,0.42153846153846153,0.5160839160839161,0.5991608391608392 +0.10293706293706294,0.7658741258741258,0.4254545454545455,0.5158041958041958,0.5944055944055944 +0.10685314685314685,0.7653146853146853,0.42685314685314685,0.5163636363636364,0.5932867132867133 +0.10797202797202797,0.7658741258741258,0.4288111888111888,0.5180419580419581,0.6016783216783217 +0.10965034965034966,0.7675524475524476,0.4302097902097902,0.5194405594405594,0.6036363636363636 +0.11048951048951049,0.7661538461538462,0.431048951048951,0.5197202797202797,0.6092307692307692 +0.11020979020979021,0.7672727272727272,0.4341258741258741,0.5188811188811189,0.6125874125874126 +0.11020979020979021,0.7597202797202797,0.43636363636363634,0.5191608391608392,0.6075524475524475 +0.10853146853146853,0.7457342657342657,0.4372027972027972,0.5194405594405594,0.6011188811188811 +0.10713286713286713,0.7560839160839161,0.4372027972027972,0.5194405594405594,0.5986013986013986 +0.10685314685314685,0.7655944055944056,0.4397202797202797,0.52,0.591048951048951 +0.10825174825174826,0.7653146853146853,0.4425174825174825,0.5205594405594406,0.5846153846153846 +0.11104895104895104,0.7667132867132868,0.44447552447552446,0.5208391608391608,0.5963636363636363 +0.11188811188811189,0.7675524475524476,0.4453146853146853,0.5222377622377622,0.6058741258741259 +0.11132867132867133,0.7664335664335664,0.4467132867132867,0.5222377622377622,0.6072727272727273 +0.11104895104895104,0.7655944055944056,0.446993006993007,0.5222377622377622,0.6044755244755244 +0.11188811188811189,0.7647552447552447,0.44783216783216784,0.5233566433566433,0.5974825174825175 +0.11104895104895104,0.7683916083916084,0.4486713286713287,0.5227972027972028,0.5952447552447553 +0.11076923076923077,0.7689510489510489,0.4495104895104895,0.5230769230769231,0.6019580419580419 +0.11020979020979021,0.772027972027972,0.45174825174825173,0.5236363636363637,0.6134265734265735 +0.11020979020979021,0.7762237762237763,0.45650349650349653,0.5227972027972028,0.617062937062937 +0.10993006993006993,0.7703496503496503,0.46237762237762237,0.5230769230769231,0.6195804195804195 +0.10937062937062937,0.7544055944055944,0.466013986013986,0.5253146853146853,0.6179020979020979 +0.10853146853146853,0.766993006993007,0.4707692307692308,0.5267132867132868,0.6179020979020979 +0.10853146853146853,0.7809790209790209,0.47160839160839163,0.5264335664335664,0.6106293706293706 +0.1076923076923077,0.7820979020979021,0.47160839160839163,0.5230769230769231,0.6 +0.1076923076923077,0.7820979020979021,0.473006993006993,0.5247552447552447,0.5927272727272728 +0.10741258741258741,0.7832167832167832,0.4735664335664336,0.5297902097902097,0.5882517482517482 +0.10657342657342657,0.7826573426573427,0.4763636363636364,0.5289510489510489,0.6030769230769231 +0.10657342657342657,0.7823776223776224,0.47664335664335666,0.5278321678321678,0.6176223776223776 +0.10657342657342657,0.784055944055944,0.4797202797202797,0.5295104895104895,0.622937062937063 +0.1062937062937063,0.7851748251748252,0.481958041958042,0.5306293706293707,0.6246153846153846 +0.1062937062937063,0.7854545454545454,0.4881118881118881,0.5309090909090909,0.627972027972028 +0.10601398601398601,0.786013986013986,0.4934265734265734,0.5311888111888112,0.6346853146853146 +0.10601398601398601,0.7876923076923077,0.49874125874125874,0.5309090909090909,0.6394405594405594 +0.1062937062937063,0.7846153846153846,0.5012587412587413,0.5311888111888112,0.6383216783216783 +0.1062937062937063,0.7804195804195804,0.5054545454545455,0.532027972027972,0.6425174825174825 +0.1062937062937063,0.7384615384615385,0.5082517482517482,0.5323076923076923,0.646993006993007 +0.1062937062937063,0.7843356643356644,0.5116083916083916,0.5323076923076923,0.6489510489510489 +0.10601398601398601,0.7932867132867133,0.5141258741258741,0.5325874125874126,0.6495104895104895 +0.10601398601398601,0.7941258741258741,0.5158041958041958,0.5325874125874126,0.6467132867132868 +0.10573426573426574,0.7921678321678322,0.5174825174825175,0.532027972027972,0.6481118881118881 +0.10573426573426574,0.7938461538461539,0.5197202797202797,0.5323076923076923,0.6472727272727272 +0.10573426573426574,0.7944055944055944,0.5216783216783217,0.532027972027972,0.6478321678321678 +0.10573426573426574,0.7963636363636364,0.5227972027972028,0.5334265734265734,0.6500699300699301 +0.10573426573426574,0.7966433566433566,0.525034965034965,0.5328671328671328,0.6517482517482518 +0.10573426573426574,0.7972027972027972,0.5261538461538462,0.5323076923076923,0.6464335664335664 +0.10573426573426574,0.798041958041958,0.5306293706293707,0.5325874125874126,0.6408391608391608 +0.10573426573426574,0.8,0.5325874125874126,0.5334265734265734,0.6436363636363637 +0.10573426573426574,0.8013986013986014,0.5362237762237763,0.5314685314685315,0.6467132867132868 +0.10573426573426574,0.8008391608391608,0.5418181818181819,0.5311888111888112,0.6497902097902097 +0.10545454545454545,0.801958041958042,0.5437762237762238,0.5323076923076923,0.6517482517482518 +0.10545454545454545,0.8036363636363636,0.5471328671328671,0.533986013986014,0.6523076923076923 +0.10517482517482518,0.8002797202797203,0.5499300699300699,0.5345454545454545,0.6534265734265734 +0.1048951048951049,0.7278321678321679,0.551048951048951,0.5323076923076923,0.6551048951048951 +0.1048951048951049,0.7946853146853147,0.554965034965035,0.5328671328671328,0.6565034965034965 +0.1048951048951049,0.8064335664335665,0.5574825174825175,0.5345454545454545,0.6579020979020979 +0.1048951048951049,0.806993006993007,0.56,0.5353846153846153,0.6584615384615384 +0.1048951048951049,0.808951048951049,0.5641958041958042,0.5351048951048951,0.6562237762237763 +0.1048951048951049,0.8097902097902098,0.5664335664335665,0.5345454545454545,0.6542657342657343 +0.10461538461538461,0.8097902097902098,0.5697902097902098,0.5348251748251748,0.6570629370629371 +0.1048951048951049,0.8120279720279721,0.5787412587412587,0.5356643356643357,0.6559440559440559 +0.10517482517482518,0.8125874125874126,0.5868531468531468,0.5345454545454545,0.6551048951048951 +0.10517482517482518,0.8117482517482517,0.5885314685314685,0.5351048951048951,0.6551048951048951 +0.10517482517482518,0.8081118881118882,0.5893706293706293,0.5356643356643357,0.6570629370629371 +0.10517482517482518,0.796923076923077,0.5899300699300699,0.5356643356643357,0.6598601398601398 +0.10573426573426574,0.7882517482517483,0.5893706293706293,0.5365034965034965,0.6629370629370629 +0.10573426573426574,0.8044755244755245,0.5888111888111888,0.5365034965034965,0.6573426573426573 +0.10573426573426574,0.8125874125874126,0.5882517482517482,0.5365034965034965,0.6517482517482518 +0.10573426573426574,0.8137062937062937,0.5888111888111888,0.5365034965034965,0.6483916083916084 +0.10573426573426574,0.8125874125874126,0.5896503496503497,0.5365034965034965,0.6534265734265734 +0.10601398601398601,0.8125874125874126,0.5907692307692308,0.5367832167832168,0.6579020979020979 +0.10601398601398601,0.8131468531468532,0.5904895104895105,0.5365034965034965,0.6595804195804196 +0.10601398601398601,0.8142657342657342,0.5893706293706293,0.5370629370629371,0.6601398601398601 +0.1062937062937063,0.8156643356643357,0.587972027972028,0.5373426573426573,0.6626573426573427 +0.10601398601398601,0.8176223776223777,0.5874125874125874,0.5370629370629371,0.6618181818181819 +0.10601398601398601,0.8179020979020979,0.5832167832167832,0.5373426573426573,0.6618181818181819 +0.10601398601398601,0.8184615384615385,0.5815384615384616,0.5373426573426573,0.6620979020979021 +0.10601398601398601,0.8187412587412587,0.580979020979021,0.5376223776223776,0.6601398601398601 +0.10601398601398601,0.819020979020979,0.5812587412587412,0.5384615384615384,0.6629370629370629 +0.10601398601398601,0.8195804195804196,0.5781818181818181,0.5384615384615384,0.6662937062937063 +0.1062937062937063,0.8198601398601398,0.580979020979021,0.5387412587412588,0.6668531468531469 +0.1062937062937063,0.820979020979021,0.586013986013986,0.5398601398601398,0.6685314685314685 +0.10657342657342657,0.8212587412587412,0.5938461538461538,0.5401398601398602,0.6657342657342658 +0.10657342657342657,0.8223776223776224,0.5974825174825175,0.5401398601398602,0.6665734265734266 +0.10685314685314685,0.8229370629370629,0.6011188811188811,0.5406993006993007,0.6702097902097902 +0.10685314685314685,0.8234965034965035,0.6055944055944056,0.5395804195804196,0.6735664335664335 +0.10685314685314685,0.8232167832167833,0.6095104895104895,0.5398601398601398,0.6721678321678322 +0.10685314685314685,0.8246153846153846,0.6128671328671329,0.5404195804195804,0.6704895104895104 +0.10741258741258741,0.826013986013986,0.6156643356643356,0.540979020979021,0.6612587412587413 +0.1076923076923077,0.8276923076923077,0.6176223776223776,0.5415384615384615,0.6593006993006993 +0.10797202797202797,0.8237762237762237,0.619020979020979,0.5418181818181819,0.6665734265734266 +0.10797202797202797,0.7577622377622377,0.619020979020979,0.540979020979021,0.6696503496503496 +0.10825174825174826,0.8215384615384616,0.6237762237762238,0.540979020979021,0.6704895104895104 +0.10825174825174826,0.826013986013986,0.6293706293706294,0.5418181818181819,0.6713286713286714 +0.10853146853146853,0.8276923076923077,0.633006993006993,0.5432167832167832,0.6724475524475525 +0.10853146853146853,0.8276923076923077,0.6318881118881119,0.5437762237762238,0.6738461538461539 +0.10909090909090909,0.8282517482517483,0.6310489510489511,0.5420979020979021,0.6738461538461539 +0.10909090909090909,0.8288111888111888,0.6372027972027972,0.5429370629370629,0.673006993006993 +0.10909090909090909,0.8304895104895105,0.6397202797202797,0.5448951048951048,0.6732867132867133 +0.10965034965034966,0.8307692307692308,0.6461538461538462,0.5451748251748252,0.673006993006993 +0.10993006993006993,0.8316083916083916,0.6495104895104895,0.5434965034965035,0.6755244755244755 +0.11020979020979021,0.8327272727272728,0.6537062937062937,0.5443356643356644,0.6766433566433566 +0.11020979020979021,0.8335664335664336,0.6562237762237763,0.546013986013986,0.6791608391608391 +0.11048951048951049,0.8335664335664336,0.6598601398601398,0.5465734265734266,0.6822377622377622 +0.11048951048951049,0.8338461538461538,0.6637762237762238,0.5454545454545454,0.6802797202797203 +0.11132867132867133,0.8344055944055944,0.6662937062937063,0.5465734265734266,0.6811188811188811 +0.1116083916083916,0.8341258741258741,0.6690909090909091,0.5474125874125874,0.6808391608391609 +0.11188811188811189,0.8352447552447553,0.6685314685314685,0.5474125874125874,0.6822377622377622 +0.11216783216783217,0.8346853146853147,0.6696503496503496,0.5468531468531469,0.6836363636363636 +0.11216783216783217,0.8268531468531468,0.6724475524475525,0.5476923076923077,0.6841958041958042 +0.11216783216783217,0.7773426573426574,0.6786013986013986,0.5479720279720279,0.6844755244755245 +0.11216783216783217,0.8318881118881118,0.6811188811188811,0.5502097902097902,0.6853146853146853 +0.11244755244755245,0.8386013986013986,0.6864335664335665,0.5485314685314685,0.6813986013986014 +0.11244755244755245,0.8388811188811188,0.6878321678321678,0.5507692307692308,0.6794405594405595 +0.11244755244755245,0.8369230769230769,0.6895104895104895,0.5521678321678322,0.678041958041958 +0.11244755244755245,0.8369230769230769,0.6923076923076923,0.5527272727272727,0.6735664335664335 +0.11244755244755245,0.8383216783216784,0.693986013986014,0.5476923076923077,0.6716083916083916 +0.11244755244755245,0.8386013986013986,0.6956643356643356,0.5518881118881119,0.6755244755244755 +0.11244755244755245,0.8391608391608392,0.6970629370629371,0.5541258741258741,0.6777622377622378 +0.11244755244755245,0.8394405594405594,0.6979020979020979,0.554965034965035,0.6788811188811189 +0.11244755244755245,0.84,0.7001398601398602,0.5524475524475524,0.6797202797202797 +0.11244755244755245,0.8366433566433567,0.7046153846153846,0.5541258741258741,0.6788811188811189 +0.11244755244755245,0.8346853146853147,0.7062937062937062,0.5602797202797203,0.673006993006993 +0.11216783216783217,0.8296503496503497,0.707972027972028,0.5622377622377622,0.6559440559440559 +0.11216783216783217,0.8302097902097902,0.7099300699300699,0.5555244755244755,0.6408391608391608 +0.11216783216783217,0.8332867132867133,0.711048951048951,0.5588811188811189,0.6383216783216783 +0.11216783216783217,0.8366433566433567,0.713006993006993,0.5686713286713286,0.6467132867132868 +0.11216783216783217,0.8377622377622378,0.7138461538461538,0.5675524475524476,0.6556643356643357 +0.11216783216783217,0.8402797202797203,0.7144055944055944,0.5586013986013986,0.6573426573426573 +0.11216783216783217,0.8433566433566434,0.7155244755244755,0.5622377622377622,0.6604195804195804 +0.11216783216783217,0.8427972027972028,0.7163636363636363,0.5672727272727273,0.6744055944055944 +0.11216783216783217,0.84,0.7177622377622378,0.5678321678321678,0.6811188811188811 +0.11216783216783217,0.8386013986013986,0.7194405594405594,0.5622377622377622,0.6836363636363636 +0.11244755244755245,0.8313286713286713,0.7194405594405594,0.5672727272727273,0.6841958041958042 +0.11244755244755245,0.831048951048951,0.7197202797202797,0.5725874125874126,0.6861538461538461 +0.11272727272727273,0.8388811188811188,0.7216783216783217,0.5770629370629371,0.6855944055944055 +0.11272727272727273,0.8433566433566434,0.7216783216783217,0.580979020979021,0.6864335664335665 +0.11272727272727273,0.8441958041958042,0.7208391608391609,0.5946853146853147,0.6906293706293706 +0.11272727272727273,0.8427972027972028,0.7222377622377623,0.5946853146853147,0.6925874125874126 +0.113006993006993,0.8422377622377623,0.7233566433566434,0.5941258741258741,0.6962237762237762 +0.113006993006993,0.8427972027972028,0.7239160839160839,0.5969230769230769,0.6909090909090909 +0.113006993006993,0.8427972027972028,0.7253146853146853,0.6008391608391609,0.6794405594405595 +0.113006993006993,0.8461538461538461,0.7272727272727273,0.6022377622377623,0.6794405594405595 +0.113006993006993,0.8464335664335665,0.7286713286713287,0.6033566433566434,0.6758041958041958 +0.113006993006993,0.8458741258741259,0.7281118881118881,0.605034965034965,0.6783216783216783 +0.113006993006993,0.8453146853146853,0.7303496503496504,0.6041958041958042,0.6858741258741259 +0.113006993006993,0.8394405594405594,0.73006993006993,0.6055944055944056,0.6878321678321678 +0.113006993006993,0.8402797202797203,0.730909090909091,0.6072727272727273,0.6892307692307692 +0.113006993006993,0.8430769230769231,0.732027972027972,0.61006993006993,0.6895104895104895 +0.113006993006993,0.8472727272727273,0.7323076923076923,0.61006993006993,0.6892307692307692 +0.113006993006993,0.8478321678321679,0.7334265734265735,0.612027972027972,0.6895104895104895 +0.113006993006993,0.848951048951049,0.733986013986014,0.6139860139860139,0.6861538461538461 +0.113006993006993,0.8495104895104895,0.7351048951048951,0.6137062937062937,0.6816783216783217 +0.113006993006993,0.8486713286713287,0.735944055944056,0.6139860139860139,0.6827972027972028 +0.113006993006993,0.8497902097902098,0.7362237762237762,0.6162237762237762,0.6836363636363636 diff --git a/results/bt_1h128n_ReLU_results.csv b/results/bt_1h128n_ReLU_results.csv new file mode 100644 index 0000000..80bc803 --- /dev/null +++ b/results/bt_1h128n_ReLU_results.csv @@ -0,0 +1,401 @@ +training_accuracy,validation_accuracy,training_loss,validation_loss,test_accuracy,test_loss +0.038811188811188814,0.019580419580419582,6.393057707616091,4.424285425524005,0.005,11.902604900906708 +0.061888111888111885,0.07132867132867132,3.9845982330615697,3.9789311938961127,, +0.16783216783216784,0.16783216783216784,3.7523821576223106,3.73892906486598,, +0.20104895104895104,0.2111888111888112,3.547375963126129,3.5325973891094073,, +0.21573426573426574,0.24335664335664337,3.3889472691926317,3.3784455129417115,, +0.23986013986013985,0.27412587412587414,3.2452346036953097,3.2397597229873654,, +0.2765734265734266,0.3062937062937063,3.105799184604157,3.105523916826381,, +0.30524475524475525,0.3202797202797203,2.974008278291045,2.9807005713549932,, +0.32342657342657344,0.3412587412587413,2.851272600241783,2.8633433589565733,, +0.34440559440559443,0.35664335664335667,2.734853740721626,2.7516118580217057,, +0.3632867132867133,0.36643356643356645,2.621368308580227,2.6435472302556806,, +0.38006993006993006,0.38181818181818183,2.509419887826101,2.539612409717918,, +0.3996503496503496,0.3986013986013986,2.403726365402373,2.4406362731369544,, +0.42202797202797204,0.413986013986014,2.308426181453028,2.3469294625743102,, +0.436013986013986,0.42377622377622376,2.2211191866913147,2.2605116663938296,, +0.4486013986013986,0.43776223776223777,2.1401110491667907,2.1821801077271625,, +0.46678321678321677,0.46293706293706294,2.064477867947346,2.1105243264683984,, +0.48391608391608393,0.4727272727272727,1.994366376479573,2.0460212523098784,, +0.4972027972027972,0.4783216783216783,1.929564498384421,1.9876044250342433,, +0.5087412587412588,0.4881118881118881,1.8693292144897695,1.9341425261979983,, +0.5241258741258741,0.49230769230769234,1.8139224030421812,1.8846863061732506,, +0.5405594405594406,0.5048951048951049,1.7622262223437983,1.83837352939355,, +0.5534965034965035,0.5188811188811189,1.714016525703335,1.7954754044442,, +0.563986013986014,0.5328671328671328,1.6687527498049022,1.7546248297241294,, +0.5723776223776224,0.5482517482517483,1.6258644869700987,1.7157204875655092,, +0.5842657342657342,0.5566433566433566,1.5853954338793133,1.6793711405187335,, +0.5947552447552448,0.5706293706293706,1.5469014110749013,1.644938588911164,, +0.6055944055944056,0.5818181818181818,1.5102016832585097,1.6123021607656616,, +0.6174825174825175,0.5888111888111888,1.4753172002652277,1.581162917786896,, +0.6342657342657343,0.6013986013986014,1.4426747107366018,1.5524952879150062,, +0.6234265734265734,0.6,1.437213750108359,1.5687059299238513,, +0.5961538461538461,0.5678321678321678,1.4814467405677567,1.622348542065846,, +0.6223776223776224,0.6027972027972028,1.416683287828632,1.5488620058290425,, +0.6384615384615384,0.6125874125874126,1.3745146293628525,1.5070317252590513,, +0.6493006993006993,0.6265734265734266,1.3423865754262512,1.4766873403236087,, +0.6580419580419581,0.6335664335664336,1.315826644295191,1.4525128796359559,, +0.6636363636363637,0.6391608391608392,1.2918495064750344,1.430728196927532,, +0.6713286713286714,0.6475524475524476,1.2673976692943372,1.4078775136297337,, +0.6786713286713286,0.6531468531468532,1.2440141031244953,1.3860083679370314,, +0.6828671328671329,0.6531468531468532,1.2225187419435568,1.3664157247318005,, +0.6895104895104895,0.6671328671328671,1.199199180426684,1.3446421905043267,, +0.6923076923076923,0.6741258741258741,1.1776850306235038,1.324060313273129,, +0.6975524475524476,0.6783216783216783,1.157110950827814,1.3045481230790203,, +0.7062937062937062,0.6839160839160839,1.1368607348756332,1.2847942378546264,, +0.7118881118881119,0.6937062937062937,1.1165596106772973,1.2646542083734644,, +0.7185314685314685,0.7034965034965035,1.0962060621974061,1.244319672831613,, +0.7251748251748251,0.7118881118881119,1.0775863118246656,1.2259321395759932,, +0.7307692307692307,0.7160839160839161,1.060454814393957,1.2089018768858784,, +0.7346153846153847,0.7258741258741259,1.0439702047034873,1.1925118787450188,, +0.7384615384615385,0.73006993006993,1.0279636945114625,1.1765035855084014,, +0.7426573426573426,0.737062937062937,1.011891048956524,1.1603082123734547,, +0.7468531468531469,0.7384615384615385,0.9965589565541074,1.1447441459099315,, +0.7520979020979021,0.7412587412587412,0.9812919885739722,1.1291320261250148,, +0.7580419580419581,0.7496503496503496,0.966097016893109,1.1136842983266404,, +0.7618881118881119,0.7538461538461538,0.9513886433919149,1.0986762135598267,, +0.765034965034965,0.7552447552447552,0.9375878985390935,1.0847650421521045,, +0.7692307692307693,0.7566433566433567,0.9250631304970762,1.0725547354217941,, +0.772027972027972,0.7636363636363637,0.9132519618891549,1.0609879143115475,, +0.7762237762237763,0.7636363636363637,0.9015459602772413,1.0493720753096798,, +0.7772727272727272,0.7678321678321678,0.8892439639360892,1.037002738019266,, +0.7828671328671328,0.7706293706293706,0.8774895355842973,1.0253320508717176,, +0.7863636363636364,0.7706293706293706,0.8658329626409835,1.01362667276598,, +0.7916083916083916,0.7734265734265734,0.8546794043173643,1.0025531835413701,, +0.7933566433566434,0.7734265734265734,0.8438615748964038,0.9917907963972437,, +0.7965034965034965,0.7762237762237763,0.8333783921238097,0.9815615944170573,, +0.7986013986013986,0.7776223776223776,0.8233494606617316,0.9718676470084168,, +0.8,0.7776223776223776,0.8142087045062824,0.9631735404108931,, +0.8024475524475524,0.779020979020979,0.8055572904920124,0.9550423453653094,, +0.8038461538461539,0.7804195804195804,0.7974506602416759,0.9476143891485486,, +0.8076923076923077,0.7832167832167832,0.7891565843722607,0.9398005770691026,, +0.8097902097902098,0.786013986013986,0.7811394184752668,0.932329095369298,, +0.8122377622377622,0.786013986013986,0.7734192190307038,0.9252579017858467,, +0.8129370629370629,0.7846153846153846,0.7663496217726583,0.9189669756880081,, +0.8160839160839161,0.7846153846153846,0.7590579658322949,0.9122104559348019,, +0.8171328671328671,0.786013986013986,0.7519676036295828,0.9056122843196367,, +0.8195804195804196,0.7874125874125875,0.7448404774072959,0.8989313070461413,, +0.8213286713286714,0.7888111888111888,0.7376309962277134,0.8920762316789772,, +0.8223776223776224,0.7902097902097902,0.7303351495565,0.8850566077378048,, +0.8227272727272728,0.7944055944055944,0.7231511121436227,0.8781260192540412,, +0.8248251748251748,0.7958041958041958,0.7161559885896078,0.8714681573836499,, +0.8276223776223777,0.7986013986013986,0.7094243600002218,0.8651138719138035,, +0.8304195804195804,0.7986013986013986,0.7029206627905166,0.8590038894788389,, +0.8325174825174825,0.8041958041958042,0.696580610664915,0.8530319481772916,, +0.8332167832167832,0.8055944055944056,0.6904835856070884,0.8473692501964367,, +0.8356643356643356,0.8055944055944056,0.6845144739985044,0.84183413033758,, +0.8367132867132867,0.8083916083916084,0.6787705799214523,0.8366698561563649,, +0.8395104895104896,0.8111888111888111,0.673056791191927,0.8315509266005122,, +0.8398601398601399,0.8153846153846154,0.6674282584926006,0.8265499888803137,, +0.8402097902097903,0.8167832167832167,0.6619811367504673,0.8216820574951014,, +0.8405594405594405,0.8181818181818182,0.6566156743804398,0.8168627874070057,, +0.8419580419580419,0.8195804195804196,0.6513404906007424,0.8121313969550531,, +0.8426573426573427,0.8195804195804196,0.6461879832824878,0.8075395974525217,, +0.843006993006993,0.820979020979021,0.6411945668461844,0.8030902823578719,, +0.8444055944055944,0.820979020979021,0.6363466944943622,0.798806941469012,, +0.8444055944055944,0.8223776223776224,0.6315867126586852,0.794634247701298,, +0.8454545454545455,0.8223776223776224,0.6269059404511083,0.7905163497781146,, +0.8486013986013986,0.8237762237762237,0.6223473530856064,0.7865190153571869,, +0.8506993006993007,0.8265734265734266,0.6178500346577955,0.7825200702889235,, +0.8527972027972028,0.8293706293706293,0.6134392565077933,0.7786267436350723,, +0.8534965034965035,0.8321678321678322,0.6091360668539197,0.7748232650743433,, +0.8545454545454545,0.8335664335664336,0.6049043301108064,0.7711060437287951,, +0.8555944055944056,0.8335664335664336,0.6007900290441675,0.7675295154191503,, +0.855944055944056,0.8349650349650349,0.5967736590078688,0.7640587461411142,, +0.8566433566433567,0.8349650349650349,0.5928488577155713,0.7607200279498646,, +0.856993006993007,0.8349650349650349,0.5889981768421532,0.7575087581495752,, +0.8573426573426574,0.8363636363636363,0.5852159828739676,0.7542851054170967,, +0.8576923076923076,0.8363636363636363,0.5814956022369508,0.7511261697263104,, +0.8590909090909091,0.8377622377622378,0.5778345564281717,0.7480160383795313,, +0.8597902097902098,0.8377622377622378,0.5742345980334811,0.7449932545258477,, +0.8604895104895105,0.8377622377622378,0.5707001226043489,0.7420538727286314,, +0.8604895104895105,0.8377622377622378,0.5672242119522065,0.7391782783320443,, +0.8611888111888112,0.8377622377622378,0.5638013759074683,0.7363752661699542,, +0.8622377622377623,0.8377622377622378,0.5604299662675772,0.733604275237464,, +0.8625874125874126,0.8391608391608392,0.5571142482263086,0.730894022004846,, +0.8625874125874126,0.8391608391608392,0.553849399115484,0.728285085741934,, +0.8639860139860139,0.8391608391608392,0.5506392245832176,0.7256658911191665,, +0.8646853146853147,0.8405594405594405,0.5474755631501967,0.7231211968216628,, +0.8646853146853147,0.8405594405594405,0.5443572500952057,0.7206277604669946,, +0.8653846153846154,0.8405594405594405,0.5412845002956146,0.7181690102994878,, +0.8657342657342657,0.8419580419580419,0.5382548130615198,0.7157418499673489,, +0.8664335664335664,0.8433566433566434,0.5352669309251715,0.7133577600077438,, +0.8685314685314686,0.8447552447552448,0.5323167199800389,0.7109988416866246,, +0.8692307692307693,0.8461538461538461,0.5294013825862169,0.7086920098789949,, +0.8699300699300699,0.8475524475524475,0.5265268388557007,0.7064247287167126,, +0.8702797202797202,0.8475524475524475,0.5236924884166508,0.7041684412943551,, +0.8716783216783217,0.8475524475524475,0.520896140989342,0.7019681432505747,, +0.8723776223776224,0.8475524475524475,0.518135288154923,0.6998087590791549,, +0.8730769230769231,0.8475524475524475,0.5154073462119959,0.697645904530215,, +0.8734265734265734,0.848951048951049,0.5127118227655683,0.6955359460654298,, +0.8741258741258742,0.848951048951049,0.5100503673283945,0.693450345407703,, +0.8744755244755245,0.848951048951049,0.5074169591655656,0.6914004053415536,, +0.8755244755244755,0.8517482517482518,0.5048139070950527,0.6893822908073006,, +0.8758741258741258,0.8503496503496504,0.5022388203367849,0.6874237647178243,, +0.8765734265734266,0.8503496503496504,0.4996961723903023,0.6854394899477907,, +0.8765734265734266,0.8503496503496504,0.4971854634381349,0.68352695343613,, +0.877972027972028,0.8503496503496504,0.49470493715832464,0.6816194363882497,, +0.8786713286713287,0.8503496503496504,0.4922539434752675,0.6797341153065294,, +0.879020979020979,0.8517482517482518,0.4898315704029924,0.6778677859835772,, +0.8800699300699301,0.8517482517482518,0.4874376335899764,0.676024636628574,, +0.8807692307692307,0.8517482517482518,0.48507227721831425,0.6742008994352066,, +0.8807692307692307,0.8517482517482518,0.4827295363648105,0.6724167602449469,, +0.8818181818181818,0.8517482517482518,0.48041554606960396,0.6706431109694873,, +0.8825174825174825,0.8531468531468531,0.47812807566959203,0.6688950412303597,, +0.8828671328671329,0.8531468531468531,0.47586494112641514,0.6671813634884427,, +0.8828671328671329,0.8531468531468531,0.47362707061352943,0.6654690120247269,, +0.8832167832167832,0.8531468531468531,0.47141449691046233,0.6637974796216513,, +0.8835664335664336,0.8517482517482518,0.46922742141935825,0.6621791645478712,, +0.8839160839160839,0.8531468531468531,0.4670554085026014,0.6605096170197975,, +0.8853146853146853,0.8531468531468531,0.4649079287597316,0.6588856698181031,, +0.8860139860139861,0.8545454545454545,0.4627844019115648,0.6573029446271528,, +0.8863636363636364,0.8545454545454545,0.4606837656533336,0.6557227610427312,, +0.8867132867132868,0.8545454545454545,0.4586044737529252,0.6541503632788631,, +0.8874125874125874,0.855944055944056,0.4565457056153967,0.6526087081756855,, +0.8874125874125874,0.855944055944056,0.45450031437603217,0.6511156807157686,, +0.8881118881118881,0.8573426573426574,0.452469631223566,0.6496579647015781,, +0.8881118881118881,0.8573426573426574,0.45043736119726824,0.6481775940109681,, +0.8884615384615384,0.855944055944056,0.44842718903608775,0.6467032517142088,, +0.8888111888111888,0.8545454545454545,0.4464307357485297,0.6452403676155243,, +0.8895104895104895,0.8545454545454545,0.4444547818783156,0.6438218038608309,, +0.8895104895104895,0.8545454545454545,0.4424953376969365,0.6423810112788174,, +0.8895104895104895,0.8545454545454545,0.44055643028671193,0.6409952419489282,, +0.8909090909090909,0.8545454545454545,0.43863776812521277,0.6396045339447246,, +0.8916083916083916,0.855944055944056,0.43673839282594384,0.6382439837401861,, +0.8923076923076924,0.855944055944056,0.4348567633176291,0.6368913686968546,, +0.8926573426573426,0.855944055944056,0.4329933826878536,0.6355552678264379,, +0.8933566433566433,0.855944055944056,0.43114814780487865,0.6342286874365796,, +0.8937062937062937,0.855944055944056,0.42932036775475707,0.6329448679387268,, +0.8937062937062937,0.855944055944056,0.4275090771066927,0.6316505883129272,, +0.8944055944055944,0.855944055944056,0.42571281405848455,0.6303612498500293,, +0.8944055944055944,0.855944055944056,0.4239325735285791,0.6290800531887386,, +0.8944055944055944,0.855944055944056,0.42216648298555526,0.6278178449316542,, +0.8951048951048951,0.855944055944056,0.4204148081434475,0.6265670036792441,, +0.8951048951048951,0.855944055944056,0.4186784305858992,0.625335890551962,, +0.8958041958041958,0.855944055944056,0.4169577559985044,0.6241198412982444,, +0.8968531468531469,0.855944055944056,0.41525346412907493,0.62291000404537,, +0.8968531468531469,0.855944055944056,0.41356243263670045,0.6217139501631839,, +0.8968531468531469,0.855944055944056,0.41188512504531605,0.6205233751222432,, +0.8989510489510489,0.855944055944056,0.4102159602499308,0.6193594557306982,, +0.8993006993006993,0.8573426573426574,0.4085575168400502,0.6181767234483239,, +0.9,0.8573426573426574,0.406898091460201,0.6170434103665362,, +0.9,0.8573426573426574,0.4052500427150192,0.6158886398513813,, +0.901048951048951,0.8573426573426574,0.4036157452162119,0.6147516539846416,, +0.901048951048951,0.8587412587412587,0.4019939478652895,0.6136297287817403,, +0.9013986013986014,0.8587412587412587,0.400385182512734,0.6125080100137715,, +0.9020979020979021,0.8587412587412587,0.39879080421913493,0.6114125972892116,, +0.9020979020979021,0.8601398601398601,0.39720657925460967,0.6103201241308411,, +0.9024475524475525,0.8601398601398601,0.39563412527779157,0.6092339273235348,, +0.9031468531468532,0.8601398601398601,0.3940736903916854,0.6081884836850824,, +0.9034965034965035,0.8615384615384616,0.39252519715472944,0.6071068279271707,, +0.9038461538461539,0.8615384615384616,0.3909877153192137,0.6060480518254954,, +0.9038461538461539,0.862937062937063,0.3894634719418215,0.6049849581883495,, +0.9041958041958041,0.862937062937063,0.38795354075106675,0.6039482257486838,, +0.9041958041958041,0.862937062937063,0.38645505410023534,0.6029205510591219,, +0.9045454545454545,0.862937062937063,0.38496941086665315,0.6018983393577093,, +0.9055944055944056,0.8615384615384616,0.38349550107534575,0.600883117240084,, +0.9059440559440559,0.8601398601398601,0.38203256190047524,0.5998768645013188,, +0.9062937062937063,0.8615384615384616,0.38058017939908584,0.5988757069951127,, +0.906993006993007,0.8615384615384616,0.3791385133872387,0.5978921137623348,, +0.9073426573426573,0.8615384615384616,0.3777074628405843,0.5969167016464789,, +0.9083916083916084,0.8615384615384616,0.3762867127398134,0.5959361915832547,, +0.9087412587412588,0.8615384615384616,0.3748756581619316,0.5949720305783379,, +0.9094405594405595,0.8615384615384616,0.3734750051104741,0.5940171252536561,, +0.9097902097902097,0.8615384615384616,0.3720843518557027,0.5930810535764094,, +0.9101398601398601,0.8615384615384616,0.37070386923285203,0.5921452489906264,, +0.9104895104895104,0.8615384615384616,0.36933285928928034,0.5912052891622114,, +0.9104895104895104,0.8615384615384616,0.36797075838619686,0.590285715917607,, +0.9108391608391608,0.8615384615384616,0.36661633242485114,0.589347585844113,, +0.9111888111888112,0.8615384615384616,0.365271276215104,0.5884337634993637,, +0.9108391608391608,0.8615384615384616,0.36393404164337123,0.5875374263164678,, +0.9115384615384615,0.862937062937063,0.36260413636138566,0.5866329908531599,, +0.9115384615384615,0.862937062937063,0.36128325362782066,0.5857386605438457,, +0.9118881118881119,0.8643356643356643,0.35997168402294116,0.5848474960011882,, +0.9118881118881119,0.8643356643356643,0.35866835402869146,0.5839650252794272,, +0.9122377622377622,0.862937062937063,0.3573746174438719,0.5830943423303864,, +0.9122377622377622,0.862937062937063,0.3560890381179709,0.5822084242682377,, +0.9125874125874126,0.8643356643356643,0.3548117107886054,0.5813361985195449,, +0.9125874125874126,0.8643356643356643,0.35354272001452897,0.5804842186173711,, +0.9132867132867133,0.8643356643356643,0.35228213118887847,0.5796388589302973,, +0.9129370629370629,0.8657342657342657,0.3510305015289124,0.5788000920701826,, +0.9132867132867133,0.8657342657342657,0.34978725447285536,0.5779639686260436,, +0.9136363636363637,0.8657342657342657,0.34855258242001275,0.5771436947701198,, +0.9136363636363637,0.8657342657342657,0.3473261962597384,0.5763246944431208,, +0.9143356643356644,0.8643356643356643,0.34610770499571075,0.5755039778456756,, +0.9150349650349651,0.8643356643356643,0.34489688928493745,0.5746902058065239,, +0.9157342657342658,0.8643356643356643,0.3436939449521259,0.5738845449246318,, +0.916083916083916,0.8643356643356643,0.34249707510223026,0.5730974997114726,, +0.9164335664335664,0.8643356643356643,0.341305080949274,0.5722956460471083,, +0.9171328671328671,0.8671328671328671,0.340120857750397,0.571499768418261,, +0.9178321678321678,0.8671328671328671,0.3389439123536763,0.5707209968219016,, +0.9181818181818182,0.8671328671328671,0.3377704311176365,0.5699469948963801,, +0.9188811188811189,0.8671328671328671,0.33660382953040846,0.5691842260043686,, +0.9192307692307692,0.8671328671328671,0.33544495271640934,0.5684083159088281,, +0.9195804195804196,0.8685314685314686,0.33429209162819556,0.5676390381742121,, +0.91993006993007,0.8699300699300699,0.33314775986454354,0.5668703391558941,, +0.9195804195804196,0.8699300699300699,0.33201067315866495,0.5661116138429493,, +0.9195804195804196,0.8699300699300699,0.33088039950817705,0.5653593877541289,, +0.91993006993007,0.8699300699300699,0.32975694782205633,0.5646051010858683,, +0.91993006993007,0.8713286713286713,0.32863735793766247,0.5638656014298777,, +0.91993006993007,0.8727272727272727,0.32752344806047284,0.5631235535873936,, +0.9206293706293707,0.8727272727272727,0.3264158062807729,0.5623914978511804,, +0.920979020979021,0.8741258741258742,0.32531426100992744,0.5616637767237913,, +0.920979020979021,0.8741258741258742,0.3242191435102792,0.5609416428156083,, +0.920979020979021,0.8741258741258742,0.3231307871136036,0.5602363302788812,, +0.9213286713286714,0.8741258741258742,0.32204859585828155,0.5595288798580862,, +0.9213286713286714,0.8741258741258742,0.3209712942832012,0.5588207801008908,, +0.9216783216783216,0.8741258741258742,0.3198989188756257,0.5581068866211645,, +0.922027972027972,0.8727272727272727,0.31883293871712914,0.5574146127510091,, +0.922027972027972,0.8727272727272727,0.31777292779615823,0.5567252239176785,, +0.922027972027972,0.8727272727272727,0.31671848501341315,0.5560573190550208,, +0.9223776223776223,0.8727272727272727,0.3156702465974988,0.555373204793962,, +0.9227272727272727,0.8727272727272727,0.31462780428052806,0.5547042586488047,, +0.9223776223776223,0.8727272727272727,0.3135902329012098,0.5540355287787795,, +0.9223776223776223,0.8727272727272727,0.3125581931275951,0.5533992035494814,, +0.9227272727272727,0.8727272727272727,0.31153089988401667,0.5527303815241956,, +0.9227272727272727,0.8727272727272727,0.31050873515141525,0.5520759277277298,, +0.9234265734265734,0.8713286713286713,0.3094926960568246,0.5514250585461603,, +0.9237762237762238,0.8713286713286713,0.3084825796180311,0.5507872209482763,, +0.9241258741258741,0.8713286713286713,0.307477723363289,0.5501267275276988,, +0.9251748251748252,0.8713286713286713,0.3064775953614192,0.5494841713621249,, +0.9251748251748252,0.8713286713286713,0.30548290981153753,0.5488512614475514,, +0.9255244755244755,0.8713286713286713,0.30449320772269234,0.548219854423086,, +0.9262237762237763,0.8713286713286713,0.30350798174280336,0.5476044036385928,, +0.9262237762237763,0.8713286713286713,0.3025281337224161,0.5469665261667487,, +0.9262237762237763,0.8713286713286713,0.3015454302007661,0.5463863912708424,, +0.926923076923077,0.8713286713286713,0.3005666440823029,0.5458018715681543,, +0.926923076923077,0.8713286713286713,0.29959446711445936,0.5451988139412536,, +0.9272727272727272,0.8713286713286713,0.2986271796296898,0.544641032465172,, +0.9272727272727272,0.8713286713286713,0.29766554567136755,0.5440459770152157,, +0.9279720279720279,0.8713286713286713,0.29670601108686867,0.5434399319144567,, +0.9279720279720279,0.8713286713286713,0.2957500274674958,0.5428167553063393,, +0.9283216783216783,0.8713286713286713,0.2947972592759179,0.5422030241280202,, +0.9283216783216783,0.8713286713286713,0.29384654004475,0.5415536360666485,, +0.9286713286713286,0.8713286713286713,0.29290217944483776,0.5409500887008593,, +0.929020979020979,0.8713286713286713,0.29196186414518716,0.5403387903773804,, +0.9300699300699301,0.8727272727272727,0.29102503554400694,0.5396835525871049,, +0.9300699300699301,0.8741258741258742,0.2900943090327005,0.5391033038791131,, +0.9304195804195804,0.8741258741258742,0.28916726103636153,0.5384695911425714,, +0.9307692307692308,0.8741258741258742,0.288245724077909,0.5378678107954935,, +0.9314685314685315,0.8741258741258742,0.2873306433322575,0.5373341737005595,, +0.9318181818181818,0.8755244755244755,0.28641889350956357,0.5367329810562751,, +0.9314685314685315,0.8755244755244755,0.2855126951331183,0.536187969524412,, +0.9318181818181818,0.8755244755244755,0.2846101960810131,0.535593149771985,, +0.9321678321678322,0.8755244755244755,0.2837133434626587,0.5350530863790872,, +0.9321678321678322,0.8755244755244755,0.2828202437448496,0.5344872873754231,, +0.9321678321678322,0.8755244755244755,0.2819315358910068,0.5339255270893254,, +0.9325174825174826,0.8755244755244755,0.28104614066211225,0.5333324544262709,, +0.9325174825174826,0.8755244755244755,0.28016619883738597,0.5327824765353293,, +0.9325174825174826,0.8755244755244755,0.27929024413352416,0.5322547062820385,, +0.9328671328671329,0.8755244755244755,0.2784176884436498,0.5316715182860199,, +0.9328671328671329,0.8755244755244755,0.27755005772841435,0.5311347230580158,, +0.9328671328671329,0.8755244755244755,0.27668635250210516,0.5306187137648718,, +0.9332167832167833,0.8755244755244755,0.27582629399259717,0.5300537833912206,, +0.9335664335664335,0.8755244755244755,0.2749699735961338,0.5295114368462083,, +0.9335664335664335,0.8755244755244755,0.27411847175831655,0.529013926114464,, +0.9335664335664335,0.8755244755244755,0.27327029526896596,0.5284588667604068,, +0.9335664335664335,0.8755244755244755,0.27242610074794715,0.5279334913956336,, +0.9339160839160839,0.8755244755244755,0.2715855110330222,0.5274096769613312,, +0.9342657342657342,0.8755244755244755,0.27074833895445777,0.5268795051360914,, +0.9349650349650349,0.8755244755244755,0.2699154083134741,0.5263652439287603,, +0.9353146853146853,0.8755244755244755,0.26908656543052495,0.5258601024137561,, +0.9356643356643357,0.8755244755244755,0.268261543417423,0.5253622020806207,, +0.9356643356643357,0.8755244755244755,0.2674404547722463,0.5248796019034135,, +0.9356643356643357,0.8755244755244755,0.2666220735310435,0.5243675326894884,, +0.936013986013986,0.8755244755244755,0.2658079064059659,0.523883199285919,, +0.9367132867132867,0.8755244755244755,0.26499831429151693,0.5234273170724312,, +0.9367132867132867,0.8755244755244755,0.2641911169588695,0.5229026826834856,, +0.9370629370629371,0.8755244755244755,0.2633881167749007,0.5224164187545928,, +0.9370629370629371,0.8755244755244755,0.2625903619321901,0.5219444242008332,, +0.9370629370629371,0.8769230769230769,0.2617960390867563,0.5214690488959348,, +0.9374125874125874,0.8769230769230769,0.2610033826365655,0.5209556929099863,, +0.9384615384615385,0.8783216783216783,0.2602151883813818,0.5205016592816051,, +0.9384615384615385,0.8783216783216783,0.2594290633327102,0.5200009602170742,, +0.9384615384615385,0.8783216783216783,0.2586479112751194,0.5195603986159505,, +0.9388111888111889,0.8783216783216783,0.2578692532430515,0.5190848403296827,, +0.9391608391608391,0.8783216783216783,0.2570942154297703,0.5186164255767688,, +0.9395104895104895,0.8783216783216783,0.25632218127652484,0.5181446318685636,, +0.9395104895104895,0.8783216783216783,0.25555364795386354,0.5176767704205878,, +0.9398601398601398,0.8783216783216783,0.2547883408940661,0.517203959168206,, +0.9402097902097902,0.8783216783216783,0.2540264087633706,0.5167361903054182,, +0.9409090909090909,0.8783216783216783,0.25326802066782006,0.5162900027488889,, +0.9409090909090909,0.8783216783216783,0.2525141043308968,0.5158659485242324,, +0.9409090909090909,0.8783216783216783,0.2517626291101916,0.515419492292404,, +0.9409090909090909,0.8783216783216783,0.25101217572749074,0.5149645329145646,, +0.9412587412587412,0.8783216783216783,0.25026634915699525,0.5145151260160205,, +0.9412587412587412,0.8783216783216783,0.24952531500485747,0.5141111703028366,, +0.9416083916083916,0.8783216783216783,0.24878437957180108,0.5136431536941855,, +0.941958041958042,0.8783216783216783,0.24804875559467976,0.5132385994981842,, +0.9423076923076923,0.8783216783216783,0.24731445054638088,0.5127814691061278,, +0.9426573426573427,0.8783216783216783,0.24658531452721807,0.5123881008677809,, +0.943006993006993,0.8783216783216783,0.24585810251741305,0.5119597289008176,, +0.9433566433566434,0.8783216783216783,0.2451341999281766,0.5115366916563869,, +0.9440559440559441,0.8797202797202798,0.2444124796187053,0.5111041373032766,, +0.9447552447552447,0.8797202797202798,0.24369459955805786,0.5106730159138082,, +0.9447552447552447,0.8797202797202798,0.24297979189321878,0.5102565738991465,, +0.9451048951048951,0.8797202797202798,0.24226752435360183,0.5098373039370909,, +0.9458041958041958,0.8797202797202798,0.241558463154129,0.5094272536930845,, +0.9458041958041958,0.8797202797202798,0.24085226989327252,0.5090241317776396,, +0.9461538461538461,0.8811188811188811,0.24014876117722161,0.5086057582250901,, +0.9472027972027972,0.8811188811188811,0.23944483213705842,0.5082245948653248,, +0.9479020979020979,0.8825174825174825,0.23874465192417485,0.5078361363388749,, +0.9482517482517483,0.8825174825174825,0.23804733417015583,0.5074346124518522,, +0.9486013986013986,0.8825174825174825,0.23735308316095222,0.5070237675889876,, +0.9486013986013986,0.8825174825174825,0.23666086982687237,0.5065915256695374,, +0.9486013986013986,0.8825174825174825,0.23597283645138092,0.5061958410568818,, +0.9493006993006993,0.8825174825174825,0.23528926206892659,0.5058451555464295,, +0.9493006993006993,0.8811188811188811,0.23460577710795597,0.5054123077380466,, +0.9493006993006993,0.8811188811188811,0.2339051689620153,0.5049346451337071,, +0.9503496503496504,0.8811188811188811,0.23320987015378572,0.5045207489661953,, +0.9503496503496504,0.8811188811188811,0.2325192591121786,0.5041074209020331,, +0.951048951048951,0.8811188811188811,0.2318326574139189,0.503704096666146,, +0.951048951048951,0.8811188811188811,0.23114910168633637,0.5033033796440842,, +0.951048951048951,0.8811188811188811,0.23046941488778458,0.5029076562542335,, +0.9513986013986014,0.8811188811188811,0.22979304226854033,0.5025141136631591,, +0.9517482517482517,0.8811188811188811,0.22911874913207683,0.5021271409973774,, +0.9517482517482517,0.8811188811188811,0.2284476762093357,0.5017415194880208,, +0.9520979020979021,0.8825174825174825,0.22777980768938585,0.501357511785521,, +0.9520979020979021,0.8811188811188811,0.22711457718670486,0.5009701892858283,, +0.9520979020979021,0.8811188811188811,0.2264520578004723,0.500591569316164,, +0.9527972027972028,0.8811188811188811,0.2257923308735793,0.5002115286513854,, +0.9527972027972028,0.8811188811188811,0.22513535170931148,0.4998388248436576,, +0.9534965034965035,0.8811188811188811,0.2244801643784773,0.49946456292572083,, +0.9538461538461539,0.8811188811188811,0.22382771806159313,0.49909291664112937,, +0.9538461538461539,0.8811188811188811,0.22317780975599977,0.49872109780279966,, +0.9538461538461539,0.8811188811188811,0.222530718084159,0.49835008327672053,, +0.9541958041958042,0.8825174825174825,0.22188625733287293,0.49798575564162734,, +0.9545454545454546,0.8811188811188811,0.22124480224148343,0.49762249203759085,, +0.9545454545454546,0.8811188811188811,0.22060575976549385,0.4972555860818327,, +0.9545454545454546,0.8825174825174825,0.21996934578415048,0.4968967948999989,, +0.9545454545454546,0.8825174825174825,0.219335796199205,0.49653188350606553,, +0.9545454545454546,0.8825174825174825,0.21870476075627662,0.4961795193318407,, +0.9545454545454546,0.8825174825174825,0.21807618845996243,0.4958205407324051,, +0.9545454545454546,0.8825174825174825,0.21745036383378033,0.49546419116270235,, +0.9545454545454546,0.8825174825174825,0.21682875302698007,0.49508659829221396,, +0.9545454545454546,0.8825174825174825,0.21620867951756872,0.49473479367147044,, +0.9545454545454546,0.8825174825174825,0.21558917285809176,0.4944048029036305,, +0.9545454545454546,0.8825174825174825,0.21497292796095102,0.4940688917086719,, +0.9548951048951049,0.8825174825174825,0.2143589095370103,0.4937266980665681,, +0.9548951048951049,0.8825174825174825,0.2137472961575646,0.49335317532756523,, +0.9552447552447553,0.8825174825174825,0.2131380096141815,0.49301012384241105,, +0.9552447552447553,0.8811188811188811,0.21251040125425807,0.49253933912041986,, +0.9555944055944056,0.8811188811188811,0.2118786487354526,0.4921451679790616,, +0.9555944055944056,0.8811188811188811,0.21125287567225542,0.4917602492857801,, +0.9552447552447553,0.8811188811188811,0.21063147819042174,0.49138574069176655,, +0.9552447552447553,0.8811188811188811,0.2100147713154583,0.491024461472506,, +0.9552447552447553,0.8811188811188811,0.20940178718499622,0.4906505796110533,, +0.9552447552447553,0.8811188811188811,0.2087907375536904,0.49029555905968614,, +0.955944055944056,0.8825174825174825,0.20818658874242277,0.48993115968003975,, +0.955944055944056,0.8825174825174825,0.20758326860040371,0.4895818410748453,, +0.955944055944056,0.8825174825174825,0.20698108041128366,0.48923237967908956,, +0.955944055944056,0.8825174825174825,0.20638500731874315,0.4888777133174856,, +0.955944055944056,0.8825174825174825,0.20579041667611342,0.4885208516157874,, +0.955944055944056,0.8825174825174825,0.20519719221659524,0.4881837717290209,, +0.9562937062937062,0.8825174825174825,0.20460762555237358,0.48783513146340163,, +0.9562937062937062,0.8825174825174825,0.20401783228554077,0.48750201435589013,, +0.9566433566433566,0.8825174825174825,0.203434238022485,0.4871461636950177,, +0.9566433566433566,0.8825174825174825,0.2028517055874286,0.48680227668835635,, +0.956993006993007,0.8825174825174825,0.20227101188606883,0.486467956625879,, +0.956993006993007,0.8825174825174825,0.20169035173258237,0.4861477884105082,, +0.9576923076923077,0.8839160839160839,0.20111560472671297,0.4858101489967659,, +0.9576923076923077,0.8853146853146853,0.2005416171599293,0.4854822204570802,, diff --git a/weights/bel_weights.npz b/weights/bel_weights.npz new file mode 100644 index 0000000..23ab97c Binary files /dev/null and b/weights/bel_weights.npz differ diff --git a/weights/bt_1h128n_ReLU_weights.npz b/weights/bt_1h128n_ReLU_weights.npz new file mode 100644 index 0000000..9a9d1ad Binary files /dev/null and b/weights/bt_1h128n_ReLU_weights.npz differ diff --git a/weights/bt_weights.npz b/weights/bt_weights.npz new file mode 100644 index 0000000..66b8c6a Binary files /dev/null and b/weights/bt_weights.npz differ