{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "lGa0_oLb61zz" }, "source": [ "# Presenting latency-coded inputs\n", "In this first tutorial we build an input layer of spiking \"projection neurons\" for our mushroom body model which converts MNIST digits into latency-coded spikes.\n", "\n", "## Install PyGeNN wheel from Google Drive\n", "Download wheel file" ] }, { "cell_type": "code", "source": [ "if \"google.colab\" in str(get_ipython()):\n", " #import IPython\n", " #IPython.core.magics.execution.ExecutionMagics.run.func_defaults[2] = lambda a: a\n", " #%run \"../install_collab.ipynb\"\n", " !pip install gdown --upgrade\n", " !gdown 1V_GzXUDzcFz9QDIpxAD8QNEglcSipssW\n", " !pip install pygenn-5.0.0-cp310-cp310-linux_x86_64.whl\n", " %env CUDA_PATH=/usr/local/cuda" ], "metadata": { "id": "maq6gt0pgTiQ", "outputId": "166cc2f9-55c9-423f-b724-34456abe7aa1", "colab": { "base_uri": "https://localhost:8080/" } }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Requirement already satisfied: gdown in /usr/local/lib/python3.10/dist-packages (5.1.0)\n", "Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.10/dist-packages (from gdown) (4.12.3)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from gdown) (3.13.1)\n", "Requirement already satisfied: requests[socks] in /usr/local/lib/python3.10/dist-packages (from gdown) (2.31.0)\n", "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from gdown) (4.66.2)\n", "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4->gdown) (2.5)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests[socks]->gdown) (3.3.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests[socks]->gdown) (3.6)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests[socks]->gdown) (2.0.7)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests[socks]->gdown) (2024.2.2)\n", "Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.10/dist-packages (from requests[socks]->gdown) (1.7.1)\n", "Downloading...\n", "From: https://drive.google.com/uc?id=1V_GzXUDzcFz9QDIpxAD8QNEglcSipssW\n", "To: /content/pygenn-5.0.0-cp310-cp310-linux_x86_64.whl\n", "100% 8.29M/8.29M [00:00<00:00, 279MB/s]\n", "Processing ./pygenn-5.0.0-cp310-cp310-linux_x86_64.whl\n", "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from pygenn==5.0.0) (1.25.2)\n", "Requirement already satisfied: deprecated in /usr/local/lib/python3.10/dist-packages (from pygenn==5.0.0) (1.2.14)\n", "Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from pygenn==5.0.0) (5.9.5)\n", "Requirement already satisfied: wrapt<2,>=1.10 in /usr/local/lib/python3.10/dist-packages (from deprecated->pygenn==5.0.0) (1.14.1)\n", "pygenn is already installed with the same version as the provided wheel. Use --force-reinstall to force an installation of the wheel.\n", "env: CUDA_PATH=/usr/local/cuda\n" ] } ] }, { "cell_type": "markdown", "source": [ "## Install MNIST package" ], "metadata": { "id": "KVRtXVzIg07T" } }, { "cell_type": "code", "source": [ "!pip install mnist" ], "metadata": { "id": "AikBc4sfg1b-", "outputId": "675537d0-38e4-4724-f244-67bbe4c39dac", "colab": { "base_uri": "https://localhost:8080/" } }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Collecting mnist\n", " Downloading mnist-0.2.2-py2.py3-none-any.whl (3.5 kB)\n", "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from mnist) (1.25.2)\n", "Installing collected packages: mnist\n", "Successfully installed mnist-0.2.2\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "yV0JrchrfQKR" }, "source": [ "## Build tutorial model\n", "Import modules" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Hl53yKXi9LiV" }, "outputs": [], "source": [ "import mnist\n", "import numpy as np\n", "from copy import copy\n", "from matplotlib import pyplot as plt\n", "from pygenn import create_current_source_model, init_postsynaptic, init_weight_update, GeNNModel" ] }, { "cell_type": "markdown", "metadata": { "id": "u67gXzipEue5" }, "source": [ "Load training images from downloaded file and normalise so each image's pixels add up to one" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "X9JrpOMu9LiZ" }, "outputs": [], "source": [ "mnist.datasets_url = \"https://storage.googleapis.com/cvdf-datasets/mnist/\"\n", "training_images = mnist.train_images()\n", "training_images = np.reshape(training_images, (training_images.shape[0], -1)).astype(np.float32)\n", "\n", "training_images /= np.sum(training_images, axis=1)[:, np.newaxis]" ] }, { "cell_type": "markdown", "metadata": { "id": "mRl2x1HA9Lia" }, "source": [ "## Visualize training data\n", "Reshape first training image from 784 element vector to 28x28 matrix and visualize." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 430 }, "id": "N2jR9guR9Lic", "outputId": "662c041c-99fb-437d-d34d-d619b4d2ac4e" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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wAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJrgZKfAVgWsme8/85V/8b9z5qxkvec/MuuC498y51OW6vWfqPy/wP1Bvi/8MBiSugAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAE9yMFAPeiILx3jP778yL61hPLH7Ne2bRRZ/FdayB7JG2a7xnan9xnffMt16q857B0MEVEADABAECAJjwClBlZaWuvfZapaWlKSsrSwsWLFBDQ0PMPseOHVN5ebkuvvhiXXTRRVq0aJHa2toSumgAwODnFaDa2lqVl5ervr5e7777rrq7uzV37lx1dnZG97n//vv11ltvaePGjaqtrdXBgwd18803J3zhAIDBzetDCFu3bo35uqqqSllZWdq1a5dmzZqlcDisX//619qwYYO+973vSZLWr1+vK6+8UvX19bruOv83KQEAQ9M3eg8oHA5LkjIyMiRJu3btUnd3t0pKSqL7TJo0SePGjVNdXd+fdunq6lIkEonZAABDX9wB6u3t1cqVKzVjxgxNnjxZktTa2qrU1FSNHj06Zt/s7Gy1trb2+fdUVlYqFApFt/z8/HiXBAAYROIOUHl5ufbu3avXXvP/uYmvqqioUDgcjm7Nzc3f6O8DAAwOcf0g6ooVK/T2229r+/btGjt2bPTxnJwcHT9+XO3t7TFXQW1tbcrJyenz7woGgwoGg/EsAwAwiHldATnntGLFCm3atEnbtm1TQUFBzPPTpk1TSkqKqquro481NDTowIEDKi4uTsyKAQBDgtcVUHl5uTZs2KAtW7YoLS0t+r5OKBTSyJEjFQqFdNddd2nVqlXKyMhQenq67rvvPhUXF/MJOABADK8APf/885Kk2bNnxzy+fv16LV26VJL085//XMOGDdOiRYvU1dWl0tJS/fKXv0zIYgEAQ0fAOeesF/FVkUhEoVBIszVfIwIp1svBGYy4ZJz3THharvfM4h9vPftOp7hn9F+9Zwa6B1r8v4tQ90v/m4pKUkbV7/2HenviOhaGnhOuWzXaonA4rPT09H73415wAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMBHXb0TFwDUit+/fPHsmn794YVzHWl5Q6z1z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6yUlVTgcliRlZGRIknbt2qXu7u6Y18OkSZM0bty4If16OPU8fOmVV15RZmamJk+erIqKCh09etRief0acDcjPdVnn32mnp4eZWdnxzyenZ2tP//5z0arslFUVKSqqipdccUVamlp0Zo1a3T99ddr7969SktLs16eidbWVknq8/Xx5XPni3nz5unmm29WQUGB9u/fr0ceeURlZWWqq6vT8OHDrZeXcL29vVq5cqVmzJihyZMnSzr5ekhNTdXo0aNj9h3Kr4e+zoMk3X777Ro/frzy8vK0Z88ePfzww2poaNCbb75puNpYAz5A+IeysrLon6dOnaqioiKNHz9eb7zxhu666y7DlWEguPXWW6N/njJliqZOnaqJEyeqpqZGc+bMMVxZcpSXl2vv3r3nxfugZ9Lfebj77rujf54yZYpyc3M1Z84c7d+/XxMnTjzXy+zTgP8WXGZmpoYPH37ap1ja2tqUk5NjtKqBYfTo0br88svV2NhovRQzX74GeH2cbsKECcrMzBySr48VK1bo7bff1vvvvx/z61tycnJ0/Phxtbe3x+w/VF8P/Z2HvhQVFUnSgHo9DPgApaamatq0aaquro4+1tvbq+rqahUXFxuuzN6RI0e0f/9+5ebmWi/FTEFBgXJycmJeH5FIRDt27DjvXx+ffvqpDh8+PKReH845rVixQps2bdK2bdtUUFAQ8/y0adOUkpIS83poaGjQgQMHhtTr4WznoS+7d++WpIH1erD+FMTX8dprr7lgMOiqqqrcH//4R3f33Xe70aNHu9bWVuulnVMPPPCAq6mpcU1NTe53v/udKykpcZmZme7QoUPWS0uqjo4O9/HHH7uPP/7YSXJPP/20+/jjj93f/vY355xzP/3pT93o0aPdli1b3J49e9z8+fNdQUGB++KLL4xXnlhnOg8dHR3uwQcfdHV1da6pqcm999577rvf/a677LLL3LFjx6yXnjDLly93oVDI1dTUuJaWluh29OjR6D733HOPGzdunNu2bZvbuXOnKy4udsXFxYarTryznYfGxkb34x//2O3cudM1NTW5LVu2uAkTJrhZs2YZrzzWoAiQc84999xzbty4cS41NdVNnz7d1dfXWy/pnFu8eLHLzc11qamp7tvf/rZbvHixa2xstF5W0r3//vtO0mnbkiVLnHMnP4r92GOPuezsbBcMBt2cOXNcQ0OD7aKT4Ezn4ejRo27u3LluzJgxLiUlxY0fP94tW7ZsyP2ftL7++SW59evXR/f54osv3L333uu+9a1vuVGjRrmFCxe6lpYWu0UnwdnOw4EDB9ysWbNcRkaGCwaD7tJLL3U/+tGPXDgctl34Kfh1DAAAEwP+PSAAwNBEgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJj4f4W4/AnknuSPAAAAAElFTkSuQmCC\n" }, "metadata": {} } ], "source": [ "fig, axis = plt.subplots()\n", "axis.imshow(np.reshape(training_images[0], (28, 28)));" ] }, { "cell_type": "markdown", "metadata": { "id": "g0IfyML59Lif" }, "source": [ "## Parameters\n", "Define some model parameters" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "oncGyriW9Lif" }, "outputs": [], "source": [ "# Simulation time step\n", "DT = 0.1\n", "\n", "# Scaling factor for converting normalised image pixels to input currents (nA)\n", "INPUT_SCALE = 80.0\n", "\n", "# Number of Projection Neurons in model (should match image size)\n", "NUM_PN = 784\n", "\n", "# How long to present each image to model\n", "PRESENT_TIME_MS = 20.0" ] }, { "cell_type": "markdown", "metadata": { "id": "ddx0SZ80Fe9z" }, "source": [ "Define a standard set of parameters to use for all leaky-integrate and fire neurons" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "---jKi0cFdec" }, "outputs": [], "source": [ "# Standard LIF neurons parameters\n", "LIF_PARAMS = {\n", " \"C\": 0.2,\n", " \"TauM\": 20.0,\n", " \"Vrest\": -60.0,\n", " \"Vreset\": -60.0,\n", " \"Vthresh\": -50.0,\n", " \"Ioffset\": 0.0,\n", " \"TauRefrac\": 2.0}" ] }, { "cell_type": "markdown", "metadata": { "id": "lAgVgaYcFq68" }, "source": [ "Make a copy of this to customise for our Projection neurons and increase the refractory time way above `PRESENT_TIME_MS` so these neurons will only spike once per input." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "9LLcZa-nFjN7" }, "outputs": [], "source": [ "# We only want PNs to spike once\n", "PN_PARAMS = copy(LIF_PARAMS)\n", "PN_PARAMS[\"TauRefrac\"] = 100.0" ] }, { "cell_type": "markdown", "metadata": { "id": "pCYjAoJf9Lig" }, "source": [ "## Custom models\n", "We are going to apply inputs to our model by treating scaled image pixels as neuronal input currents so here we define a simple model to inject the current specified by a state variable. Like all types of custom model in GeNN, the `var_name_types` kwarg is used to specify state variable names and types" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "IR8PXBg69Lih" }, "outputs": [], "source": [ "# Current source model, allowing current to be injected into neuron from variable\n", "cs_model = create_current_source_model(\n", " \"cs_model\",\n", " vars=[(\"magnitude\", \"scalar\")],\n", " injection_code=\"injectCurrent(magnitude);\")" ] }, { "cell_type": "markdown", "metadata": { "id": "Gn4DpkPQ9Lii" }, "source": [ "## Model definition\n", "Create a new model called \"mnist_mb_first_layer\" with floating point precision and set the simulation timestep to our chosen value" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Gx-GsJhD9Lik" }, "outputs": [], "source": [ "# Create model\n", "model = GeNNModel(\"float\", \"mnist_mb_first_layer\")\n", "model.dt = DT" ] }, { "cell_type": "markdown", "metadata": { "id": "AlMTvSBNHYSD" }, "source": [ "Add a population of `NUM_PN` Projection Neurons, using the built-in LIF model, the parameters we previously chose and initialising the membrane voltage to the reset voltage." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "OnHOIAyVHAFH" }, "outputs": [], "source": [ "# Create neuron populations\n", "lif_init = {\"V\": PN_PARAMS[\"Vreset\"], \"RefracTime\": 0.0}\n", "pn = model.add_neuron_population(\"pn\", NUM_PN, \"LIF\", PN_PARAMS, lif_init)\n", "\n", "# Turn on spike recording\n", "pn.spike_recording_enabled = True" ] }, { "cell_type": "markdown", "metadata": { "id": "sdYo9umiH06S" }, "source": [ "Add a current source to inject current into `pn` using our newly-defined custom model with the initial magnitude set to zero." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "7e1if0YCG_7m" }, "outputs": [], "source": [ "# Create current sources to deliver input to network\n", "pn_input = model.add_current_source(\"pn_input\", cs_model, pn , {}, {\"magnitude\": 0.0})" ] }, { "cell_type": "markdown", "metadata": { "id": "-GU4oXOS9Lil" }, "source": [ "## Build model\n", "Generate code and load it into PyGeNN allocating a large enough spike recording buffer to cover `PRESENT_TIME_MS` (after converting from ms to timesteps)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "-FE02Zoz9Lim" }, "outputs": [], "source": [ "# Concert present time into timesteps\n", "present_timesteps = int(round(PRESENT_TIME_MS / DT))\n", "\n", "# Build model and load it\n", "model.build()\n", "model.load(num_recording_timesteps=present_timesteps)" ] }, { "cell_type": "markdown", "metadata": { "id": "CcpTaaB39Lim" }, "source": [ "## Simulate tutorial model\n", "In order to ensure that the same stimulus causes exactly the same input each time it is presented, we want to reset the model's state after presenting each stimulus. This function resets neuron state variables selected by the keys of a dictionary to the values specifed in the dictionary values and pushes the new values to the GPU." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "7ENTbLZpGvye" }, "outputs": [], "source": [ "def reset_neuron(pop, var_init):\n", " # Reset variables\n", " for var_name, var_val in var_init.items():\n", " pop.vars[var_name].view[:] = var_val\n", "\n", " # Push the new values to GPU\n", " pop.vars[var_name].push_to_device()" ] }, { "cell_type": "markdown", "metadata": { "id": "hHUa3hbMGwWG" }, "source": [ "As an initial test of our model, we loop through 4 stimuli and show the Projection Neurons spikes emitted by the model in response." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "I5Qsfgq99Lin", "outputId": "0ac4adda-b2ad-496f-cb61-f906b8bbc035" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAisAAAGxCAYAAACju/aQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAztElEQVR4nO3dfXRTdZ7H8U/oE5WSRBBailCxykMVFNGhsTNuDzJUrA6O+MShgMro2Ck4iHiAHQV1XEFk1x1cKY5HwT1dcOQcH0YY7PJUnIVWEVARtIMdbJGSwugmASxtae/+4TYYaKAJTXKTvl/n5KTJffre25t7P/ndm3sthmEYAgAAMKkukS4AAADgbAgrAADA1AgrAADA1AgrAADA1AgrAADA1AgrAADA1AgrAADA1AgrAADA1OIjXUAwWlpaVFtbq+7du8tisUS6HAAA0A6GYejo0aNKT09Xly7tby+JyrBSW1urfv36RboMAAAQhAMHDujiiy9ud/8BhZVLLrlE1dXVZ7z/m9/8Ri+99JJOnDihRx99VG+88YYaGhqUl5enpUuXKjU11dtvTU2NCgsLtXnzZqWkpGjKlClasGCB4uPbX0r37t0l/TCzVqs1kFkAAAAR4vF41K9fP+9+vL0CCivbt29Xc3Oz9/Xnn3+un//857rzzjslSY888ojWrl2r1atXy2azadq0abr99tu1detWSVJzc7Py8/OVlpambdu26dChQ5o8ebISEhL07LPPtruO1kM/VquVsAIAQJQJ9BQOy/ncyHDGjBlas2aN9u3bJ4/Ho169emnlypW64447JElffvmlhgwZovLycmVnZ2vdunW65ZZbVFtb621tWbZsmWbPnq0jR44oMTGxXdP1eDyy2Wxyu92EFQAAokSw+++gfw3U2NiokpIS3X///bJYLNqxY4eampo0evRobz+DBw9W//79VV5eLkkqLy/X0KFDfQ4L5eXlyePxaM+ePX6n1dDQII/H4/MAAACdQ9Bh5Z133pHL5dK9994rSXI6nUpMTJTdbvfpLzU1VU6n09vPj4NKa/fWbv4sWLBANpvN++DkWgAAOo+gw8qrr76qsWPHKj09vSPradPcuXPldru9jwMHDoR8mgAAwByC+ulydXW1NmzYoLfeesv7XlpamhobG+VyuXxaV+rq6pSWlubt56OPPvIZV11dnbebP0lJSUpK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b9++c473pZde0iWXXKKuXbtq5MiR+uijj0I0Bx3nbMuiqalJs2fP1tChQ9WtWzelp6dr8uTJqq2tPes4g/mcmcG51ot77733jPm66aabzjneWFsvJLW57bBYLHr++ef9jjNa14v27ENPnDihoqIi9ezZUykpKRo/frzq6urOOt5gtzM/FlNhZcuWLSoqKlJFRYXWr1+vpqYmjRkzRsePHz/rcFarVYcOHfI+qqurw1RxaF1xxRU+8/U///M/fvvdtm2bJkyYoKlTp2rXrl267bbbdNttt+nzzz8PY8WhsX37dp/lsH79eknSnXfe6XeYWFknjh8/rquuukovvfRSm90XLVqkJUuWaNmyZfrwww/VrVs35eXl6cSJE37H+ac//UkzZ87U/PnztXPnTl111VXKy8vT4cOHQzUbHeJsy+L777/Xzp079cQTT2jnzp166623VFlZqV/84hfnHG8gnzOzONd6IUk33XSTz3ytWrXqrOOMxfVCks8yOHTokF577TVZLBaNHz/+rOONxvWiPfvQRx55RO+9955Wr16tLVu2qLa2VrfffvtZxxvMduYMRgw7fPiwIcnYsmWL336WL19u2Gy28BUVJvPnzzeuuuqqdvd/1113Gfn5+T7vjRw50vj1r3/dwZVF3m9/+1sjMzPTaGlpabN7rK4Tkoy3337b+7qlpcVIS0sznn/+ee97LpfLSEpKMlatWuV3PD/5yU+MoqIi7+vm5mYjPT3dWLBgQUjqDoXTl0VbPvroI0OSUV1d7befQD9nZtTWspgyZYoxbty4gMbTWdaLcePGGaNGjTprP7GwXhjGmftQl8tlJCQkGKtXr/b288UXXxiSjPLy8jbHEex25nQx1bJyOrfbLUnq0aPHWfs7duyYMjIy1K9fP40bN0579uwJR3kht2/fPqWnp+vSSy/VxIkTVVNT47ff8vJyjR492ue9vLw8lZeXh7rMsGpsbFRJSYnuv//+s94EM1bXiR/bv3+/nE6nz//dZrNp5MiRfv/vjY2N2rFjh88wXbp00ejRo2NuXXG73bJYLLLb7WftL5DPWTQpKytT7969NWjQIBUWFurbb7/1229nWS/q6uq0du1aTZ069Zz9xsJ6cfo+dMeOHWpqavL5Pw8ePFj9+/f3+38OZjvTlpgNKy0tLZoxY4ZycnJ05ZVX+u1v0KBBeu211/Tuu++qpKRELS0tuv766/XNN9+EsdqON3LkSK1YsULvv/++iouLtX//fv3sZz/T0aNH2+zf6XQqNTXV573U1FQ5nc5wlBs277zzjlwul+69916//cTqOnG61v9tIP/3f/zjH2pubo75deXEiROaPXu2JkyYcNabswX6OYsWN910k/7zP/9TGzdu1HPPPactW7Zo7Nixam5ubrP/zrJevP766+revfs5D3vEwnrR1j7U6XQqMTHxjAB/tv9zMNuZtkTlXZfbo6ioSJ9//vk5jxM6HA45HA7v6+uvv15DhgzRyy+/rN///vehLjNkxo4d6/172LBhGjlypDIyMvTmm2+261tBrHr11Vc1duxYpaen++0nVtcJtE9TU5PuuusuGYah4uLis/Ybq5+ze+65x/v30KFDNWzYMGVmZqqsrEw33nhjBCuLrNdee00TJ0485wn3sbBetHcfGi4x2bIybdo0rVmzRps3b9bFF18c0LAJCQkaPny4vvrqqxBVFxl2u10DBw70O19paWlnnNFdV1entLS0cJQXFtXV1dqwYYN+9atfBTRcrK4Trf/bQP7vF110keLi4mJ2XWkNKtXV1Vq/fn27b3nf6lyfs2h16aWX6qKLLvI7X7G+XkjSX//6V1VWVga8/ZCib73wtw9NS0tTY2OjXC6XT/9n+z8Hs51pS0yFFcMwNG3aNL399tvatGmTBgwYEPA4mpubtXv3bvXp0ycEFUbOsWPHVFVV5Xe+HA6HNm7c6PPe+vXrfVoYot3y5cvVu3dv5efnBzRcrK4TAwYMUFpams//3ePx6MMPP/T7f09MTNSIESN8hmlpadHGjRujfl1pDSr79u3Thg0b1LNnz4DHca7PWbT65ptv9O233/qdr1heL1q9+uqrGjFihK666qqAh42W9eJc+9ARI0YoISHB5/9cWVmpmpoav//nYLYz/oqLGYWFhYbNZjPKysqMQ4cOeR/ff/+9t59JkyYZc+bM8b5+6qmnjNLSUqOqqsrYsWOHcc899xhdu3Y19uzZE4lZ6DCPPvqoUVZWZuzfv9/YunWrMXr0aOOiiy4yDh8+bBjGmcth69atRnx8vLF48WLjiy++MObPn28kJCQYu3fvjtQsdKjm5majf//+xuzZs8/oFsvrxNGjR41du3YZu3btMiQZ//Zv/2bs2rXL+wuXhQsXGna73Xj33XeNzz77zBg3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\n" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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v/56o6CgwPl7c3OzkZCQYCxfvrzTZeP2UBsKCgqUk5OjrKysi65rt9tlsVgu+EvEXUlJiWJjYzVq1Cjl5+fr66+/9lZxve5i9X/55Zc1ePBgXX311SosLNQPP/zQ7raOHTum2tpal21ZrVZNmDBBpaWlXi+7t3T2GCgvL9eBAwc0e/bsi27TTMfAkSNHlJCQoMsvv1zTp09XdXW1pB/re/bsWZf3JSUlRcOHD2/38zTjMdBe/dvSG88BF6t/MJwDOnsM9MZzwFtvvaXx48dr2rRpio2N1dixY/Xiiy86l3flM21qalJ5ebnLa/r06aOsrCyPjgNuD7l59dVX9f7772vfvn0XXferr77SE088oQceeKDD9SZPnqypU6dqxIgRqqys1K9//WtNmTJFpaWlCg0N9VbRveJi9f+nf/onJSUlKSEhQR9++KEWLVqkiooKvf76622uX1tbK0mKi4tzmR8XF+dcFmg8OQZeeukljR49WjfccEOH65npGJgwYYLWrl2rUaNG6eTJk/rNb36jn/70p/roo49UW1uriIgIxcTEuLymo8/TbMdAR/Xv37+/y7q98RxwsfoHwznAk2OgN54DPvvsMxUVFWnBggX69a9/rX379umhhx5SRESEZs2a1aXP9KuvvlJzc3Obr/nkk086X7hOX5MJAtXV1UZsbKzxwQcfOOe1dynUbrcb119/vTF58mSjqanJo/1UVlYakoxt27Z1t8he5Un9W23fvt2QZBw9erTN5bt37zYkGTU1NS7zp02bZtx5551eKbc3efIe/PDDD4bVajWeffZZj/cTqMdAW7799lvDYrEY//3f/228/PLLRkRExAXrXHfddca//uu/tvl6sx0D7s6v//l64zmgLe3Vv1VvOwe0pb33oLeeA8LDww2bzeYyb+7cuUZ6erphGF37TE+cOGFIMvbs2eMyf+HChcb111/f6bJxe+g85eXlqq+v17XXXquwsDCFhYVp165dWrlypcLCwtTc3CxJOnXqlCZPnqz+/fvrjTfeUHh4uEf7ufzyyzV48GAdPXq0J6rRZZ2t//kmTJggSe3WJT4+XpIu6F1SV1fnXBZIPHkPXnvtNf3www+aOXOmx/sJ1GOgLTExMbryyit19OhRxcfHq6mpSQ0NDS7rdPR5mu0YcHd+/Vv11nNAW9qq//l62zmgLe29B731HDB06FClpqa6zBs9erTzFllXPtPBgwcrNDS028cBoeU8N998sw4ePKgDBw44p/Hjx2v69Ok6cOCAQkND5XA4NGnSJEVEROitt97q0pPvX3zxhb7++msNHTq0B2rRdZ2pv7sDBw5IUrt1GTFihOLj47V9+3bnPIfDoffee082m61H6tEdnrwHL730kv7xH/9RQ4YM8Xg/gXoMtOW7775TZWWlhg4dqnHjxik8PNzl86yoqFB1dXW7n6fZjgF359dfUq8+B7TFvf7uets5oC3tvQe99RyQkZGhiooKl3mffvqpkpKSJHXtM42IiNC4ceNcXtPS0qLt27d7dhx0+ppMkDr/1oDdbjcmTJhgpKWlGUePHjVOnjzpnM6dO+d8zahRo4zXX3/dMIwfe6E88sgjRmlpqXHs2DFj27ZtxrXXXmuMHDnSOHPmjD+q5JHz63/06FFj2bJlxv79+41jx44Zb775pnH55ZcbN910k8trzq+/YRjGihUrjJiYGOPNN980PvzwQ+O2224zRowYYZw+fdqXVemytm4PHTlyxAgJCTE2b97c5mvMfAw8/PDDRklJiXHs2DFj9+7dRlZWljF48GCjvr7eMAzDePDBB43hw4cbO3bsMPbv32/YbLYLLiWb+RjoqP7BcA7oqP7Bcg642P8Bw+jd54C9e/caYWFhxm9/+1vjyJEjxssvv2z07dvXKC4udq7Tmc904sSJxvPPP+/8/dVXXzUiIyONtWvXGocPHzYeeOABIyYmxqitre102QgtF3F+g7Vz505DUpvTsWPHnK+RZKxZs8YwjB/veU6aNMkYMmSIER4ebiQlJRn333+/Rx+SP51f/+rqauOmm24yBg4caERGRhpXXHGFsXDhQsNut7u85vz6G8aP3eMee+wxIy4uzoiMjDRuvvlmo6Kiwoe16J62QkthYaGRmJhoNDc3t/kaMx8Dd911lzF06FAjIiLCGDZsmHHXXXe5PK9w+vRp41/+5V+MAQMGGH379jV+/vOfGydPnnTZhpmPgY7qHwzngI7qHyzngIv9HzCM3n0OMAzD2Lhxo3H11VcbkZGRRkpKivHCCy+4LO/MZ5qUlGQsXbrUZd7zzz9vDB8+3IiIiDCuv/56o6yszKNyhRiGYXT+ugwAAIB/8EwLAAAwBUILAAAwBUILAAAwBUILAAAwBUILAAAwBUILAAAwBUILAAAwBUILAAAwBUILgE675557dPvtt/t8v2vXrlVISIhCQkI0b968HtvP559/7tzPNddc02P7AdA1Yf4uAIDAEBIS0uHypUuX6ne/+538NYi2xWJRRUWF+vXr12P7SExM1MmTJ/Xss89q27ZtPbYfAF1DaAEgSTp58qTz33/84x+1ZMkSl296jY6OVnR0tD+KJunHUOXJV9h3RWhoqOLj4/1aTwDt4/YQAElSfHy8c7Jarc6Q0DpFR0dfcHsoMzNTc+fO1bx58zRgwADFxcXpxRdf1Pfff697771X/fv31xVXXKHNmze77Oujjz7SlClTFB0drbi4OM2YMUNfffWVx2W+7LLL9OSTT2rmzJmKjo5WUlKS3nrrLX355Ze67bbbFB0drTFjxmj//v3O11RVVenWW2/VgAED1K9fP1111VX63//93y6/bwB8h9ACoFvWrVunwYMHa+/evZo7d67y8/M1bdo03XDDDXr//fc1adIkzZgxQz/88IMkqaGhQRMnTtTYsWO1f/9+vfPOO6qrq9Odd97Zpf0/99xzysjI0F//+lfl5ORoxowZmjlzpvLy8vT+++8rOTlZM2fOdN7WKigoUGNjo959910dPHhQ//Zv/8aVFcAkCC0AuuUnP/mJFi9erJEjR6qwsFCXXHKJBg8erPvvv18jR47UkiVL9PXXX+vDDz+UJP3Xf/2Xxo4dq6eeekopKSkaO3as/ud//kc7d+7Up59+6vH+f/azn+mf//mfnftyOBy67rrrNG3aNF155ZVatGiRPv74Y9XV1UmSqqurlZGRobS0NF1++eW65ZZbdNNNN3n1PQHQMwgtALplzJgxzn+HhoZq0KBBSktLc86Li4uTJNXX10uSPvjgA+3cudP5jEx0dLRSUlIkSZWVld3af+u+Otr/Qw89pCeffFIZGRlaunSpM0wBCHyEFgDdEh4e7vJ7SEiIy7zWXkktLS2SpO+++0633nqrDhw44DIdOXKkS1c82tpXR/v/5S9/qc8++0wzZszQwYMHNX78eD3//PMe7xeA7xFaAPjUtddeq0OHDumyyy7TFVdc4TL1ZHfm8yUmJurBBx/U66+/rocfflgvvviiT/YLoHsILQB8qqCgQN98843uvvtu7du3T5WVldqyZYvuvfdeNTc39/j+582bpy1btujYsWN6//33tXPnTo0ePbrH9wug+wgtAHwqISFBu3fvVnNzsyZNmqS0tDTNmzdPMTEx6tOn509Jzc3NKigo0OjRozV58mRdeeWVWrVqVY/vF0D3hRj+Gt4SADpp7dq1mjdvnhoaGnyyv8cff1x//vOfdeDAAZ/sD0DncKUFgCnY7XZFR0dr0aJFPbaP6upqRUdH66mnnuqxfQDoOq60AAh4p06dco6zEhMTo8GDB/fIfs6dO6fPP/9ckhQZGanExMQe2Q+AriG0AAAAU+D2EAAAMAVCCwAAMAVCCwAAMAVCCwAAMAVCCwAAMAVCCwAAMAVCCwAAMAVCCwAAMIX/B3aXWcbuFbbtAAAAAElFTkSuQmCC\n" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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2Pft22dIMnJzc33apaSkGAsWLAhaHZziuYRrrrlGycnJPuuGDh16wbs06uvr9cADD6i0tFQ7duzoNB/FfaXxv/XWWzp16pQGDBig0NBQhYaGqrS0VHPnztXAgQNNqLjtXGnsV199tUJDQ5v1+9ERXWn8NTU1+ulPf6pf//rXGj9+vIYNG6bp06frhz/8oZYvX25GyUFRWlqqnTt36sc//rF3XXx8vOrq6lRdXe3TtqqqqlNN+V9s7E3OnDmju+++Wz179tRrr72msLAwEyoMrouNf/fu3SopKVFMTIz3b54kTZw4Uenp6SZV2vYuNvZrrrlGktr9b17nO3HYRtLS0lRcXOyz7pNPPlFiYqL3+6Zwcvz4ce3Zs0e9e/du7zKD5krjz87O9jkPL0kZGRnKzs7WI4880m51BsOVxh4eHq5bb731ir8fHdWVxl9fX6/6+voLrt4PCQlRY2Nju9UZbGvWrFFsbKwyMzO960aMGKGwsDDt2rVLEydOlCQVFxerrKxMTqfTrFLb3MXGLkkej0cZGRmKiIjQpk2bOsW71i7mYuNfsGDBBYEtJSVFK1as0Pjx49u7xKC52NgHDhyohISEi/5dGDduXPCKCdrcTAe3f/9+IzQ01PjFL35hHD9+3Hj55ZeNHj16GPn5+YZhnD+tc++99xr9+vUz3n33XePkyZPepba21uTqW+9K47+YznKKpzljf/XVV42wsDDjhRdeMI4fP248//zzRkhIiPHWW2+ZWHnbaM7477zzTuOGG24w9uzZY3z22WfGmjVrjO7duxurVq0ysfK209DQYAwYMMCYP3/+Bdsef/xxY8CAAcbu3buNgwcPGk6n84JTYh3ZpcbudruNUaNGGSkpKcann37q8zfv3LlzJlXb9i73s/enTnaK53JjX7FihWG3242NGzcax48fNxYuXGh0797d+PTTT4NWDwHlMjZv3mzceOONRkREhDFkyBDjhRde8G77/PPPDUkXXfbs2WNe0W3ocuO/mM4SUAyjeWN/6aWXjOuuu87o3r27cdNNNxmvv/66CZUGx5XGf/LkSePhhx82EhISjO7duxuDBw82fvWrX13y7agdzfbt2w1JRnFx8QXbampqjCeeeMK46qqrjB49ehj/8i//Ypw8edKEKoPjUmPfs2fPJf/mff755+YUGwSX+9n762wB5UpjX7JkidGvXz+jR48ehtPpDPoLMpthGEbw5mcAAAACx0WyAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAJrt4Ycf1n333dfu/a5du1Y2m002m02zZs0KWj9/+9vfvP3cfPPNQesHwJXxYYEAJEk2m+2y259++mn99re/lVk3n7bb7SouLlZUVFTQ+ujfv79Onjyp5cuXa+fOnUHrB8CVEVAASJJOnjzp/fqPf/yjFi1a5PPppdHR0YqOjjajNEnnA1R8fHxQ+wgJCVF8fLyp4wRwHqd4AEiS4uPjvYvD4fAGgqYlOjr6glM86enpmjFjhmbNmqWrrrpKcXFxevHFF/XNN9/okUceUc+ePXXddddp27ZtPn198MEHGjdunKKjoxUXF6fs7Gz97//+b8A1Dxw4UM8995ymTJmi6OhoJSYmatOmTTp9+rR+8IMfKDo6WsOGDdPBgwe9zyktLdX48eN11VVXKSoqSjfccIP+8pe/tPjfDUBwEFAAtMq6det09dVXa//+/ZoxY4ZcLpcmTZqk2267TYcPH9bYsWOVnZ2tb7/9VpJUXV2t0aNHa/jw4Tp48KDeeOMNVVVV6YEHHmhR/ytWrFBaWpqOHDmizMxMZWdna8qUKcrKytLhw4eVlJSkKVOmeE9N5eTkqLa2Vm+++aaOHj2q//zP/2TGBLAgAgqAVrnpppu0cOFCXX/99crNzVX37t119dVX67HHHtP111+vRYsW6e9//7vef/99SdJ//dd/afjw4Vq8eLGGDBmi4cOH6w9/+IP27NmjTz75JOD+v//97+tf//VfvX15PB7deuutmjRpkgYNGqT58+fro48+UlVVlSSprKxMaWlpSklJ0fe+9z3dc889uuOOO9r03wRA6xFQALTKsGHDvF+HhISod+/eSklJ8a6Li4uTJJ06dUqS9N5772nPnj3ea1qio6M1ZMgQSVJJSUmr+m/q63L9z5w5U88995zS0tL09NNPe4MTAGshoABolbCwMJ/vbTabz7qmdwc1NjZKkr7++muNHz9e7777rs9y/PjxFs1kXKyvy/X/4x//WJ999pmys7N19OhRjRw5Us8//3zA/QIILgIKgHZ1yy236NixYxo4cKCuu+46nyWYbyH+rv79++vxxx/Xq6++qrlz5+rFF19sl34BNB8BBUC7ysnJ0ZdffqnJkyfrwIEDKikp0fbt2/XII4+ooaEh6P3PmjVL27dv1+eff67Dhw9rz549Gjp0aND7BRAYAgqAdpWQkKB9+/apoaFBY8eOVUpKimbNmqWYmBh16xb8P0kNDQ3KycnR0KFDdffdd2vQoEFatWpV0PsFEBibYdZtIQGgmdauXatZs2apurq6Xfp75pln9Prrr+vdd99tl/4AXIgZFAAdgtvtVnR0tObPnx+0PsrKyhQdHa3FixcHrQ8AzcMMCgDLO3PmjPc+JjExMbr66quD0s+5c+f0t7/9TZIUERGh/v37B6UfAFdGQAEAAJbDKR4AAGA5BBQAAGA5BBQAAGA5BBQAAGA5BBQAAGA5BBQAAGA5BBQAAGA5BBQAAGA5/x+uSjlTPf8u+QAAAABJRU5ErkJggg==\n" }, "metadata": {} } ], "source": [ "for s in range(4):\n", " # Set training image\n", " pn_input.vars[\"magnitude\"].view[:] = training_images[s] * INPUT_SCALE\n", " pn_input.vars[\"magnitude\"].push_to_device()\n", "\n", " # Simulate timesteps\n", " for i in range(present_timesteps):\n", " model.step_time()\n", "\n", " # Reset neuron state for next stimuli\n", " reset_neuron(pn, lif_init)\n", "\n", " # Download spikes from GPU\n", " model.pull_recording_buffers_from_device();\n", "\n", " # Plot PN spikes\n", " fig, axis = plt.subplots()\n", " pn_spike_times, pn_spike_ids = pn.spike_recording_data[0]\n", " axis.scatter(pn_spike_times, pn_spike_ids, s=1)\n", " axis.set_xlabel(\"Time [ms]\")" ] } ], "metadata": { "accelerator": "GPU", "colab": { "name": "1_first_layer", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7" } }, "nbformat": 4, "nbformat_minor": 0 }