{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 🔥 Building Rockpool modules with Torch" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Rockpool provides torch-backed modules with standard dynamics, for simple integration with other torch-provided modules from ``torch.nn``.\n", "\n", "======================================= =======================================\n", "Class Description\n", "======================================= =======================================\n", ":py:class:`.RateTorch` A layer of non-spiking firing-rate neurons, with trainable time constants, thresholds and biases per neuron; optinally supporting recurrent connectivity\n", ":py:class:`.LIFTorch` A layer of leaky integrate-and-fire spiking neurons, optionally supporting recurrent connectivity. Traininable with surrogate gradient descent, with trainable time constants, biases, thresholds per neuron\n", ":py:class:`.ExpSynTorch` Exponential synapses, with trainable time constants\n", ":py:class:`.LinearTorch` Equivalent to a standard trainable linear weights layer, but fully supporting the Rockpool APIs\n", ":py:class:`.InstantTorch` Wrap an arbitrary function as a Rockpool module\n", "======================================= =======================================" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Use the Rockpool Torch-backed classes" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "The classes above can be used directly to build network architectures in Rockpool, including mixing classes from ``torch.nn``. Here we build a simple feed-forward dynamical rate network, including a dropout layer from torch." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "# - Switch off warnings\n", "import warnings\n", "\n", "warnings.filterwarnings(\"ignore\")\n", "\n", "# - Rich printing\n", "try:\n", " from rich import print\n", "except:\n", " pass\n", "\n", "# - Import and configure matplotlib for plotting\n", "import sys\n", "!{sys.executable} -m pip install --quiet matplotlib\n", "import matplotlib.pyplot as plt\n", "\n", "%matplotlib inline\n", "plt.rcParams[\"figure.figsize\"] = [12, 4]\n", "plt.rcParams[\"figure.dpi\"] = 300\n", "\n", "# - Torch imports\n", "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "TorchSequential with shape (2, 2) {\n", " LinearTorch '0_LinearTorch' with shape (2, 5)\n", " RateTorch '1_RateTorch' with shape (5,)\n", " Dropout2d '2_Dropout2d' with shape (None,)\n", " LinearTorch '3_LinearTorch' with shape (5, 2)\n", " RateTorch '4_RateTorch' with shape (2,)\n", "}" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from rockpool.nn.modules import RateTorch, LinearTorch\n", "from rockpool.nn.combinators import Sequential\n", "\n", "Nin = 2\n", "Nhidden = 5\n", "Nout = 2\n", "\n", "# Define a simple feed-forward network using the Torch backend\n", "net = Sequential(\n", " LinearTorch((Nin, Nhidden)),\n", " RateTorch((Nhidden,)),\n", " nn.Dropout2d(0.25),\n", " LinearTorch((Nhidden, Nout)),\n", " RateTorch((Nout,)),\n", ")\n", "net" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# - Evolve the network on random data and plot\n", "data = torch.rand((1, 100, Nin))\n", "out, _, _ = net(data)\n", "plt.plot(out[0].detach());" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
[\n",
       "    '0_LinearTorch',\n",
       "    '0_LinearTorch_output',\n",
       "    '1_RateTorch',\n",
       "    '1_RateTorch_output',\n",
       "    '2_Dropout2d',\n",
       "    '2_Dropout2d_output',\n",
       "    '3_LinearTorch',\n",
       "    '3_LinearTorch_output',\n",
       "    '4_RateTorch',\n",
       "    '4_RateTorch_output'\n",
       "]\n",
       "
\n" ], "text/plain": [ "\u001b[1m[\u001b[0m\n", " \u001b[32m'0_LinearTorch'\u001b[0m,\n", " \u001b[32m'0_LinearTorch_output'\u001b[0m,\n", " \u001b[32m'1_RateTorch'\u001b[0m,\n", " \u001b[32m'1_RateTorch_output'\u001b[0m,\n", " \u001b[32m'2_Dropout2d'\u001b[0m,\n", " \u001b[32m'2_Dropout2d_output'\u001b[0m,\n", " \u001b[32m'3_LinearTorch'\u001b[0m,\n", " \u001b[32m'3_LinearTorch_output'\u001b[0m,\n", " \u001b[32m'4_RateTorch'\u001b[0m,\n", " \u001b[32m'4_RateTorch_output'\u001b[0m\n", "\u001b[1m]\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Recording internal signals also works\n", "out, _, rd = net(data, record=True)\n", "print(list(rd.keys()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convert an existing Torch ``torch.nn.module`` for use in Rockpool" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Torch modules implemented using ``torch.nn.Module`` can be converted directly to the Rockpool API using the method :py:meth:`.TorchModule.from_torch`. This method returns an object adhering to the Rockpool low-level API, converting Torch calls and attributes into Rockpool calls and registered attributes.\n", "\n", "Here we show an example of a simple Torch module coverted to a Rockpool object." ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [], "source": [ "# - Torch imports\n", "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "\n", "# - Rockpool imports\n", "from rockpool.nn.modules import TorchModule\n", "\n", "# - Implement a Torch class\n", "class TorchNet(torch.nn.Module):\n", " def __init__(self, *args, **kwargs):\n", " super().__init__(*args, **kwargs)\n", "\n", " # - Build some convolutional layers\n", " self.conv1 = nn.Conv2d(1, 2, 3, 1)\n", "\n", " # - Add a dropout layer\n", " self.dropout1 = nn.Dropout2d(0.25)\n", "\n", " # - Fully-connected layer\n", " self.fc1 = nn.Linear(338, 10)\n", "\n", " # - Register an example buffer\n", " self.register_buffer(\"test_buf\", torch.zeros(3, 4))\n", "\n", " def forward(self, x):\n", " x = self.conv1(x)\n", " x = F.relu(x)\n", "\n", " x = F.max_pool2d(x, 2)\n", " x = self.dropout1(x)\n", "\n", " x = torch.flatten(x, 1)\n", "\n", " x = self.fc1(x)\n", " x = F.relu(x)\n", "\n", " output = F.log_softmax(x, dim=1)\n", " return output" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [], "source": [ "# - Instantiate the network and test the Torch API\n", "\n", "# Equates to one random 28x28 image\n", "random_data = torch.rand((1, 1, 28, 28))\n", "\n", "# - Generate torch module and test evaluation\n", "mod = TorchNet()\n", "result = mod(random_data)" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
TorchNet 'TorchModulePatch' with shape (None,) {\n",
       "    Conv2d 'TorchModulePatch' with shape (None,)\n",
       "    Dropout2d 'TorchModulePatch' with shape (None,)\n",
       "    Linear 'TorchModulePatch' with shape (None,)\n",
       "}\n",
       "
\n" ], "text/plain": [ "TorchNet \u001b[32m'TorchModulePatch'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m \u001b[1m{\u001b[0m\n", " Conv2d \u001b[32m'TorchModulePatch'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " Dropout2d \u001b[32m'TorchModulePatch'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " Linear \u001b[32m'TorchModulePatch'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Convert object to Rockpool API, in-place\n", "TorchModule.from_torch(mod)\n", "print(mod)" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
tensor([[-2.2458, -1.9656, -2.3617, -2.3617, -2.3617, -2.3617, -2.3617, -2.3617,\n",
       "         -2.3617, -2.3617]], grad_fn=<LogSoftmaxBackward0>)\n",
       "
\n" ], "text/plain": [ "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-2.2458\u001b[0m, \u001b[1;36m-1.9656\u001b[0m, \u001b[1;36m-2.3617\u001b[0m, \u001b[1;36m-2.3617\u001b[0m, \u001b[1;36m-2.3617\u001b[0m, \u001b[1;36m-2.3617\u001b[0m, \u001b[1;36m-2.3617\u001b[0m, \u001b[1;36m-2.3617\u001b[0m,\n", " \u001b[1;36m-2.3617\u001b[0m, \u001b[1;36m-2.3617\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mgrad_fn\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mLogSoftmaxBackward0\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Use the Rockpool API to evolve the module\n", "output, _, _ = mod(random_data)\n", "print(output)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "The module attributes can be accessed using the Rockpool API via :py:meth:`~.TorchModule.parameters`, :py:meth:`~.TorchModule.state` and :py:meth:`~.TorchModule.simulationparameters` methods. The attribute dictionaries returned by these methods support an additional method :py:meth:`~.TorchModuleParameters.astorch`, which converts the attribute dictionary to a generator returning raw :py:class:`Tensor` s. Doing so is equivalent to calling the :py:meth:`Torch.nn.Module.parameters` method." ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Parameters: \n",
       "{\n",
       "    'conv1': {\n",
       "        'weight': Parameter containing:\n",
       "tensor([[[[-0.1636, -0.3071,  0.0886],\n",
       "          [ 0.1826, -0.0988, -0.2805],\n",
       "          [ 0.1841, -0.1396, -0.0389]]],\n",
       "\n",
       "\n",
       "        [[[ 0.2814, -0.2359, -0.0974],\n",
       "          [-0.2386,  0.3125,  0.1958],\n",
       "          [ 0.3165,  0.0791, -0.0173]]]], requires_grad=True),\n",
       "        'bias': Parameter containing:\n",
       "tensor([-0.1282,  0.0541], requires_grad=True)\n",
       "    },\n",
       "    'dropout1': {},\n",
       "    'fc1': {\n",
       "        'weight': Parameter containing:\n",
       "tensor([[ 0.0261, -0.0336, -0.0126,  ..., -0.0055,  0.0495, -0.0540],\n",
       "        [ 0.0469,  0.0163, -0.0500,  ..., -0.0408, -0.0364, -0.0121],\n",
       "        [-0.0284,  0.0247,  0.0290,  ..., -0.0128,  0.0444,  0.0534],\n",
       "        ...,\n",
       "        [ 0.0184,  0.0500,  0.0326,  ..., -0.0116, -0.0092,  0.0071],\n",
       "        [ 0.0190,  0.0424, -0.0505,  ..., -0.0379, -0.0238,  0.0469],\n",
       "        [ 0.0119,  0.0063,  0.0538,  ..., -0.0211, -0.0373,  0.0374]],\n",
       "       requires_grad=True),\n",
       "        'bias': Parameter containing:\n",
       "tensor([-0.0106, -0.0069, -0.0463,  0.0346,  0.0390, -0.0147, -0.0386, -0.0023,\n",
       "         0.0171, -0.0368], requires_grad=True)\n",
       "    }\n",
       "}\n",
       "
\n" ], "text/plain": [ "Parameters: \n", "\u001b[1m{\u001b[0m\n", " \u001b[32m'conv1'\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[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-0.1636\u001b[0m, \u001b[1;36m-0.3071\u001b[0m, \u001b[1;36m0.0886\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.1826\u001b[0m, \u001b[1;36m-0.0988\u001b[0m, \u001b[1;36m-0.2805\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.1841\u001b[0m, \u001b[1;36m-0.1396\u001b[0m, \u001b[1;36m-0.0389\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m,\n", "\n", "\n", " \u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m \u001b[1;36m0.2814\u001b[0m, \u001b[1;36m-0.2359\u001b[0m, \u001b[1;36m-0.0974\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.2386\u001b[0m, \u001b[1;36m0.3125\u001b[0m, \u001b[1;36m0.1958\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.3165\u001b[0m, \u001b[1;36m0.0791\u001b[0m, \u001b[1;36m-0.0173\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\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;36m-0.1282\u001b[0m, \u001b[1;36m0.0541\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'dropout1'\u001b[0m: \u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", " \u001b[32m'fc1'\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.0261\u001b[0m, \u001b[1;36m-0.0336\u001b[0m, \u001b[1;36m-0.0126\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0055\u001b[0m, \u001b[1;36m0.0495\u001b[0m, \u001b[1;36m-0.0540\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0469\u001b[0m, \u001b[1;36m0.0163\u001b[0m, \u001b[1;36m-0.0500\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0408\u001b[0m, \u001b[1;36m-0.0364\u001b[0m, \u001b[1;36m-0.0121\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0284\u001b[0m, \u001b[1;36m0.0247\u001b[0m, \u001b[1;36m0.0290\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0128\u001b[0m, \u001b[1;36m0.0444\u001b[0m, \u001b[1;36m0.0534\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[33m...\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0184\u001b[0m, \u001b[1;36m0.0500\u001b[0m, \u001b[1;36m0.0326\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0116\u001b[0m, \u001b[1;36m-0.0092\u001b[0m, \u001b[1;36m0.0071\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0190\u001b[0m, \u001b[1;36m0.0424\u001b[0m, \u001b[1;36m-0.0505\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0379\u001b[0m, \u001b[1;36m-0.0238\u001b[0m, \u001b[1;36m0.0469\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0119\u001b[0m, \u001b[1;36m0.0063\u001b[0m, \u001b[1;36m0.0538\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0211\u001b[0m, \u001b[1;36m-0.0373\u001b[0m, \u001b[1;36m0.0374\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m,\n", " \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;36m-0.0106\u001b[0m, \u001b[1;36m-0.0069\u001b[0m, \u001b[1;36m-0.0463\u001b[0m, \u001b[1;36m0.0346\u001b[0m, \u001b[1;36m0.0390\u001b[0m, \u001b[1;36m-0.0147\u001b[0m, \u001b[1;36m-0.0386\u001b[0m, \u001b[1;36m-0.0023\u001b[0m,\n", " \u001b[1;36m0.0171\u001b[0m, \u001b[1;36m-0.0368\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" }, { "data": { "text/html": [ "
State: \n",
       "{\n",
       "    'test_buf': tensor([[0., 0., 0., 0.],\n",
       "        [0., 0., 0., 0.],\n",
       "        [0., 0., 0., 0.]]),\n",
       "    'conv1': {},\n",
       "    'dropout1': {},\n",
       "    'fc1': {}\n",
       "}\n",
       "
\n" ], "text/plain": [ "State: \n", "\u001b[1m{\u001b[0m\n", " \u001b[32m'test_buf'\u001b[0m: \u001b[1;35mtensor\u001b[0m\u001b[1m(\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[1m]\u001b[0m,\n", " \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[1m]\u001b[0m,\n", " \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[1m]\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'conv1'\u001b[0m: \u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", " \u001b[32m'dropout1'\u001b[0m: \u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", " \u001b[32m'fc1'\u001b[0m: \u001b[1m{\u001b[0m\u001b[1m}\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Use the Rockpool API to access parameters\n", "print(\"Parameters: \", mod.parameters())\n", "print(\"State: \", mod.state())" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Parameters.astorch(): \n",
       "[\n",
       "    Parameter containing:\n",
       "tensor([[[[-0.1636, -0.3071,  0.0886],\n",
       "          [ 0.1826, -0.0988, -0.2805],\n",
       "          [ 0.1841, -0.1396, -0.0389]]],\n",
       "\n",
       "\n",
       "        [[[ 0.2814, -0.2359, -0.0974],\n",
       "          [-0.2386,  0.3125,  0.1958],\n",
       "          [ 0.3165,  0.0791, -0.0173]]]], requires_grad=True),\n",
       "    Parameter containing:\n",
       "tensor([-0.1282,  0.0541], requires_grad=True),\n",
       "    Parameter containing:\n",
       "tensor([[ 0.0261, -0.0336, -0.0126,  ..., -0.0055,  0.0495, -0.0540],\n",
       "        [ 0.0469,  0.0163, -0.0500,  ..., -0.0408, -0.0364, -0.0121],\n",
       "        [-0.0284,  0.0247,  0.0290,  ..., -0.0128,  0.0444,  0.0534],\n",
       "        ...,\n",
       "        [ 0.0184,  0.0500,  0.0326,  ..., -0.0116, -0.0092,  0.0071],\n",
       "        [ 0.0190,  0.0424, -0.0505,  ..., -0.0379, -0.0238,  0.0469],\n",
       "        [ 0.0119,  0.0063,  0.0538,  ..., -0.0211, -0.0373,  0.0374]],\n",
       "       requires_grad=True),\n",
       "    Parameter containing:\n",
       "tensor([-0.0106, -0.0069, -0.0463,  0.0346,  0.0390, -0.0147, -0.0386, -0.0023,\n",
       "         0.0171, -0.0368], requires_grad=True)\n",
       "]\n",
       "
\n" ], "text/plain": [ "\u001b[1;35mParameters.astorch\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \n", "\u001b[1m[\u001b[0m\n", " Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-0.1636\u001b[0m, \u001b[1;36m-0.3071\u001b[0m, \u001b[1;36m0.0886\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.1826\u001b[0m, \u001b[1;36m-0.0988\u001b[0m, \u001b[1;36m-0.2805\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.1841\u001b[0m, \u001b[1;36m-0.1396\u001b[0m, \u001b[1;36m-0.0389\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m,\n", "\n", "\n", " \u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m \u001b[1;36m0.2814\u001b[0m, \u001b[1;36m-0.2359\u001b[0m, \u001b[1;36m-0.0974\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.2386\u001b[0m, \u001b[1;36m0.3125\u001b[0m, \u001b[1;36m0.1958\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.3165\u001b[0m, \u001b[1;36m0.0791\u001b[0m, \u001b[1;36m-0.0173\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\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", " Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-0.1282\u001b[0m, \u001b[1;36m0.0541\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m \u001b[1;36m0.0261\u001b[0m, \u001b[1;36m-0.0336\u001b[0m, \u001b[1;36m-0.0126\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0055\u001b[0m, \u001b[1;36m0.0495\u001b[0m, \u001b[1;36m-0.0540\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0469\u001b[0m, \u001b[1;36m0.0163\u001b[0m, \u001b[1;36m-0.0500\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0408\u001b[0m, \u001b[1;36m-0.0364\u001b[0m, \u001b[1;36m-0.0121\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0284\u001b[0m, \u001b[1;36m0.0247\u001b[0m, \u001b[1;36m0.0290\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0128\u001b[0m, \u001b[1;36m0.0444\u001b[0m, \u001b[1;36m0.0534\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[33m...\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0184\u001b[0m, \u001b[1;36m0.0500\u001b[0m, \u001b[1;36m0.0326\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0116\u001b[0m, \u001b[1;36m-0.0092\u001b[0m, \u001b[1;36m0.0071\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0190\u001b[0m, \u001b[1;36m0.0424\u001b[0m, \u001b[1;36m-0.0505\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0379\u001b[0m, \u001b[1;36m-0.0238\u001b[0m, \u001b[1;36m0.0469\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0119\u001b[0m, \u001b[1;36m0.0063\u001b[0m, \u001b[1;36m0.0538\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0211\u001b[0m, \u001b[1;36m-0.0373\u001b[0m, \u001b[1;36m0.0374\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-0.0106\u001b[0m, \u001b[1;36m-0.0069\u001b[0m, \u001b[1;36m-0.0463\u001b[0m, \u001b[1;36m0.0346\u001b[0m, \u001b[1;36m0.0390\u001b[0m, \u001b[1;36m-0.0147\u001b[0m, \u001b[1;36m-0.0386\u001b[0m, \u001b[1;36m-0.0023\u001b[0m,\n", " \u001b[1;36m0.0171\u001b[0m, \u001b[1;36m-0.0368\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": [ "# - Convert the parameter dictionary to torch parameters\n", "print(\"Parameters.astorch(): \", list(mod.parameters().astorch()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Write a native Rockpool/Torch module using ``TorchModule``" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "You can also use :py:class:`.TorchModule` directly as a base class, in place of ``torch.nn.Module``. Usually this will be a drop-in replacement, without modifying the initialisation or evaluation code.\n", "\n", "The example here mimics the network above --- only the inherited base class has been changed." ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "# - Implement a Rockpool class using the TorchModule base class\n", "class RockpoolNet(TorchModule):\n", " def __init__(self, *args, **kwargs):\n", " super().__init__(*args, **kwargs)\n", "\n", " # - Build some convolutional layers\n", " self.conv1 = nn.Conv2d(1, 2, 3, 1)\n", "\n", " # - Add a dropout layer\n", " self.dropout1 = nn.Dropout2d(0.25)\n", "\n", " # - Fully-connected layer\n", " self.fc1 = nn.Linear(338, 10)\n", "\n", " # - Register an example buffer\n", " self.register_buffer(\"test_buf\", torch.zeros(3, 4))\n", "\n", " def forward(self, x):\n", " x = self.conv1(x)\n", " x = F.relu(x)\n", "\n", " x = F.max_pool2d(x, 2)\n", " x = self.dropout1(x)\n", "\n", " x = torch.flatten(x, 1)\n", "\n", " x = self.fc1(x)\n", " x = F.relu(x)\n", "\n", " output = F.log_softmax(x, dim=1)\n", " return output" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
RockpoolNet  with shape (None,) {\n",
       "    Conv2d 'conv1' with shape (None,)\n",
       "    Conv2d 'conv1' with shape (None,)\n",
       "    Dropout2d 'dropout1' with shape (None,)\n",
       "    Dropout2d 'dropout1' with shape (None,)\n",
       "    Linear 'fc1' with shape (None,)\n",
       "    Linear 'fc1' with shape (None,)\n",
       "}\n",
       "
\n" ], "text/plain": [ "RockpoolNet with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m \u001b[1m{\u001b[0m\n", " Conv2d \u001b[32m'conv1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " Conv2d \u001b[32m'conv1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " Dropout2d \u001b[32m'dropout1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " Dropout2d \u001b[32m'dropout1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " Linear \u001b[32m'fc1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " Linear \u001b[32m'fc1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Instantiate the Rockpool class directly\n", "rmod = RockpoolNet()\n", "print(rmod)" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
tensor([[-2.3283, -2.3283, -2.3283, -2.3283, -2.3283, -2.2359, -2.2393, -2.2600,\n",
       "         -2.3283, -2.3283]], grad_fn=<LogSoftmaxBackward0>)\n",
       "
\n" ], "text/plain": [ "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-2.3283\u001b[0m, \u001b[1;36m-2.3283\u001b[0m, \u001b[1;36m-2.3283\u001b[0m, \u001b[1;36m-2.3283\u001b[0m, \u001b[1;36m-2.3283\u001b[0m, \u001b[1;36m-2.2359\u001b[0m, \u001b[1;36m-2.2393\u001b[0m, \u001b[1;36m-2.2600\u001b[0m,\n", " \u001b[1;36m-2.3283\u001b[0m, \u001b[1;36m-2.3283\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mgrad_fn\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mLogSoftmaxBackward0\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Evaluate the module using the Rockpool API\n", "output, _, _ = rmod(random_data)\n", "print(output)" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Parameters: \n",
       "{\n",
       "    'conv1': {\n",
       "        'weight': Parameter containing:\n",
       "tensor([[[[ 0.2828, -0.2562,  0.0924],\n",
       "          [ 0.1476,  0.0577, -0.0121],\n",
       "          [ 0.0073,  0.2832, -0.2923]]],\n",
       "\n",
       "\n",
       "        [[[ 0.2786,  0.0777, -0.0933],\n",
       "          [-0.1199,  0.0570, -0.2343],\n",
       "          [ 0.2991,  0.0064, -0.2985]]]], requires_grad=True),\n",
       "        'bias': Parameter containing:\n",
       "tensor([-0.2721, -0.2435], requires_grad=True)\n",
       "    },\n",
       "    'dropout1': {},\n",
       "    'fc1': {\n",
       "        'weight': Parameter containing:\n",
       "tensor([[-0.0320,  0.0249, -0.0329,  ...,  0.0196,  0.0241, -0.0021],\n",
       "        [-0.0400,  0.0448, -0.0266,  ..., -0.0056, -0.0111,  0.0318],\n",
       "        [ 0.0204,  0.0127, -0.0184,  ...,  0.0482, -0.0074,  0.0258],\n",
       "        ...,\n",
       "        [ 0.0328, -0.0477,  0.0297,  ..., -0.0182, -0.0296,  0.0217],\n",
       "        [-0.0037,  0.0421,  0.0048,  ...,  0.0057, -0.0409, -0.0112],\n",
       "        [-0.0214, -0.0465, -0.0319,  ...,  0.0304, -0.0220, -0.0306]],\n",
       "       requires_grad=True),\n",
       "        'bias': Parameter containing:\n",
       "tensor([ 0.0059,  0.0042, -0.0443,  0.0200,  0.0258,  0.0406,  0.0433, -0.0303,\n",
       "         0.0038,  0.0473], requires_grad=True)\n",
       "    }\n",
       "}\n",
       "
\n" ], "text/plain": [ "Parameters: \n", "\u001b[1m{\u001b[0m\n", " \u001b[32m'conv1'\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[1m[\u001b[0m\u001b[1m[\u001b[0m \u001b[1;36m0.2828\u001b[0m, \u001b[1;36m-0.2562\u001b[0m, \u001b[1;36m0.0924\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.1476\u001b[0m, \u001b[1;36m0.0577\u001b[0m, \u001b[1;36m-0.0121\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0073\u001b[0m, \u001b[1;36m0.2832\u001b[0m, \u001b[1;36m-0.2923\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m,\n", "\n", "\n", " \u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m \u001b[1;36m0.2786\u001b[0m, \u001b[1;36m0.0777\u001b[0m, \u001b[1;36m-0.0933\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.1199\u001b[0m, \u001b[1;36m0.0570\u001b[0m, \u001b[1;36m-0.2343\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.2991\u001b[0m, \u001b[1;36m0.0064\u001b[0m, \u001b[1;36m-0.2985\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\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;36m-0.2721\u001b[0m, \u001b[1;36m-0.2435\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'dropout1'\u001b[0m: \u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", " \u001b[32m'fc1'\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-0.0320\u001b[0m, \u001b[1;36m0.0249\u001b[0m, \u001b[1;36m-0.0329\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m0.0196\u001b[0m, \u001b[1;36m0.0241\u001b[0m, \u001b[1;36m-0.0021\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0400\u001b[0m, \u001b[1;36m0.0448\u001b[0m, \u001b[1;36m-0.0266\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0056\u001b[0m, \u001b[1;36m-0.0111\u001b[0m, \u001b[1;36m0.0318\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0204\u001b[0m, \u001b[1;36m0.0127\u001b[0m, \u001b[1;36m-0.0184\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m0.0482\u001b[0m, \u001b[1;36m-0.0074\u001b[0m, \u001b[1;36m0.0258\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[33m...\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0328\u001b[0m, \u001b[1;36m-0.0477\u001b[0m, \u001b[1;36m0.0297\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0182\u001b[0m, \u001b[1;36m-0.0296\u001b[0m, \u001b[1;36m0.0217\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0037\u001b[0m, \u001b[1;36m0.0421\u001b[0m, \u001b[1;36m0.0048\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m0.0057\u001b[0m, \u001b[1;36m-0.0409\u001b[0m, \u001b[1;36m-0.0112\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0214\u001b[0m, \u001b[1;36m-0.0465\u001b[0m, \u001b[1;36m-0.0319\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m0.0304\u001b[0m, \u001b[1;36m-0.0220\u001b[0m, \u001b[1;36m-0.0306\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m,\n", " \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.0059\u001b[0m, \u001b[1;36m0.0042\u001b[0m, \u001b[1;36m-0.0443\u001b[0m, \u001b[1;36m0.0200\u001b[0m, \u001b[1;36m0.0258\u001b[0m, \u001b[1;36m0.0406\u001b[0m, \u001b[1;36m0.0433\u001b[0m, \u001b[1;36m-0.0303\u001b[0m,\n", " \u001b[1;36m0.0038\u001b[0m, \u001b[1;36m0.0473\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" }, { "data": { "text/html": [ "
State: \n",
       "{\n",
       "    'test_buf': tensor([[0., 0., 0., 0.],\n",
       "        [0., 0., 0., 0.],\n",
       "        [0., 0., 0., 0.]]),\n",
       "    'conv1': {},\n",
       "    'dropout1': {},\n",
       "    'fc1': {}\n",
       "}\n",
       "
\n" ], "text/plain": [ "State: \n", "\u001b[1m{\u001b[0m\n", " \u001b[32m'test_buf'\u001b[0m: \u001b[1;35mtensor\u001b[0m\u001b[1m(\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[1m]\u001b[0m,\n", " \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[1m]\u001b[0m,\n", " \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[1m]\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'conv1'\u001b[0m: \u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", " \u001b[32m'dropout1'\u001b[0m: \u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", " \u001b[32m'fc1'\u001b[0m: \u001b[1m{\u001b[0m\u001b[1m}\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Access parameters using the Rockpool API\n", "print(\"Parameters: \", rmod.parameters())\n", "print(\"State: \", rmod.state())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Converting from Rockpool/torch to pure torch" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Sometimes you may want to use the Rockpool provided :py:class:`.TorchModule` derived classes with other software that expects pure torch (e.g. MLFlow or Pytorch Lightning).\n", "\n", "In that case you can use the :py:meth:`~.TorchModule.to_torch` method to expose a pure torch interface. Here we show how that works, using the class ``RockpoolNet`` defined above." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Rockpool API" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
RockpoolNet  with shape (None,) {\n",
       "    Conv2d 'conv1' with shape (None,)\n",
       "    Conv2d 'conv1' with shape (None,)\n",
       "    Dropout2d 'dropout1' with shape (None,)\n",
       "    Dropout2d 'dropout1' with shape (None,)\n",
       "    Linear 'fc1' with shape (None,)\n",
       "    Linear 'fc1' with shape (None,)\n",
       "}\n",
       "
\n" ], "text/plain": [ "RockpoolNet with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m \u001b[1m{\u001b[0m\n", " Conv2d \u001b[32m'conv1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " Conv2d \u001b[32m'conv1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " Dropout2d \u001b[32m'dropout1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " Dropout2d \u001b[32m'dropout1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " Linear \u001b[32m'fc1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " Linear \u001b[32m'fc1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Instantiate the Rockpool class\n", "net = RockpoolNet()\n", "print(net)" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Parameters:\n",
       "{\n",
       "    'conv1': {\n",
       "        'weight': Parameter containing:\n",
       "tensor([[[[-0.2905,  0.1654, -0.1893],\n",
       "          [-0.0804,  0.1523, -0.3320],\n",
       "          [ 0.0346,  0.1020,  0.0288]]],\n",
       "\n",
       "\n",
       "        [[[-0.1374,  0.3117,  0.0558],\n",
       "          [-0.3279,  0.1651,  0.3008],\n",
       "          [ 0.0011,  0.1701, -0.1425]]]], requires_grad=True),\n",
       "        'bias': Parameter containing:\n",
       "tensor([-0.1574, -0.1525], requires_grad=True)\n",
       "    },\n",
       "    'dropout1': {},\n",
       "    'fc1': {\n",
       "        'weight': Parameter containing:\n",
       "tensor([[ 0.0269, -0.0310,  0.0103,  ..., -0.0044, -0.0114, -0.0388],\n",
       "        [ 0.0409, -0.0286,  0.0256,  ...,  0.0166,  0.0072, -0.0476],\n",
       "        [-0.0356,  0.0108, -0.0136,  ..., -0.0108,  0.0268,  0.0322],\n",
       "        ...,\n",
       "        [-0.0467, -0.0277,  0.0084,  ..., -0.0023,  0.0034, -0.0107],\n",
       "        [-0.0191,  0.0524, -0.0005,  ...,  0.0305,  0.0221, -0.0304],\n",
       "        [-0.0199,  0.0537,  0.0393,  ..., -0.0248,  0.0081,  0.0438]],\n",
       "       requires_grad=True),\n",
       "        'bias': Parameter containing:\n",
       "tensor([ 0.0454,  0.0186, -0.0167, -0.0339,  0.0249,  0.0274, -0.0339, -0.0019,\n",
       "        -0.0250, -0.0271], requires_grad=True)\n",
       "    }\n",
       "}\n",
       "
\n" ], "text/plain": [ "Parameters:\n", "\u001b[1m{\u001b[0m\n", " \u001b[32m'conv1'\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[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-0.2905\u001b[0m, \u001b[1;36m0.1654\u001b[0m, \u001b[1;36m-0.1893\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0804\u001b[0m, \u001b[1;36m0.1523\u001b[0m, \u001b[1;36m-0.3320\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0346\u001b[0m, \u001b[1;36m0.1020\u001b[0m, \u001b[1;36m0.0288\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m,\n", "\n", "\n", " \u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-0.1374\u001b[0m, \u001b[1;36m0.3117\u001b[0m, \u001b[1;36m0.0558\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.3279\u001b[0m, \u001b[1;36m0.1651\u001b[0m, \u001b[1;36m0.3008\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0011\u001b[0m, \u001b[1;36m0.1701\u001b[0m, \u001b[1;36m-0.1425\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\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;36m-0.1574\u001b[0m, \u001b[1;36m-0.1525\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'dropout1'\u001b[0m: \u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", " \u001b[32m'fc1'\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.0269\u001b[0m, \u001b[1;36m-0.0310\u001b[0m, \u001b[1;36m0.0103\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0044\u001b[0m, \u001b[1;36m-0.0114\u001b[0m, \u001b[1;36m-0.0388\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0409\u001b[0m, \u001b[1;36m-0.0286\u001b[0m, \u001b[1;36m0.0256\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m0.0166\u001b[0m, \u001b[1;36m0.0072\u001b[0m, \u001b[1;36m-0.0476\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0356\u001b[0m, \u001b[1;36m0.0108\u001b[0m, \u001b[1;36m-0.0136\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0108\u001b[0m, \u001b[1;36m0.0268\u001b[0m, \u001b[1;36m0.0322\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[33m...\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0467\u001b[0m, \u001b[1;36m-0.0277\u001b[0m, \u001b[1;36m0.0084\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0023\u001b[0m, \u001b[1;36m0.0034\u001b[0m, \u001b[1;36m-0.0107\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0191\u001b[0m, \u001b[1;36m0.0524\u001b[0m, \u001b[1;36m-0.0005\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m0.0305\u001b[0m, \u001b[1;36m0.0221\u001b[0m, \u001b[1;36m-0.0304\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0199\u001b[0m, \u001b[1;36m0.0537\u001b[0m, \u001b[1;36m0.0393\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0248\u001b[0m, \u001b[1;36m0.0081\u001b[0m, \u001b[1;36m0.0438\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m,\n", " \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.0454\u001b[0m, \u001b[1;36m0.0186\u001b[0m, \u001b[1;36m-0.0167\u001b[0m, \u001b[1;36m-0.0339\u001b[0m, \u001b[1;36m0.0249\u001b[0m, \u001b[1;36m0.0274\u001b[0m, \u001b[1;36m-0.0339\u001b[0m, \u001b[1;36m-0.0019\u001b[0m,\n", " \u001b[1;36m-0.0250\u001b[0m, \u001b[1;36m-0.0271\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": [ "# - Rockpool dictionary-based parameter API\n", "print(\"Parameters:\", net.parameters())" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
(\n",
       "    tensor([[-2.3239, -2.3239, -2.2561, -2.2330, -2.3239, -2.3239, -2.3239, -2.3239,\n",
       "         -2.2750, -2.3239]], grad_fn=<LogSoftmaxBackward0>),\n",
       "    {\n",
       "        'test_buf': tensor([[0., 0., 0., 0.],\n",
       "        [0., 0., 0., 0.],\n",
       "        [0., 0., 0., 0.]]),\n",
       "        'conv1': {},\n",
       "        'dropout1': {},\n",
       "        'fc1': {}\n",
       "    },\n",
       "    {}\n",
       ")\n",
       "
\n" ], "text/plain": [ "\u001b[1m(\u001b[0m\n", " \u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-2.3239\u001b[0m, \u001b[1;36m-2.3239\u001b[0m, \u001b[1;36m-2.2561\u001b[0m, \u001b[1;36m-2.2330\u001b[0m, \u001b[1;36m-2.3239\u001b[0m, \u001b[1;36m-2.3239\u001b[0m, \u001b[1;36m-2.3239\u001b[0m, \u001b[1;36m-2.3239\u001b[0m,\n", " \u001b[1;36m-2.2750\u001b[0m, \u001b[1;36m-2.3239\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mgrad_fn\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mLogSoftmaxBackward0\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[1m{\u001b[0m\n", " \u001b[32m'test_buf'\u001b[0m: \u001b[1;35mtensor\u001b[0m\u001b[1m(\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[1m]\u001b[0m,\n", " \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[1m]\u001b[0m,\n", " \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[1m]\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'conv1'\u001b[0m: \u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", " \u001b[32m'dropout1'\u001b[0m: \u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", " \u001b[32m'fc1'\u001b[0m: \u001b[1m{\u001b[0m\u001b[1m}\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[1m{\u001b[0m\u001b[1m}\u001b[0m\n", "\u001b[1m)\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Evaluate one random 28x28 image\n", "random_data = torch.rand((1, 1, 28, 28))\n", "\n", "# - Rockpool standard calling semantics\n", "print(net(random_data))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Torch API" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
RockpoolNet(\n",
       "  (conv1): Conv2d 'conv1' with shape (None,)\n",
       "  (dropout1): Dropout2d 'dropout1' with shape (None,)\n",
       "  (fc1): Linear 'fc1' with shape (None,)\n",
       ")\n",
       "
\n" ], "text/plain": [ "\u001b[1;35mRockpoolNet\u001b[0m\u001b[1m(\u001b[0m\n", " \u001b[1m(\u001b[0mconv1\u001b[1m)\u001b[0m: Conv2d \u001b[32m'conv1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " \u001b[1m(\u001b[0mdropout1\u001b[1m)\u001b[0m: Dropout2d \u001b[32m'dropout1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", " \u001b[1m(\u001b[0mfc1\u001b[1m)\u001b[0m: Linear \u001b[32m'fc1'\u001b[0m with shape \u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m,\u001b[1m)\u001b[0m\n", "\u001b[1m)\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# - Convert in-place to the pure Torch API\n", "net.to_torch()\n", "print(net)" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Parameters:\n",
       "[\n",
       "    Parameter containing:\n",
       "tensor([[[[-0.2905,  0.1654, -0.1893],\n",
       "          [-0.0804,  0.1523, -0.3320],\n",
       "          [ 0.0346,  0.1020,  0.0288]]],\n",
       "\n",
       "\n",
       "        [[[-0.1374,  0.3117,  0.0558],\n",
       "          [-0.3279,  0.1651,  0.3008],\n",
       "          [ 0.0011,  0.1701, -0.1425]]]], requires_grad=True),\n",
       "    Parameter containing:\n",
       "tensor([-0.1574, -0.1525], requires_grad=True),\n",
       "    Parameter containing:\n",
       "tensor([[ 0.0269, -0.0310,  0.0103,  ..., -0.0044, -0.0114, -0.0388],\n",
       "        [ 0.0409, -0.0286,  0.0256,  ...,  0.0166,  0.0072, -0.0476],\n",
       "        [-0.0356,  0.0108, -0.0136,  ..., -0.0108,  0.0268,  0.0322],\n",
       "        ...,\n",
       "        [-0.0467, -0.0277,  0.0084,  ..., -0.0023,  0.0034, -0.0107],\n",
       "        [-0.0191,  0.0524, -0.0005,  ...,  0.0305,  0.0221, -0.0304],\n",
       "        [-0.0199,  0.0537,  0.0393,  ..., -0.0248,  0.0081,  0.0438]],\n",
       "       requires_grad=True),\n",
       "    Parameter containing:\n",
       "tensor([ 0.0454,  0.0186, -0.0167, -0.0339,  0.0249,  0.0274, -0.0339, -0.0019,\n",
       "        -0.0250, -0.0271], requires_grad=True)\n",
       "]\n",
       "
\n" ], "text/plain": [ "Parameters:\n", "\u001b[1m[\u001b[0m\n", " Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-0.2905\u001b[0m, \u001b[1;36m0.1654\u001b[0m, \u001b[1;36m-0.1893\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0804\u001b[0m, \u001b[1;36m0.1523\u001b[0m, \u001b[1;36m-0.3320\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0346\u001b[0m, \u001b[1;36m0.1020\u001b[0m, \u001b[1;36m0.0288\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m,\n", "\n", "\n", " \u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-0.1374\u001b[0m, \u001b[1;36m0.3117\u001b[0m, \u001b[1;36m0.0558\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.3279\u001b[0m, \u001b[1;36m0.1651\u001b[0m, \u001b[1;36m0.3008\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0011\u001b[0m, \u001b[1;36m0.1701\u001b[0m, \u001b[1;36m-0.1425\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\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", " Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-0.1574\u001b[0m, \u001b[1;36m-0.1525\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m \u001b[1;36m0.0269\u001b[0m, \u001b[1;36m-0.0310\u001b[0m, \u001b[1;36m0.0103\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0044\u001b[0m, \u001b[1;36m-0.0114\u001b[0m, \u001b[1;36m-0.0388\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m \u001b[1;36m0.0409\u001b[0m, \u001b[1;36m-0.0286\u001b[0m, \u001b[1;36m0.0256\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m0.0166\u001b[0m, \u001b[1;36m0.0072\u001b[0m, \u001b[1;36m-0.0476\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0356\u001b[0m, \u001b[1;36m0.0108\u001b[0m, \u001b[1;36m-0.0136\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0108\u001b[0m, \u001b[1;36m0.0268\u001b[0m, \u001b[1;36m0.0322\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[33m...\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0467\u001b[0m, \u001b[1;36m-0.0277\u001b[0m, \u001b[1;36m0.0084\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0023\u001b[0m, \u001b[1;36m0.0034\u001b[0m, \u001b[1;36m-0.0107\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0191\u001b[0m, \u001b[1;36m0.0524\u001b[0m, \u001b[1;36m-0.0005\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m0.0305\u001b[0m, \u001b[1;36m0.0221\u001b[0m, \u001b[1;36m-0.0304\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[1m[\u001b[0m\u001b[1;36m-0.0199\u001b[0m, \u001b[1;36m0.0537\u001b[0m, \u001b[1;36m0.0393\u001b[0m, \u001b[33m...\u001b[0m, \u001b[1;36m-0.0248\u001b[0m, \u001b[1;36m0.0081\u001b[0m, \u001b[1;36m0.0438\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[33mrequires_grad\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m,\n", " Parameter containing:\n", "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m \u001b[1;36m0.0454\u001b[0m, \u001b[1;36m0.0186\u001b[0m, \u001b[1;36m-0.0167\u001b[0m, \u001b[1;36m-0.0339\u001b[0m, \u001b[1;36m0.0249\u001b[0m, \u001b[1;36m0.0274\u001b[0m, \u001b[1;36m-0.0339\u001b[0m, \u001b[1;36m-0.0019\u001b[0m,\n", " \u001b[1;36m-0.0250\u001b[0m, \u001b[1;36m-0.0271\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": [ "# - Now returns the torch parameters API\n", "print(\"Parameters:\", list(net.parameters()))" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
tensor([[-2.3227, -2.3227, -2.3227, -2.2396, -2.3227, -2.3227, -2.3227, -2.3227,\n",
       "         -2.2124, -2.3227]], grad_fn=<LogSoftmaxBackward0>)\n",
       "
\n" ], "text/plain": [ "\u001b[1;35mtensor\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m-2.3227\u001b[0m, \u001b[1;36m-2.3227\u001b[0m, \u001b[1;36m-2.3227\u001b[0m, \u001b[1;36m-2.2396\u001b[0m, \u001b[1;36m-2.3227\u001b[0m, \u001b[1;36m-2.3227\u001b[0m, \u001b[1;36m-2.3227\u001b[0m, \u001b[1;36m-2.3227\u001b[0m,\n", " \u001b[1;36m-2.2124\u001b[0m, \u001b[1;36m-2.3227\u001b[0m\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[33mgrad_fn\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mLogSoftmaxBackward0\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Evaluate one random 28x28 image\n", "random_data = torch.rand((1, 1, 28, 28))\n", "\n", "# - Now uses torch calling semantics\n", "print(net(random_data))" ] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:py38]", "language": "python", "name": "conda-env-py38-py" }, "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.11" } }, "nbformat": 4, "nbformat_minor": 4 }