├── results.png ├── before_opt.png ├── README.md └── Quantum Neural Network.ipynb /results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arturml/quantum-neural-network/HEAD/results.png -------------------------------------------------------------------------------- /before_opt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arturml/quantum-neural-network/HEAD/before_opt.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Continuous-variable quantum neural networks 2 | 3 | 4 | This is an attempt to implement one of the results of the paper [Continuous-variable quantum neural networks](https://arxiv.org/abs/1806.06871) using Xanadu's [strawberryfields](https://github.com/XanaduAI/strawberryfields), which is "a full-stack Python library for designing, simulating, and optimizing continuous variable (CV) quantum optical circuits". More specifically, I used a variational quantum circuit to learn the `sin(np.pi*x)` function on the interval [-1,1]. The function implemented by the circuit before the optimization is a line: 5 | 6 | ![before](before_opt.png) 7 | 8 | After the optimization, it's more or less the sine function: 9 | 10 | ![after](results.png) 11 | 12 | if you want to know more about the continuous-variable model of quantum computing, check out Xanadu's [white paper](https://arxiv.org/abs/1804.03159). 13 | -------------------------------------------------------------------------------- /Quantum Neural Network.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "%matplotlib inline\n", 10 | "import tensorflow as tf\n", 11 | "import strawberryfields as sf\n", 12 | "from strawberryfields.ops import *\n", 13 | "import numpy as np\n", 14 | "import matplotlib.pyplot as plt" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 2, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "# I used some code from this repository: https://github.com/XanaduAI/quantum-learning\n", 24 | "\n", 25 | "eng, q = sf.Engine(1)\n", 26 | "\n", 27 | "depth = 5\n", 28 | "passive_sd = 0.1\n", 29 | "active_sd = 0.001\n", 30 | "batch_size = 32\n", 31 | "\n", 32 | "x_ = tf.placeholder(tf.float32, shape=[batch_size ,])\n", 33 | "\n", 34 | "sq_r = tf.Variable(tf.random_normal(shape=[depth], stddev=active_sd))\n", 35 | "sq_phi = tf.Variable(tf.random_normal(shape=[depth], stddev=passive_sd))\n", 36 | "\n", 37 | "\n", 38 | "d_r = tf.Variable(tf.random_normal(shape=[depth], stddev=active_sd))\n", 39 | "d_phi = tf.Variable(tf.random_normal(shape=[depth], stddev=passive_sd))\n", 40 | "\n", 41 | "\n", 42 | "r1 = tf.Variable(tf.random_normal(shape=[depth], stddev=passive_sd))\n", 43 | "r2 = tf.Variable(tf.random_normal(shape=[depth], stddev=passive_sd))\n", 44 | "\n", 45 | "kappa = tf.Variable(tf.random_normal(shape=[depth], stddev=active_sd))\n", 46 | "\n", 47 | "with eng:\n", 48 | " Dgate(x_) | q\n", 49 | " \n", 50 | " for i in range(depth):\n", 51 | " Rgate(r1[i]) | q\n", 52 | " Sgate(sq_r[i], d_phi[i]) | q\n", 53 | " Rgate(r2[i]) | q\n", 54 | " Dgate(d_r[i], d_phi[i]) | q\n", 55 | " Kgate(kappa[i]) | q" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 3, 61 | "metadata": { 62 | "scrolled": false 63 | }, 64 | "outputs": [], 65 | "source": [ 66 | "state = eng.run('tf', cutoff_dim=10, eval=False, batch_size=batch_size)\n", 67 | "output = state.quad_expectation(0, eval=False)[0]" 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": 4, 73 | "metadata": {}, 74 | "outputs": [], 75 | "source": [ 76 | "cost_op = tf.losses.mean_squared_error(tf.sin(np.pi * x_), output)\n", 77 | "optimizer = tf.train.AdamOptimizer(learning_rate=1e-3)\n", 78 | "train_step = optimizer.minimize(cost_op)" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": 5, 84 | "metadata": {}, 85 | "outputs": [], 86 | "source": [ 87 | "sess = tf.Session()\n", 88 | "sess.run(tf.global_variables_initializer())" 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": 6, 94 | "metadata": {}, 95 | "outputs": [ 96 | { 97 | "data": { 98 | "text/plain": [ 99 | "" 100 | ] 101 | }, 102 | "execution_count": 6, 103 | "metadata": {}, 104 | "output_type": "execute_result" 105 | }, 106 | { 107 | "data": { 108 | "image/png": "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\n", 109 | "text/plain": [ 110 | "
" 111 | ] 112 | }, 113 | "metadata": {}, 114 | "output_type": "display_data" 115 | } 116 | ], 117 | "source": [ 118 | "x = np.linspace(-1, 1, num=batch_size)\n", 119 | "y = sess.run(output, feed_dict={x_: x})\n", 120 | "plt.scatter(x, y, color='red', label='predictions')\n", 121 | "plt.plot(x, np.sin(np.pi*x), label=r'$\\sin(\\pi x)$')\n", 122 | "plt.legend()" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": 7, 128 | "metadata": {}, 129 | "outputs": [ 130 | { 131 | "name": "stdout", 132 | "output_type": "stream", 133 | "text": [ 134 | "0.4251451\n", 135 | "0.106350556\n", 136 | "0.11664895\n", 137 | "0.062014386\n", 138 | "0.06089666\n", 139 | "0.053732745\n", 140 | "0.035934877\n", 141 | "0.023872264\n", 142 | "0.028691988\n", 143 | "0.019830972\n" 144 | ] 145 | } 146 | ], 147 | "source": [ 148 | "n_steps = 500\n", 149 | "\n", 150 | "cost_hist = []\n", 151 | "for step in range(n_steps):\n", 152 | " x = np.random.uniform(-1, 1, size=batch_size) \n", 153 | " cost, _ = sess.run([cost_op, train_step], feed_dict={x_: x})\n", 154 | " cost_hist.append(cost)\n", 155 | " if step % 50 == 0:\n", 156 | " print(cost)" 157 | ] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": 8, 162 | "metadata": { 163 | "scrolled": false 164 | }, 165 | "outputs": [], 166 | "source": [ 167 | "x = np.linspace(-1, 1, num=32)\n", 168 | "y = sess.run(output, feed_dict={x_: x})" 169 | ] 170 | }, 171 | { 172 | "cell_type": "code", 173 | "execution_count": 9, 174 | "metadata": {}, 175 | "outputs": [ 176 | { 177 | "data": { 178 | "text/plain": [ 179 | "" 180 | ] 181 | }, 182 | "execution_count": 9, 183 | "metadata": {}, 184 | "output_type": "execute_result" 185 | }, 186 | { 187 | "data": { 188 | "image/png": "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\n", 189 | "text/plain": [ 190 | "
" 191 | ] 192 | }, 193 | "metadata": {}, 194 | "output_type": "display_data" 195 | } 196 | ], 197 | "source": [ 198 | "plt.scatter(x, y, color='red', label='predictions')\n", 199 | "plt.plot(x, np.sin(np.pi*x), label=r'$\\sin(\\pi x)$')\n", 200 | "plt.legend()" 201 | ] 202 | } 203 | ], 204 | "metadata": { 205 | "kernelspec": { 206 | "display_name": "Python 3", 207 | "language": "python", 208 | "name": "python3" 209 | }, 210 | "language_info": { 211 | "codemirror_mode": { 212 | "name": "ipython", 213 | "version": 3 214 | }, 215 | "file_extension": ".py", 216 | "mimetype": "text/x-python", 217 | "name": "python", 218 | "nbconvert_exporter": "python", 219 | "pygments_lexer": "ipython3", 220 | "version": "3.6.5" 221 | } 222 | }, 223 | "nbformat": 4, 224 | "nbformat_minor": 2 225 | } 226 | --------------------------------------------------------------------------------