{ "cells": [ { "cell_type": "markdown", "id": "8f979225", "metadata": {}, "source": [ "# MNIST Example with Endurance" ] }, { "cell_type": "code", "execution_count": 1, "id": "492751a4", "metadata": {}, "outputs": [], "source": [ "# You dont need this, this is for my convinience\n", "import sys\n", "import os\n", "notebook_dir = os.path.dirname(os.getcwd())\n", "sys.path.append(notebook_dir)" ] }, { "cell_type": "code", "execution_count": null, "id": "445d3a24", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from nervos.utils import Module, Parameters\n", "from nervos.dataloader import MNISTLoader\n", "import glob" ] }, { "cell_type": "markdown", "id": "d5812d65", "metadata": {}, "source": [ "### Parameters\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "5a360660", "metadata": {}, "outputs": [], "source": [ "p = Parameters()\n", "p.from_url('https://pastebin.com/raw/rdtizMB9')" ] }, { "cell_type": "code", "execution_count": 8, "id": "be2b82de", "metadata": {}, "outputs": [], "source": [ "allowed_levels = np.array(\n", " [1.0, 0.9679310906766183, 0.93760456888016, 0.9076014969897948, 0.8791824458963751,\n", " 0.8496445762753205, 0.8209604023080539, 0.7935519996097391, 0.7671344494652823,\n", " 0.741995145069934, 0.7168883624137776, 0.6916196780559918, 0.6682011978604938,\n", " 0.644600313127789, 0.62183509569345, 0.5993915606793792, 0.5773725757606286,\n", " 0.5557031995381914, 0.5343449008210679, 0.5132156682669483, 0.49230418996654846,\n", " 0.47142452641101046, 0.4505597804358407, 0.4297537503397992, 0.4088284856499594,\n", " 0.3877543957690631, 0.3664585982352714, 0.34477928874249386, 0.3228929359601,\n", " 0.30055530869670194, 0.2778102406007755, 0.254499930537807, 0.2310277187732093,\n", " 0.20723594557133454, 0.18259118371000224, 0.15743915341670922, 0.1322747507226366,\n", " 0.10701030833083243, 0.08075324589934445, 0.05429645756955848, 0.027605300619291628,\n", " 0.0]\n", " )" ] }, { "cell_type": "markdown", "id": "7b484f7f", "metadata": {}, "source": [ "### Endurance Simulation Initialization" ] }, { "cell_type": "markdown", "id": "f8dfce30", "metadata": {}, "source": [ "![](https://i.ibb.co/Ng8ChngX/download.png)" ] }, { "cell_type": "code", "execution_count": 9, "id": "fa60152c", "metadata": {}, "outputs": [], "source": [ "def find_closest_index(arr, target):\n", " arr = np.array(arr)\n", " return np.argmin(np.abs(arr - target))\n", "\n", "def get_wt_ls_by_cyc(og_wt, max_interp, min_interp, cycle):\n", " max_val = max_interp[cycle]\n", " min_val = min_interp[cycle]\n", " # Normalize\n", " global_max = np.max(max_interp)\n", " global_min = np.min(min_interp)\n", " range_val = global_max - global_min\n", " \n", " if range_val == 0:\n", " return og_wt # Fallback\n", "\n", " ul = max_val / range_val\n", " ll = min_val / range_val\n", " \n", " ll_idx = find_closest_index(og_wt, ll)\n", " ul_idx = find_closest_index(og_wt, ul)\n", " \n", " if ll_idx == ul_idx:\n", " return np.full_like(og_wt, og_wt[ul_idx])\n", "\n", " step = 1 if ll_idx >= ul_idx else -1\n", " trend = og_wt[ul_idx : ll_idx + step : step]\n", " \n", " if len(trend) < 2:\n", " return og_wt # Fallback\n", "\n", " y0, y1 = trend[0], trend[-1]\n", " \n", " if y0 == y1:\n", " shape = np.zeros_like(trend)\n", " else:\n", " shape = (y0 - trend) / (y0 - y1)\n", " \n", " xi_orig = np.linspace(0, 1, len(shape))\n", " xi_new = np.linspace(0, 1, len(og_wt)) # Interpolate to original length\n", " shape42 = np.interp(xi_new, xi_orig, shape)\n", " out = ul + (ll - ul) * shape42\n", " return out \n", "\n", "def generate_weight_lookup(lev_All):\n", " lc = 0.1/11\n", " x_vals = np.array([10, 100, 1000, 10000])\n", " log_x_vals = np.log10(x_vals)\n", " \n", " max_points = [0.3+5*lc, 0.2+10*lc,0.2+6*lc, -0.1+8*lc]\n", " min_points = [0+3*lc, 0+1*lc, 0+8*lc, -0.1+5*lc]\n", "\n", " x_all = np.arange(0, 10001)\n", "\n", " # Prepare empty arrays\n", " max_interp = np.zeros_like(x_all, dtype=float)\n", " min_interp = np.zeros_like(x_all, dtype=float)\n", "\n", " # Handle x = 0 separately\n", " max_interp[0] = max_points[0]\n", " min_interp[0] = min_points[0]\n", "\n", " # For x >= 1: interpolate in log10(x)\n", " x_nonzero = x_all[1:]\n", " log_x_nonzero = np.log10(x_nonzero)\n", "\n", " max_interp[1:] = np.interp(log_x_nonzero, log_x_vals, max_points)\n", " min_interp[1:] = np.interp(log_x_nonzero, log_x_vals, min_points)\n", "\n", " mmin = min(min(max_interp),min(min_interp))\n", " min_interp += -mmin\n", " max_interp += -mmin\n", " \n", " print(\"Generating cycle dependent weight lookup table...\")\n", " weight_ls_Store = np.array([get_wt_ls_by_cyc(lev_All, max_interp, min_interp, i) for i in range(10001)])\n", " return weight_ls_Store" ] }, { "cell_type": "code", "execution_count": 10, "id": "d4e8019c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Generating cycle dependent weight lookup table...\n" ] } ], "source": [ "weight_lookup = generate_weight_lookup(allowed_levels)" ] }, { "cell_type": "markdown", "id": "dfbf0354", "metadata": {}, "source": [ "### Model\n" ] }, { "cell_type": "code", "execution_count": 17, "id": "c141eb21", "metadata": {}, "outputs": [], "source": [ "\n", "class MNIST_SNN(Module):\n", " def __init__(self, parameters, identifier=None):\n", " super().__init__(parameters, identifier)\n", " self.dataloader = MNISTLoader(parameters, classes=[i for i in range(5)])\n", " self.X_train, self.Y_train = self.dataloader.dataloader(\n", " preprocess=True, pca=False, size=parameters.training_images_amount\n", " )\n", " self.X_test, self.Y_test = self.dataloader.dataloader(\n", " preprocess=True, train=False, pca=False, size=parameters.testing_images_amount\n", " )\n", " self.get_spikeplots = False\n", " \n", " self.allowed_levels = allowed_levels\n", "\n", " def predict(self, un_processed_image, model_location):\n", " spike_train = np.array(self.dataloader.img2spiketrain(un_processed_image))\n", " synapses, neuron_label_map = self.load_model(model_location)\n", " return self.get_prediction(spike_train, synapses, neuron_label_map)\n" ] }, { "cell_type": "code", "execution_count": 18, "id": "c531a16a", "metadata": {}, "outputs": [], "source": [ "m = MNIST_SNN(p, \"5classmnist_with_endurance\")\n", "m.initialise_layers([784, 60])\n", "m.cycle_dependent_weight_lookup = weight_lookup\n", "m.enable_cycle_dependent_weights = True" ] }, { "cell_type": "code", "execution_count": 19, "id": "fd4a3aa7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/5\n", "100/100 [========================================] [Max cycles for one synapse: 2655.0]\n", "Testing...\n", "Test set accuracy: 0.8\n", "Time elapsed since training start: 284.202s\n", "Epoch 2/5\n", "100/100 [========================================] [Max cycles for one synapse: 3609.0]\n", "Testing...\n", "Test set accuracy: 0.95\n", "Time elapsed since training start: 526.392s\n", "Epoch 3/5\n", "100/100 [========================================] [Max cycles for one synapse: 4884.0]\n", "Testing...\n", "Test set accuracy: 0.9\n", "Time elapsed since training start: 774.322s\n", "Epoch 4/5\n", "100/100 [========================================] [Max cycles for one synapse: 5873.0]\n", "Testing...\n", "Test set accuracy: 0.9\n", "Time elapsed since training start: 990.677s\n", "Epoch 5/5\n", "100/100 [========================================] [Max cycles for one synapse: 6516.0]\n", "Testing...\n", "Test set accuracy: 0.65\n", "Time elapsed since training start: 1198.092s\n", "Training complete!\n" ] } ], "source": [ "y = m.train()" ] }, { "cell_type": "code", "execution_count": 20, "id": "05b8d171", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def visualise_synapse(synapses,labels):\n", " kk=28\n", " classes = {i:np.zeros((kk,kk)) for i in np.unique(labels)}\n", " for idx in range(len(synapses)):\n", " classes[labels[idx]]+= synapses[idx].reshape((kk,kk))\n", " \n", " i = 1\n", " plt.figure(figsize=(10,30))\n", " for k in classes.keys():\n", " plt.subplot(1,len(classes),i)\n", " plt.imshow(classes[k])\n", " plt.title(f\"{k}\")\n", " plt.tight_layout()\n", " plt.axis('off')\n", " i+=1\n", " plt.show()\n", " \n", "visualise_synapse(m.learned_synapses[0],m.learned_neuron_label_map)" ] }, { "cell_type": "code", "execution_count": 21, "id": "a3d7d0f0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Calculating Accuracy\n", "Tested 1500 images\n", "0.5726666666666667\n" ] } ], "source": [ "def accuracy(m2):\n", " spike_trains,labels = MNISTLoader(p,classes=[i for i in range(5)]).dataloader(train=False,preprocess=True,seed=123,size=1500)\n", " t = 0\n", " c = 0\n", " preds = []\n", " print('Calculating Accuracy')\n", " for st,label in zip(spike_trains,labels):\n", " pred = m2.get_prediction(st)\n", " preds.append(pred)\n", " if pred == label:\n", " c+=1\n", " t+=1\n", " \n", " print(f\"\\rTested {t} images\",end='')\n", " print()\n", " print(c/t)\n", " return labels,preds,c/t\n", "\n", "y_true,y_pred,_ = accuracy(m)" ] }, { "cell_type": "code", "execution_count": 30, "id": "db54511e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Calculating Accuracy\n", "Tested 1500 images\n", "0.6546666666666666\n", "Calculating Accuracy\n", "Tested 1500 images\n", "0.818\n", "Calculating Accuracy\n", "Tested 1500 images\n", "0.768\n", "Calculating Accuracy\n", "Tested 1500 images\n", "0.702\n", "Calculating Accuracy\n", "Tested 1500 images\n", "0.5726666666666667\n" ] } ], "source": [ "fp = glob.glob(os.path.join('storage', f'{m.identifier}*'))[0]\n", "spike_trains,labels = MNISTLoader(p,classes=[i for i in range(5)]).dataloader(train=False,preprocess=True,seed=123,size=1500)\n", "accs = []\n", "for epoch in os.listdir(fp):\n", " m2 = MNIST_SNN(p)\n", " m2.initialise_layers([784,60])\n", " m2.cycle_dependent_weight_lookup = weight_lookup\n", " m2.enable_cycle_dependent_weights = True\n", " m2.load_model(os.path.join(fp, epoch, 'model.red'))\n", " accs.append(accuracy(m2)[-1])" ] }, { "cell_type": "code", "execution_count": 35, "id": "6264d58d", "metadata": {}, "outputs": [ { "data": { "image/png": "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zk6dOlX/+c9/7Llk/u7fmL/P6DUyr8/5vbbmSwNzIW3awzz///73vypYsKBNKtKZdjKJ7e23327b37S5+SLlapnjmHPaJEjm/Z+emL3//vv2vDBfhJjEYMyYMfb8/vXXXy94XPMamB7zRx55xCZ+Jvm96aabtHPnTvteMvbu3WtfZ5M8mfPczIEy55d5f5n3izmXMvu+uZJ2N8c1Pb+DBw+255D5fDTvbcN8qfDJJ5/Yc9u8HumfdaaNrr/+env+mvePSebNe7ZVq1b2PDPP63Keo/kiwjymaZ/nn39eVapUsX9n/jW9ZuY9ZM7N5557zp7r5ksA064ArpILADJp8eLF5it715QpU+zPaWlpruLFi7v69et3zn4vv/yy3W/cuHEXHMP8jfHZZ5/ZfYYOHXrRfWbMmGH3Mf+ebdu2bfb+zz///Mx9d911l73vueeeu+B48fHxF9w3ZMgQV0BAgGvHjh1n7mvWrJkrMjLynPvOjscYMGCAKywszHX06NEz9x08eNAVHBzsGjhwoOtSHn/8cRvjX3/9dea+48ePu8qUKeMqXbq0KzU11d738ccf2/1WrVp1zt9XrVrV1apVqzM/v/baa66cOXO6Nm7ceM5+pg2CgoJcO3fuPKe9oqKibKyXo1SpUvZvMrqZtju/3R999NFz2qtjx46u0NBQ16FDh+x9EyZMsPu9/vrr5zzOzTffbF+HzZs32583bdrkCgwMdHXt2vVMe5x93PPjmz179pn7zHMzr82TTz555r5atWrZWDKrT58+rkKFCp35uX///vb8KFiwoGvkyJH2vsOHD9vY33///XPaw8SWzjx/E2dG50Z627366qvn3F+nTh1XTEzMv8bYvHnzi75GDz300Jn9zGOb++69995z/t60cf78+c/8vHz5crvfI488cs5+t99++wXP4fznef5jnc38bF7TNWvW/Ot7MykpyVW9evVzzvP0Y5jzKf08MVasWGHv/+CDD87cd+edd9rH+vvvvy94rPTz53LfN1fb7umfXz/++OM5f28+t8z9Z8doYqtQoYKrffv255znpn3M50Pbtm0z9RzNY2b02Tl+/PgLHhuAezAsEECmmd4Z8+2rGWpimG/yb7vtNvtt89nDmP73v/+pVq1aF/TupP9N+j7mG+xHH330ovtciYy+7T+7l8UMTTPfOJtv5c0127Jly+z9hw4d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3BcWFuZYPACA7ImeKwCAzzOJVOHChc+55c2b1/7O9GKNHDlS119/vXLkyKGyZcvqp59+OufvV61apVatWtnf58+fXw8++KBOnDhxzj6fffaZqlWrZh+rSJEi6tu37zm/j42NVdeuXRUREaEKFSro559/PvO7f/75R3fccYcKFChgH8P8/vxkEADg+0iuAAB+76WXXtJNN92kFStW2CSne/fuWrdunf3dyZMn1b59e5uM/f333/rxxx81derUc5Ink5z16dPHJl0mETOJU/ny5c95jEGDBunWW2/VypUr1aFDB/s4R44cOfP4a9eu1e+//24f1xwvOjo6i1sBAOBpAS6Xy+XxRwEAwINzrr755huFh4efc//zzz9vb6bn6uGHH7YJTbprr71WdevW1UcffaTRo0fr2Wef1a5du5QzZ077+0mTJqlTp07au3evChUqpGLFiumee+7R66+/nmEM5jFefPFFvfbaa2cStly5ctlkygxZvPHGG20yZXq/AAD+izlXAACf17Jly3OSJyNfvnxnths2bHjO78zPy5cvt9umJ6lWrVpnEiujcePGSktL04YNG2ziZJKs1q1bXzKGmjVrntk2x4qKitLBgwftz71797Y9Z0uXLlW7du3UpUsXNWrU6CqfNQDA25BcAQB8nklmzh+m5y5mjtTlCAkJOednk5SZBM0w87127Nhhe8SmTJliEzUzzPDdd9/1SMwAAGcw5woA4PcWLFhwwc9VqlSx2+ZfMxfLDOVLN3fuXAUGBqpSpUqKjIxU6dKlNW3atKuKwRSzuOuuu+wQxmHDhumTTz65quMBALwPPVcAAJ+XmJio/fv3n3NfcHDwmaIRpkhFvXr11KRJE3377bdatGiRPv30U/s7U3hi4MCBNvF55ZVXdOjQIT366KPq1auXnW9lmPvNvK2CBQvaXqjjx4/bBMzsdzlefvllxcTE2GqDJtZff/31THIHAPAfJFcAAJ83efJkWx79bKbXaf369Wcq+Y0ZM0aPPPKI3e/7779X1apV7e9M6fQ//vhD/fr10zXXXGN/NvOjhg4deuZYJvFKSEjQe++9p6eeesombTfffPNlxxcaGqoBAwZo+/btdphh06ZNbTwAAP9CtUAAgF8zc5/Gjx9vi0gAAOBJzLkCAAAAADcguQIAAAAAN2DOFQDArzH6HQCQVei5AgAAAAA3ILkCAAAAADcguQIAAAAANyC5AgAAAAA3ILkCAAAAADcguQIAAAAANyC5AgAAAAA3ILkCAAAAAF29/wfFWV9IaMQhGQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10,6))\n", "plt.plot(accs)\n", "plt.xlabel('Epochs')\n", "plt.ylabel('Accuracy')\n", "plt.title('Accuracy over Epochs with Endurance Effects')\n", "plt.grid('on',which='both')\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "venv", "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.4" } }, "nbformat": 4, "nbformat_minor": 5 }