diff --git a/bindsnet/network/__init__.py b/bindsnet/network/__init__.py index e4a635dc..327c9375 100644 --- a/bindsnet/network/__init__.py +++ b/bindsnet/network/__init__.py @@ -98,12 +98,6 @@ def run(self, inpts, time): for monitor in self.monitors: self.monitors[monitor].record() - # if self.train: - # # Normalize synapse weights. - # for synapse in self.connections: - # if type(self.connections[synapse]) == connections.STDPconnections: - # self.connections[synapse].normalize() - return spikes def reset(self): @@ -133,7 +127,8 @@ def get(self, var): def record(self): for var in self.state_vars: - self.recording[var] = torch.cat([self.recording[var], self.obj.__dict__[var]]) + data = self.obj.__dict__[var].view(-1, 1) + self.recording[var] = torch.cat([self.recording[var], data], 1) def reset(self): self.recording = {var : torch.Tensor() for var in self.state_vars} \ No newline at end of file diff --git a/bindsnet/network/connections.py b/bindsnet/network/connections.py index ebc582bf..321b3cfb 100644 --- a/bindsnet/network/connections.py +++ b/bindsnet/network/connections.py @@ -1,7 +1,7 @@ import torch -def ETH_STDP(conn, nu_pre=1e-4, nu_post=1e-2): +def ETH_STDP(conn, nu_pre=1e-4, nu_post=1e-2, norm=78.0): # Post-synaptic. conn.w += nu_post * (conn.source.x.view(conn.source.n, 1) * conn.target.s.float().view(1, conn.target.n)) @@ -9,8 +9,9 @@ def ETH_STDP(conn, nu_pre=1e-4, nu_post=1e-2): conn.w -= nu_pre * (conn.source.s.float().view(conn.source.n, 1) * conn.target.x.view(1, conn.target.n)) - # Ensure that weights are within [0, self.wmax]. + # Bound and re-normalize weights. conn.w = torch.clamp(conn.w, 0, conn.wmax) + conn.w *= norm / conn.w.sum(0).view(1, -1) class Connection: diff --git a/bindsnet/network/nodes.py b/bindsnet/network/nodes.py index 9fa3b3c2..98479fb1 100644 --- a/bindsnet/network/nodes.py +++ b/bindsnet/network/nodes.py @@ -93,6 +93,7 @@ def __init__(self, n, traces=False, threshold=1.0, trace_tc=5e-2): self.n = n # No. of neurons. self.traces = traces # Whether to record synpatic traces. self.threshold = threshold # Spike threshold voltage. + self.v = torch.zeros_like(torch.Tensor(n)) # Neuron voltages. self.s = torch.zeros_like(torch.Tensor(n)) # Spike occurences. if self.traces: @@ -108,7 +109,8 @@ def step(self, inpts, dt): of inputs to the layer, with size equal to self.n. dt (float): Simulation time step. ''' - self.s = inpts >= self.threshold # Check for spiking neurons. + self.v = inpts + self.s = self.v >= self.threshold # Check for spiking neurons. if self.traces: # Decay and set spike traces. diff --git a/examples/Simple test network.ipynb b/examples/Simple test network.ipynb deleted file mode 100644 index 428ac3a0..00000000 --- a/examples/Simple test network.ipynb +++ /dev/null @@ -1,323 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Testing simple `bindsnet` functionality\n", - "\n", - "## Imports and utils" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import os, sys\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "sys.path.append(os.path.abspath(os.path.join('..', 'bindsnet')))\n", - "sys.path.append(os.path.abspath(os.path.join('..', 'bindsnet', 'network')))\n", - "\n", - "from network import Network\n", - "from connections import Connection\n", - "from nodes import McCullochPitts, Input\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Construct simple network" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "network = Network(dt=1.0) # Initialize network" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That was easy!\n", - "\n", - "### Add layer of McCulloch-Pitts (MP) neurons" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "n_neurons = 25\n", - "\n", - "# Create layer of `n_neurons` McCulloch-Pitts neurons and add it to the network\n", - "mp_layer = McCullochPitts(n=n_neurons, traces=False, threshold=2.0) \n", - "network.add_layer(mp_layer, name='A')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Add input layer" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "n_input = 25\n", - "\n", - "# Create layer of `n_input` input neurons and add it to the network\n", - "input_layer = Input(n=n_input)\n", - "network.add_layer(input_layer, name='X')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Check properties of network" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'A': , 'X': }\n", - "\n", - "No. of neurons in layer A: 25\n", - "Spike traces in layer A? False\n", - "Threshold of neurons in layer A: 2.0\n", - "Spike occurrence vector of layer A: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", - " 0.]\n", - "\n", - "No. of neurons in layer X: 25\n", - "Spike traces in layer X? False\n", - "Spike occurrence vector of layer X: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", - " 0.]\n" - ] - } - ], - "source": [ - "print(network.layers)\n", - "print()\n", - "\n", - "print('No. of neurons in layer A:', network.layers['A'].n)\n", - "print('Spike traces in layer A?', network.layers['A'].traces)\n", - "print('Threshold of neurons in layer A:', network.layers['A'].threshold)\n", - "print('Spike occurrence vector of layer A:', network.layers['A'].s.numpy())\n", - "print()\n", - "\n", - "print('No. of neurons in layer X:', network.layers['X'].n)\n", - "print('Spike traces in layer X?', network.layers['X'].traces)\n", - "print('Spike occurrence vector of layer X:', network.layers['X'].s.numpy())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Add connection from input to MP layer" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "w = torch.rand(input_layer.n, mp_layer.n) # Create random uniform weight matrix between layers.\n", - "\n", - "# Create connection object from input to MP layer with specified weights.\n", - "connection = Connection(input_layer, mp_layer, update_rule=None, w=w)\n", - "network.add_connection(connection, source='X', target='A')" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(10, 10))\n", - "\n", - "im = ax.matshow(w.numpy(), cmap='hot_r')\n", - "ax.set_xticks(()); ax.set_yticks(()); plt.colorbar(im)\n", - "ax.set_title('Weights from input to McCulloch-Pitts layer');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Run simple network simulation\n", - "\n", - "### Create network input" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "time = 100 # Simulation time\n", - "p_fire = 0.1 # Bernoulli probability of input neuron spiking\n", - "\n", - "# Input spikes are Bernoulli experiments with spike prob. `p_fire`.\n", - "inpt = np.random.binomial(1, p_fire, [n_input, time])\n", - "inpt = torch.from_numpy(inpt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Run network simulation" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "output = network.run(inpts={'X' : inpt}, time=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Inspect network input / output" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "inpt_spikes = output['X'].numpy()\n", - "mp_spikes = output['A'].numpy()\n", - "\n", - "plt.matshow(inpt_spikes, cmap='binary');\n", - "plt.xticks(()); plt.yticks(());\n", - "plt.xlabel('Simulation time'); plt.ylabel('Index of input neuron');\n", - "plt.title('Input neurons spikes over time');\n", - "\n", - "plt.matshow(mp_spikes, cmap='binary')\n", - "plt.xticks(()); plt.yticks(())\n", - "plt.xlabel('Simulation time'); plt.ylabel('Index of input neuron')\n", - "plt.title('McCulloch-Pitts neurons spikes over time')\n", - "\n", - "plt.matshow(np.stack([inpt_spikes.sum(axis=0)] * 25))\n", - "plt.xlabel('Simulation time'); plt.ylabel('Index of input neuron')\n", - "plt.title('Summed intensity of input spikes')\n", - "plt.xticks(()); plt.yticks(());\n", - "\n", - "plt.matshow(np.stack([mp_spikes.sum(axis=0)] * 25))\n", - "plt.xlabel('Simulation time'); plt.ylabel('Index of input neuron')\n", - "plt.title('Summed intensity of McCulloch-Pitts spikes')\n", - "plt.xticks(()); plt.yticks(());" - ] - } - ], - "metadata": { - "anaconda-cloud": {}, - "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.6.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/notebooks/Monitor test.ipynb b/examples/notebooks/Monitor test.ipynb new file mode 100644 index 00000000..ebb8e5c1 --- /dev/null +++ b/examples/notebooks/Monitor test.ipynb @@ -0,0 +1,152 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Testing `bindsnet.Monitor` object" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import os, sys\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "sys.path.append(os.path.abspath(os.path.join('..', '..', 'bindsnet')))\n", + "sys.path.append(os.path.abspath(os.path.join('..', '..', 'bindsnet', 'network')))\n", + "\n", + "from network import Network, Monitor\n", + "from connections import Connection\n", + "from nodes import McCullochPitts, Input\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "network = Network(dt=1.0)\n", + "\n", + "n_neurons = 25\n", + "\n", + "input_layer = Input(n=n_neurons)\n", + "mp_layer = McCullochPitts(n=n_neurons)\n", + "\n", + "network.add_layer(input_layer, name='input')\n", + "network.add_layer(mp_layer, name='MP')\n", + "\n", + "connection = Connection(source=input_layer, target=mp_layer)\n", + "network.add_connection(connection, source='input', target='MP')\n", + "\n", + "voltage_monitor = Monitor(mp_layer, state_vars=['v'])\n", + "network.add_monitor(voltage_monitor, name='v_monitor')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "time = 100 # Simulation time\n", + "p_fire = 0.1 # Bernoulli probability of input neuron spiking\n", + "\n", + "# Input spikes are Bernoulli experiments with spike prob. `p_fire`.\n", + "inpt = np.random.binomial(1, p_fire, [n_neurons, time])\n", + "inpt = torch.from_numpy(inpt)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "spikes = network.run(inpts={'input' : inpt}, time=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "voltages = voltage_monitor.get('v')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.matshow(voltages)\n", + "plt.xticks(()); plt.yticks(());\n", + "plt.xlabel('Time'); plt.ylabel('Neuron index');" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5wAAAD/CAYAAACdOtm4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAADdVJREFUeJzt3W2spHdZx/Hf1S4UKH1uQWpKMcUiNS0EqZYaiyQKoRFDKqYvGo2VmOADlJREJDEE4QUEIYBN1DQSqW8UExCwom0K0vgULAWFpLU8GAmxUFss3T7QSrd/X+ysXUz33H/KXGeZ6eeTnOyZs/8z5zoz98ycb2bue2qMEQAAAFi3Iw73AAAAAGwnwQkAAEALwQkAAEALwQkAAEALwQkAAEALwQkAAEALwQkAAEALwQkAAEALwQkAAEALwQkAAECLPR1neuSTjx57Tjzxuz6fo/77ocU1Dz5xuZn3PXH5Zx35zZmJdlYnPLi4Zty5not8zx33Li86evkXf+DE5ctv5rKZuYxnzFznZ57x9cU1/7Xv8Ytr7rjtuMU1M5fzvh88asf/n7nO17WNzmyDJz1++Xf6xn8cs7hm5rY3M8+D9y9fPnuesHu3rZOfetfimtv2Lm87S2a29Znb54yZbeesU29fXPP5L520uGZm5rNPWM/PmtkGZ+z55vJ1sQ5rm3fm/n/CA6cdvbhmHY+Nydx93Lpu5zPX58x2+tRjl+8Llu4rZ37Ouv7WmbGu62HmceQpR/7P4pqbv3nC4pqp63wNj9VJcuStE39Tnrrz9TVzHuty/DPuXlyzrsfzdW07M4/5M48RN916yuKamZnXcTvfzb+HZszcp8xY2taT5L4vfO2OMcbilVFjjLUMdbCjnn7aOPV1r/2uz+eZ779vcc0d5yw/YH7j2cu/4/E319RMO3ncy5dvIN/60PINZMbJV/7T8qLzzllc8sWLn7S4ZuaymbmMZ8xc59d88E8W11xx5+mLa973ngsX18xcznd99Jk7/v/Mdb6ubXRmG7zk9BsW11z9yhcurpm57c3Mc/stJy+uOeVZdyyuWddt65cu++jimndf+9Lv+ufMbOszt88ZM9vOjW/6g8U1L7noFxfXzMz8pYv/cC0/a2YbnHHyZ9cTcEvWNu/M/f+EL77rvMU163hsTObu49Z1O5+5Pme209e++K8X1yzdV878nHX9rTNjXdfDzOPIq0/48uKa8/7lFYtrpq7zNTxWJ8lxb16+vu56487X18x5rMvPvPf6xTXrejxf17Yz85g/8xjxI2/61cU1MzOv43a+m38PzZi5T5mxtK0nyQ0vfduNY4znL63zkloAAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaCE4AAABaLAZnVb2lqvYcdPrYqvrj3rEAAADYdDPPcO5J8smqOqeqfjrJDUlu7B0LAACATbdnacEY4w1VdV2STya5M8kFY4wvtk8GAADARpt5Se0FSX4vyZuTfCLJFVV1avNcAAAAbLjFZziTvCPJz48xbkqSqrooyceT/FDnYAAAAGy2meB8wRhj34ETY4wPVtX1jTMBAACwBWYOGnRyVb23qv4mSarqrCQv7x0LAACATTcTnO9Lck2Sp61Ofz7Ja7sGAgAAYDtMPcM5xvjzJA8lyRjjwST7dv4WAAAAHutmgvPeqjopyUiSqjovyV2tUwEAALDxZg4adHmSjyQ5o6r+IckpSV7ROhUAAAAbbzE4xxifrqoXJnlWkkpyyxjjW+2TAQAAsNEOGZyr99t8JGdWVcYYH2yaCQAAgC2w0zOcL1v9+5Qk5yf5+Or0i5L8YxLBCQAAwCEdMjjHGJcmSVVdm+SsMcZXV6eflv1vlQIAAACHNHOU2tMOxObKbUme3jQPAAAAW2LmKLUfq6prkvzp6vTFSa7rGwkAAIBtMHOU2t9YHUDoJ1ZfunKM8Re9YwEAALDpZp7hPHBEWgcJAgAAYNriPpxVdVFVfaGq7qqqvVV1d1Xt3Y3hAAAA2Fwzz3C+PcnLxhg3dw8DAADA9pg5Su1tYhMAAIDv1MwznJ+qqvcn+VCSBw58cbVfJwAAADyimeA8Nsl9SV580NdGHEQIAACAHcy8LcqluzEIAAAA2+WQwVlVvznGeHtVXZH9z2h+mzHGa1onAwAAYKPt9AzngQMFfWo3BgEAAGC7HDI4xxh/ufr3qt0bBwAAgG0x87YoAAAA8B0TnAAAALQQnAAAALRYfFuUqjolya8kecbB68cYv9w3FgAAAJtuMTiTfDjJ3yW5Lsm+3nEAAADYFjPB+aQxxuvbJwEAAGCrzOzDeXVVXdg+CQAAAFtlJjgvy/7ovL+q7l597O0eDAAAgM22+JLaMcYxuzEIAAAA22VmH85U1c8muWB18hNjjKv7RgIAAGAbLL6ktqrelv0vq71p9XFZVb21ezAAAAA228wznBcmee4Y46EkqaqrknwmyRs6BwMAAGCzzRw0KEmOP+jz4zoGAQAAYLvMPMP51iSfqaq/TVLZvy/nb7VOBQAAwMbbMTirqpL8fZLzkpy7+vLrxxhf6x4MAACAzbZjcI4xRlV9dIxxdpKP7NJMAAAAbIGZfTg/XVXnLi8DAACAh83sw/ljSS6pqi8nuTf79+McY4xzWicDAABgo80E50vapwAAAGDrzATnaJ8CAACArTMTnH+V/dFZSZ6Q5AeS3JLkhxvnAgAAYMMtBufqCLX/p6qel+TX2iYCAABgK8wcpfbbjDE+nf0HEgIAAIBDWnyGs6ouP+jkEUmel+TWtokAAADYCjP7cB5z0OcPZv8+nR/oGQcAAIBtMbMP5+8kSVU9aYxxX/9IAAAAbIPFfTir6gVVdVOSf1udfk5V/X77ZAAAAGy0mYMGvTvJS5J8PUnGGP+a5ILOoQAAANh8U0epHWN85f99aV/DLAAAAGyRmYMGfaWqzk8yqupxSS5LcnPvWAAAAGy6mWc4X5Xk15N8f5L/TPLc1WkAAAA4pJmj1N6R5JJdmAUAAIAtcsjgrKo37vB9Y4zxloZ5AAAA2BI7PcN57yN87egkr0xyUhLBCQAAwCEdMjjHGO888HlVHZP9Bwu6NMmfJXnnob4PAAAAkoV9OKvqxCSXZ/8+nFcled4Y487dGAwAAIDNttM+nL+b5KIkVyY5e4xxz65NBQAAwMbb6W1RXpfk1CS/neTWqtq7+ri7qvbuzngAAABsqp324Zx5j04AAAB4RKISAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFoITAACAFjXGWP+ZVt2e5MtrP2MAAAC+F5w+xjhlaVFLcAIAAICX1AIAANBCcAIAANBiz+EeAAC+11TVSUk+tjr5fUn2Jbl9dfq+Mcb5h2UwANgw9uEEgB1U1ZuS3DPGeMfhngUANo2X1ALAd6Cq7ln9+5NVdX1Vfbiq/r2q3lZVl1TVP1fV56rqjNW6U6rqA1V1w+rjxw/vbwAAu0dwAsCj95wkr0ry7CS/kOTMMcaPJvmjJK9erXlPkneNMc5N8nOr/wOAxwT7cALAo3fDGOOrSVJVX0py7errn0vyotXnP5XkrKo68D3HVtWTxxj37OqkAHAYCE4AePQeOOjzhw46/VAefow9Isl5Y4z7d3MwAPhe4CW1ANDr2jz88tpU1XMP4ywAsKsEJwD0ek2S51fVZ6vqpuzf5xMAHhO8LQoAAAAtPMMJAABAC8EJAABAC8EJAABAC8EJAABAC8EJAABAC8EJAABAC8EJAABAC8EJAABAi/8Fxvth9DAyXt8AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.matshow(torch.stack([inpt.sum(0)] * n_neurons))\n", + "plt.xticks(()); plt.yticks(())\n", + "plt.xlabel('Time'); plt.ylabel('Neuron index');" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/notebooks/Simple test network.ipynb b/examples/notebooks/Simple test network.ipynb new file mode 100644 index 00000000..559c301b --- /dev/null +++ b/examples/notebooks/Simple test network.ipynb @@ -0,0 +1,323 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Testing simple `bindsnet` functionality\n", + "\n", + "## Imports and utils" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import os, sys\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "sys.path.append(os.path.abspath(os.path.join('..', '..', 'bindsnet')))\n", + "sys.path.append(os.path.abspath(os.path.join('..', '..', 'bindsnet', 'network')))\n", + "\n", + "from network import Network\n", + "from connections import Connection\n", + "from nodes import McCullochPitts, Input\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Construct simple network" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "network = Network(dt=1.0) # Initialize network" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That was easy!\n", + "\n", + "### Add layer of McCulloch-Pitts (MP) neurons" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "n_neurons = 25\n", + "\n", + "# Create layer of `n_neurons` McCulloch-Pitts neurons and add it to the network\n", + "mp_layer = McCullochPitts(n=n_neurons, traces=False, threshold=2.0) \n", + "network.add_layer(mp_layer, name='A')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Add input layer" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "n_input = 25\n", + "\n", + "# Create layer of `n_input` input neurons and add it to the network\n", + "input_layer = Input(n=n_input)\n", + "network.add_layer(input_layer, name='X')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check properties of network" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'A': , 'X': }\n", + "\n", + "No. of neurons in layer A: 25\n", + "Spike traces in layer A? False\n", + "Threshold of neurons in layer A: 2.0\n", + "Spike occurrence vector of layer A: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0.]\n", + "\n", + "No. of neurons in layer X: 25\n", + "Spike traces in layer X? False\n", + "Spike occurrence vector of layer X: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0.]\n" + ] + } + ], + "source": [ + "print(network.layers)\n", + "print()\n", + "\n", + "print('No. of neurons in layer A:', network.layers['A'].n)\n", + "print('Spike traces in layer A?', network.layers['A'].traces)\n", + "print('Threshold of neurons in layer A:', network.layers['A'].threshold)\n", + "print('Spike occurrence vector of layer A:', network.layers['A'].s.numpy())\n", + "print()\n", + "\n", + "print('No. of neurons in layer X:', network.layers['X'].n)\n", + "print('Spike traces in layer X?', network.layers['X'].traces)\n", + "print('Spike occurrence vector of layer X:', network.layers['X'].s.numpy())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Add connection from input to MP layer" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "w = torch.rand(input_layer.n, mp_layer.n) # Create random uniform weight matrix between layers.\n", + "\n", + "# Create connection object from input to MP layer with specified weights.\n", + "connection = Connection(input_layer, mp_layer, update_rule=None, w=w)\n", + "network.add_connection(connection, source='X', target='A')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh4AAAI1CAYAAACZqPO/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3XmcXfP9x/H3x75EbYlqFrE0lqAipvor9UN+QYpYaouQnxZRVKuorQ21taX89Kcltlqj+SEtmkRqqy2WkglaFUWkIoslCSkNFWk+vz/OGW7GJDOT88nJ9568no9HHsydO+9zzp07cz/zPt97r7m7AAAAyrDc0t4BAACw7GDwAAAApWHwAAAApWHwAAAApWHwAAAApWHwAAAApWHwAAAApWHwAAAApWHwAAAApWHwAAAApVlhae8AAADIrGBW2huZzJfudfd+JW3uEwweAAAkwiWtWtK25kgdS9rUAhg8AABISNXXQFT9+AAAQEJoPAAASIRJWn5p78QSRuMBAABKw+ABAABKw6kWAAASUvVGoOrHBwAAEkLjAQBAIlhcikoxs6vM7Kw2XvdGM7tgCe3Hjmb2ipn908z2WxLbaGX7L5jZLmVvt4rM7Jtm9ljNx25mXyyY+ZqZ9S2+d5KZ/cHMjojIaiF7if2MAFXG4JEwMzvTzP7Q7LJXFnLZgNby3P1Ydz8/aN+KPMCcJ+lyd+/g7ndF7E97uPuW7v7wkt5OWx6YityOZrZh/vXPNru8o5nNNbPX2pjzBTO7zszeMLP3zexvZnauma2+OPtVtnxQ+TAfZN/Kb/cOkuTuX3f3m/LrLTAk5ZcxPCA5y5f0b2lh8Ejbo5J2MLPlpewBQtKKkrZtdtkX8+vWi+6SXmjpE5bhftk+q5nZVjUfD5T097Z8oZmtI+lJZa/S/FV3X0PSbpLWkrRJ9I4uQf3dvYOk3pIaJA1ZyvuzRJgZp8dR9/gFn7ZxygaNXvnHO0l6SNJLzS571d2nS5KZbW5m95vZO2b2kpkd3BTW/K87Mzst/yt3upkd3cJf32ub2d35X8FPmdkm+dc1DTl/zv/KPCT/K3u0mc3Otz22pQHCzF6VtLGkUfnXrmxmD5vZT8zscUkfSNrYzDqb2cg8a6KZDa7JOMfMRpjZLfm+PW9mm+YN0dtmNsXMdl/YjVpb5edZt5vZzXnWC2bW0Oy6Z5rZBDN718xuMLNV8s+19Be0m9kXzewYSYdJOi0/zlEt7Mdnbsf88sH5Mb+T3wadF3YsuWGSak8n/Lekm5ttq5uZ3WFmM8xslpldnn/qZEnvSzrc3V+TJHef4u4nuvtfalqVFWqyHjazo1vZJ5nZmvntOsPMJpvZkNr7RH6cL+a3+wQz613z5b3M7C9m9g8zu63pNm+Nu0+T9AdJW9Xuq5ltIekqSV/Nb+vZC/semdnpZjYt36+XzOy/2nCsa+f3/xn5/WS0mXXNP3eQmY1vdv2Tzez3+f+vbGaXmNnrljU2V5nZqvnndjGzqfk+vSnphrbcDqhfpuyBuYx/SwuDR8Lcfa6kpyT9Z37Rf0oaK+mxZpc9KkmWVeP3SxouaT1JAyQNNbOezbPNrJ+yB52+yhqTXVrYhQGSzpW0tqSJkn6S71fTtrfJT5fcJukUSVMldZL0eUk/VPZ+R82PaRNJryv/C9XdP8o/NUjSMZLWkDRZ0q15XmdJB0r6qZn1qYnqr+wBd21Jz0q6V9n9uYuyUzlXt3A8C7NPvr21JI2UdHmzzx8maQ9lDcCmasNf0+5+jaTfSPp5fpz9W7jOZ27H/Bh/JulgSV/Qp7fFotwiaYCZLZ9/rzsou99Ikixrx0bnWRsqu42aMvtKusPd57d2TIvhV5LWVDZo7qxsIPpWvk8HSTonv+xzyr4Hs2q+9mBJ/SRtJOlLkr7Zlg2aWTdJeyq7T3zC3V+UdKykJ/Pbeq2WvkdmtpmkEyR9OW9/9pD0Whs2vZyyoaC7pA0kfahP70cjJW2UDz9NBunT4fBCZferXsp+FrtIOrvmuutLWifPPqYN+wIkjcEjfY/o0yFjJ2WDx9hmlz2S///ekl5z9xvcfZ67Pyvpd5IOaiH3YEk3uPsL7v6BsgeB5u5096fdfZ6yX9C9WrhOk4+VPVB2d/eP3X2se7ve3fnGfF/mKftFu6Ok0939X+7+nKRfK3uQajLW3e/Nrz9C2cBzobt/rOxBdUMzW6uN237M3ce4+7+VDTPbNPv85XkL8I6y4evQdhxXex0m6Xp3fyYfys5U9lf6hov4mqnKWrC+ym6jYc0+v72yAe5Ud5+T36ZNTc26kt4I3H9Jnww7AySd6e7v523K/yh7wJWko5U94I/zzER3n1wT8Ut3n57f5qO06PueJN1lZrOVDeWPSPrpYu76vyWtLKmnma3o7q+5+6utfZG7z3L337n7B+7+vrL7yc755z6SdJukwyXJzLZUNgCONjNTNkyc5O7v5F/7U2W3XZP5kn7s7h+5+4eLeVyoI6zxwNL2qKSvWXYuvpO7vyLpCWVrP9ZRVik3VfbdJX0lr5Fn57+ID1P2QN5cZ0lTaj6e0sJ13qz5/w+U/SW9MBcra0XuM7NJZnZGG46tVu32O0tq+iXcZLKyvwSbvFXz/x9KmpkPDk0fq5X9rdX8OFexBc+l1+7b5Hz/lpTO+TYkSe7+T2VNQJeFfkXmZmWtwKH67ODRTdLkfEhrbpaygTFaR2WnCWuHidrvYTdJi3pAb/G+Z9mzVP6Z/zus5jr75S1Gd3c/fnEfoN19oqTvKxvE3zazW9twqktmtpqZXZ2fUnpP2c/kWvkAJkk3SRqYDxqDJN2eDySdJK0maXzNz+w9+eVNZrj7vxbneIAUMXik70lldfVgSY9Lkru/J2l6ftl0d29aSDhF0iP5L+Cmfx3c/bgWct+Q1LXm425FdjL/q/YUd99YWW1+clvOjddG1Pz/dEnrmNkaNZdtIGlakX0soPa22UDZ/knSHGUPGpIkM2s+4LWn8WkyXdkA2ZS5urJWorVj/52kvSRNcvfXm31uiqQNrOWFiQ9I2t8WvqB3Tv7f1Woua2mQbW6mshase81ltd/DKVqMxav5s1Q65P9+094vb8tl7j7c3b+mbN9d0kVtyD5F0maSvuLun9OnjaTlmX+SNFdZQzlQnw6HM5UNylvW/MyumS+UXdR+o6KaXseDxgNLTf6XW6Oy9Rhjaz71WH5Z7bNZRkva1MwGmdmK+b8vNzu33OR2Sd8ysy3MbDVJbXp9jxpvKTt3L0kys70tW1Rpkv6hrLJerHUD7j5FWavzMzNbxcy+JOkoZWsZlobvmFnXvGH6kbLaXJL+LGlLM+uVL348p9nXLXAbLUTz6/yfsu9LLzNbWVnt/lTTws+Fcfc5kvooO4XR3NPKBs0LzWz1/DbdMf/cpcrWWNxkZt0lycy6mNmlZvYld5+hbFg4PF9DcqTaMDDk7dPtkn5iZmvk2Sfr0+/hryX9wMy2s8wXm7a/BL0lqauZrdTsstr78WZm1ie/7f+lbChoy/14jfy6s/P7yY9buM7NytZ9fNx0qitfW3OtpF+Y2Xr5PnQxsz3afXRAnWDwqA+PKFssWvsMirH5ZZ8MHvmpid2VnR+erqyuvkjZOesFuPsfJP1S2bNkJkr6U/6pj5pfdyHOUfZgNduyZ870UPbX8z+VtTRD3f2hNma15FBl58GnS7pT2TnuBwrkFTFc0n2SJik7PXCBJLn7y8oWsj4g6RUt+P2RpOuUrRWYbWYLe72Sc1RzO+bHeJayBuMNZQ/yrb5GS74/jS2tR8iHgP7KFi6+rmxNyCH5596RtIOyduIpM3tf0h+VDY8T84jBkk5VdlpmS2VDYVt8V1ljMknZbTNc0vX5dkcoWwcxXNmzau5StoBySXpQ2dO43zSzmfllzb9HKytb7DlT2c/PesrW2bTmf5U9JXmmsp+le1q4zjBlp0abD9CnK/8ZzE/TPKCsPcEyqurParH2rf9DVeWtyF8lrbyQtQDLJMtehOvopTj0oCLyp8i+Lal3vlYL+IyVzbxr61cLMUka7+4NrV8zFi9Gswwzs/0ljVF2/v4iSaMYOoAl5jhJ4xg6sCjLwnu1MHgs274t6UZl6zEekXT8Ut0boKLy5swklf7eREBqGDyWYe7eb2nvQ+rcfcOlvQ+of9yPgE8xeAAAkJCqP+uj6scHAAASQuMBAEAiloXFpTQeAACgNDQeAAAkgsYDAAAgEI0HAAAJqXojUPXjAwAACaHxAAAgEazxAAAACETjAQBAQmg8AAAAgtB4AACQCFP1G4GqHx8AAEgIjQcAAAlhjQcAAEAQBg8AAFAaTrUAAJAIFpcCAAAEovEAACAhLC4FAAAIQuMBAEAieJM4AACAQDQeAAAkpOqNQLsGjxXMfMWAjW65nQWkSHrbQ2JmTQmJ0bodAkK6BGRI0mtBOVt1jsmZOT0mJyhGEXdkSS9/EJOzaY+AkNcDMiRpw5iYl16Kydks6C6oLwT93pkV83tHa8fEaLl1i2dMmFU8Q5I2i4mZ/FxMzocBGR9J+tg96M4DqZ2Dx4qSNg7YaGNj0G/9y+aGxNz0/ZAYHdE7IOT8gAxJOiYop/H4mJzrh8Tk/DgmRuvHxPRpjMl58IqAkKBvla6Jidlp55icscfF5GhI0O+dYTG/d3RgTIxW3ad4Rq8bimdI0oMxMUevE5Pz10Qy2oM1HgAAAIFY4wEAQEJoPAAAAILQeAAAkAjeqwUAACAQjQcAAAlhjQcAAEAQBg8AAFAaTrUAAJAIFpcCAAAEovEAACARvGQ6AABAIBoPAAASQuMBAAAQhMYDAIBE8KwWAACAQObubb5ywwrmjR0CtnppQIYkHXlSUNCaMTFdzime8aPiEZI09DsxOb+PidG9vmtIzhh7KCRnz9VCYvTwBzE53w3IGBKQIUmH+JNBSV+Midm8U0zOhTExd+wfk3NbTIzWCsiI+jm/LCjnkaCciwMydpL0jLsFRLXJuma+Z0nbukUa7+4NJW3uEzQeAACgNKzxAAAgEbyOBwAAQCAaDwAAElL1RqDqxwcAABJC4wEAQCJY4wEAABCIwQMAAJSGUy0AACSk6o1A1Y8PAAAkhMYDAIBEsLgUAAAgEI0HAAAJofEAAAAIQuMBAEAiTNVvBKp+fAAAICE0HgAAJKTqazzaN3j06iE1/ipgs78PyJCkNYNyJsfErBGQMSEgQ9LxfmtIzi9tQEiO9O+QlM4hKZK6x8TsMuGVkJznj+hROOPBmwN2RJL0HyEpR5qF5Fw/NSRGGh4T8w3fICTndHs9JOeV1Ypn9PmgeIYkHXJOUE7MrwvpzOIRy+1YPAMLovEAACARvI4HAABAIBoPAAASUvVGoOrHBwAAEkLjAQBAIljjAQAAEIjBAwAAlIZTLQAAJKTqjUDVjw8AACSExgMAgESwuBQAACAQjQcAAImg8QAAAAhE4wEAQEKq3ghU/fgAAEBCaDwAAEgEazwAAAACmbu3+cobmvmPAjY6+KOAEEkbrhyT87uYGE0OyLg6IEOSRgTlPBOUs8s6QUGzOsfk9J4ek/PM9iExN9nThTOO8BkBeyLpxU4xOffFxOjE0UFBJwflXBoTc/3eITFdjiqeMW3/4hmSpKicPjExu3UtnvGUpPfcrXhS23Q18++VtK3TpfHu3lDS5j5B4wEAAErD4AEAQCJM2QNzGf/atD9m/czsJTObaGZntPD5DczsITN71sz+YmZ7tpbJ4AEAAD7DzJaXdIWkr0vqKelQM+vZ7GpDJN3u7ttKGiBpaGu5PKsFAICEJPSslu0lTXT3SZJkZrdK2lfShJrruKTP5f+/pqRWF9AxeAAAgJZ0kTSl5uOpkr7S7DrnSLrPzL4raXVJfVsL5VQLAACJKHmNR0cza6z5d8xi7PKhkm50966S9pQ0zMwWOVvQeAAAsGya2crTaadJ6lbzcdf8slpHSeonSe7+pJmtIqmjpLcXFkrjAQAAWjJOUg8z28jMVlK2eHRks+u8Lum/JMnMtpC0iqRFvqgQjQcAAAlJZXGpu88zsxMk3atst6539xfM7DxJje4+UtIpkq41s5OULTT9prfyyqQMHgAAoEXuPkbSmGaXnV3z/xMk7dieTAYPAAASwZvEAQAABKLxAAAgIVVvBKp+fAAAICE0HgAAJII1HgAAAIHa1Xh03EQafEnAVlea0vp12uA1fzwkRxoYkjLD5hfOeCxgP6TsVV4ijPGHQnJetV1DcjbZs9X3H2qTYc+GxGjQcU+H5ET8BTDKOgWkSOeFpEjjDgsKGrh3SMxa/xcSo96K2Z/mb3ixuKYF3HnOvbN4hiQ9E5TTOyZG9wf8umjoVzyjvWg8AAAAgrDGAwCARDS9SVyVVf34AABAQmg8AABIBM9qAQAACETjAQBAQqreCFT9+AAAQEIYPAAAQGk41QIAQCJYXAoAABCIxgMAgITQeAAAAASh8QAAIBG8ZDoAAEAgGg8AABLCGg8AAIAgNB4AACRiWXgdj/YNHvMkzSi+0futW/EQSbv5rSE50jUhKf3uO7pwxpyvBuyIJHVYLSZnrV1DYg4ISZGeG3NLSM4g3RaS87CNCskZdEZAyOiADEn9J8XkaMWgnJhfF1o/JkZnBuXs5r8NybnMDiyc8ePHAnZEknZ8JSTmG9YjJEenBmRMDcjAAmg8AABISNXXQFT9+AAAQEJoPAAASMSysMaDxgMAAJSGxgMAgIRUvRGo+vEBAICEMHgAAIDScKoFAIBEsLgUAAAgEI0HAAAJofEAAAAIQuMBAEAiTNVvBKp+fAAAICE0HgAAJIQ1HgAAAEFoPAAASASv4wEAABCofY1Hx+WkwasU3uhusz8onJH5XlBOTPHz8u7FMzb1g4qHSNJpI2JyPo6J+V1MjKR5ISmX2aiQnCivXFg848riEZKkZ/yumKAP94vJWfXykJi/9TkhJGfgriEx2k2bheS8ExFyRUSIpNk9QmLu2CskRof8pnjGpOIR7Vb1RqDqxwcAABLCGg8AABLBGg8AAIBANB4AACSk6o1A1Y8PAAAkhMEDAACUhlMtAAAkgsWlAAAAgWg8AABIBI0HAABAIBoPAAASUvVGoOrHBwAAEkLjAQBAIljjAQAAEIjGAwCAhNB4AAAABKHxAAAgEabqNwLtGzxmzZeGfVB4o5ecVjhCknTTaW+H5Dy/bUiMOgVkHGEjAlKkm2aExEg/Hx0Sc5vtHZLzQ/9mSM6JfUNidNcDMTn7+djCGYN77BSwJ9KPbb+QnHP9w5AcvbdqSMy6u4bE6I8xMZK2CknZOCJkSkSIpOlBOefGxOxwd/GMJ4tHoBkaDwAAEsIaDwAAgCA0HgAAJGJZWONR9eMDAAAJYfAAAACl4VQLAAAJYXEpAABAEBoPAAASwZvEAQAABKLxAAAgIVVvBKp+fAAAICE0HgAAJII1HgAAAIFoPAAASASNBwAAQCAaDwAAElL1RqDqxwcAABJi7t7mKzdsZN54XsBWB/UPCJHUbVRMzpRBMTmaXDjhZXs0YD+kx0JSpKeCcq5eOSjo6ZiYE7eJyfl1TIzm7BUQMiMgQ9ImQbfxq1vF5OjioJw5QTkHPBAS8zfrG5LTKSBjXR8dkCJJXwlJucwijko60e8qnNHQcIoaGydawO60yXZm/nhJ21pVGu/uDSVt7hM0HgAAoDSs8QAAICFVbwSqfnwAACAhDB4AAKA0nGoBACARvIAYAABAIBoPAAASQuMBAAAQhMYDAICUlFUJzC9pO83QeAAAgNLQeAAAkIoyn9ZC4wEAAKqOxgMAgJSU1Xh8XNJ2mqHxAAAApaHxAAAgFabKVwIVPzwAAJASGg8AAFJS8Zcubd/gse7W0qAxxbd6QbfiGZLUIyZmmA0LyRn01+IZxxaPkCQ9uEVMzt4vxuTovpiYl7eJyZkTE6M5d8bk9N6/eMb1xSMkSa960De9U9Cd8OSYmA2DDmu8+obkbP79kBipd/GI92zv4iGSVgxJkU58JCjo6f2KZ0T9ssAnaDwAAEjFMvD2tKzxAAAApWHwAAAApeFUCwAAKal4JVDxwwMAAIvLzPqZ2UtmNtHMzljIdQ42swlm9oKZDW8tk8YDAIBUJLS41MyWl3SFpN0kTZU0zsxGuvuEmuv0kHSmpB3d/V0zW6+1XBoPAADQku0lTXT3Se4+V9KtkvZtdp3Bkq5w93clyd3fbi2UwQMAgJQsV9K/1nWRNKXm46n5ZbU2lbSpmT1uZn8ys36thXKqBQCAZVNHM2us+fgad7+mnRkrKHs5z10kdZX0qJlt7e6zF/UFAAAgBeWu8Zjp7g2L+Pw0SbUvNd41v6zWVElPufvHkv5uZi8rG0TGLSyUUy0AAKAl4yT1MLONzGwlSQMkjWx2nbuUtR0ys47KTr1MWlQojQcAAClJ5Fkt7j7PzE6QdK+yvbre3V8ws/MkNbr7yPxzu5vZBEn/lnSqu89aVC6DBwAAaJG7j5E0ptllZ9f8vyt7K8c2v50jgwcAAKkwVX4RRMUPDwAApITGAwCAlCSyxmNJofEAAAClaV/j8e7z0ohurV+vNd8rHiFJ2icmZtBhMTlztiqe8aCfVTxEkg45PyTmgBdDYjT2P58PyblZW4fkPBmSImm/40JinvHrCmc8aHMD9kTS41uExLw7MyRGWwXlTPNBMUG3DguJef3QkBidEpAx4q2AEEla76qYnI2PDYnp8vfiGTOKR7RPQu/VsqTQeAAAgNIweAAAgNKwuBQAgJRUvBKo+OEBAICU0HgAAJAKFpcCAADEofEAACAlFa8EKn54AAAgJTQeAACkgjUeAAAAcWg8AABIBY0HAABAHBoPAABSUvFKoOKHBwAAUkLjAQBAKljjAQAAEIfGAwCAlFS88WjX4DFhktTr4OIb3bl4hCTpmaCcXwXlvBKQcZBmBqRIm9weEqPPx8RIh28dEtM7JEW64LGYnFF2ZUhO/0nFM/pcUzxDkrTjjSExa3vMDs22J0JypL1CUvY9dFhIzh0hKTG/T3cJ+kF/eK9jQ3J6/D0kRtMCfs4bjiqegQVxqgUAAJSGUy0AAKTCVPlKoOKHBwAAUkLjAQBASiq+uJTGAwAAlIbGAwCAVLDGAwAAIA6NBwAAKWGNBwAAQAwaDwAAUsGbxAEAAMSh8QAAICUVrwQqfngAACAlNB4AAKSCNR4AAABxaDwAAEgJjQcAAECMdjUe3SRdGrDRPr5eQIqk4W/H5BwfE9PrquIZO9mVxUMkvepBM+Xd80Ni7to7JEbf8GdjgjbeNiSm/8ohMdJGPYtnPDCheIYkDZ4dk6PbQlLmnNMtJEc6ICRlYEiKNCQo552AjGkBGZL04d0xOXfFxGiPrxXPeKV4BJrhVAsAAKngTeIAAADi0HgAAJAKnk4LAAAQh8YDAICUVLwSqPjhAQCAlNB4AACQCtZ4AAAAxKHxAAAgJTQeAAAAMWg8AABIBa9cCgAAEIfGAwCAlLDGAwAAIAaNBwAAqeB1PAAAAOK0q/FYY7uN1afx58W3evaBxTMkrXV+SIxGxcRopwEvFs4Y222LgD2RTrL5ITmNISnScUE5t9m2ITmHNITESJNijuwHdmXhjEtODdgRSdrp+yExdz0Wk9MpJEXacZsVQ3LOC0mRrgvK+W5AxsUBGZK06vsxOVvGxOjegLtgw++LZ7RbxSuBih8eAABICYMHAAAoDYtLAQBIBYtLAQAA4tB4AACQkopXAhU/PAAAkBIaDwAAUsEaDwAAgDg0HgAApITGAwAAIAaNBwAAqTBVvhKo+OEBAICU0HgAAJAS1ngAAADEoPEAACAVvI4HAABAHBoPAABSUvFKoJ2Dx+qStiu80eHnF46QJM3eLCZHf/tWSMw026JwRhfvGbAn0kmaEJIzMiRFGujbh+Qcbk+H5BwyLmZ/dNGVITGXnBoQcnRAhqQ3L47J2W9iTI42eTEk5viAn09JeuHYkBgdclVMzr4BGd8JyJCk/ToMjgm6+9qQmB9cVzxjavEINFPxuQoAAKSEUy0AAKSCxaUAAABxaDwAAEhJxSuBih8eAABICY0HAACpYI0HAABAHBoPAABSQeMBAAAQh8YDAICUVLwSqPjhAQCAlNB4AACQCtZ4AAAAxKHxAAAgJTQeAAAAMWg8AABIhanylUDFDw8AAKSknY3HR5JeLbzRgacWjshMjYm51m4IyRm8UfGMt21C8RBJG/hVITknDD82JGeIPR2Sc8svQ2L0XND+9PLvhuTosl8Vz3igeIQkre/bh+QcGXQbb6MtQnIuDkmRdOUOITG3Xfk/ITnSrMIJQ7RdwH5I0g9DUh7fOyRGl3jx79XDDX8O2BPU4lQLAAApYXEpAABADBoPAABSweJSAACAODQeAACkhDUeAAAAMRg8AABIRdObxJXxry27Y9bPzF4ys4lmdsYirneAmbmZNbSWyeABAAA+w8yWl3SFpK9L6inpUDPr2cL11pB0oqSn2pLL4AEAQEqWK+lf67aXNNHdJ7n7XEm3Stq3heudL+kiSf9q6+EBAAA010XSlJqPp+aXfcLMekvq5u53tzWUZ7UAAJCKpjUe5ehoZo01H1/j7te09YvNbDlJl0r6Zns2yuABAMCyaaa7L2ox6DRJ3Wo+7ppf1mQNSVtJetjMJGl9SSPNbB93rx1oFsDgAQBAStJZBDFOUg8z20jZwDFA0sCmT7r7PyR1bPrYzB6W9INFDR1SSocHAACS4e7zJJ0g6V5JL0q63d1fMLPzzGyfxc2l8QAAIBXlrvFolbuPkTSm2WVnL+S6u7Qlk8YDAACUhsEDAACUxty9zVfubeaPB2x01bMCQiTp3JiY44PGr6EfB4SssENAiKQXn4jJ2eKCmBy9FZTT0mvXLIbhfWNynouJ0c8fKp4xatfiGZLUP+gHYqf5MTlHxcTc9K2YnCMujMnZaaEvPt0+Y18qnrH1ZsUzJOl5Pykm6IhfhMRseXPxjEmSPnS34klt07CJeeNPy9mWDdD4Vp7VskTQeAAAgNKwuBQAgJRUvBKo+OEBAICU0HgAAJCKxJ5OuyTQeAAAgNLQeAAAkBIaDwAAgBg0HgAApMJU+Uqg4ocHAABSQuMBAEBKWOMBAAAQg8YDAIBUsMYDAAAgDo0HAAApYY1y8ROZAAAK0ElEQVQHAABADAYPAABQGk61AACQimXgTeLaNXjMkHRlwEZPPu/dgBSpv60dkvOdkBRp7orFMw7TE8VDJI3wmDLrehsSknNkY0iMtN3jITHXHhYSo8kxMbpgj10LZ6y+T8COSJpzwPyYoKD9UZ+YmCN2j8k5/IyYnJ1jYqSfFI/oXDwi1Po3x+S86Q8Vzmho+HbAnqAWjQcAACmp+CKIih8eAABICY0HAACpWAbWeNB4AACA0tB4AACQEhoPAACAGDQeAACkgjeJAwAAiEPjAQBASljjAQAAEIPGAwCAVLDGAwAAIA6NBwAAKWGNBwAAQAwGDwAAUBpOtQAAkAreJA4AACBOuxqPz39eOvnw4hvd3NYuHiLpb75xSI6OmxSTs0bxiNUuLp4hSSNsfkjOkf5KSM4e1iMkZ6qeCckJuudo1ISgoC3GFY6Y87UvB+yIpN+ODonpZXuH5Dx3aszfR0feF/MzccthITE68jcxOUNvLp7Rs3hE5iu/CIl50/83JOcy27VwxtsB+9FuFa8EKn54AAAgJazxAAAgFazxAAAAiEPjAQBAKmg8AAAA4tB4AACQkopXAhU/PAAAkBIaDwAAUsEaDwAAgDg0HgAApKTilUDFDw8AAKSExgMAgFSwxgMAACAOgwcAACgNp1oAAEgJp1oAAABi0HgAAJAKU+UrAXP3Nl95PTM/MGCjQ7sHhEjSa2fF5Mw7PyZnhWcLR6xu2wbsiDTHfx2So52Pjsm5KCZm9a/G5EyNidHaV8bkXH1c8Yxve//iIZKes1EhOb26hsRoWtA3a0pMjG4OyhnqH8cEzVuxeMYKg4pnBPqBDQvJCbhldKOkN9wtIKpNGnqZN95Xzrbs8xrv7g3lbO1TNB4AAKSENR4AAAAxaDwAAEgFLyAGAAAQh8YDAICUVLwSqPjhAQCAlNB4AACQCtZ4AAAAxKHxAAAgJRWvBCp+eAAAICU0HgAApII1HgAAAHEYPAAAQGk41QIAQCo41QIAABCHxgMAgJRUvBKo+OEBAICUtKvx2GALaejw4hs9c9viGZL0s2+cHxN0RkyMtr+jcMQcP6f4fkjSzKNjch4ZHZPz3t4hMXOeComRJsXErHtoTM4sv6d4yGn9imdI2iskRZo25fmQnGNt65CcH4WkSL8NylnHVgzJucAHFc5414YF7Im09j9CYtQzJkbTAzKWyl/nVtYij3+XtJ0F0XgAAIDSsMYDAIBkmMp7aKbxAAAAFUfjAQBAMspsPD4qaTsLovEAAAClofEAACAZZTYeSweNBwAAKE21xyoAAOpOtR+aaTwAAEBpqj1WAQBQV1jjAQAAEIbBAwAAlKbafQ4AAHWFUy0AAABhqj1WAQBQV2g8AAAAwpi7t/nK3c389ICNHh807sydH5Ozkh8UE7TziMIR33g0YD8k3TEpJkcbfSkoaF5IyuE2ISTnyyEp0omdY3J2mF4844m9imdIkkbvFpOz4f0xOR/HxGwdcBtL0vPHxOTo6qBfhFcF/CIcXTxCkubeHZOz0p0xOdpv+8IRDQ1/VWPjHAvYmzZub2VvbOxayrbMJo1394ZSNlaDxgMAAJSm2ieSAACoK6zxAAAACFPtsQoAgLpC4wEAABCm2mMVAAB1hcYDAAAgTLXHKgAA6gqNBwAAWEaZWT8ze8nMJprZGS18/mQzm2BmfzGzP5pZ99YyGTwAAEjKCiX9WzQzW17SFZK+LqmnpEPNrGezqz0rqcHdvyTpt5J+3lougwcAAGjJ9pImuvskd58r6VZJ+9Zewd0fcvcP8g//JKnV13tn8AAAAC3pImlKzcdT88sW5ihJf2gttNorWAAAqCulLi7taGaNNR9f4+7XLE6QmR0uqUHSzq1dl8EDAIBl08xW3p12mqRuNR93zS9bgJn1lfQjSTu7+0etbZTBAwCAZCT1dNpxknqY2UbKBo4BkgbWXsHMtpV0taR+7v52W0JZ4wEAAD7D3edJOkHSvZJelHS7u79gZueZ2T751S6W1EHSCDN7zsxGtpabzFgFAACSajzk7mMkjWl22dk1/9+3vZntOrpO222n4xsbW79ia56z4hmSJm0bEqPN3xgRkjPt0ZCYEG9uHJOz/m//EpJzwYEhMTouJkY7nh8UNGSDkJgndHfhjJts64A9kY54+f6QHB0aE6OfXRUS8/xax4bkaLOYGKlXSMoLxz1TOKNb61dpk8+9HxTU4Z6YnOP6Fc94vXgEFpTOWAUAwDIvrcZjSWCNBwAAKE21xyoAAOpOtR+aaTwAAEBpqj1WAQBQV1jjAQAAEKbaYxUAAHWFxgMAACBMtccqAADqCo0HAABAmGqPVQAA1BUaDwAAgDAMHgAAoDTV7nMAAKgrnGoBAAAIU+2xCgCAurP80t6BJYrGAwAAlKadjcfzkjYpvtVezxbPkLT5RtuG5BzZOSRGpwRkHBOQIUnrT4/JuTzothnym5icEw6LydlxyK9jgnY7OiTmuQe2LpxxhA8O2BPpeLs2JGeoPxCSo3v6xuTM3j8mZ7c7Y3L++5mQmCsCMobuFRAi6fA1YnJGql9Iznu+Q/GQcX8untEurPEAAAAIU+2xCgCAukLjAQAAEKbaYxUAAHWFxgMAACBMtccqAADqTrUfmmk8AABAaao9VgEAUFdY4wEAABCm2mMVAAB1hcYDAAAgDIMHAAAoTbX7HAAA6gqnWgAAAMJUe6wCAKCu0HgAAACEqfZYBQBA3an2Q3O7ju718XN1vE0qvNGvatvCGZI06M6QGF3/k5gcjTurcMSW750fsCPSuWuGxKh3TIw08K6QmMv32S8kR5cdHZNz/wYhMevY68VD5l1bPEPSUP8wJOdBWzUkp891ITGS/hyS0v+BkBiNWj0m55iAjJ3uDgiRNHb3mJz/uC8mR/prQEbMzwM+Ve2xCgCAusIaDwAAgDDVHqsAAKgrNB4AAABhqj1WAQBQV2g8AAAAwlR7rAIAoK7QeAAAAISp9lgFAEDdqfZDM40HAAAoDYMHAAAoTbX7HAAA6gqLSwEAAMJUe6wCAKCumKTll/ZOLFE0HgAAoDQ0HgAAJIM1HgAAAGHM3dt+ZbMZkiYvud0BACAp3d29U1kba2jYxBsbf1rKtswGjHf3hlI2VqNdfU6ZNz4AAKieap9IAgCg7lT7oZk1HgAAoDTVHqsAAKgrPKsFAAAgTLXHKgAA6gqNBwAAQJhqj1UAANQVGg8AAIAwDB4AAKA01e5zAACoK5xqAQAACFPtsQoAgLpT7YdmGg8AAFCaao9VAADUFdZ4AAAAhKn2WAUAQF2h8QAAAAhT7bEKAIC6QuMBAAAQptpjFQAAdYXGAwAAIEy1xyoAAOpOtR+aaTwAAEBpqj1WAQBQV1jjAQAAEIbBAwAAlKbafQ4AAHWFUy0AAABhqj1WAQBQV0zS8kt7J5YoGg8AAFAaGg8AAJJS7YdmGg8AAFCaao9VAADUFZ7VAgAAEKbaYxUAAHWFxgMAACBMtccqAADqCo0HAABAmGqPVQAA1BUaDwAAgDDVHqsAAKgrNB4AAABhGDwAAEBpqt3nAABQd6r90EzjAQAASlPtsQoAgLpS/cWl5u5Lex8AAIAkM7tHUseSNjfT3fuVtK1PMHgAAIDSsMYDAACUhsEDAACUhsEDAACUhsEDAACUhsEDAACUhsEDAACUhsEDAACUhsEDAACUhsEDAACU5v8B2j5LN1XFR5QAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(10, 10))\n", + "\n", + "im = ax.matshow(w.numpy(), cmap='hot_r')\n", + "ax.set_xticks(()); ax.set_yticks(()); plt.colorbar(im)\n", + "ax.set_title('Weights from input to McCulloch-Pitts layer');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run simple network simulation\n", + "\n", + "### Create network input" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "time = 100 # Simulation time\n", + "p_fire = 0.1 # Bernoulli probability of input neuron spiking\n", + "\n", + "# Input spikes are Bernoulli experiments with spike prob. `p_fire`.\n", + "inpt = np.random.binomial(1, p_fire, [n_input, time])\n", + "inpt = torch.from_numpy(inpt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run network simulation" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "output = network.run(inpts={'X' : inpt}, time=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Inspect network input / output" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "inpt_spikes = output['X'].numpy()\n", + "mp_spikes = output['A'].numpy()\n", + "\n", + "plt.matshow(inpt_spikes, cmap='binary');\n", + "plt.xticks(()); plt.yticks(());\n", + "plt.xlabel('Simulation time'); plt.ylabel('Index of input neuron');\n", + "plt.title('Input neurons spikes over time');\n", + "\n", + "plt.matshow(mp_spikes, cmap='binary')\n", + "plt.xticks(()); plt.yticks(())\n", + "plt.xlabel('Simulation time'); plt.ylabel('Index of input neuron')\n", + "plt.title('McCulloch-Pitts neurons spikes over time')\n", + "\n", + "plt.matshow(np.stack([inpt_spikes.sum(axis=0)] * 25))\n", + "plt.xlabel('Simulation time'); plt.ylabel('Index of input neuron')\n", + "plt.title('Summed intensity of input spikes')\n", + "plt.xticks(()); plt.yticks(());\n", + "\n", + "plt.matshow(np.stack([mp_spikes.sum(axis=0)] * 25))\n", + "plt.xlabel('Simulation time'); plt.ylabel('Index of input neuron')\n", + "plt.title('Summed intensity of McCulloch-Pitts spikes')\n", + "plt.xticks(()); plt.yticks(());" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "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.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}