{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# How To: Configure and perform constrained optimization in Rockpool" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Spiking Neural Networks present a more complex optimisation problem than standard DNNs.\n", "This is due not only to the complex dynamics of spiking neurons but also to the additional classes of parameters present in SNNs.\n", "\n", "DNNs usually optimise linear weights and bias parameters, all of which share a common scale and which can adopt unconstrained finite values.\n", "SNNs, on the other hand, contain various time-constant parameters of various formulations, which can only validly adopt a constrained range of values.\n", "For example, time constants in the form of synaptic and membrane :math:`\\tau`s must be positive.\n", "Decay formulations for synapse and membrane time constants must range ``(0, 1)``.\n", "Firing thresholds are usually also strictly positive values.\n", "\n", "Because of this need, Rockpool provides convenient ways to access individual classes of parameters in a complex network via the :py:meth:`.Module.parameters` interface and a set of tools for easily configuring and imposing boundary constraints during optimisation.\n", "\n", "This How To guide shows you how to use the :py:mod:`.training.torch_loss` and :py:mod:`.training.jax_loss` packages and the features of the :py:mod:`.utilities.tree_utils` mini-library to set up constrained optimisation problems." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip available: \u001b[0m\u001b[31;49m22.2.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.0.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/Shared/anaconda3/envs/py38/lib/python3.8/site-packages/chex/_src/pytypes.py:37: FutureWarning: jax.tree_structure is deprecated, and will be removed in a future release. Use jax.tree_util.tree_structure instead.\n", " PyTreeDef = type(jax.tree_structure(None))\n" ] } ], "source": [ "# - Make sure additional required packages are installed\n", "import sys\n", "!{sys.executable} -m pip install --quiet rich torch jax optax\n", "\n", "from rich import print\n", "\n", "import matplotlib.pyplot as plt\n", "plt.rcParams['figure.figsize'] = [12, 4]\n", "plt.rcParams['figure.dpi'] = 300\n", "\n", "import numpy as np\n", "import torch, jax, optax" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## `torch` interface for constrained optimization" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Rockpool supports both ``torch`` and ``jax`` optimisation backends, with a common API for setting up constrained optimisation.\n", "Here, we demonstrate the ``torch`` interface to set parameter constraints for a single LIF module." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Module: LIFTorch  with shape (1, 1)\n",
                            "
\n" ], "text/plain": [ "Module: LIFTorch with shape \u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m, \u001b[1;36m1\u001b[0m\u001b[1m)\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parameters:\n",
                            "{\n",
                            "    'tau_mem': Parameter containing:\n",
                            "tensor([0.0200], requires_grad=True),\n",
                            "    'tau_syn': Parameter containing:\n",
                            "tensor([[0.0200]], requires_grad=True),\n",
                            "    'bias': Parameter containing:\n",
                            "tensor([0.], requires_grad=True),\n",
                            "    'threshold': Parameter containing:\n",
                            "tensor([1.], requires_grad=True)\n",
                            "}\n",
                            "
\n" ], "text/plain": [ "Parameters:\n", "\u001b[1m{\u001b[0m\n", " \u001b[32m'tau_mem'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0.0200\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'tau_syn'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0.0200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'bias'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0\u001b[0m.\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'threshold'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m1\u001b[0m.\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Import the LIF module we will use\n", "from rockpool.nn.modules import LIFTorch\n", "\n", "# - Create a single LIF module\n", "net = LIFTorch(1)\n", "print('Module:', net)\n", "print('Parameters:', net.parameters())" ] }, { "attachments": {}, "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Even this single spiking neuron has four parameters --- two time constants for synapse and membrane (``tau_syn`` and ``tau_mem``), which must be positive; a ``bias`` parameter, which can adopt any value; and a ``threshold`` parameter which should also be positive.\n", "\n", "Suppose either time constant becomes negative during training. In that case, the dynamics of the module will be undefined and most likely unstable, leading to a breakdown of both network dynamics and training.\n", "\n", "Rockpool provides a cost function :py:func:`~.training.torch_loss.bounds_cost`, which imposes bounded parameter constraints.\n", "We also provide a helper function :py:func:`~.training.torch_loss.make_bounds`, which helps you build specifications for which parameters should be constrained and how.\n", "\n", "Below we show how the cost function behaves as a parameter approaches and violates a constraint (0, 1)." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# - Import the `make_bounds` and `bounds_cost` helper functions\n", "from rockpool.training.torch_loss import make_bounds, bounds_cost\n", "\n", "xs = np.linspace(-1, 2, 1001)\n", "cost = [bounds_cost({'x': torch.tensor(x)}, {'x': 0.}, {'x': 1.}) for x in xs]\n", "\n", "plt.figure()\n", "plt.plot(xs, cost)\n", "plt.plot([0, 0], [0, 3], 'r:')\n", "plt.plot([1, 1], [0, 3], 'r:')\n", "plt.xlabel('Parameter value')\n", "plt.ylabel('Cost');" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "When no bounds are violated, the cost evaluates to zero.\n", "At the bounds, a cost of 1 is imposed, which increases for increasing violations.\n", "\n", "Now let's see how to create and apply bounds to the parameters of a LIF module.\n", "\n", "The :py:func:`.training.torch_loss.make_bounds` function takes the parameters of a Rockpool network and generates lower- and upper-bounds configuration dictionaries.\n", "These dictionaries mimic the structure of the network parameters." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
{'tau_mem': -inf, 'tau_syn': -inf, 'bias': -inf, 'threshold': -inf}\n",
                            "{'tau_mem': inf, 'tau_syn': inf, 'bias': inf, 'threshold': inf}\n",
                            "
\n" ], "text/plain": [ "\u001b[1m{\u001b[0m\u001b[32m'tau_mem'\u001b[0m: -inf, \u001b[32m'tau_syn'\u001b[0m: -inf, \u001b[32m'bias'\u001b[0m: -inf, \u001b[32m'threshold'\u001b[0m: -inf\u001b[1m}\u001b[0m\n", "\u001b[1m{\u001b[0m\u001b[32m'tau_mem'\u001b[0m: inf, \u001b[32m'tau_syn'\u001b[0m: inf, \u001b[32m'bias'\u001b[0m: inf, \u001b[32m'threshold'\u001b[0m: inf\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Call `make_bounds` on the parameters of the module\n", "lb, ub = make_bounds(net.parameters())\n", "print(lb, ub)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "By default, no parameters are constrained --- the lower and upper bounds are set to negative and positive infinity, respectively.\n", "We set bounds by changing the values to finite lower and upper bounds.\n", "Let's use (0ms, 200ms) as the constraints for ``tau_mem``." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
{'tau_mem': -inf, 'tau_syn': 0.0, 'bias': -inf, 'threshold': -inf}\n",
                            "{'tau_mem': inf, 'tau_syn': 0.2, 'bias': inf, 'threshold': inf}\n",
                            "
\n" ], "text/plain": [ "\u001b[1m{\u001b[0m\u001b[32m'tau_mem'\u001b[0m: -inf, \u001b[32m'tau_syn'\u001b[0m: \u001b[1;36m0.0\u001b[0m, \u001b[32m'bias'\u001b[0m: -inf, \u001b[32m'threshold'\u001b[0m: -inf\u001b[1m}\u001b[0m\n", "\u001b[1m{\u001b[0m\u001b[32m'tau_mem'\u001b[0m: inf, \u001b[32m'tau_syn'\u001b[0m: \u001b[1;36m0.2\u001b[0m, \u001b[32m'bias'\u001b[0m: inf, \u001b[32m'threshold'\u001b[0m: inf\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "lb['tau_syn'] = 0.\n", "ub['tau_syn'] = 200e-3\n", "print(lb, ub)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
tensor(0., grad_fn=<SumBackward0>)\n",
                            "
\n" ], "text/plain": [ "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m., \u001b[33mgrad_fn\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSumBackward0\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Evaluate the boundary constraint cost\n", "print(bounds_cost(net.parameters(), lb, ub))" ] }, { "attachments": {}, "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "In this case, no bounds are violated, so the cost is zero.\n", "\n", "Now let's look at an example of a complex network with many layers and module nesting.\n", "We'll define the network to use two different classes of leak parameters, needing different constraints on each class." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Network: TorchSequential  with shape (2, 5) {\n",
                            "    LinearTorch '0_LinearTorch' with shape (2, 3)\n",
                            "    LIFTorch '1_LIFTorch' with shape (3, 3)\n",
                            "    TorchResidual '2_TorchResidual' with shape (3, 3) {\n",
                            "        LinearTorch '0_LinearTorch' with shape (3, 3)\n",
                            "        LIFTorch '1_LIFTorch' with shape (3, 3)\n",
                            "    }\n",
                            "    LinearTorch '3_LinearTorch' with shape (3, 5)\n",
                            "    LIFTorch '4_LIFTorch' with shape (5, 5)\n",
                            "}\n",
                            "
\n" ], "text/plain": [ "Network: TorchSequential with shape \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m, \u001b[1;36m5\u001b[0m\u001b[1m)\u001b[0m \u001b[1m{\u001b[0m\n", " LinearTorch \u001b[32m'0_LinearTorch'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m, \u001b[1;36m3\u001b[0m\u001b[1m)\u001b[0m\n", " LIFTorch \u001b[32m'1_LIFTorch'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[1;36m3\u001b[0m, \u001b[1;36m3\u001b[0m\u001b[1m)\u001b[0m\n", " TorchResidual \u001b[32m'2_TorchResidual'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[1;36m3\u001b[0m, \u001b[1;36m3\u001b[0m\u001b[1m)\u001b[0m \u001b[1m{\u001b[0m\n", " LinearTorch \u001b[32m'0_LinearTorch'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[1;36m3\u001b[0m, \u001b[1;36m3\u001b[0m\u001b[1m)\u001b[0m\n", " LIFTorch \u001b[32m'1_LIFTorch'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[1;36m3\u001b[0m, \u001b[1;36m3\u001b[0m\u001b[1m)\u001b[0m\n", " \u001b[1m}\u001b[0m\n", " LinearTorch \u001b[32m'3_LinearTorch'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[1;36m3\u001b[0m, \u001b[1;36m5\u001b[0m\u001b[1m)\u001b[0m\n", " LIFTorch \u001b[32m'4_LIFTorch'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[1;36m5\u001b[0m, \u001b[1;36m5\u001b[0m\u001b[1m)\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parameters:\n",
                            "{\n",
                            "    '0_LinearTorch': {\n",
                            "        'weight': Parameter containing:\n",
                            "tensor([[-1.7288,  0.3565,  0.7264],\n",
                            "        [-0.9882, -1.2147,  1.2812]], requires_grad=True)\n",
                            "    },\n",
                            "    '1_LIFTorch': {\n",
                            "        'alpha': Parameter containing:\n",
                            "tensor([0.5000, 0.5000, 0.5000], requires_grad=True),\n",
                            "        'beta': Parameter containing:\n",
                            "tensor([[0.5000],\n",
                            "        [0.5000],\n",
                            "        [0.5000]], requires_grad=True),\n",
                            "        'bias': Parameter containing:\n",
                            "tensor([0., 0., 0.], requires_grad=True),\n",
                            "        'threshold': Parameter containing:\n",
                            "tensor([1., 1., 1.], requires_grad=True)\n",
                            "    },\n",
                            "    '2_TorchResidual': {\n",
                            "        '0_LinearTorch': {\n",
                            "            'weight': Parameter containing:\n",
                            "tensor([[ 0.7141, -1.3781, -0.7695],\n",
                            "        [-0.8757, -0.6188, -0.4058],\n",
                            "        [-0.8914,  0.4774,  0.1480]], requires_grad=True)\n",
                            "        },\n",
                            "        '1_LIFTorch': {\n",
                            "            'alpha': Parameter containing:\n",
                            "tensor([0.5000, 0.5000, 0.5000], requires_grad=True),\n",
                            "            'beta': Parameter containing:\n",
                            "tensor([[0.5000],\n",
                            "        [0.5000],\n",
                            "        [0.5000]], requires_grad=True),\n",
                            "            'bias': Parameter containing:\n",
                            "tensor([0., 0., 0.], requires_grad=True),\n",
                            "            'threshold': Parameter containing:\n",
                            "tensor([1., 1., 1.], requires_grad=True)\n",
                            "        }\n",
                            "    },\n",
                            "    '3_LinearTorch': {\n",
                            "        'weight': Parameter containing:\n",
                            "tensor([[ 0.4936,  1.3029, -1.0018,  1.1015, -1.4031],\n",
                            "        [ 0.1428,  1.2207,  1.1742,  0.8693, -0.3616],\n",
                            "        [ 0.1114, -1.3645, -1.3504, -0.6766, -0.4882]], requires_grad=True)\n",
                            "    },\n",
                            "    '4_LIFTorch': {\n",
                            "        'tau_mem': Parameter containing:\n",
                            "tensor([0.0200, 0.0200, 0.0200, 0.0200, 0.0200], requires_grad=True),\n",
                            "        'tau_syn': Parameter containing:\n",
                            "tensor([[0.0200],\n",
                            "        [0.0200],\n",
                            "        [0.0200],\n",
                            "        [0.0200],\n",
                            "        [0.0200]], requires_grad=True),\n",
                            "        'bias': Parameter containing:\n",
                            "tensor([0., 0., 0., 0., 0.], requires_grad=True),\n",
                            "        'threshold': Parameter containing:\n",
                            "tensor([1., 1., 1., 1., 1.], requires_grad=True)\n",
                            "    }\n",
                            "}\n",
                            "
\n" ], "text/plain": [ "Parameters:\n", "\u001b[1m{\u001b[0m\n", " \u001b[32m'0_LinearTorch'\u001b[0m: \u001b[1m{\u001b[0m\n", " \u001b[32m'weight'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-1.7288\u001b[0m, \u001b[1;36m0.3565\u001b[0m, \u001b[1;36m0.7264\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.9882\u001b[0m, \u001b[1;36m-1.2147\u001b[0m, \u001b[1;36m1.2812\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[32m'1_LIFTorch'\u001b[0m: \u001b[1m{\u001b[0m\n", " \u001b[32m'alpha'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0.5000\u001b[0m, \u001b[1;36m0.5000\u001b[0m, \u001b[1;36m0.5000\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'beta'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0.5000\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.5000\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.5000\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'bias'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m.\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'threshold'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m.\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[32m'2_TorchResidual'\u001b[0m: \u001b[1m{\u001b[0m\n", " \u001b[32m'0_LinearTorch'\u001b[0m: \u001b[1m{\u001b[0m\n", " \u001b[32m'weight'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m \u001b[1;36m0.7141\u001b[0m, \u001b[1;36m-1.3781\u001b[0m, \u001b[1;36m-0.7695\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.8757\u001b[0m, \u001b[1;36m-0.6188\u001b[0m, \u001b[1;36m-0.4058\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.8914\u001b[0m, \u001b[1;36m0.4774\u001b[0m, \u001b[1;36m0.1480\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[32m'1_LIFTorch'\u001b[0m: \u001b[1m{\u001b[0m\n", " \u001b[32m'alpha'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0.5000\u001b[0m, \u001b[1;36m0.5000\u001b[0m, \u001b[1;36m0.5000\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'beta'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0.5000\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.5000\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.5000\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'bias'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m.\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'threshold'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m.\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m\n", " \u001b[1m}\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[32m'3_LinearTorch'\u001b[0m: \u001b[1m{\u001b[0m\n", " \u001b[32m'weight'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m \u001b[1;36m0.4936\u001b[0m, \u001b[1;36m1.3029\u001b[0m, \u001b[1;36m-1.0018\u001b[0m, \u001b[1;36m1.1015\u001b[0m, \u001b[1;36m-1.4031\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.1428\u001b[0m, \u001b[1;36m1.2207\u001b[0m, \u001b[1;36m1.1742\u001b[0m, \u001b[1;36m0.8693\u001b[0m, \u001b[1;36m-0.3616\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.1114\u001b[0m, \u001b[1;36m-1.3645\u001b[0m, \u001b[1;36m-1.3504\u001b[0m, \u001b[1;36m-0.6766\u001b[0m, \u001b[1;36m-0.4882\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[32m'4_LIFTorch'\u001b[0m: \u001b[1m{\u001b[0m\n", " \u001b[32m'tau_mem'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0.0200\u001b[0m, \u001b[1;36m0.0200\u001b[0m, \u001b[1;36m0.0200\u001b[0m, \u001b[1;36m0.0200\u001b[0m, \u001b[1;36m0.0200\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'tau_syn'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0.0200\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.0200\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.0200\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.0200\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.0200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'bias'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m.\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'threshold'\u001b[0m: Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m.\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m\n", " \u001b[1m}\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from rockpool.nn.modules import LinearTorch\n", "from rockpool.nn.combinators import Sequential, Residual\n", "\n", "net = Sequential(\n", " LinearTorch((2, 3)),\n", " LIFTorch(3, leak_mode=\"decays\"),\n", "\n", " Residual(\n", " LinearTorch((3, 3)),\n", " LIFTorch(3, leak_mode=\"decays\"),\n", " ),\n", "\n", " LinearTorch((3, 5)),\n", " LIFTorch(5, leak_mode=\"taus\"),\n", ")\n", "print('Network:', net)\n", "print('Parameters:', net.parameters())" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "This is a deeply nested network with a complex set of parameters.\n", "Luckily, Rockpool provides several convenient tools that make it easy to build constraints even for complex networks.\n", "\n", "The :py:meth:`.Module.parameters` method allows you to easily extract families of parameters, helping you identify all time constants, for example.\n", "The :py:meth:`.Module.attributes_named` method allows you to specify particular named parameters.\n", "\n", "The mini-library :py:mod:`~.rockpool.utilities.tree_utils` helps you easily manipulate the parameter and constraint dictionaries to set chosen bounds.\n", "Here we'll use the :py:func:`.tree_utils.set_matching` function to set bounds for chosen parameter sets." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
{\n",
                            "    '0_LinearTorch': {'weight': -inf},\n",
                            "    '1_LIFTorch': {'alpha': 0.5, 'beta': 0.5, 'bias': -inf, 'threshold': -inf},\n",
                            "    '2_TorchResidual': {\n",
                            "        '0_LinearTorch': {'weight': -inf},\n",
                            "        '1_LIFTorch': {'alpha': 0.5, 'beta': 0.5, 'bias': -inf, 'threshold': -inf}\n",
                            "    },\n",
                            "    '3_LinearTorch': {'weight': -inf},\n",
                            "    '4_LIFTorch': {'tau_mem': 0.0, 'tau_syn': 0.0, 'bias': -inf, 'threshold': -inf}\n",
                            "}\n",
                            "{\n",
                            "    '0_LinearTorch': {'weight': inf},\n",
                            "    '1_LIFTorch': {'alpha': 1.0, 'beta': 1.0, 'bias': inf, 'threshold': inf},\n",
                            "    '2_TorchResidual': {\n",
                            "        '0_LinearTorch': {'weight': inf},\n",
                            "        '1_LIFTorch': {'alpha': 1.0, 'beta': 1.0, 'bias': inf, 'threshold': inf}\n",
                            "    },\n",
                            "    '3_LinearTorch': {'weight': inf},\n",
                            "    '4_LIFTorch': {'tau_mem': inf, 'tau_syn': 0.5, 'bias': inf, 'threshold': inf}\n",
                            "}\n",
                            "
\n" ], "text/plain": [ "\u001b[1m{\u001b[0m\n", " \u001b[32m'0_LinearTorch'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'weight'\u001b[0m: -inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'1_LIFTorch'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'alpha'\u001b[0m: \u001b[1;36m0.5\u001b[0m, \u001b[32m'beta'\u001b[0m: \u001b[1;36m0.5\u001b[0m, \u001b[32m'bias'\u001b[0m: -inf, \u001b[32m'threshold'\u001b[0m: -inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'2_TorchResidual'\u001b[0m: \u001b[1m{\u001b[0m\n", " \u001b[32m'0_LinearTorch'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'weight'\u001b[0m: -inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'1_LIFTorch'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'alpha'\u001b[0m: \u001b[1;36m0.5\u001b[0m, \u001b[32m'beta'\u001b[0m: \u001b[1;36m0.5\u001b[0m, \u001b[32m'bias'\u001b[0m: -inf, \u001b[32m'threshold'\u001b[0m: -inf\u001b[1m}\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[32m'3_LinearTorch'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'weight'\u001b[0m: -inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'4_LIFTorch'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'tau_mem'\u001b[0m: \u001b[1;36m0.0\u001b[0m, \u001b[32m'tau_syn'\u001b[0m: \u001b[1;36m0.0\u001b[0m, \u001b[32m'bias'\u001b[0m: -inf, \u001b[32m'threshold'\u001b[0m: -inf\u001b[1m}\u001b[0m\n", "\u001b[1m}\u001b[0m\n", "\u001b[1m{\u001b[0m\n", " \u001b[32m'0_LinearTorch'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'weight'\u001b[0m: inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'1_LIFTorch'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'alpha'\u001b[0m: \u001b[1;36m1.0\u001b[0m, \u001b[32m'beta'\u001b[0m: \u001b[1;36m1.0\u001b[0m, \u001b[32m'bias'\u001b[0m: inf, \u001b[32m'threshold'\u001b[0m: inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'2_TorchResidual'\u001b[0m: \u001b[1m{\u001b[0m\n", " \u001b[32m'0_LinearTorch'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'weight'\u001b[0m: inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'1_LIFTorch'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'alpha'\u001b[0m: \u001b[1;36m1.0\u001b[0m, \u001b[32m'beta'\u001b[0m: \u001b[1;36m1.0\u001b[0m, \u001b[32m'bias'\u001b[0m: inf, \u001b[32m'threshold'\u001b[0m: inf\u001b[1m}\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[32m'3_LinearTorch'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'weight'\u001b[0m: inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'4_LIFTorch'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'tau_mem'\u001b[0m: inf, \u001b[32m'tau_syn'\u001b[0m: \u001b[1;36m0.5\u001b[0m, \u001b[32m'bias'\u001b[0m: inf, \u001b[32m'threshold'\u001b[0m: inf\u001b[1m}\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Import the tree utilities library\n", "import rockpool.utilities.tree_utils as tu\n", "\n", "# - Make template lower and upper bounds\n", "lb, ub = make_bounds(net.parameters())\n", "\n", "# - Set lower bounds on \"decays\" and \"taus\" family parameters\n", "lb = tu.set_matching(lb, net.parameters('decays'), 0.5)\n", "lb = tu.set_matching(lb, net.parameters('taus'), 0.)\n", "\n", "# - Set upper bounds on \"decays\" family parameters\n", "ub = tu.set_matching(ub, net.parameters('decays'), 1.)\n", "\n", "# - Set an upper bound on a specific parameter name\n", "ub = tu.set_matching(ub, net.attributes_named('tau_syn'), 500e-3)\n", "\n", "print(lb, ub)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
tensor(0., grad_fn=<SumBackward0>)\n",
                            "
\n" ], "text/plain": [ "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m., \u001b[33mgrad_fn\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSumBackward0\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Evaluate the boundary constraint cost for the full set of network parameters\n", "print(bounds_cost(net.parameters(), lb, ub))" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Defining and evaluating boundary losses for constrained optimisation is made simple, even for complex networks!\n", "Imposing the constraints is as simple as including :py:func:`.torch_loss.bounds_cost` as a factor of the loss function during training, as in the example below." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "from torch.optim import Adam\n", "from torch.nn import CrossEntropyLoss\n", "\n", "# - Initialise the optimiser\n", "optimizer = Adam(net.parameters().astorch(), lr=1e-3)\n", "func_loss = CrossEntropyLoss()\n", "\n", "# - Dummy dataset\n", "dataset = [(torch.tensor(np.random.rand(1, 1, 2), dtype=torch.float), torch.tensor(np.random.rand(1, 1, 5), dtype=torch.float))]\n", "\n", "# - Optimiser loop over dataset\n", "for input, target in dataset:\n", " optimizer.zero_grad()\n", " output, _, _ = net(input)\n", "\n", " # - Evaluate the functional and constraints losses\n", " loss = func_loss(output, target) + bounds_cost(net.parameters(), lb, ub)\n", "\n", " # - Perform the backward step\n", " loss.backward()\n", " optimizer.step()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## `jax` interface for constrained optimization" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "The ``jax`` interface for constrained optimisation is identical to the ``torch`` interface.\n", "Here we demonstrate a similar constrained optimisation problem as above." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# - Import the Rockpool NN modules\n", "from rockpool.nn.modules import LIFJax, LinearJax\n", "from rockpool.nn.combinators import Sequential\n", "\n", "# - Import tools from ``jax_loss`` instead of ``torch_loss``\n", "from rockpool.training.jax_loss import make_bounds, bounds_cost\n", "\n", "# - Import the tree utility package\n", "from rockpool.utilities import tree_utils as tu" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Network: JaxSequential  with shape (2, 5) {\n",
                            "    LinearJax '0_LinearJax' with shape (2, 3)\n",
                            "    LIFJax '1_LIFJax' with shape (3, 3)\n",
                            "    LinearJax '2_LinearJax' with shape (3, 5)\n",
                            "    LIFJax '3_LIFJax' with shape (5, 5)\n",
                            "}\n",
                            "
\n" ], "text/plain": [ "Network: JaxSequential with shape \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m, \u001b[1;36m5\u001b[0m\u001b[1m)\u001b[0m \u001b[1m{\u001b[0m\n", " LinearJax \u001b[32m'0_LinearJax'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m, \u001b[1;36m3\u001b[0m\u001b[1m)\u001b[0m\n", " LIFJax \u001b[32m'1_LIFJax'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[1;36m3\u001b[0m, \u001b[1;36m3\u001b[0m\u001b[1m)\u001b[0m\n", " LinearJax \u001b[32m'2_LinearJax'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[1;36m3\u001b[0m, \u001b[1;36m5\u001b[0m\u001b[1m)\u001b[0m\n", " LIFJax \u001b[32m'3_LIFJax'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[1;36m5\u001b[0m, \u001b[1;36m5\u001b[0m\u001b[1m)\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parameters:\n",
                            "{\n",
                            "    '0_LinearJax': {\n",
                            "        'weight': array([[ 1.45853284, -1.09957019, -0.31666267],\n",
                            "       [ 0.63834515,  1.47955107,  1.03358989]])\n",
                            "    },\n",
                            "    '1_LIFJax': {\n",
                            "        'tau_mem': DeviceArray([0.02, 0.02, 0.02], dtype=float32),\n",
                            "        'tau_syn': DeviceArray([[0.02],\n",
                            "             [0.02],\n",
                            "             [0.02]], dtype=float32),\n",
                            "        'bias': DeviceArray([0., 0., 0.], dtype=float32),\n",
                            "        'threshold': DeviceArray([1., 1., 1.], dtype=float32)\n",
                            "    },\n",
                            "    '2_LinearJax': {\n",
                            "        'weight': array([[ 0.3648217 ,  0.34105733,  1.23947428, -0.42756732,  0.6361447 ],\n",
                            "       [-0.19837451,  0.61290813,  1.25214626,  1.206278  ,  0.70346237],\n",
                            "       [ 0.73964399, -1.02753273, -0.28541291, -1.10618743,  0.78135608]])\n",
                            "    },\n",
                            "    '3_LIFJax': {\n",
                            "        'tau_mem': DeviceArray([0.02, 0.02, 0.02, 0.02, 0.02], dtype=float32),\n",
                            "        'tau_syn': DeviceArray([[0.02],\n",
                            "             [0.02],\n",
                            "             [0.02],\n",
                            "             [0.02],\n",
                            "             [0.02]], dtype=float32),\n",
                            "        'bias': DeviceArray([0., 0., 0., 0., 0.], dtype=float32),\n",
                            "        'threshold': DeviceArray([1., 1., 1., 1., 1.], dtype=float32)\n",
                            "    }\n",
                            "}\n",
                            "
\n" ], "text/plain": [ "Parameters:\n", "\u001b[1m{\u001b[0m\n", " \u001b[32m'0_LinearJax'\u001b[0m: \u001b[1m{\u001b[0m\n", " \u001b[32m'weight'\u001b[0m: \u001b[1;35marray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m \u001b[1;36m1.45853284\u001b[0m, \u001b[1;36m-1.09957019\u001b[0m, \u001b[1;36m-0.31666267\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.63834515\u001b[0m, \u001b[1;36m1.47955107\u001b[0m, \u001b[1;36m1.03358989\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[32m'1_LIFJax'\u001b[0m: \u001b[1m{\u001b[0m\n", " \u001b[32m'tau_mem'\u001b[0m: \u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0.02\u001b[0m, \u001b[1;36m0.02\u001b[0m, \u001b[1;36m0.02\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mfloat32\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'tau_syn'\u001b[0m: \u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0.02\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.02\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.02\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mfloat32\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'bias'\u001b[0m: \u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m.\u001b[1m]\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mfloat32\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'threshold'\u001b[0m: \u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m.\u001b[1m]\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mfloat32\u001b[0m\u001b[1m)\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[32m'2_LinearJax'\u001b[0m: \u001b[1m{\u001b[0m\n", " \u001b[32m'weight'\u001b[0m: \u001b[1;35marray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m \u001b[1;36m0.3648217\u001b[0m , \u001b[1;36m0.34105733\u001b[0m, \u001b[1;36m1.23947428\u001b[0m, \u001b[1;36m-0.42756732\u001b[0m, \u001b[1;36m0.6361447\u001b[0m \u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.19837451\u001b[0m, \u001b[1;36m0.61290813\u001b[0m, \u001b[1;36m1.25214626\u001b[0m, \u001b[1;36m1.206278\u001b[0m , \u001b[1;36m0.70346237\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.73964399\u001b[0m, \u001b[1;36m-1.02753273\u001b[0m, \u001b[1;36m-0.28541291\u001b[0m, \u001b[1;36m-1.10618743\u001b[0m, \u001b[1;36m0.78135608\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[32m'3_LIFJax'\u001b[0m: \u001b[1m{\u001b[0m\n", " \u001b[32m'tau_mem'\u001b[0m: \u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0.02\u001b[0m, \u001b[1;36m0.02\u001b[0m, \u001b[1;36m0.02\u001b[0m, \u001b[1;36m0.02\u001b[0m, \u001b[1;36m0.02\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mfloat32\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'tau_syn'\u001b[0m: \u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0.02\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.02\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.02\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.02\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m0.02\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mfloat32\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'bias'\u001b[0m: \u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m., \u001b[1;36m0\u001b[0m.\u001b[1m]\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mfloat32\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'threshold'\u001b[0m: \u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m., \u001b[1;36m1\u001b[0m.\u001b[1m]\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mfloat32\u001b[0m\u001b[1m)\u001b[0m\n", " \u001b[1m}\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Set up a simple network\n", "net = Sequential(\n", " LinearJax((2, 3)),\n", " LIFJax(3),\n", " LinearJax((3, 5)),\n", " LIFJax(5),\n", ")\n", "print('Network:', net)\n", "print('Parameters:', net.parameters())" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "We again use :py:func:`.training.jax_loss.make_bounds` to build a template configuration for constrained optimisation.\n", "We use the tree handling library and :py:meth:`.Module.parameters`, to set lower-bounds constraints on time constants." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
{\n",
                            "    '0_LinearJax': {'weight': -inf},\n",
                            "    '1_LIFJax': {'bias': -inf, 'tau_mem': -inf, 'tau_syn': -inf, 'threshold': -inf},\n",
                            "    '2_LinearJax': {'weight': -inf},\n",
                            "    '3_LIFJax': {'bias': -inf, 'tau_mem': -inf, 'tau_syn': -inf, 'threshold': -inf}\n",
                            "}\n",
                            "{\n",
                            "    '0_LinearJax': {'weight': inf},\n",
                            "    '1_LIFJax': {'bias': inf, 'tau_mem': inf, 'tau_syn': inf, 'threshold': inf},\n",
                            "    '2_LinearJax': {'weight': inf},\n",
                            "    '3_LIFJax': {'bias': inf, 'tau_mem': inf, 'tau_syn': inf, 'threshold': inf}\n",
                            "}\n",
                            "
\n" ], "text/plain": [ "\u001b[1m{\u001b[0m\n", " \u001b[32m'0_LinearJax'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'weight'\u001b[0m: -inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'1_LIFJax'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'bias'\u001b[0m: -inf, \u001b[32m'tau_mem'\u001b[0m: -inf, \u001b[32m'tau_syn'\u001b[0m: -inf, \u001b[32m'threshold'\u001b[0m: -inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'2_LinearJax'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'weight'\u001b[0m: -inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'3_LIFJax'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'bias'\u001b[0m: -inf, \u001b[32m'tau_mem'\u001b[0m: -inf, \u001b[32m'tau_syn'\u001b[0m: -inf, \u001b[32m'threshold'\u001b[0m: -inf\u001b[1m}\u001b[0m\n", "\u001b[1m}\u001b[0m\n", "\u001b[1m{\u001b[0m\n", " \u001b[32m'0_LinearJax'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'weight'\u001b[0m: inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'1_LIFJax'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'bias'\u001b[0m: inf, \u001b[32m'tau_mem'\u001b[0m: inf, \u001b[32m'tau_syn'\u001b[0m: inf, \u001b[32m'threshold'\u001b[0m: inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'2_LinearJax'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'weight'\u001b[0m: inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'3_LIFJax'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'bias'\u001b[0m: inf, \u001b[32m'tau_mem'\u001b[0m: inf, \u001b[32m'tau_syn'\u001b[0m: inf, \u001b[32m'threshold'\u001b[0m: inf\u001b[1m}\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Build a template configuration\n", "lb, ub = make_bounds(net.parameters())\n", "print(lb, ub)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
{\n",
                            "    '0_LinearJax': {'weight': -inf},\n",
                            "    '1_LIFJax': {'bias': -inf, 'tau_mem': 0.0, 'tau_syn': 0.0, 'threshold': -inf},\n",
                            "    '2_LinearJax': {'weight': -inf},\n",
                            "    '3_LIFJax': {'bias': -inf, 'tau_mem': 0.0, 'tau_syn': 0.0, 'threshold': -inf}\n",
                            "}\n",
                            "
\n" ], "text/plain": [ "\u001b[1m{\u001b[0m\n", " \u001b[32m'0_LinearJax'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'weight'\u001b[0m: -inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'1_LIFJax'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'bias'\u001b[0m: -inf, \u001b[32m'tau_mem'\u001b[0m: \u001b[1;36m0.0\u001b[0m, \u001b[32m'tau_syn'\u001b[0m: \u001b[1;36m0.0\u001b[0m, \u001b[32m'threshold'\u001b[0m: -inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'2_LinearJax'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'weight'\u001b[0m: -inf\u001b[1m}\u001b[0m,\n", " \u001b[32m'3_LIFJax'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'bias'\u001b[0m: -inf, \u001b[32m'tau_mem'\u001b[0m: \u001b[1;36m0.0\u001b[0m, \u001b[32m'tau_syn'\u001b[0m: \u001b[1;36m0.0\u001b[0m, \u001b[32m'threshold'\u001b[0m: -inf\u001b[1m}\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Set lower bounds for time constants\n", "lb = tu.set_matching(lb, net.parameters('taus'), 0.)\n", "print(lb)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "raw_mimetype": "text/restructuredtext" }, "outputs": [ { "data": { "text/html": [ "
0.0\n",
                            "
\n" ], "text/plain": [ "\u001b[1;36m0.0\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Evaluate the boundary constraint cost\n", "print(bounds_cost(net.parameters(), lb, ub))" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Therefore, the Rockpool-provided interface for setting bounds is almost identical between ``torch`` and ``jax``.\n", "Below we show a very simple ``jax`` optimisation loop that incorporates the boundary constraints during optimisation." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "# - Initialise the Adam optimiser with the initial network parameters\n", "optimizer = optax.adam(1e-4)\n", "params = net.parameters()\n", "opt_state = optimizer.init(params)\n", "\n", "# - Use an MSE loss\n", "func_loss = lambda o, t: jax.numpy.mean((o - t) ** 2)\n", "\n", "# - Network evaluation and loss function\n", "def eval_loss(params, net, input, target):\n", " output, _, _ = net(input)\n", " loss = func_loss(output, target) + bounds_cost(params, lb, ub)\n", "\n", " return loss\n", "\n", "# - Dummy dataset\n", "dataset = [(np.random.rand(1, 1, 2), np.random.rand(1, 1, 5))]\n", "\n", "# - Loop over dataset, evaluating loss and applying updates\n", "for input, target in dataset:\n", " loss_value, grads = jax.value_and_grad(eval_loss)(params, net, input, target)\n", " updates, opt_state = optimizer.update(grads, opt_state, params)\n", " params = optax.apply_updates(params, updates)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Next steps" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "See :ref:`/in-depth/jax-training.ipynb` for a ``jax`` training example that includes constraints." ] } ], "metadata": { "kernelspec": { "display_name": "py38", "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.8.12" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }