389 lines
59 KiB
Plaintext
389 lines
59 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Repeat Copy Task\n",
|
|
"### Differentiable Neural Computer (DNC) using a RNN Controller\n",
|
|
"\n",
|
|
"<a href=\"http://www.nature.com/nature/journal/v538/n7626/full/nature20101.html\"><img src=\"../static/dnc_schema.png\" alt=\"DNC schema\" style=\"width: 700px;\"/></a>\n",
|
|
"\n",
|
|
"**Sam Greydanus $\\cdot$ February 2017 $\\cdot$ MIT License.**\n",
|
|
"\n",
|
|
"Represents the state of the art in differentiable memory. Inspired by this [Nature paper](http://www.nature.com/nature/journal/v538/n7626/full/nature20101.html). Some ideas taken from [this Gihub repo](https://github.com/Mostafa-Samir/DNC-tensorflow)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import tensorflow as tf\n",
|
|
"import numpy as np\n",
|
|
"import sys\n",
|
|
"sys.path.insert(0, '../dnc')\n",
|
|
"\n",
|
|
"from dnc import DNC\n",
|
|
"from rnn_controller import RNNController\n",
|
|
"\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"%matplotlib inline"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Hyperparameters"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"xydim = 6\n",
|
|
"tf.app.flags.DEFINE_integer(\"xlen\", xydim, \"Input dimension\")\n",
|
|
"tf.app.flags.DEFINE_integer(\"ylen\", xydim, \"output dimension\")\n",
|
|
"tf.app.flags.DEFINE_integer(\"length\", 5, \"Sequence length\")\n",
|
|
"tf.app.flags.DEFINE_integer(\"reps\", 3, \"Number of repeats for copy task\")\n",
|
|
"tf.app.flags.DEFINE_integer(\"batch_size\", 16, \"Size of batch in minibatch gradient descent\")\n",
|
|
"\n",
|
|
"tf.app.flags.DEFINE_integer(\"R\", 1, \"Number of DNC read heads\")\n",
|
|
"tf.app.flags.DEFINE_integer(\"W\", 10, \"Word length for DNC memory\")\n",
|
|
"tf.app.flags.DEFINE_integer(\"N\", 7, \"Number of words the DNC memory can store\")\n",
|
|
"\n",
|
|
"tf.app.flags.DEFINE_integer(\"print_every\", 100, \"Print training info after this number of train steps\")\n",
|
|
"tf.app.flags.DEFINE_integer(\"iterations\", 20000, \"Number of training iterations\")\n",
|
|
"tf.app.flags.DEFINE_float(\"lr\", 1e-4, \"Learning rate (alpha) for the model\")\n",
|
|
"tf.app.flags.DEFINE_float(\"momentum\", .9, \"RMSProp momentum\")\n",
|
|
"tf.app.flags.DEFINE_integer(\"save_every\", 1000, \"Save model after this number of train steps\")\n",
|
|
"tf.app.flags.DEFINE_string(\"save_path\", \"rnn_models/model.ckpt\", \"Where to save checkpoints\")\n",
|
|
"FLAGS = tf.app.flags.FLAGS"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Data functions"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\nQmCC\n",
|
|
"text/plain": [
|
|
"<matplotlib.figure.Figure at 0x10fc9e590>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"def get_sequence(length, reps, dim):\n",
|
|
" X = [np.concatenate((np.random.randint(2, size=(length,dim)), np.zeros((length + 3,dim)))) for _ in range(reps)]\n",
|
|
" X = np.vstack(X) ; X[:,dim-1] = 0\n",
|
|
" \n",
|
|
" X = np.concatenate((X[-1:,:],X[:-1,:]))\n",
|
|
" y = np.concatenate((X[-(length + 2):,:],X[:-(length + 2),:]))\n",
|
|
" markers = range(length+1, X.shape[0], 2*length+3)\n",
|
|
" X[markers,dim-1] = 1\n",
|
|
" return X, y\n",
|
|
" \n",
|
|
"def next_batch(batch_size, length, reps, dim):\n",
|
|
" X_batch = []\n",
|
|
" y_batch = []\n",
|
|
" for _ in range(batch_size):\n",
|
|
" X, y = get_sequence(length, reps, dim)\n",
|
|
" X_batch.append(X) ; y_batch.append(y)\n",
|
|
" return [X_batch, y_batch]\n",
|
|
"\n",
|
|
"batch = next_batch(1, FLAGS.length, FLAGS.reps, FLAGS.xlen)\n",
|
|
"plt.imshow(batch[0][0].T - batch[1][0].T, interpolation='none')\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Helper functions"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def binary_cross_entropy(y_hat, y):\n",
|
|
" return tf.reduce_mean(-y*tf.log(y_hat) - (1-y)*tf.log(1-y_hat))\n",
|
|
"\n",
|
|
"def llprint(message):\n",
|
|
" sys.stdout.write(message)\n",
|
|
" sys.stdout.flush()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Build graph, initialize everything"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"building graph...\n",
|
|
"defining loss...\n",
|
|
"computing gradients...\n",
|
|
"init variables... \n",
|
|
"ready to train..."
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"sess = tf.InteractiveSession()\n",
|
|
"\n",
|
|
"llprint(\"building graph...\\n\")\n",
|
|
"optimizer = tf.train.RMSPropOptimizer(FLAGS.lr, momentum=FLAGS.momentum)\n",
|
|
"dnc = DNC(RNNController, FLAGS)\n",
|
|
"\n",
|
|
"llprint(\"defining loss...\\n\")\n",
|
|
"y_hat, outputs = dnc.get_outputs()\n",
|
|
"y_hat = tf.clip_by_value(tf.sigmoid(y_hat), 1e-6, 1. - 1e-6)\n",
|
|
"loss = binary_cross_entropy(y_hat, dnc.y)\n",
|
|
"\n",
|
|
"llprint(\"computing gradients...\\n\")\n",
|
|
"gradients = optimizer.compute_gradients(loss)\n",
|
|
"for i, (grad, var) in enumerate(gradients):\n",
|
|
" if grad is not None:\n",
|
|
" gradients[i] = (tf.clip_by_value(grad, -10, 10), var)\n",
|
|
" \n",
|
|
"grad_op = optimizer.apply_gradients(gradients)\n",
|
|
"\n",
|
|
"llprint(\"init variables... \\n\")\n",
|
|
"sess.run(tf.global_variables_initializer())\n",
|
|
"llprint(\"ready to train...\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"model overview...\n",
|
|
"\tvariable \"dnc_scope/basic_lstm_cell/weights:0\" has 73728 parameters\n",
|
|
"\tvariable \"dnc_scope/basic_lstm_cell/biases:0\" has 512 parameters\n",
|
|
"\tvariable \"W_z:0\" has 6144 parameters\n",
|
|
"\tvariable \"W_v:0\" has 768 parameters\n",
|
|
"\tvariable \"W_r:0\" has 60 parameters\n",
|
|
"total of 81212 parameters\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# tf parameter overview\n",
|
|
"total_parameters = 0 ; print \"model overview...\"\n",
|
|
"for variable in tf.trainable_variables():\n",
|
|
" shape = variable.get_shape()\n",
|
|
" variable_parameters = 1\n",
|
|
" for dim in shape:\n",
|
|
" variable_parameters *= dim.value\n",
|
|
" print '\\tvariable \"{}\" has {} parameters' \\\n",
|
|
" .format(variable.name, variable_parameters)\n",
|
|
" total_parameters += variable_parameters\n",
|
|
"print \"total of {} parameters\".format(total_parameters)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"loaded model: rnn_models/model.ckpt-6000\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"global_step = 0\n",
|
|
"saver = tf.train.Saver(tf.global_variables())\n",
|
|
"load_was_success = True # yes, I'm being optimistic\n",
|
|
"try:\n",
|
|
" save_dir = '/'.join(FLAGS.save_path.split('/')[:-1])\n",
|
|
" ckpt = tf.train.get_checkpoint_state(save_dir)\n",
|
|
" load_path = ckpt.model_checkpoint_path\n",
|
|
" saver.restore(sess, load_path)\n",
|
|
"except:\n",
|
|
" print \"no saved model to load.\"\n",
|
|
" load_was_success = False\n",
|
|
"else:\n",
|
|
" print \"loaded model: {}\".format(load_path)\n",
|
|
" saver = tf.train.Saver(tf.global_variables())\n",
|
|
" global_step = int(load_path.split('-')[-1]) + 1"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Train loop"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"loss_history = []\n",
|
|
"for i in xrange(global_step, FLAGS.iterations + 1):\n",
|
|
" llprint(\"\\rIteration {}/{}\".format(i, FLAGS.iterations))\n",
|
|
"\n",
|
|
" rlen = np.random.randint(1, FLAGS.length + 1)\n",
|
|
" rreps = np.random.randint(1, FLAGS.reps + 1)\n",
|
|
" X, y = next_batch(FLAGS.batch_size, rlen, rreps, FLAGS.xlen)\n",
|
|
" tsteps = rreps*(2*rlen+3)\n",
|
|
"\n",
|
|
" fetch = [loss, grad_op]\n",
|
|
" feed = {dnc.X: X, dnc.y: y, dnc.tsteps: tsteps}\n",
|
|
"\n",
|
|
" step_loss, _ = sess.run(fetch, feed_dict=feed)\n",
|
|
" loss_history.append(step_loss)\n",
|
|
" global_step = i\n",
|
|
"\n",
|
|
" if i % 100 == 0:\n",
|
|
" llprint(\"\\n\\tloss: {:03.4f}\\n\".format(np.mean(loss_history)))\n",
|
|
" loss_history = []\n",
|
|
" if i % FLAGS.save_every == 0 and i is not 0:\n",
|
|
" llprint(\"\\n\\tSAVING MODEL\\n\")\n",
|
|
" saver.save(sess, FLAGS.save_path, global_step=global_step)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\npIP+cdIBdCawea/jarNMbyJN07Cy7nVKTZojSdMaPEb6IGzR67g7WU7SYA+LSB/6FcBNwH8CG/U6\n7swyNioTuXa3AAAgAElEQVTfSuCDdekGuj4nKucQ1ee3itgfL8ryM+DNw1SXE5VzWOpyWF5u4wfv\n5Tbebfyg1afb+OGpy4nKOSx1GRGoKJCZmZmZmZmZVaDbg6uZmZmZmZmZTSrueJuZmZmZmZlVyB1v\nMzMzMzMzswq5421mZmZmZmZWIXe8zczMzMzMzCrkjreZmZmZmZlZhdzxNjMzMzMzM6uQO95mZmZm\nZmZmFXLH28zMzMzMzKxC7nibmZmZmZmZVcgdbzMzMzMzM7MKueNtZmZmZmZmViF3vM3MzMzMzMwq\n5I63mZmZmZmZWYXc8TYzMzMzMzOrkDveZmZmZmZmZhVyx9vMzMzMzMysQu54m5mZmZmZmVXIHW8z\nMzMzMzOzCrnjbWZmZmZmZlYhd7zNzMzMzMzMKuSOt5mZmZmZmVmF3PE2MzMzMzMzq5A73mZmZmZm\nZmYVcsfbzMzMzMzMrELueJuZmZmZmZlVyB1vMzMzMzMzswq5421mZmZmZmZWIXe8zczMzMzMzCrk\njreZmZmZmZlZhdzxNjMzMzMzM6uQO95mZmZmZmZmFXLH28zMzMzMzKxC7nibmZmZmZmZVcgdbzMz\nMzMzM7MKueNtZmZmZmZmViF3vM3MzMzMzMwq5I63mZmZmZmZWYXc8TYzMzMzMzOrkDveZmZmZmZm\nZhVyx9vMzMzMzMysQu54m5mZmZmZmVXIHW8zMzMzMzOzCrnjbWZmZmZmZlYhd7zNzMzMzMzMKuSO\nt00akvaXNCLpRb2OpR3tlkPSkcX6z+1VDJ0g6RBJSyvexsck3SppWpXbMTMzM7Ph5o63TSZRvJ4h\naUdJ8yWt06OYWjGmHFWsP8G+aTeGtkhaGzgEOLbiTS0EVgc+VvF2zMzMzGyIueNtk8l3gDUi4raa\nZTsB84D1ehNSSxqVowrj7ZtuxdDMh4GpwNlVbiQingBOA/6xyu2YmZmZ2XBzx9uGnqTnAETyZP3b\nPQipLU3KUYWm+6aLMTSzP3Bel2I4B9hM0i5d2JaZmZmZDSF3vK0vSZpdPEP8tzXL5hTLrqxLe76k\n3xT/H31++ZWSzpR0P3BJ8d4qzyVLmg98scjmluK9lTXvP0/SKZLukrRC0hJJB1QVe9ltNnu+WtIu\n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\ntayrmZlZMgXYGJjd51tOmZmZ2RiVmnibmZmZmZmZDbrcVc3NzMzMzMzMLIMTbzMzMzMzM7MSOfE2\nMzMzMzMzK5ETbzMzMzMzM7MSOfE2MzMzMzMzK1FPEm9Jn5F0h6SnJV0t6Y29iKMskqZLWlb3uLnX\ncY2HpJ0knS/pvqI9ezQoM0PS/ZKekvQ/kjbtRazjMVo7JZ3WoG8v7FW8YyHpcEnXSnpC0oOSfi5p\n8wbl+ro/22lnRfrzIEk3SlpUPK6StHtdmb7uSxi9nVXoSzMzM6uurifekj4KnABMB7YBbgRmS1q3\n27GUbB6wPrBB8Xhrb8MZt1WBG4BDgBF70En6MvBZ4EDgTcBiUr+u2M0gO6BlOwsXsXzf7t2d0Dpm\nJ+DfgDcD7wQmA7+RtPJwgYr056jtLPR7f94DfBmYCmwL/A44X9IWUJm+hFHaWej3vjQzM7OK6vo+\n3pKuBq6JiM8X34v0hurkiDiuq8GURNJ0YM+ImNrrWMogaRnw/og4v+bY/cDxEXFS8f0awIPAJyNi\nVm8iHZ8m7TwNWDMiPti7yDqr+NDrIWDniLiiOFbF/mzUzsr1J4CkR4AvRsRpVezLYXXtrGRfmpmZ\nWTV09Y63pMmkOxW/HT4WKfO/GNi+m7F0wWbFcOXbJP1U0it6HVBZJG1CurtU269PANdQvX4F2KUY\nujxf0kxJL+l1QOO0Funu/qNQ6f5crp01KtOfkiZJ2gtYCbisqn1Z386apyrTl2ZmZlYtK3T5fOsC\nQ6S7LbUeBF7T5VjKdDWwL/AXYEPgKNKb4C0jYnEP4yrLBqSEplG/btD9cEp1EXAecAfwauBY4EJJ\n20e3h490QDHi5LvAFRExvA5B5fqzSTuhIv0paUvgD8AU4CngIxFxm6TtqVBfNmtn8XQl+tLMzMyq\nqduJ90CIiNk1386TdC1wF/AR4LTeRGWdUDc098+SbgJuA3YBLulJUOMzE9gC2LHXgZSsYTsr1J/z\nga2BNYEPA+dKeltvQypFw3ZGxPUV6kszMzOroG4vrrYQWEpa/KbW+sCCLsfSNRGxCPgr0HcrCbdp\nASAGrF8BIuIO0nXdd30r6RTgPcAuEfFAzVOV6s8W7RyhX/szIp6PiNuLBPSrpKHkB1OxvmzRzkZl\n+7IvzczMrJq6mnhHxBJgDrDr8LFiCOiuwFXdjKWbJK1GevPX8k1/vyre4C5g+X5dg7SadGX7FUDS\nRsA69FnfFsnonsDbI+Lu2ueq1J+t2tmkfF/2ZwOTgKEq9WUTk0jTl0aoUF+amZlZBfRiqPmJwOmS\n5gDXAtOAVYDTexBLKSQdD1xAGl7+cuBoYAlwTi/jGg9Jq5I+PFBx6FWStgYejYh7SPNnj5B0K3An\n8HXgXuCXPQh3zFq1s3hMJ80jXVCU+zZpNMPskbVNTJJmkrZZ2gNYLGn4buiiiHim+Lrv+3O0dhZ9\nXYX+PIY0v/luYHVgH2Bn4BtFkb7vS2jdzqr0pZmZmVVX1xPviJhVbOszgzTc8QZgt4h4uNuxlGgj\n4GzS3ZaHgSuAt0TEIz2Nany2I82TjOJxQnH8DGD/iDhO0irAqaTVoy8H3h0Rz/Ui2HFo1c5DgNcD\nnyC18X7Sm/oji9Ec/eIgUtsurTu+H3AmQEX6c7R2LqUa/bke6frcEFgE/In0O/USqExfQot2SppC\nNfrSzMzMKqrr+3ibmZmZmZmZDZJuL65mZmZmZmZmNlCceJuZmZmZmZmVyIm3mZmZmZmZWYmceJuZ\nmZmZmZmVyIm3mZmZmZmZWYmceJuZmZmZmZmVyIm3mZmZmZmZWYmceJuZmZmZmZmVyIm3mZmZmZmZ\nWYmceJuZmZmZmZmVyIm3mZmZmZmZWYmceJuZmZmZmZmVyIm3mZmZmZmZWYmceJuZmZmZmZmVyIm3\nmZmZmZmZWYmceJuZmZmZmZmVyIm3mZmZmZmZWYmceJuZmZmZmZmVyIm3mZmZmZmZWYmceJuZmZmZ\nmZmVyIm3mZmZmZmZWYmceJuZmZmZmZmVyIm3mZmZmZmZWYmceJuZmZmZmZmVyIm3mZmZmZmZWYmc\neJuZmZmZmZmVyIm3mZmZmZmZWYmceJuZmZmZmZmVyIm3mZmZmZmZWYmceJuZmZmZmZmVyIm3mZmZ\nmZmZWYmceJuZmZmZmZmVyIm3mZmZmZmZWYmceJuZmZmZmZmVyIm3mZmZmZmZWYmceJuZmZmZmZmV\nyIm3mZmZmZmZWYmceJuZmZmZmZmVyIm3mZmZmZmZWYmceJtlkHSUpGU9jmFfScsk/cMYX39U8fqX\n9CqGTpB0qKSbS6j305LukjS503WbmZmZ2WBy4m2WJ4pHP8fQ1uslbS9puqQ1SohhXCStDhwKfKuE\n6k8HVgQ+XULdZmZmZjaAnHib9Z8zgZUj4u6Sz7MDcCSwVg9jaOZTwBBwbqcrjohngTOAL3S6bjMz\n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\nrkJggg==\n",
|
|
"text/plain": [
|
|
"<matplotlib.figure.Figure at 0x1217958d0>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"X, y = next_batch(FLAGS.batch_size, FLAGS.length, FLAGS.reps, FLAGS.xlen)\n",
|
|
"tsteps = FLAGS.reps*(2*FLAGS.length+3)\n",
|
|
"\n",
|
|
"feed = {dnc.X: X, dnc.y: y, dnc.tsteps: tsteps}\n",
|
|
"fetch = [outputs['y_hat'], outputs['w_w'], outputs['w_r'], outputs['f'], outputs['g_a']]\n",
|
|
"[_y_hat, _w_w, _w_r, _f, _g_a] = sess.run(fetch, feed)\n",
|
|
"_y_hat = np.clip(_y_hat, 1e-6, 1. - 1e-6)\n",
|
|
"_y = y[0] ; _X = X[0]\n",
|
|
"\n",
|
|
"fig, ((ax1,ax2),(ax3,ax5),(ax4,ax6),) = plt.subplots(nrows=3, ncols=2)\n",
|
|
"plt.rcParams['savefig.facecolor'] = \"0.8\"\n",
|
|
"fs = 12 # font size\n",
|
|
"fig.set_figwidth(10)\n",
|
|
"fig.set_figheight(5)\n",
|
|
"\n",
|
|
"ax1.imshow(_X.T - _y.T, interpolation='none') ; ax1.set_title('input ($X$) and target ($y$)')\n",
|
|
"ax2.imshow(_y_hat[0,:,:].T, interpolation='none') ; ax2.set_title('prediction ($\\hat y$)')\n",
|
|
"\n",
|
|
"ax3.imshow(_w_w[0,:,:].T, interpolation='none') ; ax3.set_title('write weighting ($w_w$)')\n",
|
|
"ax4.imshow(_w_r[0,:,:,0].T, interpolation='none') ; ax4.set_title('read weighting ($w_r$)')\n",
|
|
"\n",
|
|
"ax5.imshow(_f[0,:,:].T, interpolation='none') ; ax5.set_title('free gate ($f$)') ; ax5.set_aspect(3)\n",
|
|
"ax6.imshow(_g_a[0,:,:].T, interpolation='none') ; ax6.set_title('allocation gate ($g_a$)') ; ax6.set_aspect(3)\n",
|
|
"\n",
|
|
"plt.tight_layout()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 2",
|
|
"language": "python",
|
|
"name": "python2"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 2
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython2",
|
|
"version": "2.7.10"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 1
|
|
}
|