{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Circuit optimization by backpropagation with PyTorch " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Imports" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Python\n", "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# Torch\n", "import torch\n", "\n", "# PhotonTorch\n", "import photontorch as pt\n", "\n", "# Progress Bars\n", "from tqdm.notebook import tqdm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Michelson Interferometer Cavity\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simulation and Design Parameters" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "neff = np.sqrt(12.1)\n", "wl = 1.55e-6\n", "dt = 0.5e-9\n", "total_time = 2e-6\n", "time = np.arange(0,total_time,dt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Network" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We define the network again in the standard way. However, sometimes it is useful to define components only once, but save copies of the component while setting it as an attribute of the network.\n", "\n", "Look for example at the line\n", "```\n", "self.m_west = self.m_north = self.m_east = self.m_south = pt.Mirror(R=0.9)\n", "```\n", "Note that the order of the detectors is defined by where they appear in the link." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "BoundedParameter in [0.00, 1.00] representing:\n", "tensor(0.9000)\n", "BoundedParameter in [0.00, 1.00] representing:\n", "tensor(0.9000)\n", "BoundedParameter in [0.00, 1.00] representing:\n", "tensor(0.9000)\n", "BoundedParameter in [0.00, 1.00] representing:\n", "tensor(0.9000)\n" ] } ], "source": [ "# define network in the standard way:\n", "class MichelsonCavity(pt.Network):\n", " def __init__(self):\n", " super(MichelsonCavity, self).__init__()\n", " self.west = pt.Source()\n", " self.north = self.east = self.south = pt.Detector()\n", " self.m_west = pt.Mirror(R=0.9)\n", " self.m_north = pt.Mirror(R=0.9)\n", " self.m_east = pt.Mirror(R=0.9)\n", " self.m_south = pt.Mirror(R=0.9)\n", " self.wg_west = pt.Waveguide(0.43, neff=neff, trainable=False)\n", " self.wg_north = pt.Waveguide(0.60, neff=neff, trainable=False)\n", " self.wg_east = pt.Waveguide(0.95, neff=neff, trainable=False)\n", " self.wg_south = pt.Waveguide(1.12, neff=neff, trainable=False)\n", " self.dc = pt.DirectionalCoupler(coupling=0.5, trainable=False)\n", " self.link('west:0','0:m_west:1', '0:wg_west:1', '0:dc:2', '0:wg_east:1', '0:m_east:1', '0:east')\n", " self.link('north:0', '0:m_north:1', '0:wg_north:1', '1:dc:3', '0:wg_south:1', '0:m_south:1', '0:south')\n", " \n", "# create network\n", "nw = MichelsonCavity()\n", "\n", "# print out the parameters of the network:\n", "for p in nw.parameters():\n", " print(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simulation" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 1.1 s, sys: 59.7 ms, total: 1.16 s\n", "Wall time: 581 ms\n" ] } ], "source": [ "%%time\n", "with pt.Environment(wl=wl, t=time):\n", " detected = nw(source=1)[:,0,:,0] # get all timesteps, the only wavelength, all detectors, the only batch" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "nw.plot(detected);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Training parameters:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "num_epochs = 10 # number of training cycles\n", "learning_rate = 0.2 # multiplication factor for the gradients during optimization.\n", "lossfunc = torch.nn.MSELoss()\n", "optimizer = torch.optim.Adam(nw.parameters(), learning_rate)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We would like to train the network to arrive in another steady state with the same output everywhere:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "total_power_out = detected.data.cpu().numpy()[-1].sum()\n", "target = np.ones(3)*total_power_out/3\n", "# The target should be a torch variable.\n", "# You can create a new torch variable with the right type and cuda type, straight from the network itself:\n", "target = torch.tensor(target, device=nw.device, dtype=torch.get_default_dtype())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can start the training. However, to be able to train the parameters of the network, gradient tracking should be enabled in the simulation environment. This is done by setting the `enable_grad` flag to `True`." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "12e4b5a2a1974751b9bdb19664fb617c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, max=10.0), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "# loop over the training cycles:\n", "with pt.Environment(wl=wl, t=time, grad=True):\n", " for epoch in tqdm(range(num_epochs)):\n", " optimizer.zero_grad()\n", " detected = nw(source=1)[-1,0,:,0] # get the last timestep, the only wavelength, all detectors, the only batch\n", " loss = lossfunc(detected, target) # calculate the loss (error) between detected and target\n", " loss.backward() # calculate the resulting gradients for all the parameters of the network\n", " optimizer.step() # update the networks parameters with the gradients\n", " del detected, loss # free up memory (important for GPU)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Do a final simulation:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "with pt.Environment(wl=wl, t=time):\n", " detected = nw(source=1) # get all timesteps, the only wavelength, all detectors, the only batch\n", " nw.plot(detected);" ] } ], "metadata": { "kernelspec": { "display_name": "ptdev", "language": "python", "name": "ptdev" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7" } }, "nbformat": 4, "nbformat_minor": 4 }