From 1cef46d086a4add140f5abc2f5c2f3a24c7756df Mon Sep 17 00:00:00 2001 From: Oliver O'Brien Date: Mon, 10 Aug 2020 10:24:25 +0100 Subject: [PATCH 1/7] Create qgan.ipynb --- docs/tutorials/qgan.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/tutorials/qgan.ipynb diff --git a/docs/tutorials/qgan.ipynb b/docs/tutorials/qgan.ipynb new file mode 100644 index 000000000..e69de29bb From 13c980ed3000fcd8845daa6c995e36850574ec83 Mon Sep 17 00:00:00 2001 From: Oliver O'Brien Date: Mon, 10 Aug 2020 10:28:29 +0100 Subject: [PATCH 2/7] Created using Colaboratory --- docs/tutorials/qGAN.ipynb | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 docs/tutorials/qGAN.ipynb diff --git a/docs/tutorials/qGAN.ipynb b/docs/tutorials/qGAN.ipynb new file mode 100644 index 000000000..aa4d3379a --- /dev/null +++ b/docs/tutorials/qGAN.ipynb @@ -0,0 +1,41 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Untitled0.ipynb", + "provenance": [], + "authorship_tag": "ABX9TyO6fSnFkAXNT6HWNq7ayKg2", + "include_colab_link": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "KeNu6kUJsmxj", + "colab_type": "code", + "colab": {} + }, + "source": [ + "" + ], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file From d709a0d30d3bd73319f328addc3a3a4604aae13b Mon Sep 17 00:00:00 2001 From: Oliver O'Brien Date: Mon, 10 Aug 2020 10:29:28 +0100 Subject: [PATCH 3/7] Delete qgan.ipynb --- docs/tutorials/qgan.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/tutorials/qgan.ipynb diff --git a/docs/tutorials/qgan.ipynb b/docs/tutorials/qgan.ipynb deleted file mode 100644 index e69de29bb..000000000 From 49cfeaed18beadf8b35578f1ac0f7052ad7dd896 Mon Sep 17 00:00:00 2001 From: Oliver O'Brien Date: Wed, 12 Aug 2020 10:50:59 +0100 Subject: [PATCH 4/7] Created using Colaboratory --- qgan.ipynb | 988 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 988 insertions(+) create mode 100644 qgan.ipynb diff --git a/qgan.ipynb b/qgan.ipynb new file mode 100644 index 000000000..07b4d9616 --- /dev/null +++ b/qgan.ipynb @@ -0,0 +1,988 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "qgan.ipynb", + "provenance": [], + "authorship_tag": "ABX9TyOX4sjMKPZJM1QBJQSL21l1", + "include_colab_link": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ldLDoEjQtx8g", + "colab_type": "text" + }, + "source": [ + "# Quantum Generative Adversarial Network (qGAN)\n", + "\n", + "Loading an arbitary random probability distribution into a n qubit quantum state normally requires $O(2^n)$ gates which in most algorithms will dominate the complexity of the quantum algorithm and make it useless. By using a qGAN this loading can be done in $O(poly(n))$ gates [[1](https://https://www.nature.com/articles/s41534-019-0223-2)]. \n", + "\n", + "A qGAN is a version of a [Generative Adversarial Network](https://papers.nips.cc/paper/5423-generative-adversarial-nets) with a quantum generator and a classical discriminator. The quantum generator is trained to transform a given n-qubit input into:\n", + "$$\n", + "\\sum_{j=0}^{2^n-1} \\sqrt{p^j_{\\theta}}\\left| j \\right\\rangle\n", + "$$\n", + "where $p^j_{\\theta}$ relate to the probabilty of the state $j$. The discriminator has to try and distinguish between the output of the generator and the training data set. The two networks train alternatively and will eventaully reach a nash equilibrium where the discriminator cannot tell apart the generator and the training set data. The aim of this process is for $p^j_{\\theta}$ to approximate the distribution of the training data.\n", + "\n", + "This tutorial will guide you through using a qGAN to load a lognormal distribution to a 2 qubit system." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uwQzoKsCuSrY", + "colab_type": "text" + }, + "source": [ + "# Setup" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "u4g8Xz0auW9z", + "colab_type": "code", + "colab": {} + }, + "source": [ + "!pip install --upgrade tensorflow==2.1.0 tensorflow-quantum tensorflow-gan tensorflow-probability==0.9 tensorflow-datasets" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "fVNr2dGRvtFv", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import tensorflow as tf\n", + "import tensorflow_quantum as tfq\n", + "import tensorflow_gan as tfg\n", + "\n", + "import cirq\n", + "import sympy\n", + "import numpy as np\n", + "import collections\n", + "import math\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Intialise qubits\n", + "num_qubits = 2 #@param\n", + "qubits = [cirq.GridQubit(x,0) for x in range(num_qubits)]\n" + ], + "execution_count": 31, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Wn7A2fP1KnQL", + "colab_type": "text" + }, + "source": [ + "# Load Training Data" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tOoK9Y-NKxSV", + "colab_type": "text" + }, + "source": [ + "Before building the model, you need to generate the training data set." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "gd3G6JxNOQe4", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def generate_data():\n", + " \"\"\"Generate training data for discriminator\n", + " \n", + " Bundles this with noise for generator to use\n", + " \"\"\"\n", + "\n", + " size = 1000 # Size of training data set\n", + "\n", + " # Take samples of lognormal distribution with mean = 1 and standard deviation =1\n", + " mu =1\n", + " sigma =1\n", + " continous_data = np.random.lognormal(mean=mu, sigma=sigma, size=size)\n", + " \n", + " # Remove all samples that lie outside the range expressible in the given number of qubits\n", + " continous_data = continous_data[continous_data <= 2**num_qubits-0.5]\n", + "\n", + " # Discretize the remaining samples so the continous distribution can be approximated by a discrete distribution\n", + " discrete_data = tf.convert_to_tensor(np.digitize(continous_data,[i - 0.5 for i in range(1,2**num_qubits)]),dtype=tf.dtypes.int32)\n", + "\n", + " # Convert the decimal into binary tensor\n", + " discrete_data = tf.cast(tf.math.mod(tf.bitwise.right_shift(tf.expand_dims(discrete_data,1), tf.range(num_qubits)), 2),dtype=tf.float32)\n", + " \n", + " # Intialise the same number of circuits as the discrete tensor to a uniform distribution by applying multiple hardardman gates\n", + " noise = []\n", + " for n in range(discrete_data.shape[0]):\n", + " noise.append(cirq.Circuit(cirq.Moment(cirq.H.on_each(qubits))))\n", + " noise = tfq.convert_to_tensor(noise)\n", + "\n", + " return noise, discrete_data\n", + "\n" + ], + "execution_count": 26, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tGhG-BIAVmCW", + "colab_type": "text" + }, + "source": [ + "# Quantum Generator\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "q8nF0dBAelvH", + "colab_type": "text" + }, + "source": [ + "Each layer of a quantum generator consists of a layer of parameterised $R_y$ rotations, and a layer of $CZ$ gates to entangle all the qubits.\n", + "\n", + "The quantum generator you will be using only is only one layer deep. To represent more complex structures a larger circuit depth would need to be used." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2kVGCmeaV7nQ", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 358 + }, + "outputId": "98b4f238-d6a3-4513-c35f-66136974074d" + }, + "source": [ + "def quantum_generator_model(initial_distribution_tensor):\n", + " # Create parameters for each qubit\n", + " theta = sympy.symbols('a0:%d'%num_qubits)\n", + "\n", + " # Set the input to the network\n", + " inputs = tf.keras.Input(shape=(),dtype=tf.dtypes.string)\n", + "\n", + " # Create the parameterised Ry rotation layer circuit\n", + " parameterized_circuit = cirq.Circuit(cirq.Moment([cirq.ry(theta[i])(qubits[i]) for i in range(num_qubits)]))\n", + "\n", + " # Entangle all the qubits by applying CZ in a circular fashion - except when there are only two qubits and then just apply one CZ\n", + " entangle_circuit = cirq.Circuit()\n", + " if(num_qubits > 2):\n", + " for i in range(num_qubits):\n", + " entangle_circuit.append([cirq.CZ(qubits[i], qubits[(i + 1) % num_qubits])])\n", + " else:\n", + " entangle_circuit.append([cirq.CZ(qubits[0],qubits[1])])\n", + " \n", + " # Combine the parameterized circuit layer and the entanglement circuit layer\n", + " layer_circuit = parameterized_circuit + entangle_circuit\n", + " print(layer_circuit)\n", + "\n", + " # Add this circuit layer to the network with an output on measurements on in the Z component\n", + " # Manipulate the output so it maps the -1, 1 outputs to 0, 1 like the binary discrete data generated by generate_data\n", + " layer = tfq.layers.PQC(layer_circuit, [(cirq.Z(qubits[i])+1)/2 for i in range(num_qubits)], repetitions=1)(inputs) #Important to have repetition =1\n", + " model = tf.keras.Model(inputs=[inputs], outputs=[layer])\n", + "\n", + " #model.summary()\n", + "\n", + " return model(initial_distribution_tensor)\n", + "\n", + "# Test the quantum generator\n", + "noise, real_data = generate_data()\n", + "print(quantum_generator_model(noise))\n", + "print(real_data)" + ], + "execution_count": 27, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(0, 0): ───Ry(a0)───@───────@───\n", + " │ │\n", + "(1, 0): ───Ry(a1)───@───@───┼───\n", + " │ │\n", + "(2, 0): ───Ry(a2)───────@───@───\n", + "tf.Tensor(\n", + "[[1. 0. 0.]\n", + " [0. 1. 0.]\n", + " [1. 1. 0.]\n", + " ...\n", + " [1. 0. 0.]\n", + " [1. 0. 0.]\n", + " [1. 0. 0.]], shape=(856, 3), dtype=float32)\n", + "tf.Tensor(\n", + "[[0. 0. 0.]\n", + " [1. 0. 0.]\n", + " [0. 1. 0.]\n", + " ...\n", + " [1. 0. 0.]\n", + " [0. 0. 1.]\n", + " [1. 1. 0.]], shape=(856, 3), dtype=float32)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NfzqbvDmR1m1", + "colab_type": "text" + }, + "source": [ + "## Generator Loss Function" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "7IgRsGmCR43s", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def generator_loss_function(gan_model):\n", + " # Function from https://www.nature.com/articles/s41534-019-0223-2\n", + " m = gan_model.discriminator_gen_outputs.shape[0]\n", + " sum = tf.math.reduce_sum(tf.math.log(gan_model.discriminator_gen_outputs))\n", + " sum = 1/m * sum\n", + " return sum" + ], + "execution_count": 19, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "w2Sh5UwR40fg", + "colab_type": "text" + }, + "source": [ + "# Discriminator" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4NQcpLm1KCCa", + "colab_type": "text" + }, + "source": [ + "The discriminator is a classical neural network. You will use a 3-layer network with 50 input nodes, 20 hidden nodes and 1 output nodes. The structure of the discriminator is picked so it is equally balanced with the generator by emperical methods (we have just used the same structure as https://www.nature.com/articles/s41534-019-0223-2)." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "DHHwHieb7QLj", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def discriminator_model(real_input, gen_inputs):\n", + " model = tf.keras.Sequential()\n", + " model.add(tf.keras.Input(shape=(num_qubits,)))\n", + " model.add(tf.keras.layers.Dense(50, activation=\"relu\"))\n", + " model.add(tf.keras.layers.Dense(20, activation=\"relu\"))\n", + " model.add(tf.keras.layers.Dense(1, activation=\"sigmoid\"))\n", + " #model.summary()\n", + " #print(real_input)\n", + " \n", + " return model(real_input)\n", + "\n", + "#discriminator = make_discriminator_model()\n", + "#tf.keras.utils.plot_model(discriminator,show_shapes=True, show_layer_names=False, dpi=70)" + ], + "execution_count": 20, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "S2lrCLuLMfFc", + "colab_type": "text" + }, + "source": [ + "## Discriminator loss function" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ezQQLtBGMn2h", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def discriminator_loss_function(gan_model):\n", + " # function from https://www.nature.com/articles/s41534-019-0223-2\n", + " m = gan_model.discriminator_gen_outputs.shape[0]\n", + " sum = tf.math.reduce_sum(tf.math.log(gan_model.discriminator_real_outputs) + tf.math.log(1-gan_model.discriminator_gen_outputs))\n", + " sum = 1/m * sum\n", + " return sum" + ], + "execution_count": 21, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EF4uYrrbLx-Z", + "colab_type": "text" + }, + "source": [ + "# Evaluate model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "nNHvJtnEL2sP", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def get_eval_metric_ops_fn(gan_model):\n", + " real_data_logits = tf.reduce_mean(gan_model.discriminator_real_outputs)\n", + " gen_data_logits = tf.reduce_mean(gan_model.discriminator_gen_outputs)\n", + "\n", + " # Convert 2 bit binary tensor into single decimal tensor\n", + " sum_tensor = tf.reduce_sum(tf.map_fn(lambda t: t * 2 ** tf.range(tf.cast(gan_model.generated_data.shape[1], dtype=tf.int64)),\n", + " tf.cast(tf.reverse(tensor=gan_model.generated_data, axis=[1]), dtype=tf.int64)), axis=1)\n", + " \n", + " # Create labels to compare sum_tensor to so we can return the percentage of each result at every evaluation\n", + " zeros = tf.zeros(sum_tensor.shape)\n", + " ones = tf.ones(sum_tensor.shape)\n", + " twos = tf.ones(sum_tensor.shape) * 2\n", + " threes = tf.ones(sum_tensor.shape) * 3\n", + "\n", + " # Attempt to calculate entropy to see how accurate the network is (but this doesn't work yet - just gives nan)\n", + " cce = tf.keras.losses.CategoricalCrossentropy()\n", + " entropy = cce(gan_model.generated_data, gan_model.real_data)\n", + " return {\n", + " 'real_data_logits': tf.compat.v1.metrics.mean(real_data_logits),\n", + " 'gen_data_logits': tf.compat.v1.metrics.mean(gen_data_logits),\n", + " 'zeros': tf.compat.v1.metrics.accuracy(zeros,sum_tensor),\n", + " 'ones':tf.compat.v1.metrics.accuracy(ones,sum_tensor),\n", + " 'twos':tf.compat.v1.metrics.accuracy(twos,sum_tensor),\n", + " 'threes':tf.compat.v1.metrics.accuracy(threes,sum_tensor),\n", + " 'entropy':tf.compat.v1.metrics.mean(entropy),\n", + " }" + ], + "execution_count": 22, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L82bU_YpLm-m", + "colab_type": "text" + }, + "source": [ + "# GANEstimator" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Ayp5JoOqLrXX", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "bc38a488-2ac6-4daa-fbf4-7ff2fd4b784c" + }, + "source": [ + "generator_lr = 0.001\n", + "discriminator_lr = 0.0002\n", + "\n", + "# Configure the GAN estimator with all the functions from above\n", + "gan_estimator = tfg.estimator.GANEstimator(generator_fn=quantum_generator_model,\n", + " discriminator_fn=discriminator_model,\n", + " generator_loss_fn=generator_loss_function,\n", + " discriminator_loss_fn=discriminator_loss_function,\n", + " generator_optimizer=tf.compat.v1.train.AdamOptimizer(generator_lr, 0.5),\n", + " discriminator_optimizer=tf.compat.v1.train.AdamOptimizer(discriminator_lr, 0.5),\n", + " get_eval_metric_ops_fn=get_eval_metric_ops_fn)\n", + "\n", + "steps_per_eval = 10 #@param\n", + "max_train_steps = 100 #@param\n", + "batches_for_eval_metrics = 10 #@param\n", + "\n", + "# Used to track metrics.\n", + "steps = []\n", + "real_logits, fake_logits = [], []\n", + "zeros, ones, twos, threes = [],[],[],[]\n", + "\n", + "cur_step = 0\n", + "start_time = time.time()\n", + "while cur_step < max_train_steps:\n", + " next_step = min(cur_step + steps_per_eval, max_train_steps)\n", + " gan_estimator.train(generate_data, max_steps=next_step)\n", + " steps_taken = next_step - cur_step\n", + " cur_step = next_step\n", + " \n", + " # Calculate some metrics.\n", + " metrics = gan_estimator.evaluate(generate_data, steps=batches_for_eval_metrics)\n", + " steps.append(cur_step)\n", + " real_logits.append(metrics['real_data_logits'])\n", + " fake_logits.append(metrics['gen_data_logits'])\n", + " print('Average discriminator output on Real: %.2f Fake: %.2f' % (\n", + " real_logits[-1], fake_logits[-1]))\n", + " plt.figure()\n", + " plt.bar(np.arange(0,4), [metrics['zeros'],metrics['ones'],metrics['twos'],metrics['threes']])\n", + " zeros.append(metrics['zeros'])\n", + " ones.append(metrics['ones'])\n", + " twos.append(metrics['twos'])\n", + " threes.append(metrics['threes'])\n", + " print(metrics['entropy'])\n", + "\n", + "plt.figure()\n", + "plt.plot(steps, zeros, steps, ones, steps, twos, steps, threes)\n" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "INFO:tensorflow:Using default config.\n", + "WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpjlrkso7q\n", + "INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpjlrkso7q', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true\n", + "graph_options {\n", + " rewrite_options {\n", + " meta_optimizer_iterations: ONE\n", + " }\n", + "}\n", + ", '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}\n", + "WARNING:tensorflow:Estimator's model_fn (._model_fn at 0x7fae7b7432f0>) includes params argument, but params are not passed to Estimator.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.321094, step = 0\n", + "INFO:tensorflow:Saving checkpoints for 10 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.3661062.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:49:52Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-10\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.92984s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:49:53\n", + "INFO:tensorflow:Saving dict for global step 10: discriminator_loss = -1.3667452, entropy = nan, gen_data_logits = 0.511203, generator_loss = -0.6710436, global_step = 10, loss = -1.3667452, ones = 0.0053333333, real_data_logits = 0.5217606, threes = 0.55733335, twos = 0.4335, zeros = 0.0038333333\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 10: /tmp/tmpjlrkso7q/model.ckpt-10\n", + "Average discriminator output on Real: 0.52 Fake: 0.51\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-10\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 10 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.3706237, step = 10\n", + "INFO:tensorflow:Saving checkpoints for 20 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.4174153.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:49:59Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-20\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.99218s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:00\n", + "INFO:tensorflow:Saving dict for global step 20: discriminator_loss = -1.4193214, entropy = nan, gen_data_logits = 0.524186, generator_loss = -0.64598644, global_step = 20, loss = -1.4193214, ones = 0.0059322035, real_data_logits = 0.50851995, threes = 0.5622034, twos = 0.42762712, zeros = 0.004237288\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 20: /tmp/tmpjlrkso7q/model.ckpt-20\n", + "Average discriminator output on Real: 0.51 Fake: 0.52\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-20\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 20 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.42323, step = 20\n", + "INFO:tensorflow:Saving checkpoints for 30 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.4711331.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:06Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-30\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.96922s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:07\n", + "INFO:tensorflow:Saving dict for global step 30: discriminator_loss = -1.4720995, entropy = nan, gen_data_logits = 0.537337, generator_loss = -0.62125856, global_step = 30, loss = -1.4720995, ones = 0.0067357514, real_data_logits = 0.49611425, threes = 0.5580311, twos = 0.4300518, zeros = 0.005181347\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 30: /tmp/tmpjlrkso7q/model.ckpt-30\n", + "Average discriminator output on Real: 0.50 Fake: 0.54\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-30\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 30 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.4787662, step = 30\n", + "INFO:tensorflow:Saving checkpoints for 40 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.525995.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:13Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-40\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.97511s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:14\n", + "INFO:tensorflow:Saving dict for global step 40: discriminator_loss = -1.5259699, entropy = nan, gen_data_logits = 0.5501564, generator_loss = -0.5977688, global_step = 40, loss = -1.5259699, ones = 0.008373591, real_data_logits = 0.48356724, threes = 0.55152977, twos = 0.4347826, zeros = 0.0053140097\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 40: /tmp/tmpjlrkso7q/model.ckpt-40\n", + "Average discriminator output on Real: 0.48 Fake: 0.55\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-40\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 40 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.5313491, step = 40\n", + "INFO:tensorflow:Saving checkpoints for 50 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.5814705.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:20Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-50\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.96375s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:21\n", + "INFO:tensorflow:Saving dict for global step 50: discriminator_loss = -1.5813547, entropy = nan, gen_data_logits = 0.56256807, generator_loss = -0.57556635, global_step = 50, loss = -1.5813547, ones = 0.007894737, real_data_logits = 0.4706164, threes = 0.53125, twos = 0.45427632, zeros = 0.0065789474\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 50: /tmp/tmpjlrkso7q/model.ckpt-50\n", + "Average discriminator output on Real: 0.47 Fake: 0.56\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-50\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 50 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.5888276, step = 50\n", + "INFO:tensorflow:Saving checkpoints for 60 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.6451112.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:27Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-60\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.96454s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:28\n", + "INFO:tensorflow:Saving dict for global step 60: discriminator_loss = -1.6422592, entropy = nan, gen_data_logits = 0.57580954, generator_loss = -0.55242676, global_step = 60, loss = -1.6422592, ones = 0.0072847684, real_data_logits = 0.45681602, threes = 0.535596, twos = 0.452649, zeros = 0.004470199\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 60: /tmp/tmpjlrkso7q/model.ckpt-60\n", + "Average discriminator output on Real: 0.46 Fake: 0.58\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-60\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 60 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.6509174, step = 60\n", + "INFO:tensorflow:Saving checkpoints for 70 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.709187.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:33Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-70\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 1.00544s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:34\n", + "INFO:tensorflow:Saving dict for global step 70: discriminator_loss = -1.7091427, entropy = nan, gen_data_logits = 0.59141445, generator_loss = -0.52594554, global_step = 70, loss = -1.7091427, ones = 0.00928, real_data_logits = 0.44395787, threes = 0.5432, twos = 0.4392, zeros = 0.00832\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 70: /tmp/tmpjlrkso7q/model.ckpt-70\n", + "Average discriminator output on Real: 0.44 Fake: 0.59\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-70\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 70 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.7174889, step = 70\n", + "INFO:tensorflow:Saving checkpoints for 80 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.790208.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:40Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-80\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.98008s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:41\n", + "INFO:tensorflow:Saving dict for global step 80: discriminator_loss = -1.7832139, entropy = nan, gen_data_logits = 0.60673684, generator_loss = -0.50064135, global_step = 80, loss = -1.7832139, ones = 0.008952702, real_data_logits = 0.4287591, threes = 0.51317567, twos = 0.46976352, zeros = 0.008108108\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 80: /tmp/tmpjlrkso7q/model.ckpt-80\n", + "Average discriminator output on Real: 0.43 Fake: 0.61\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-80\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 80 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.7944455, step = 80\n", + "INFO:tensorflow:Saving checkpoints for 90 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.8660104.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:47Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-90\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 1.00737s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:48\n", + "INFO:tensorflow:Saving dict for global step 90: discriminator_loss = -1.8626773, entropy = nan, gen_data_logits = 0.6255778, generator_loss = -0.47029623, global_step = 90, loss = -1.8626773, ones = 0.009298532, real_data_logits = 0.4165743, threes = 0.50522023, twos = 0.47553018, zeros = 0.009951061\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 90: /tmp/tmpjlrkso7q/model.ckpt-90\n", + "Average discriminator output on Real: 0.42 Fake: 0.63\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-90\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 90 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.8747579, step = 90\n", + "INFO:tensorflow:Saving checkpoints for 100 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.9657041.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:54Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-100\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.95951s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:55\n", + "INFO:tensorflow:Saving dict for global step 100: discriminator_loss = -1.9677017, entropy = nan, gen_data_logits = 0.6510126, generator_loss = -0.43074673, global_step = 100, loss = -1.9677017, ones = 0.010296412, real_data_logits = 0.4033714, threes = 0.50031203, twos = 0.4778471, zeros = 0.011544461\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 100: /tmp/tmpjlrkso7q/model.ckpt-100\n", + "Average discriminator output on Real: 0.40 Fake: 0.65\n", + "nan\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 32 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAOX0lEQVR4nO3db4ylZ13G8e/FtgtGiICdYNNdmIKbmBUrlHGpaJBoSbY02SUBw9YYaVKyIbqxBl+4BLOJ6wtbSBr/bSIbaAJGXKAYGWRJU7DE+KJlByil27oy3VS7m2qHgq3ESFn8+eI8C6fTM3ue2TkzZ3rz/SQn8/y5d87Ve+a5+sxz/qWqkCQ99z1v2gEkSZNhoUtSIyx0SWqEhS5JjbDQJakRl0zrji+77LKanZ2d1t1L0nPSl7/85W9W1cyofVMr9NnZWRYWFqZ195L0nJTk31ba5yUXSWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqxNReKSrpR9fswc9OO8JUPXLL9evyfT1Dl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqRG9Cj3J7iSnkiwmOThi/41JlpLc193eNfmokqQLGfsBF0m2AEeANwNngBNJ5qvqwWVDP15VB9YhoySphz5n6LuAxao6XVVPA8eAvesbS5K0Wn0K/Qrg0aH1M9225d6W5P4kdyTZPuobJdmfZCHJwtLS0kXElSStZFIPin4GmK2qq4C7gI+MGlRVR6tqrqrmZmZmJnTXkiToV+hngeEz7m3dth+oqieq6rvd6oeA100mniSprz6FfgLYkeTKJFuBfcD88IAklw+t7gEemlxESVIfY5/lUlXnkhwA7gS2ALdX1ckkh4GFqpoHfjfJHuAc8C3gxnXMLEkaYWyhA1TVceD4sm2HhpbfC7x3stEkSavhK0UlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRvT6TFFJPzR78LPTjjB1j9xy/bQjaATP0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmN6FXoSXYnOZVkMcnBC4x7W5JKMje5iJKkPsYWepItwBHgOmAncEOSnSPGvQi4Gbh30iElSeP1OUPfBSxW1emqeho4BuwdMe6PgVuB/51gPklST30K/Qrg0aH1M922H0hyNbC9qnyTC0makjU/KJrkecBtwO/3GLs/yUKShaWlpbXetSRpSJ9CPwtsH1rf1m0770XAq4EvJnkEuAaYH/XAaFUdraq5qpqbmZm5+NSSpGfpU+gngB1JrkyyFdgHzJ/fWVVPVtVlVTVbVbPAPcCeqlpYl8SSpJHGFnpVnQMOAHcCDwGfqKqTSQ4n2bPeASVJ/fT6gIuqOg4cX7bt0Apj37T2WJKk1fKVopLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjehV6El2JzmVZDHJwRH7353k60nuS/LPSXZOPqok6ULGFnqSLcAR4DpgJ3DDiML+WFX9XFW9Bng/cNvEk0qSLqjPGfouYLGqTlfV08AxYO/wgKp6amj1x4GaXERJUh+X9BhzBfDo0PoZ4PXLByX5HeA9wFbgV0d9oyT7gf0AL3/5y1ebVZJ0ARN7ULSqjlTVq4A/AP5whTFHq2ququZmZmYmddeSJPoV+llg+9D6tm7bSo4Bb11LKEnS6vUp9BPAjiRXJtkK7APmhwck2TG0ej3wjclFlCT1MfYaelWdS3IAuBPYAtxeVSeTHAYWqmoeOJDkWuB7wLeBd65naEnSs/V5UJSqOg4cX7bt0NDyzRPOJUlaJV8pKkmNsNAlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEZY6JLUiF6FnmR3klNJFpMcHLH/PUkeTHJ/ki8kecXko0qSLmRsoSfZAhwBrgN2Ajck2bls2FeBuaq6CrgDeP+kg0qSLqzPGfouYLGqTlfV08AxYO/wgKq6u6r+p1u9B9g22ZiSpHH6FPoVwKND62e6bSu5CfjcqB1J9idZSLKwtLTUP6UkaayJPiia5DeBOeADo/ZX1dGqmququZmZmUnetST9yLukx5izwPah9W3dtmdIci3wPuBXquq7k4knSeqrzxn6CWBHkiuTbAX2AfPDA5K8FvggsKeqHp98TEnSOGMLvarOAQeAO4GHgE9U1ckkh5Ps6YZ9AHgh8Mkk9yWZX+HbSZLWSZ9LLlTVceD4sm2HhpavnXAuSdIq+UpRSWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNaJXoSfZneRUksUkB0fsf2OSryQ5l+Ttk48pSRpnbKEn2QIcAa4DdgI3JNm5bNi/AzcCH5t0QElSP5f0GLMLWKyq0wBJjgF7gQfPD6iqR7p9/7cOGSVJPfS55HIF8OjQ+plu26ol2Z9kIcnC0tLSxXwLSdIKNvRB0ao6WlVzVTU3MzOzkXctSc3rU+hnge1D69u6bZKkTaRPoZ8AdiS5MslWYB8wv76xJEmrNbbQq+occAC4E3gI+ERVnUxyOMkegCS/kOQM8OvAB5OcXM/QkqRn6/MsF6rqOHB82bZDQ8snGFyKkSRNia8UlaRGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqxCV9BiXZDfwZsAX4UFXdsmz/84GPAq8DngDeUVWPTDaqJmX24GenHWGqHrnl+mlHkNbF2EJPsgU4ArwZOAOcSDJfVQ8ODbsJ+HZV/XSSfcCtwDvWIzBYSBaSpFH6XHLZBSxW1emqeho4BuxdNmYv8JFu+Q7g15JkcjElSeP0ueRyBfDo0PoZ4PUrjamqc0meBH4S+ObwoCT7gf3d6neSnFrhPi9b/m83manmy61jhzh/F9DA/IFzuFbP5fl7xUr/qNc19EmpqqPA0XHjkixU1dwGRLoo5lsb863dZs9ovrW52Hx9LrmcBbYPrW/rto0ck+QS4CcYPDgqSdogfQr9BLAjyZVJtgL7gPllY+aBd3bLbwf+sapqcjElSeOMveTSXRM/ANzJ4GmLt1fVySSHgYWqmgc+DPx1kkXgWwxKfy3GXpaZMvOtjfnWbrNnNN/aXFS+eCItSW3wlaKS1AgLXZIasSkKPclLk9yV5Bvd15esMO77Se7rbssfmF2PXLuTnEqymOTgiP3PT/Lxbv+9SWbXO9Mq892YZGlozt61wfluT/J4kgdW2J8kf97lvz/J1Zss35uSPDk0f4c2MNv2JHcneTDJySQ3jxgztfnrmW+a8/eCJF9K8rUu3x+NGDO147dnvtUfv1U19RvwfuBgt3wQuHWFcd/ZwExbgIeBVwJbga8BO5eN+W3gr7rlfcDHN1m+G4G/nOLP9Y3A1cADK+x/C/A5IMA1wL2bLN+bgH+Y0txdDlzdLb8I+NcRP9+pzV/PfNOcvwAv7JYvBe4Frlk2ZprHb598qz5+N8UZOs9864CPAG+dYpbzNvtbHvTJN1VV9U8MnvW0kr3AR2vgHuDFSS7fmHS98k1NVT1WVV/plv8beIjBK7KHTW3+euabmm5OvtOtXtrdlj8DZGrHb898q7ZZCv1lVfVYt/wfwMtWGPeCJAtJ7kmy3qU/6i0Plv/CPuMtD4Dzb3mwEfrkA3hb9+f4HUm2j9g/TX3/G6bpF7s/iz+X5GenEaC7FPBaBmdxwzbF/F0gH0xx/pJsSXIf8DhwV1WtOH9TOH775INVHr8bVuhJPp/kgRG3Z5xV1uBvjZX+T/WKGrwc9jeAP03yqvXO/Rz3GWC2qq4C7uKHZyPq5ysMfud+HvgL4O83OkCSFwKfAn6vqp7a6PsfZ0y+qc5fVX2/ql7D4NXtu5K8eiPvf5we+VZ9/G5YoVfVtVX16hG3TwP/ef5Pxe7r4yt8j7Pd19PAFxmcFayXzf6WB2PzVdUTVfXdbvVDDN6vfjPpM8dTU1VPnf+zuKqOA5cmuWyj7j/JpQzK8m+q6u9GDJnq/I3LN+35G8rxX8DdwO5luzbFW5aslO9ijt/Ncsll+K0D3gl8evmAJC/J4IM06H4pfgl4cPm4Cdrsb3kwNt+y66l7GFzn3Ezmgd/qnq1xDfDk0KW3qUvyU+evqSbZxeB42ZADvrvfDwMPVdVtKwyb2vz1yTfl+ZtJ8uJu+ccYfJ7DvywbNrXjt0++izp+N+pR3QvdGFy3+gLwDeDzwEu77XMMPiEJ4A3A1xk8m+PrwE0bkOstDB69fxh4X7ftMLCnW34B8ElgEfgS8MoNnrdx+f4EONnN2d3Az2xwvr8FHgO+x+D67k3Au4F3d/vD4MNTHu5+pnObLN+Bofm7B3jDBmb7ZQaXHu8H7utub9ks89cz3zTn7yrgq12+B4BD3fZNcfz2zLfq49eX/ktSIzbLJRdJ0hpZ6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakR/w/y3OlzuajoJwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + } + ] +} \ No newline at end of file From 217aa84407d208c41190bde84e1037225c7ca080 Mon Sep 17 00:00:00 2001 From: Oliver O'Brien Date: Wed, 12 Aug 2020 10:53:31 +0100 Subject: [PATCH 5/7] moved file --- docs/tutorials/qGAN.ipynb | 957 +++++++++++++++++++++++++++++++++++- qgan.ipynb | 988 -------------------------------------- 2 files changed, 952 insertions(+), 993 deletions(-) delete mode 100644 qgan.ipynb diff --git a/docs/tutorials/qGAN.ipynb b/docs/tutorials/qGAN.ipynb index aa4d3379a..07b4d9616 100644 --- a/docs/tutorials/qGAN.ipynb +++ b/docs/tutorials/qGAN.ipynb @@ -3,9 +3,9 @@ "nbformat_minor": 0, "metadata": { "colab": { - "name": "Untitled0.ipynb", + "name": "qgan.ipynb", "provenance": [], - "authorship_tag": "ABX9TyO6fSnFkAXNT6HWNq7ayKg2", + "authorship_tag": "ABX9TyOX4sjMKPZJM1QBJQSL21l1", "include_colab_link": true }, "kernelspec": { @@ -21,21 +21,968 @@ "colab_type": "text" }, "source": [ - "\"Open" + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ldLDoEjQtx8g", + "colab_type": "text" + }, + "source": [ + "# Quantum Generative Adversarial Network (qGAN)\n", + "\n", + "Loading an arbitary random probability distribution into a n qubit quantum state normally requires $O(2^n)$ gates which in most algorithms will dominate the complexity of the quantum algorithm and make it useless. By using a qGAN this loading can be done in $O(poly(n))$ gates [[1](https://https://www.nature.com/articles/s41534-019-0223-2)]. \n", + "\n", + "A qGAN is a version of a [Generative Adversarial Network](https://papers.nips.cc/paper/5423-generative-adversarial-nets) with a quantum generator and a classical discriminator. The quantum generator is trained to transform a given n-qubit input into:\n", + "$$\n", + "\\sum_{j=0}^{2^n-1} \\sqrt{p^j_{\\theta}}\\left| j \\right\\rangle\n", + "$$\n", + "where $p^j_{\\theta}$ relate to the probabilty of the state $j$. The discriminator has to try and distinguish between the output of the generator and the training data set. The two networks train alternatively and will eventaully reach a nash equilibrium where the discriminator cannot tell apart the generator and the training set data. The aim of this process is for $p^j_{\\theta}$ to approximate the distribution of the training data.\n", + "\n", + "This tutorial will guide you through using a qGAN to load a lognormal distribution to a 2 qubit system." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uwQzoKsCuSrY", + "colab_type": "text" + }, + "source": [ + "# Setup" ] }, { "cell_type": "code", "metadata": { - "id": "KeNu6kUJsmxj", + "id": "u4g8Xz0auW9z", "colab_type": "code", "colab": {} }, "source": [ - "" + "!pip install --upgrade tensorflow==2.1.0 tensorflow-quantum tensorflow-gan tensorflow-probability==0.9 tensorflow-datasets" ], "execution_count": null, "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "fVNr2dGRvtFv", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import tensorflow as tf\n", + "import tensorflow_quantum as tfq\n", + "import tensorflow_gan as tfg\n", + "\n", + "import cirq\n", + "import sympy\n", + "import numpy as np\n", + "import collections\n", + "import math\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Intialise qubits\n", + "num_qubits = 2 #@param\n", + "qubits = [cirq.GridQubit(x,0) for x in range(num_qubits)]\n" + ], + "execution_count": 31, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Wn7A2fP1KnQL", + "colab_type": "text" + }, + "source": [ + "# Load Training Data" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tOoK9Y-NKxSV", + "colab_type": "text" + }, + "source": [ + "Before building the model, you need to generate the training data set." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "gd3G6JxNOQe4", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def generate_data():\n", + " \"\"\"Generate training data for discriminator\n", + " \n", + " Bundles this with noise for generator to use\n", + " \"\"\"\n", + "\n", + " size = 1000 # Size of training data set\n", + "\n", + " # Take samples of lognormal distribution with mean = 1 and standard deviation =1\n", + " mu =1\n", + " sigma =1\n", + " continous_data = np.random.lognormal(mean=mu, sigma=sigma, size=size)\n", + " \n", + " # Remove all samples that lie outside the range expressible in the given number of qubits\n", + " continous_data = continous_data[continous_data <= 2**num_qubits-0.5]\n", + "\n", + " # Discretize the remaining samples so the continous distribution can be approximated by a discrete distribution\n", + " discrete_data = tf.convert_to_tensor(np.digitize(continous_data,[i - 0.5 for i in range(1,2**num_qubits)]),dtype=tf.dtypes.int32)\n", + "\n", + " # Convert the decimal into binary tensor\n", + " discrete_data = tf.cast(tf.math.mod(tf.bitwise.right_shift(tf.expand_dims(discrete_data,1), tf.range(num_qubits)), 2),dtype=tf.float32)\n", + " \n", + " # Intialise the same number of circuits as the discrete tensor to a uniform distribution by applying multiple hardardman gates\n", + " noise = []\n", + " for n in range(discrete_data.shape[0]):\n", + " noise.append(cirq.Circuit(cirq.Moment(cirq.H.on_each(qubits))))\n", + " noise = tfq.convert_to_tensor(noise)\n", + "\n", + " return noise, discrete_data\n", + "\n" + ], + "execution_count": 26, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tGhG-BIAVmCW", + "colab_type": "text" + }, + "source": [ + "# Quantum Generator\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "q8nF0dBAelvH", + "colab_type": "text" + }, + "source": [ + "Each layer of a quantum generator consists of a layer of parameterised $R_y$ rotations, and a layer of $CZ$ gates to entangle all the qubits.\n", + "\n", + "The quantum generator you will be using only is only one layer deep. To represent more complex structures a larger circuit depth would need to be used." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2kVGCmeaV7nQ", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 358 + }, + "outputId": "98b4f238-d6a3-4513-c35f-66136974074d" + }, + "source": [ + "def quantum_generator_model(initial_distribution_tensor):\n", + " # Create parameters for each qubit\n", + " theta = sympy.symbols('a0:%d'%num_qubits)\n", + "\n", + " # Set the input to the network\n", + " inputs = tf.keras.Input(shape=(),dtype=tf.dtypes.string)\n", + "\n", + " # Create the parameterised Ry rotation layer circuit\n", + " parameterized_circuit = cirq.Circuit(cirq.Moment([cirq.ry(theta[i])(qubits[i]) for i in range(num_qubits)]))\n", + "\n", + " # Entangle all the qubits by applying CZ in a circular fashion - except when there are only two qubits and then just apply one CZ\n", + " entangle_circuit = cirq.Circuit()\n", + " if(num_qubits > 2):\n", + " for i in range(num_qubits):\n", + " entangle_circuit.append([cirq.CZ(qubits[i], qubits[(i + 1) % num_qubits])])\n", + " else:\n", + " entangle_circuit.append([cirq.CZ(qubits[0],qubits[1])])\n", + " \n", + " # Combine the parameterized circuit layer and the entanglement circuit layer\n", + " layer_circuit = parameterized_circuit + entangle_circuit\n", + " print(layer_circuit)\n", + "\n", + " # Add this circuit layer to the network with an output on measurements on in the Z component\n", + " # Manipulate the output so it maps the -1, 1 outputs to 0, 1 like the binary discrete data generated by generate_data\n", + " layer = tfq.layers.PQC(layer_circuit, [(cirq.Z(qubits[i])+1)/2 for i in range(num_qubits)], repetitions=1)(inputs) #Important to have repetition =1\n", + " model = tf.keras.Model(inputs=[inputs], outputs=[layer])\n", + "\n", + " #model.summary()\n", + "\n", + " return model(initial_distribution_tensor)\n", + "\n", + "# Test the quantum generator\n", + "noise, real_data = generate_data()\n", + "print(quantum_generator_model(noise))\n", + "print(real_data)" + ], + "execution_count": 27, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(0, 0): ───Ry(a0)───@───────@───\n", + " │ │\n", + "(1, 0): ───Ry(a1)───@───@───┼───\n", + " │ │\n", + "(2, 0): ───Ry(a2)───────@───@───\n", + "tf.Tensor(\n", + "[[1. 0. 0.]\n", + " [0. 1. 0.]\n", + " [1. 1. 0.]\n", + " ...\n", + " [1. 0. 0.]\n", + " [1. 0. 0.]\n", + " [1. 0. 0.]], shape=(856, 3), dtype=float32)\n", + "tf.Tensor(\n", + "[[0. 0. 0.]\n", + " [1. 0. 0.]\n", + " [0. 1. 0.]\n", + " ...\n", + " [1. 0. 0.]\n", + " [0. 0. 1.]\n", + " [1. 1. 0.]], shape=(856, 3), dtype=float32)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NfzqbvDmR1m1", + "colab_type": "text" + }, + "source": [ + "## Generator Loss Function" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "7IgRsGmCR43s", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def generator_loss_function(gan_model):\n", + " # Function from https://www.nature.com/articles/s41534-019-0223-2\n", + " m = gan_model.discriminator_gen_outputs.shape[0]\n", + " sum = tf.math.reduce_sum(tf.math.log(gan_model.discriminator_gen_outputs))\n", + " sum = 1/m * sum\n", + " return sum" + ], + "execution_count": 19, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "w2Sh5UwR40fg", + "colab_type": "text" + }, + "source": [ + "# Discriminator" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4NQcpLm1KCCa", + "colab_type": "text" + }, + "source": [ + "The discriminator is a classical neural network. You will use a 3-layer network with 50 input nodes, 20 hidden nodes and 1 output nodes. The structure of the discriminator is picked so it is equally balanced with the generator by emperical methods (we have just used the same structure as https://www.nature.com/articles/s41534-019-0223-2)." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "DHHwHieb7QLj", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def discriminator_model(real_input, gen_inputs):\n", + " model = tf.keras.Sequential()\n", + " model.add(tf.keras.Input(shape=(num_qubits,)))\n", + " model.add(tf.keras.layers.Dense(50, activation=\"relu\"))\n", + " model.add(tf.keras.layers.Dense(20, activation=\"relu\"))\n", + " model.add(tf.keras.layers.Dense(1, activation=\"sigmoid\"))\n", + " #model.summary()\n", + " #print(real_input)\n", + " \n", + " return model(real_input)\n", + "\n", + "#discriminator = make_discriminator_model()\n", + "#tf.keras.utils.plot_model(discriminator,show_shapes=True, show_layer_names=False, dpi=70)" + ], + "execution_count": 20, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "S2lrCLuLMfFc", + "colab_type": "text" + }, + "source": [ + "## Discriminator loss function" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ezQQLtBGMn2h", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def discriminator_loss_function(gan_model):\n", + " # function from https://www.nature.com/articles/s41534-019-0223-2\n", + " m = gan_model.discriminator_gen_outputs.shape[0]\n", + " sum = tf.math.reduce_sum(tf.math.log(gan_model.discriminator_real_outputs) + tf.math.log(1-gan_model.discriminator_gen_outputs))\n", + " sum = 1/m * sum\n", + " return sum" + ], + "execution_count": 21, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EF4uYrrbLx-Z", + "colab_type": "text" + }, + "source": [ + "# Evaluate model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "nNHvJtnEL2sP", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def get_eval_metric_ops_fn(gan_model):\n", + " real_data_logits = tf.reduce_mean(gan_model.discriminator_real_outputs)\n", + " gen_data_logits = tf.reduce_mean(gan_model.discriminator_gen_outputs)\n", + "\n", + " # Convert 2 bit binary tensor into single decimal tensor\n", + " sum_tensor = tf.reduce_sum(tf.map_fn(lambda t: t * 2 ** tf.range(tf.cast(gan_model.generated_data.shape[1], dtype=tf.int64)),\n", + " tf.cast(tf.reverse(tensor=gan_model.generated_data, axis=[1]), dtype=tf.int64)), axis=1)\n", + " \n", + " # Create labels to compare sum_tensor to so we can return the percentage of each result at every evaluation\n", + " zeros = tf.zeros(sum_tensor.shape)\n", + " ones = tf.ones(sum_tensor.shape)\n", + " twos = tf.ones(sum_tensor.shape) * 2\n", + " threes = tf.ones(sum_tensor.shape) * 3\n", + "\n", + " # Attempt to calculate entropy to see how accurate the network is (but this doesn't work yet - just gives nan)\n", + " cce = tf.keras.losses.CategoricalCrossentropy()\n", + " entropy = cce(gan_model.generated_data, gan_model.real_data)\n", + " return {\n", + " 'real_data_logits': tf.compat.v1.metrics.mean(real_data_logits),\n", + " 'gen_data_logits': tf.compat.v1.metrics.mean(gen_data_logits),\n", + " 'zeros': tf.compat.v1.metrics.accuracy(zeros,sum_tensor),\n", + " 'ones':tf.compat.v1.metrics.accuracy(ones,sum_tensor),\n", + " 'twos':tf.compat.v1.metrics.accuracy(twos,sum_tensor),\n", + " 'threes':tf.compat.v1.metrics.accuracy(threes,sum_tensor),\n", + " 'entropy':tf.compat.v1.metrics.mean(entropy),\n", + " }" + ], + "execution_count": 22, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L82bU_YpLm-m", + "colab_type": "text" + }, + "source": [ + "# GANEstimator" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Ayp5JoOqLrXX", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "bc38a488-2ac6-4daa-fbf4-7ff2fd4b784c" + }, + "source": [ + "generator_lr = 0.001\n", + "discriminator_lr = 0.0002\n", + "\n", + "# Configure the GAN estimator with all the functions from above\n", + "gan_estimator = tfg.estimator.GANEstimator(generator_fn=quantum_generator_model,\n", + " discriminator_fn=discriminator_model,\n", + " generator_loss_fn=generator_loss_function,\n", + " discriminator_loss_fn=discriminator_loss_function,\n", + " generator_optimizer=tf.compat.v1.train.AdamOptimizer(generator_lr, 0.5),\n", + " discriminator_optimizer=tf.compat.v1.train.AdamOptimizer(discriminator_lr, 0.5),\n", + " get_eval_metric_ops_fn=get_eval_metric_ops_fn)\n", + "\n", + "steps_per_eval = 10 #@param\n", + "max_train_steps = 100 #@param\n", + "batches_for_eval_metrics = 10 #@param\n", + "\n", + "# Used to track metrics.\n", + "steps = []\n", + "real_logits, fake_logits = [], []\n", + "zeros, ones, twos, threes = [],[],[],[]\n", + "\n", + "cur_step = 0\n", + "start_time = time.time()\n", + "while cur_step < max_train_steps:\n", + " next_step = min(cur_step + steps_per_eval, max_train_steps)\n", + " gan_estimator.train(generate_data, max_steps=next_step)\n", + " steps_taken = next_step - cur_step\n", + " cur_step = next_step\n", + " \n", + " # Calculate some metrics.\n", + " metrics = gan_estimator.evaluate(generate_data, steps=batches_for_eval_metrics)\n", + " steps.append(cur_step)\n", + " real_logits.append(metrics['real_data_logits'])\n", + " fake_logits.append(metrics['gen_data_logits'])\n", + " print('Average discriminator output on Real: %.2f Fake: %.2f' % (\n", + " real_logits[-1], fake_logits[-1]))\n", + " plt.figure()\n", + " plt.bar(np.arange(0,4), [metrics['zeros'],metrics['ones'],metrics['twos'],metrics['threes']])\n", + " zeros.append(metrics['zeros'])\n", + " ones.append(metrics['ones'])\n", + " twos.append(metrics['twos'])\n", + " threes.append(metrics['threes'])\n", + " print(metrics['entropy'])\n", + "\n", + "plt.figure()\n", + "plt.plot(steps, zeros, steps, ones, steps, twos, steps, threes)\n" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "INFO:tensorflow:Using default config.\n", + "WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpjlrkso7q\n", + "INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpjlrkso7q', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true\n", + "graph_options {\n", + " rewrite_options {\n", + " meta_optimizer_iterations: ONE\n", + " }\n", + "}\n", + ", '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}\n", + "WARNING:tensorflow:Estimator's model_fn (._model_fn at 0x7fae7b7432f0>) includes params argument, but params are not passed to Estimator.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.321094, step = 0\n", + "INFO:tensorflow:Saving checkpoints for 10 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.3661062.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:49:52Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-10\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.92984s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:49:53\n", + "INFO:tensorflow:Saving dict for global step 10: discriminator_loss = -1.3667452, entropy = nan, gen_data_logits = 0.511203, generator_loss = -0.6710436, global_step = 10, loss = -1.3667452, ones = 0.0053333333, real_data_logits = 0.5217606, threes = 0.55733335, twos = 0.4335, zeros = 0.0038333333\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 10: /tmp/tmpjlrkso7q/model.ckpt-10\n", + "Average discriminator output on Real: 0.52 Fake: 0.51\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-10\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 10 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.3706237, step = 10\n", + "INFO:tensorflow:Saving checkpoints for 20 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.4174153.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:49:59Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-20\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.99218s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:00\n", + "INFO:tensorflow:Saving dict for global step 20: discriminator_loss = -1.4193214, entropy = nan, gen_data_logits = 0.524186, generator_loss = -0.64598644, global_step = 20, loss = -1.4193214, ones = 0.0059322035, real_data_logits = 0.50851995, threes = 0.5622034, twos = 0.42762712, zeros = 0.004237288\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 20: /tmp/tmpjlrkso7q/model.ckpt-20\n", + "Average discriminator output on Real: 0.51 Fake: 0.52\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-20\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 20 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.42323, step = 20\n", + "INFO:tensorflow:Saving checkpoints for 30 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.4711331.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:06Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-30\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.96922s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:07\n", + "INFO:tensorflow:Saving dict for global step 30: discriminator_loss = -1.4720995, entropy = nan, gen_data_logits = 0.537337, generator_loss = -0.62125856, global_step = 30, loss = -1.4720995, ones = 0.0067357514, real_data_logits = 0.49611425, threes = 0.5580311, twos = 0.4300518, zeros = 0.005181347\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 30: /tmp/tmpjlrkso7q/model.ckpt-30\n", + "Average discriminator output on Real: 0.50 Fake: 0.54\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-30\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 30 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.4787662, step = 30\n", + "INFO:tensorflow:Saving checkpoints for 40 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.525995.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:13Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-40\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.97511s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:14\n", + "INFO:tensorflow:Saving dict for global step 40: discriminator_loss = -1.5259699, entropy = nan, gen_data_logits = 0.5501564, generator_loss = -0.5977688, global_step = 40, loss = -1.5259699, ones = 0.008373591, real_data_logits = 0.48356724, threes = 0.55152977, twos = 0.4347826, zeros = 0.0053140097\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 40: /tmp/tmpjlrkso7q/model.ckpt-40\n", + "Average discriminator output on Real: 0.48 Fake: 0.55\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-40\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 40 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.5313491, step = 40\n", + "INFO:tensorflow:Saving checkpoints for 50 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.5814705.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:20Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-50\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.96375s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:21\n", + "INFO:tensorflow:Saving dict for global step 50: discriminator_loss = -1.5813547, entropy = nan, gen_data_logits = 0.56256807, generator_loss = -0.57556635, global_step = 50, loss = -1.5813547, ones = 0.007894737, real_data_logits = 0.4706164, threes = 0.53125, twos = 0.45427632, zeros = 0.0065789474\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 50: /tmp/tmpjlrkso7q/model.ckpt-50\n", + "Average discriminator output on Real: 0.47 Fake: 0.56\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-50\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 50 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.5888276, step = 50\n", + "INFO:tensorflow:Saving checkpoints for 60 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.6451112.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:27Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-60\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.96454s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:28\n", + "INFO:tensorflow:Saving dict for global step 60: discriminator_loss = -1.6422592, entropy = nan, gen_data_logits = 0.57580954, generator_loss = -0.55242676, global_step = 60, loss = -1.6422592, ones = 0.0072847684, real_data_logits = 0.45681602, threes = 0.535596, twos = 0.452649, zeros = 0.004470199\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 60: /tmp/tmpjlrkso7q/model.ckpt-60\n", + "Average discriminator output on Real: 0.46 Fake: 0.58\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-60\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 60 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.6509174, step = 60\n", + "INFO:tensorflow:Saving checkpoints for 70 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.709187.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:33Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-70\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 1.00544s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:34\n", + "INFO:tensorflow:Saving dict for global step 70: discriminator_loss = -1.7091427, entropy = nan, gen_data_logits = 0.59141445, generator_loss = -0.52594554, global_step = 70, loss = -1.7091427, ones = 0.00928, real_data_logits = 0.44395787, threes = 0.5432, twos = 0.4392, zeros = 0.00832\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 70: /tmp/tmpjlrkso7q/model.ckpt-70\n", + "Average discriminator output on Real: 0.44 Fake: 0.59\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-70\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 70 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.7174889, step = 70\n", + "INFO:tensorflow:Saving checkpoints for 80 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.790208.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:40Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-80\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.98008s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:41\n", + "INFO:tensorflow:Saving dict for global step 80: discriminator_loss = -1.7832139, entropy = nan, gen_data_logits = 0.60673684, generator_loss = -0.50064135, global_step = 80, loss = -1.7832139, ones = 0.008952702, real_data_logits = 0.4287591, threes = 0.51317567, twos = 0.46976352, zeros = 0.008108108\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 80: /tmp/tmpjlrkso7q/model.ckpt-80\n", + "Average discriminator output on Real: 0.43 Fake: 0.61\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-80\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 80 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.7944455, step = 80\n", + "INFO:tensorflow:Saving checkpoints for 90 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.8660104.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:47Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-90\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 1.00737s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:48\n", + "INFO:tensorflow:Saving dict for global step 90: discriminator_loss = -1.8626773, entropy = nan, gen_data_logits = 0.6255778, generator_loss = -0.47029623, global_step = 90, loss = -1.8626773, ones = 0.009298532, real_data_logits = 0.4165743, threes = 0.50522023, twos = 0.47553018, zeros = 0.009951061\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 90: /tmp/tmpjlrkso7q/model.ckpt-90\n", + "Average discriminator output on Real: 0.42 Fake: 0.63\n", + "nan\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-90\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 90 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:loss = -1.8747579, step = 90\n", + "INFO:tensorflow:Saving checkpoints for 100 into /tmp/tmpjlrkso7q/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: -1.9657041.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:54Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-100\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [1/10]\n", + "INFO:tensorflow:Evaluation [2/10]\n", + "INFO:tensorflow:Evaluation [3/10]\n", + "INFO:tensorflow:Evaluation [4/10]\n", + "INFO:tensorflow:Evaluation [5/10]\n", + "INFO:tensorflow:Evaluation [6/10]\n", + "INFO:tensorflow:Evaluation [7/10]\n", + "INFO:tensorflow:Evaluation [8/10]\n", + "INFO:tensorflow:Evaluation [9/10]\n", + "INFO:tensorflow:Evaluation [10/10]\n", + "INFO:tensorflow:Inference Time : 0.95951s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:55\n", + "INFO:tensorflow:Saving dict for global step 100: discriminator_loss = -1.9677017, entropy = nan, gen_data_logits = 0.6510126, generator_loss = -0.43074673, global_step = 100, loss = -1.9677017, ones = 0.010296412, real_data_logits = 0.4033714, threes = 0.50031203, twos = 0.4778471, zeros = 0.011544461\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 100: /tmp/tmpjlrkso7q/model.ckpt-100\n", + "Average discriminator output on Real: 0.40 Fake: 0.65\n", + "nan\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 32 + }, + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAOTElEQVR4nO3df6zdd13H8eeLbmXGEQF7g2TtuAObmIoTxrVMNEh0JN2WtCTD2BkjS0aaRRtn8A9LME2sf7iNhBi1iTRjCRqxwDRykS7LwBHjHxu9jLGtm5VLM10bdJeBm4txo/j2j/stnF3O7fne3nPvufvwfCQn/f743PN97dN+X/ve77nn3FQVkqSXv1dMOoAkaTwsdElqhIUuSY2w0CWpERa6JDXiokkdeMuWLTU9PT2pw0vSy9KXv/zlb1bV1LB9Eyv06elp5ubmJnV4SXpZSvJvy+3zloskNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDViYu8UlfTDa/rA5yYdYaKevO36NXler9AlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpEb0KPcmuJCeTzCc5MGT/TUkWkjzcPd4//qiSpPMZ+SvokmwCDgPvBk4Dx5PMVtXjS4Z+sqr2r0FGSVIPfa7QdwLzVXWqql4EjgJ71jaWJGml+hT6ZcBTA+unu21L3ZDkkSR3J9k27ImS7Esyl2RuYWHhAuJKkpYzrhdFPwtMV9WVwH3Ax4cNqqojVTVTVTNTU1NjOrQkCfoV+hlg8Ip7a7fte6rqmap6oVu9E3jbeOJJkvrqU+jHge1JrkiyGdgLzA4OSPL6gdXdwBPjiyhJ6mPkT7lU1dkk+4F7gU3AXVV1IskhYK6qZoHfSbIbOAt8C7hpDTNLkoYYWegAVXUMOLZk28GB5Q8CHxxvNEnSSvhOUUlqhIUuSY2w0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRvX6nqKTvmz7wuUlHmLgnb7t+0hE0hFfoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEb0KvQku5KcTDKf5MB5xt2QpJLMjC+iJKmPkYWeZBNwGLgW2AHcmGTHkHGvAm4FHhx3SEnSaH2u0HcC81V1qqpeBI4Ce4aM+yPgduB/x5hPktRTn0K/DHhqYP10t+17klwFbKuq837IRZJ9SeaSzC0sLKw4rCRpeat+UTTJK4CPAL83amxVHamqmaqamZqaWu2hJUkD+hT6GWDbwPrWbts5rwLeDHwxyZPA1cCsL4xK0vrqU+jHge1JrkiyGdgLzJ7bWVXPVtWWqpquqmngAWB3Vc2tSWJJ0lAjC72qzgL7gXuBJ4BPVdWJJIeS7F7rgJKkfnr9gouqOgYcW7Lt4DJj37X6WJKklfKdopLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWpEr0JPsivJySTzSQ4M2X9LkkeTPJzkn5PsGH9USdL5jCz0JJuAw8C1wA7gxiGF/Ymq+pmqegtwB/CRsSeVJJ1Xnyv0ncB8VZ2qqheBo8CewQFV9dzA6o8CNb6IkqQ+Luox5jLgqYH108Dblw5K8tvAB4DNwC8Pe6Ik+4B9AJdffvlKs0qSzmNsL4pW1eGqehPw+8AfLDPmSFXNVNXM1NTUuA4tSaJfoZ8Btg2sb+22Leco8J7VhJIkrVyfQj8ObE9yRZLNwF5gdnBAku0Dq9cDXxtfRElSHyPvoVfV2ST7gXuBTcBdVXUiySFgrqpmgf1JrgG+A3wbeN9ahpYk/aA+L4pSVceAY0u2HRxYvnXMuSRJK+Q7RSWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktSIXoWeZFeSk0nmkxwYsv8DSR5P8kiSLyR5w/ijSpLOZ2ShJ9kEHAauBXYANybZsWTYV4CZqroSuBu4Y9xBJUnn1+cKfScwX1WnqupF4CiwZ3BAVd1fVf/TrT4AbB1vTEnSKH0K/TLgqYH109225dwM3DNsR5J9SeaSzC0sLPRPKUkaaawviib5DWAG+PCw/VV1pKpmqmpmampqnIeWpB96F/UYcwbYNrC+tdv2EkmuAT4E/FJVvTCeeJKkvvpcoR8Htie5IslmYC8wOzggyVuBjwK7q+rp8ceUJI0ystCr6iywH7gXeAL4VFWdSHIoye5u2IeBS4FPJ3k4yewyTydJWiN9brlQVceAY0u2HRxYvmbMuSRJK+Q7RSWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktSIXoWeZFeSk0nmkxwYsv+dSR5KcjbJe8cfU5I0yshCT7IJOAxcC+wAbkyyY8mwfwduAj4x7oCSpH4u6jFmJzBfVacAkhwF9gCPnxtQVU92+/5vDTJKknroc8vlMuCpgfXT3TZJ0gayri+KJtmXZC7J3MLCwnoeWpKa16fQzwDbBta3dttWrKqOVNVMVc1MTU1dyFNIkpbRp9CPA9uTXJFkM7AXmF3bWJKklRpZ6FV1FtgP3As8AXyqqk4kOZRkN0CSn0tyGvhV4KNJTqxlaEnSD+rzUy5U1THg2JJtBweWj7N4K0aSNCG+U1SSGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqRG9Cj3JriQnk8wnOTBk/yuTfLLb/2CS6XEHlSSd30WjBiTZBBwG3g2cBo4nma2qxweG3Qx8u6p+Msle4Hbg19YiMMD0gc+t1VO/LDx52/Wr+nrnb3XzJ21Ufa7QdwLzVXWqql4EjgJ7lozZA3y8W74b+JUkGV9MSdIoI6/QgcuApwbWTwNvX25MVZ1N8izw48A3Bwcl2Qfs61afT3JymWNuWfq1G8xE8+X2kUOcv/NoYP7AOVytl/P8vWG5L+pT6GNTVUeAI6PGJZmrqpl1iHRBzLc65lu9jZ7RfKtzofn63HI5A2wbWN/abRs6JslFwI8Bz6w0jCTpwvUp9OPA9iRXJNkM7AVml4yZBd7XLb8X+MeqqvHFlCSNMvKWS3dPfD9wL7AJuKuqTiQ5BMxV1SzwMeCvkswD32Kx9Fdj5G2ZCTPf6phv9TZ6RvOtzgXlixfSktQG3ykqSY2w0CWpERui0JO8Nsl9Sb7W/fmaZcZ9N8nD3WPpC7NrkWtDf+RBj3w3JVkYmLP3r3O+u5I8neSxZfYnyZ92+R9JctUGy/euJM8OzN/Bdcy2Lcn9SR5PciLJrUPGTGz+euab5PxdkuRLSb7a5fvDIWMmdv72zLfy87eqJv4A7gAOdMsHgNuXGff8OmbaBHwdeCOwGfgqsGPJmN8C/qJb3gt8coPluwn48wn+vb4TuAp4bJn91wH3AAGuBh7cYPneBfzDhObu9cBV3fKrgH8d8vc7sfnrmW+S8xfg0m75YuBB4OolYyZ5/vbJt+Lzd0NcofPSjw74OPCeCWY5Z6N/5EGffBNVVf/E4k89LWcP8Je16AHg1Ulevz7peuWbmKr6RlU91C3/N/AEi+/IHjSx+euZb2K6OXm+W724eyz9CZCJnb89863YRin011XVN7rl/wBet8y4S5LMJXkgyVqX/rCPPFj6D/YlH3kAnPvIg/XQJx/ADd2343cn2TZk/yT1/W+YpJ/vvi2+J8lPTyJAdyvgrSxexQ3aEPN3nnwwwflLsinJw8DTwH1Vtez8TeD87ZMPVnj+rluhJ/l8kseGPF5yVVmL32ss93+qN9Ti22F/HfiTJG9a69wvc58FpqvqSuA+vn81on4eYvHf3M8Cfwb8/XoHSHIp8LfA71bVc+t9/FFG5Jvo/FXVd6vqLSy+u31nkjev5/FH6ZFvxefvuhV6VV1TVW8e8vgM8J/nvlXs/nx6mec40/15Cvgii1cFa2Wjf+TByHxV9UxVvdCt3gm8bZ2y9dVnjiemqp47921xVR0DLk6yZb2On+RiFsvyr6vq74YMmej8jco36fkbyPFfwP3AriW7NsRHliyX70LO341yy2XwowPeB3xm6YAkr0nyym55C/ALwONLx43RRv/Ig5H5ltxP3c3ifc6NZBb4ze6nNa4Gnh249TZxSX7i3D3VJDtZPF/W5YTvjvsx4Imq+sgywyY2f33yTXj+ppK8ulv+ERZ/n8O/LBk2sfO3T74LOn/X61Xd8z1YvG/1BeBrwOeB13bbZ4A7u+V3AI+y+NMcjwI3r0Ou61h89f7rwIe6bYeA3d3yJcCngXngS8Ab13neRuX7Y+BEN2f3Az+1zvn+BvgG8B0W7+/eDNwC3NLtD4u/POXr3d/pzAbLt39g/h4A3rGO2X6RxVuPjwAPd4/rNsr89cw3yfm7EvhKl+8x4GC3fUOcvz3zrfj89a3/ktSIjXLLRZK0Sha6JDXCQpekRljoktQIC12SGmGhS1IjLHRJasT/A9EV43ZzUjM2AAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] } ] } \ No newline at end of file diff --git a/qgan.ipynb b/qgan.ipynb deleted file mode 100644 index 07b4d9616..000000000 --- a/qgan.ipynb +++ /dev/null @@ -1,988 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "qgan.ipynb", - "provenance": [], - "authorship_tag": "ABX9TyOX4sjMKPZJM1QBJQSL21l1", - "include_colab_link": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - } - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "view-in-github", - "colab_type": "text" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ldLDoEjQtx8g", - "colab_type": "text" - }, - "source": [ - "# Quantum Generative Adversarial Network (qGAN)\n", - "\n", - "Loading an arbitary random probability distribution into a n qubit quantum state normally requires $O(2^n)$ gates which in most algorithms will dominate the complexity of the quantum algorithm and make it useless. By using a qGAN this loading can be done in $O(poly(n))$ gates [[1](https://https://www.nature.com/articles/s41534-019-0223-2)]. \n", - "\n", - "A qGAN is a version of a [Generative Adversarial Network](https://papers.nips.cc/paper/5423-generative-adversarial-nets) with a quantum generator and a classical discriminator. The quantum generator is trained to transform a given n-qubit input into:\n", - "$$\n", - "\\sum_{j=0}^{2^n-1} \\sqrt{p^j_{\\theta}}\\left| j \\right\\rangle\n", - "$$\n", - "where $p^j_{\\theta}$ relate to the probabilty of the state $j$. The discriminator has to try and distinguish between the output of the generator and the training data set. The two networks train alternatively and will eventaully reach a nash equilibrium where the discriminator cannot tell apart the generator and the training set data. The aim of this process is for $p^j_{\\theta}$ to approximate the distribution of the training data.\n", - "\n", - "This tutorial will guide you through using a qGAN to load a lognormal distribution to a 2 qubit system." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "uwQzoKsCuSrY", - "colab_type": "text" - }, - "source": [ - "# Setup" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "u4g8Xz0auW9z", - "colab_type": "code", - "colab": {} - }, - "source": [ - "!pip install --upgrade tensorflow==2.1.0 tensorflow-quantum tensorflow-gan tensorflow-probability==0.9 tensorflow-datasets" - ], - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "fVNr2dGRvtFv", - "colab_type": "code", - "colab": {} - }, - "source": [ - "import tensorflow as tf\n", - "import tensorflow_quantum as tfq\n", - "import tensorflow_gan as tfg\n", - "\n", - "import cirq\n", - "import sympy\n", - "import numpy as np\n", - "import collections\n", - "import math\n", - "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "# Intialise qubits\n", - "num_qubits = 2 #@param\n", - "qubits = [cirq.GridQubit(x,0) for x in range(num_qubits)]\n" - ], - "execution_count": 31, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Wn7A2fP1KnQL", - "colab_type": "text" - }, - "source": [ - "# Load Training Data" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tOoK9Y-NKxSV", - "colab_type": "text" - }, - "source": [ - "Before building the model, you need to generate the training data set." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "gd3G6JxNOQe4", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def generate_data():\n", - " \"\"\"Generate training data for discriminator\n", - " \n", - " Bundles this with noise for generator to use\n", - " \"\"\"\n", - "\n", - " size = 1000 # Size of training data set\n", - "\n", - " # Take samples of lognormal distribution with mean = 1 and standard deviation =1\n", - " mu =1\n", - " sigma =1\n", - " continous_data = np.random.lognormal(mean=mu, sigma=sigma, size=size)\n", - " \n", - " # Remove all samples that lie outside the range expressible in the given number of qubits\n", - " continous_data = continous_data[continous_data <= 2**num_qubits-0.5]\n", - "\n", - " # Discretize the remaining samples so the continous distribution can be approximated by a discrete distribution\n", - " discrete_data = tf.convert_to_tensor(np.digitize(continous_data,[i - 0.5 for i in range(1,2**num_qubits)]),dtype=tf.dtypes.int32)\n", - "\n", - " # Convert the decimal into binary tensor\n", - " discrete_data = tf.cast(tf.math.mod(tf.bitwise.right_shift(tf.expand_dims(discrete_data,1), tf.range(num_qubits)), 2),dtype=tf.float32)\n", - " \n", - " # Intialise the same number of circuits as the discrete tensor to a uniform distribution by applying multiple hardardman gates\n", - " noise = []\n", - " for n in range(discrete_data.shape[0]):\n", - " noise.append(cirq.Circuit(cirq.Moment(cirq.H.on_each(qubits))))\n", - " noise = tfq.convert_to_tensor(noise)\n", - "\n", - " return noise, discrete_data\n", - "\n" - ], - "execution_count": 26, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tGhG-BIAVmCW", - "colab_type": "text" - }, - "source": [ - "# Quantum Generator\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "q8nF0dBAelvH", - "colab_type": "text" - }, - "source": [ - "Each layer of a quantum generator consists of a layer of parameterised $R_y$ rotations, and a layer of $CZ$ gates to entangle all the qubits.\n", - "\n", - "The quantum generator you will be using only is only one layer deep. To represent more complex structures a larger circuit depth would need to be used." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "2kVGCmeaV7nQ", - "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 358 - }, - "outputId": "98b4f238-d6a3-4513-c35f-66136974074d" - }, - "source": [ - "def quantum_generator_model(initial_distribution_tensor):\n", - " # Create parameters for each qubit\n", - " theta = sympy.symbols('a0:%d'%num_qubits)\n", - "\n", - " # Set the input to the network\n", - " inputs = tf.keras.Input(shape=(),dtype=tf.dtypes.string)\n", - "\n", - " # Create the parameterised Ry rotation layer circuit\n", - " parameterized_circuit = cirq.Circuit(cirq.Moment([cirq.ry(theta[i])(qubits[i]) for i in range(num_qubits)]))\n", - "\n", - " # Entangle all the qubits by applying CZ in a circular fashion - except when there are only two qubits and then just apply one CZ\n", - " entangle_circuit = cirq.Circuit()\n", - " if(num_qubits > 2):\n", - " for i in range(num_qubits):\n", - " entangle_circuit.append([cirq.CZ(qubits[i], qubits[(i + 1) % num_qubits])])\n", - " else:\n", - " entangle_circuit.append([cirq.CZ(qubits[0],qubits[1])])\n", - " \n", - " # Combine the parameterized circuit layer and the entanglement circuit layer\n", - " layer_circuit = parameterized_circuit + entangle_circuit\n", - " print(layer_circuit)\n", - "\n", - " # Add this circuit layer to the network with an output on measurements on in the Z component\n", - " # Manipulate the output so it maps the -1, 1 outputs to 0, 1 like the binary discrete data generated by generate_data\n", - " layer = tfq.layers.PQC(layer_circuit, [(cirq.Z(qubits[i])+1)/2 for i in range(num_qubits)], repetitions=1)(inputs) #Important to have repetition =1\n", - " model = tf.keras.Model(inputs=[inputs], outputs=[layer])\n", - "\n", - " #model.summary()\n", - "\n", - " return model(initial_distribution_tensor)\n", - "\n", - "# Test the quantum generator\n", - "noise, real_data = generate_data()\n", - "print(quantum_generator_model(noise))\n", - "print(real_data)" - ], - "execution_count": 27, - "outputs": [ - { - "output_type": "stream", - "text": [ - "(0, 0): ───Ry(a0)───@───────@───\n", - " │ │\n", - "(1, 0): ───Ry(a1)───@───@───┼───\n", - " │ │\n", - "(2, 0): ───Ry(a2)───────@───@───\n", - "tf.Tensor(\n", - "[[1. 0. 0.]\n", - " [0. 1. 0.]\n", - " [1. 1. 0.]\n", - " ...\n", - " [1. 0. 0.]\n", - " [1. 0. 0.]\n", - " [1. 0. 0.]], shape=(856, 3), dtype=float32)\n", - "tf.Tensor(\n", - "[[0. 0. 0.]\n", - " [1. 0. 0.]\n", - " [0. 1. 0.]\n", - " ...\n", - " [1. 0. 0.]\n", - " [0. 0. 1.]\n", - " [1. 1. 0.]], shape=(856, 3), dtype=float32)\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "NfzqbvDmR1m1", - "colab_type": "text" - }, - "source": [ - "## Generator Loss Function" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "7IgRsGmCR43s", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def generator_loss_function(gan_model):\n", - " # Function from https://www.nature.com/articles/s41534-019-0223-2\n", - " m = gan_model.discriminator_gen_outputs.shape[0]\n", - " sum = tf.math.reduce_sum(tf.math.log(gan_model.discriminator_gen_outputs))\n", - " sum = 1/m * sum\n", - " return sum" - ], - "execution_count": 19, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "w2Sh5UwR40fg", - "colab_type": "text" - }, - "source": [ - "# Discriminator" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4NQcpLm1KCCa", - "colab_type": "text" - }, - "source": [ - "The discriminator is a classical neural network. You will use a 3-layer network with 50 input nodes, 20 hidden nodes and 1 output nodes. The structure of the discriminator is picked so it is equally balanced with the generator by emperical methods (we have just used the same structure as https://www.nature.com/articles/s41534-019-0223-2)." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "DHHwHieb7QLj", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def discriminator_model(real_input, gen_inputs):\n", - " model = tf.keras.Sequential()\n", - " model.add(tf.keras.Input(shape=(num_qubits,)))\n", - " model.add(tf.keras.layers.Dense(50, activation=\"relu\"))\n", - " model.add(tf.keras.layers.Dense(20, activation=\"relu\"))\n", - " model.add(tf.keras.layers.Dense(1, activation=\"sigmoid\"))\n", - " #model.summary()\n", - " #print(real_input)\n", - " \n", - " return model(real_input)\n", - "\n", - "#discriminator = make_discriminator_model()\n", - "#tf.keras.utils.plot_model(discriminator,show_shapes=True, show_layer_names=False, dpi=70)" - ], - "execution_count": 20, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "S2lrCLuLMfFc", - "colab_type": "text" - }, - "source": [ - "## Discriminator loss function" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "ezQQLtBGMn2h", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def discriminator_loss_function(gan_model):\n", - " # function from https://www.nature.com/articles/s41534-019-0223-2\n", - " m = gan_model.discriminator_gen_outputs.shape[0]\n", - " sum = tf.math.reduce_sum(tf.math.log(gan_model.discriminator_real_outputs) + tf.math.log(1-gan_model.discriminator_gen_outputs))\n", - " sum = 1/m * sum\n", - " return sum" - ], - "execution_count": 21, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "EF4uYrrbLx-Z", - "colab_type": "text" - }, - "source": [ - "# Evaluate model" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "nNHvJtnEL2sP", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def get_eval_metric_ops_fn(gan_model):\n", - " real_data_logits = tf.reduce_mean(gan_model.discriminator_real_outputs)\n", - " gen_data_logits = tf.reduce_mean(gan_model.discriminator_gen_outputs)\n", - "\n", - " # Convert 2 bit binary tensor into single decimal tensor\n", - " sum_tensor = tf.reduce_sum(tf.map_fn(lambda t: t * 2 ** tf.range(tf.cast(gan_model.generated_data.shape[1], dtype=tf.int64)),\n", - " tf.cast(tf.reverse(tensor=gan_model.generated_data, axis=[1]), dtype=tf.int64)), axis=1)\n", - " \n", - " # Create labels to compare sum_tensor to so we can return the percentage of each result at every evaluation\n", - " zeros = tf.zeros(sum_tensor.shape)\n", - " ones = tf.ones(sum_tensor.shape)\n", - " twos = tf.ones(sum_tensor.shape) * 2\n", - " threes = tf.ones(sum_tensor.shape) * 3\n", - "\n", - " # Attempt to calculate entropy to see how accurate the network is (but this doesn't work yet - just gives nan)\n", - " cce = tf.keras.losses.CategoricalCrossentropy()\n", - " entropy = cce(gan_model.generated_data, gan_model.real_data)\n", - " return {\n", - " 'real_data_logits': tf.compat.v1.metrics.mean(real_data_logits),\n", - " 'gen_data_logits': tf.compat.v1.metrics.mean(gen_data_logits),\n", - " 'zeros': tf.compat.v1.metrics.accuracy(zeros,sum_tensor),\n", - " 'ones':tf.compat.v1.metrics.accuracy(ones,sum_tensor),\n", - " 'twos':tf.compat.v1.metrics.accuracy(twos,sum_tensor),\n", - " 'threes':tf.compat.v1.metrics.accuracy(threes,sum_tensor),\n", - " 'entropy':tf.compat.v1.metrics.mean(entropy),\n", - " }" - ], - "execution_count": 22, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "L82bU_YpLm-m", - "colab_type": "text" - }, - "source": [ - "# GANEstimator" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "Ayp5JoOqLrXX", - "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "outputId": "bc38a488-2ac6-4daa-fbf4-7ff2fd4b784c" - }, - "source": [ - "generator_lr = 0.001\n", - "discriminator_lr = 0.0002\n", - "\n", - "# Configure the GAN estimator with all the functions from above\n", - "gan_estimator = tfg.estimator.GANEstimator(generator_fn=quantum_generator_model,\n", - " discriminator_fn=discriminator_model,\n", - " generator_loss_fn=generator_loss_function,\n", - " discriminator_loss_fn=discriminator_loss_function,\n", - " generator_optimizer=tf.compat.v1.train.AdamOptimizer(generator_lr, 0.5),\n", - " discriminator_optimizer=tf.compat.v1.train.AdamOptimizer(discriminator_lr, 0.5),\n", - " get_eval_metric_ops_fn=get_eval_metric_ops_fn)\n", - "\n", - "steps_per_eval = 10 #@param\n", - "max_train_steps = 100 #@param\n", - "batches_for_eval_metrics = 10 #@param\n", - "\n", - "# Used to track metrics.\n", - "steps = []\n", - "real_logits, fake_logits = [], []\n", - "zeros, ones, twos, threes = [],[],[],[]\n", - "\n", - "cur_step = 0\n", - "start_time = time.time()\n", - "while cur_step < max_train_steps:\n", - " next_step = min(cur_step + steps_per_eval, max_train_steps)\n", - " gan_estimator.train(generate_data, max_steps=next_step)\n", - " steps_taken = next_step - cur_step\n", - " cur_step = next_step\n", - " \n", - " # Calculate some metrics.\n", - " metrics = gan_estimator.evaluate(generate_data, steps=batches_for_eval_metrics)\n", - " steps.append(cur_step)\n", - " real_logits.append(metrics['real_data_logits'])\n", - " fake_logits.append(metrics['gen_data_logits'])\n", - " print('Average discriminator output on Real: %.2f Fake: %.2f' % (\n", - " real_logits[-1], fake_logits[-1]))\n", - " plt.figure()\n", - " plt.bar(np.arange(0,4), [metrics['zeros'],metrics['ones'],metrics['twos'],metrics['threes']])\n", - " zeros.append(metrics['zeros'])\n", - " ones.append(metrics['ones'])\n", - " twos.append(metrics['twos'])\n", - " threes.append(metrics['threes'])\n", - " print(metrics['entropy'])\n", - "\n", - "plt.figure()\n", - "plt.plot(steps, zeros, steps, ones, steps, twos, steps, threes)\n" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "INFO:tensorflow:Using default config.\n", - "WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpjlrkso7q\n", - "INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpjlrkso7q', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true\n", - "graph_options {\n", - " rewrite_options {\n", - " meta_optimizer_iterations: ONE\n", - " }\n", - "}\n", - ", '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}\n", - "WARNING:tensorflow:Estimator's model_fn (._model_fn at 0x7fae7b7432f0>) includes params argument, but params are not passed to Estimator.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.321094, step = 0\n", - "INFO:tensorflow:Saving checkpoints for 10 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.3661062.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:49:52Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-10\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.92984s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:49:53\n", - "INFO:tensorflow:Saving dict for global step 10: discriminator_loss = -1.3667452, entropy = nan, gen_data_logits = 0.511203, generator_loss = -0.6710436, global_step = 10, loss = -1.3667452, ones = 0.0053333333, real_data_logits = 0.5217606, threes = 0.55733335, twos = 0.4335, zeros = 0.0038333333\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 10: /tmp/tmpjlrkso7q/model.ckpt-10\n", - "Average discriminator output on Real: 0.52 Fake: 0.51\n", - "nan\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-10\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 10 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.3706237, step = 10\n", - "INFO:tensorflow:Saving checkpoints for 20 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.4174153.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:49:59Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-20\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.99218s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:00\n", - "INFO:tensorflow:Saving dict for global step 20: discriminator_loss = -1.4193214, entropy = nan, gen_data_logits = 0.524186, generator_loss = -0.64598644, global_step = 20, loss = -1.4193214, ones = 0.0059322035, real_data_logits = 0.50851995, threes = 0.5622034, twos = 0.42762712, zeros = 0.004237288\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 20: /tmp/tmpjlrkso7q/model.ckpt-20\n", - "Average discriminator output on Real: 0.51 Fake: 0.52\n", - "nan\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-20\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 20 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.42323, step = 20\n", - "INFO:tensorflow:Saving checkpoints for 30 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.4711331.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:06Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-30\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.96922s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:07\n", - "INFO:tensorflow:Saving dict for global step 30: discriminator_loss = -1.4720995, entropy = nan, gen_data_logits = 0.537337, generator_loss = -0.62125856, global_step = 30, loss = -1.4720995, ones = 0.0067357514, real_data_logits = 0.49611425, threes = 0.5580311, twos = 0.4300518, zeros = 0.005181347\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 30: /tmp/tmpjlrkso7q/model.ckpt-30\n", - "Average discriminator output on Real: 0.50 Fake: 0.54\n", - "nan\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-30\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 30 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.4787662, step = 30\n", - "INFO:tensorflow:Saving checkpoints for 40 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.525995.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:13Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-40\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.97511s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:14\n", - "INFO:tensorflow:Saving dict for global step 40: discriminator_loss = -1.5259699, entropy = nan, gen_data_logits = 0.5501564, generator_loss = -0.5977688, global_step = 40, loss = -1.5259699, ones = 0.008373591, real_data_logits = 0.48356724, threes = 0.55152977, twos = 0.4347826, zeros = 0.0053140097\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 40: /tmp/tmpjlrkso7q/model.ckpt-40\n", - "Average discriminator output on Real: 0.48 Fake: 0.55\n", - "nan\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-40\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 40 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.5313491, step = 40\n", - "INFO:tensorflow:Saving checkpoints for 50 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.5814705.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:20Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-50\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.96375s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:21\n", - "INFO:tensorflow:Saving dict for global step 50: discriminator_loss = -1.5813547, entropy = nan, gen_data_logits = 0.56256807, generator_loss = -0.57556635, global_step = 50, loss = -1.5813547, ones = 0.007894737, real_data_logits = 0.4706164, threes = 0.53125, twos = 0.45427632, zeros = 0.0065789474\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 50: /tmp/tmpjlrkso7q/model.ckpt-50\n", - "Average discriminator output on Real: 0.47 Fake: 0.56\n", - "nan\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-50\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 50 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.5888276, step = 50\n", - "INFO:tensorflow:Saving checkpoints for 60 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.6451112.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:27Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-60\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.96454s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:28\n", - "INFO:tensorflow:Saving dict for global step 60: discriminator_loss = -1.6422592, entropy = nan, gen_data_logits = 0.57580954, generator_loss = -0.55242676, global_step = 60, loss = -1.6422592, ones = 0.0072847684, real_data_logits = 0.45681602, threes = 0.535596, twos = 0.452649, zeros = 0.004470199\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 60: /tmp/tmpjlrkso7q/model.ckpt-60\n", - "Average discriminator output on Real: 0.46 Fake: 0.58\n", - "nan\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-60\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 60 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.6509174, step = 60\n", - "INFO:tensorflow:Saving checkpoints for 70 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.709187.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:33Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-70\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 1.00544s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:34\n", - "INFO:tensorflow:Saving dict for global step 70: discriminator_loss = -1.7091427, entropy = nan, gen_data_logits = 0.59141445, generator_loss = -0.52594554, global_step = 70, loss = -1.7091427, ones = 0.00928, real_data_logits = 0.44395787, threes = 0.5432, twos = 0.4392, zeros = 0.00832\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 70: /tmp/tmpjlrkso7q/model.ckpt-70\n", - "Average discriminator output on Real: 0.44 Fake: 0.59\n", - "nan\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-70\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 70 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.7174889, step = 70\n", - "INFO:tensorflow:Saving checkpoints for 80 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.790208.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:40Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-80\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.98008s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:41\n", - "INFO:tensorflow:Saving dict for global step 80: discriminator_loss = -1.7832139, entropy = nan, gen_data_logits = 0.60673684, generator_loss = -0.50064135, global_step = 80, loss = -1.7832139, ones = 0.008952702, real_data_logits = 0.4287591, threes = 0.51317567, twos = 0.46976352, zeros = 0.008108108\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 80: /tmp/tmpjlrkso7q/model.ckpt-80\n", - "Average discriminator output on Real: 0.43 Fake: 0.61\n", - "nan\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-80\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 80 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.7944455, step = 80\n", - "INFO:tensorflow:Saving checkpoints for 90 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.8660104.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:47Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-90\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 1.00737s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:48\n", - "INFO:tensorflow:Saving dict for global step 90: discriminator_loss = -1.8626773, entropy = nan, gen_data_logits = 0.6255778, generator_loss = -0.47029623, global_step = 90, loss = -1.8626773, ones = 0.009298532, real_data_logits = 0.4165743, threes = 0.50522023, twos = 0.47553018, zeros = 0.009951061\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 90: /tmp/tmpjlrkso7q/model.ckpt-90\n", - "Average discriminator output on Real: 0.42 Fake: 0.63\n", - "nan\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-90\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 90 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.8747579, step = 90\n", - "INFO:tensorflow:Saving checkpoints for 100 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.9657041.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:54Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-100\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.95951s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:55\n", - "INFO:tensorflow:Saving dict for global step 100: discriminator_loss = -1.9677017, entropy = nan, gen_data_logits = 0.6510126, generator_loss = -0.43074673, global_step = 100, loss = -1.9677017, ones = 0.010296412, real_data_logits = 0.4033714, threes = 0.50031203, twos = 0.4778471, zeros = 0.011544461\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 100: /tmp/tmpjlrkso7q/model.ckpt-100\n", - "Average discriminator output on Real: 0.40 Fake: 0.65\n", - "nan\n" - ], - "name": "stdout" - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ]" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 32 - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - } - ] - } - ] -} \ No newline at end of file From dd5283530bb9b7aae18338035f6f444329d63da6 Mon Sep 17 00:00:00 2001 From: Oliver O'Brien Date: Tue, 25 Aug 2020 12:04:51 +0100 Subject: [PATCH 6/7] Updated version --- qgan.ipynb | 2644 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2644 insertions(+) create mode 100644 qgan.ipynb diff --git a/qgan.ipynb b/qgan.ipynb new file mode 100644 index 000000000..9488f58ac --- /dev/null +++ b/qgan.ipynb @@ -0,0 +1,2644 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "qgan.ipynb", + "provenance": [], + "authorship_tag": "ABX9TyPeqyBT5OtzJ8bOp2rTKI2y", + "include_colab_link": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ldLDoEjQtx8g", + "colab_type": "text" + }, + "source": [ + "# Quantum Generative Adversarial Network (qGAN)\n", + "\n", + "Loading an arbitrary random probability distribution into an n-qubit quantum state normally requires $O(2^n)$ gates which in most algorithms will dominate the complexity of the quantum algorithm and make it useless. By using a qGAN this loading can be done in $O(poly(n))$ gates [[1](https://https://www.nature.com/articles/s41534-019-0223-2)]. \n", + "\n", + "A qGAN is a quantum version of a [Generative Adversarial Network](https://papers.nips.cc/paper/5423-generative-adversarial-nets) with a quantum generator and a classical discriminator. The quantum generator is trained to transform a given n-qubit input into:\n", + "$$\n", + "\\sum_{j=0}^{2^n-1} \\sqrt{p^j_{\\theta}}\\left| j \\right\\rangle\n", + "$$\n", + "where $p^j_{\\theta}$ is the probabilty of the state $j$. The discriminator has to try and distinguish between the output of the generator and the training data set. The two networks train alternatively and will eventaully reach a nash equilibrium where the discriminator cannot tell apart the generator and the training set data. The aim of this process is for $p^j_{\\theta}$ to approximate the distribution of the training data.\n", + "\n", + "This tutorial will guide you through using a qGAN to load a lognormal distribution to a 2 qubit system." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uwQzoKsCuSrY", + "colab_type": "text" + }, + "source": [ + "# Setup" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "u4g8Xz0auW9z", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "0e451dc5-96c1-4ddb-8df1-979716b51dd1" + }, + "source": [ + "!pip install --upgrade tensorflow==2.1.0 tensorflow-quantum tensorflow-gan tensorflow-probability==0.9 tensorflow-datasets" + ], + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Collecting tensorflow==2.1.0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/85/d4/c0cd1057b331bc38b65478302114194bd8e1b9c2bbc06e300935c0e93d90/tensorflow-2.1.0-cp36-cp36m-manylinux2010_x86_64.whl (421.8MB)\n", + "\u001b[K |████████████████████████████████| 421.8MB 32kB/s \n", + "\u001b[?25hCollecting tensorflow-quantum\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/eb/76/766f7ef3f57abf1467bf1a591a5e6776f1166420a90ea05af9ca5e25d768/tensorflow_quantum-0.3.1-cp36-cp36m-manylinux2010_x86_64.whl (3.9MB)\n", + "\u001b[K |████████████████████████████████| 3.9MB 46.6MB/s \n", + "\u001b[?25hCollecting tensorflow-gan\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/0c/2e/62922111d7d50e1900e3030764743ea7735540ce103b3ab30fd5cd2d8a2b/tensorflow_gan-2.0.0-py2.py3-none-any.whl (365kB)\n", + "\u001b[K |████████████████████████████████| 368kB 41.4MB/s \n", + "\u001b[?25hCollecting tensorflow-probability==0.9\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/9b/ed/f587d64127bbb85e539f06a2aace1240b7b5c6b4267bea94f232230551a5/tensorflow_probability-0.9.0-py2.py3-none-any.whl (3.2MB)\n", + "\u001b[K |████████████████████████████████| 3.2MB 40.3MB/s \n", + "\u001b[?25hCollecting tensorflow-datasets\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/ca/c9/d97bdf931edbae9aebc767633d088bd674136d5fe7587ef693b7cb6a1883/tensorflow_datasets-3.2.1-py3-none-any.whl (3.4MB)\n", + "\u001b[K |████████████████████████████████| 3.4MB 48.3MB/s \n", + "\u001b[?25hRequirement already satisfied, skipping upgrade: six>=1.12.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.15.0)\n", + "Collecting keras-applications>=1.0.8\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/71/e3/19762fdfc62877ae9102edf6342d71b28fbfd9dea3d2f96a882ce099b03f/Keras_Applications-1.0.8-py3-none-any.whl (50kB)\n", + "\u001b[K |████████████████████████████████| 51kB 7.2MB/s \n", + "\u001b[?25hRequirement already satisfied, skipping upgrade: astor>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (0.8.1)\n", + "Requirement already satisfied, skipping upgrade: absl-py>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (0.9.0)\n", + "Requirement already satisfied, skipping upgrade: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (0.34.2)\n", + "Requirement already satisfied, skipping upgrade: wrapt>=1.11.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.12.1)\n", + "Requirement already satisfied, skipping upgrade: keras-preprocessing>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.1.2)\n", + "Requirement already satisfied, skipping upgrade: protobuf>=3.8.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (3.12.4)\n", + "Requirement already satisfied, skipping upgrade: termcolor>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.1.0)\n", + "Collecting tensorflow-estimator<2.2.0,>=2.1.0rc0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/18/90/b77c328a1304437ab1310b463e533fa7689f4bfc41549593056d812fab8e/tensorflow_estimator-2.1.0-py2.py3-none-any.whl (448kB)\n", + "\u001b[K |████████████████████████████████| 450kB 37.6MB/s \n", + "\u001b[?25hRequirement already satisfied, skipping upgrade: opt-einsum>=2.3.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (3.3.0)\n", + "Requirement already satisfied, skipping upgrade: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.31.0)\n", + "Collecting tensorboard<2.2.0,>=2.1.0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/d9/41/bbf49b61370e4f4d245d4c6051dfb6db80cec672605c91b1652ac8cc3d38/tensorboard-2.1.1-py3-none-any.whl (3.8MB)\n", + "\u001b[K |████████████████████████████████| 3.9MB 44.6MB/s \n", + "\u001b[?25hRequirement already satisfied, skipping upgrade: scipy==1.4.1; python_version >= \"3\" in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.4.1)\n", + "Requirement already satisfied, skipping upgrade: numpy<2.0,>=1.16.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.18.5)\n", + "Collecting gast==0.2.2\n", + " Downloading https://files.pythonhosted.org/packages/4e/35/11749bf99b2d4e3cceb4d55ca22590b0d7c2c62b9de38ac4a4a7f4687421/gast-0.2.2.tar.gz\n", + "Requirement already satisfied, skipping upgrade: google-pasta>=0.1.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (0.2.0)\n", + "Collecting sympy==1.4\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/21/21/f4105795ca7f35c541d82c5b06be684dd2f5cb4f508fb487cd7aea4de776/sympy-1.4-py2.py3-none-any.whl (5.3MB)\n", + "\u001b[K |████████████████████████████████| 5.3MB 37.9MB/s \n", + "\u001b[?25hCollecting pathos==0.2.5\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/c6/a2/cd59f73d5ede4f122687bf8f63de5d671c9561e493ca699241f05b038278/pathos-0.2.5.tar.gz (162kB)\n", + "\u001b[K |████████████████████████████████| 163kB 50.9MB/s \n", + "\u001b[?25hCollecting cirq==0.8.0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/b8/cf/d95635b4b0de2227956077687277426299883ccdb9e6418fa6e599893ea3/cirq-0.8.0-py3-none-any.whl (1.4MB)\n", + "\u001b[K |████████████████████████████████| 1.4MB 44.8MB/s \n", + "\u001b[?25hRequirement already satisfied, skipping upgrade: tensorflow-hub>=0.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gan) (0.8.0)\n", + "Requirement already satisfied, skipping upgrade: decorator in /usr/local/lib/python3.6/dist-packages (from tensorflow-probability==0.9) (4.4.2)\n", + "Requirement already satisfied, skipping upgrade: cloudpickle>=1.2.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow-probability==0.9) (1.3.0)\n", + "Requirement already satisfied, skipping upgrade: tensorflow-metadata in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (0.22.2)\n", + "Requirement already satisfied, skipping upgrade: requests>=2.19.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (2.23.0)\n", + "Requirement already satisfied, skipping upgrade: dill in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (0.3.2)\n", + "Requirement already satisfied, skipping upgrade: promise in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (2.3)\n", + "Requirement already satisfied, skipping upgrade: attrs>=18.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (19.3.0)\n", + "Requirement already satisfied, skipping upgrade: tqdm in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (4.41.1)\n", + "Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (0.16.0)\n", + "Requirement already satisfied, skipping upgrade: h5py in /usr/local/lib/python3.6/dist-packages (from keras-applications>=1.0.8->tensorflow==2.1.0) (2.10.0)\n", + "Requirement already satisfied, skipping upgrade: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.8.0->tensorflow==2.1.0) (49.2.0)\n", + "Requirement already satisfied, skipping upgrade: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (3.2.2)\n", + "Requirement already satisfied, skipping upgrade: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (1.0.1)\n", + "Requirement already satisfied, skipping upgrade: google-auth<2,>=1.6.3 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (1.17.2)\n", + "Requirement already satisfied, skipping upgrade: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (0.4.1)\n", + "Requirement already satisfied, skipping upgrade: mpmath>=0.19 in /usr/local/lib/python3.6/dist-packages (from sympy==1.4->tensorflow-quantum) (1.1.0)\n", + "Collecting ppft>=1.6.6.1\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/2b/fb/fa21f6e9aedc4823448473ed96e8eab64af1cb248c18165f045a90e1c6b4/ppft-1.6.6.2.zip (106kB)\n", + "\u001b[K |████████████████████████████████| 112kB 48.6MB/s \n", + "\u001b[?25hCollecting pox>=0.2.7\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/1a/0c/ec447fb0ed88bc1c09bf0dadf00e40ea05fda17e841d15bb351a52d9e192/pox-0.2.8.zip (128kB)\n", + "\u001b[K |████████████████████████████████| 133kB 48.6MB/s \n", + "\u001b[?25hRequirement already satisfied, skipping upgrade: multiprocess>=0.70.9 in /usr/local/lib/python3.6/dist-packages (from pathos==0.2.5->tensorflow-quantum) (0.70.10)\n", + "Requirement already satisfied, skipping upgrade: pandas in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (1.0.5)\n", + "Requirement already satisfied, skipping upgrade: dataclasses; python_version < \"3.7\" in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (0.7)\n", + "Requirement already satisfied, skipping upgrade: networkx~=2.4 in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (2.4)\n", + "Requirement already satisfied, skipping upgrade: matplotlib~=3.0 in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (3.2.2)\n", + "Requirement already satisfied, skipping upgrade: sortedcontainers~=2.0 in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (2.2.2)\n", + "Requirement already satisfied, skipping upgrade: typing-extensions in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (3.7.4.2)\n", + "Collecting freezegun~=0.3.15\n", + " Downloading https://files.pythonhosted.org/packages/17/5d/1b9d6d3c7995fff473f35861d674e0113a5f0bd5a72fe0199c3f254665c7/freezegun-0.3.15-py2.py3-none-any.whl\n", + "Requirement already satisfied, skipping upgrade: google-api-core[grpc]<2.0.0dev,>=1.14.0 in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (1.16.0)\n", + "Requirement already satisfied, skipping upgrade: googleapis-common-protos in /usr/local/lib/python3.6/dist-packages (from tensorflow-metadata->tensorflow-datasets) (1.52.0)\n", + "Requirement already satisfied, skipping upgrade: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow-datasets) (1.24.3)\n", + "Requirement already satisfied, skipping upgrade: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow-datasets) (2020.6.20)\n", + "Requirement already satisfied, skipping upgrade: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow-datasets) (2.10)\n", + "Requirement already satisfied, skipping upgrade: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow-datasets) (3.0.4)\n", + "Requirement already satisfied, skipping upgrade: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.6/dist-packages (from markdown>=2.6.8->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (1.7.0)\n", + "Requirement already satisfied, skipping upgrade: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (0.2.8)\n", + "Requirement already satisfied, skipping upgrade: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (4.1.1)\n", + "Requirement already satisfied, skipping upgrade: rsa<5,>=3.1.4; python_version >= \"3\" in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (4.6)\n", + "Requirement already satisfied, skipping upgrade: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (1.3.0)\n", + "Requirement already satisfied, skipping upgrade: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas->cirq==0.8.0->tensorflow-quantum) (2.8.1)\n", + "Requirement already satisfied, skipping upgrade: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas->cirq==0.8.0->tensorflow-quantum) (2018.9)\n", + "Requirement already satisfied, skipping upgrade: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib~=3.0->cirq==0.8.0->tensorflow-quantum) (2.4.7)\n", + "Requirement already satisfied, skipping upgrade: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib~=3.0->cirq==0.8.0->tensorflow-quantum) (1.2.0)\n", + "Requirement already satisfied, skipping upgrade: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib~=3.0->cirq==0.8.0->tensorflow-quantum) (0.10.0)\n", + "Requirement already satisfied, skipping upgrade: zipp>=0.5 in /usr/local/lib/python3.6/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (3.1.0)\n", + "Requirement already satisfied, skipping upgrade: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.6/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (0.4.8)\n", + "Requirement already satisfied, skipping upgrade: oauthlib>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (3.1.0)\n", + "Building wheels for collected packages: gast, pathos, ppft, pox\n", + " Building wheel for gast (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for gast: filename=gast-0.2.2-cp36-none-any.whl size=7540 sha256=2ad6cbdc07e51d75f24df6a3c5431e851f78bdf88af71c690910e7e848ef4f5e\n", + " Stored in directory: /root/.cache/pip/wheels/5c/2e/7e/a1d4d4fcebe6c381f378ce7743a3ced3699feb89bcfbdadadd\n", + " Building wheel for pathos (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for pathos: filename=pathos-0.2.5-cp36-none-any.whl size=77577 sha256=343c596b255ac0aacd0809ba6d675783772d715ee8822532e84af24239f89ebb\n", + " Stored in directory: /root/.cache/pip/wheels/61/6d/83/90b0c3d2c271da2c4850731e894798c98f8dbedbac74e8eff0\n", + " Building wheel for ppft (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for ppft: filename=ppft-1.6.6.2-cp36-none-any.whl size=64743 sha256=8f1da4f2e681b1565a8a86757300af1eb50de1cf1530f7308bb208d3f2827963\n", + " Stored in directory: /root/.cache/pip/wheels/db/d2/2d/0ee21ede61786bb13247dbc69079373fd500c2bb0481913084\n", + " Building wheel for pox (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for pox: filename=pox-0.2.8-cp36-none-any.whl size=28290 sha256=bf2b329588e208ed398a506e3f3f94fb45284cf1a70df4d8a0dd42e429525219\n", + " Stored in directory: /root/.cache/pip/wheels/39/ed/ce/a93103746b327e18bffaeb99ba0d57a88b392f31d719cea700\n", + "Successfully built gast pathos ppft pox\n", + "\u001b[31mERROR: cirq 0.8.0 has requirement protobuf==3.8.0, but you'll have protobuf 3.12.4 which is incompatible.\u001b[0m\n", + "Installing collected packages: keras-applications, tensorflow-estimator, tensorboard, gast, tensorflow, sympy, ppft, pox, pathos, freezegun, cirq, tensorflow-quantum, tensorflow-probability, tensorflow-gan, tensorflow-datasets\n", + " Found existing installation: tensorflow-estimator 2.3.0\n", + " Uninstalling tensorflow-estimator-2.3.0:\n", + " Successfully uninstalled tensorflow-estimator-2.3.0\n", + " Found existing installation: tensorboard 2.3.0\n", + " Uninstalling tensorboard-2.3.0:\n", + " Successfully uninstalled tensorboard-2.3.0\n", + " Found existing installation: gast 0.3.3\n", + " Uninstalling gast-0.3.3:\n", + " Successfully uninstalled gast-0.3.3\n", + " Found existing installation: tensorflow 2.3.0\n", + " Uninstalling tensorflow-2.3.0:\n", + " Successfully uninstalled tensorflow-2.3.0\n", + " Found existing installation: sympy 1.1.1\n", + " Uninstalling sympy-1.1.1:\n", + " Successfully uninstalled sympy-1.1.1\n", + " Found existing installation: tensorflow-probability 0.11.0\n", + " Uninstalling tensorflow-probability-0.11.0:\n", + " Successfully uninstalled tensorflow-probability-0.11.0\n", + " Found existing installation: tensorflow-datasets 2.1.0\n", + " Uninstalling tensorflow-datasets-2.1.0:\n", + " Successfully uninstalled tensorflow-datasets-2.1.0\n", + "Successfully installed cirq-0.8.0 freezegun-0.3.15 gast-0.2.2 keras-applications-1.0.8 pathos-0.2.5 pox-0.2.8 ppft-1.6.6.2 sympy-1.4 tensorboard-2.1.1 tensorflow-2.1.0 tensorflow-datasets-3.2.1 tensorflow-estimator-2.1.0 tensorflow-gan-2.0.0 tensorflow-probability-0.9.0 tensorflow-quantum-0.3.1\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "fVNr2dGRvtFv", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import tensorflow as tf\n", + "import tensorflow_quantum as tfq\n", + "import tensorflow_gan as tfg\n", + "\n", + "import cirq\n", + "import sympy\n", + "import numpy as np\n", + "import collections\n", + "import math\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Initialize qubits\n", + "num_qubits = 2#@param\n", + "qubits = [cirq.GridQubit(x,0) for x in range(num_qubits)]\n", + "num_of_samples = 100 # Size of training data set\n", + "sample_size = 50\n", + "tf.keras.backend.set_floatx('float32')\n" + ], + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Wn7A2fP1KnQL", + "colab_type": "text" + }, + "source": [ + "# Load Training Data" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tOoK9Y-NKxSV", + "colab_type": "text" + }, + "source": [ + "Before building the model, you need to generate the training data set." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "gd3G6JxNOQe4", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def generate_data():\n", + " \"\"\"Generate training data for discriminator\n", + " \n", + " Bundles this with noise for generator to use\n", + " \"\"\"\n", + "\n", + " # Take samples of lognormal distribution with mean = 1 \n", + " # and standard deviation =1\n", + " mu =1\n", + " sigma =1\n", + "\n", + " total = []\n", + " \n", + "\n", + " continuous_data = np.random.lognormal(\n", + " mean=mu, sigma=sigma, size=sample_size*num_of_samples)\n", + " \n", + " # Remove all samples that lie outside the range \n", + " # expressible in the given number of qubits\n", + " continuous_data = continuous_data[continuous_data < 2**num_qubits-0.5]\n", + "\n", + " # Crop the data so it is a multiple of the sample size\n", + " # This can cause problems if the sample size is very low (e.g. 1) as it can\n", + " # crop all the way to empty\n", + " continuous_data = continuous_data[:len(continuous_data)\n", + " //sample_size* sample_size]\n", + "\n", + " # Discretize the remaining data so the continuous distribution can be \n", + " # approximated by a discrete distribution\n", + " discrete_data = tf.convert_to_tensor(\n", + " np.around(continuous_data, decimals=0), dtype=tf.dtypes.float32)\n", + " \n", + " # Split the data into batches of the required sample size\n", + " batches = tf.reshape(\n", + " discrete_data,(len(continuous_data)//sample_size,sample_size))\n", + "\n", + " # Initialize the same number of circuits as the discrete tensor to a uniform \n", + " # distribution by applying multiple Hadamard gates\n", + " noise = tfq.convert_to_tensor(\n", + " [cirq.Circuit(\n", + " cirq.H.on_each(qubits)\n", + " ) for _ in range(len(continuous_data))])\n", + "\n", + " return noise, batches\n", + "\n" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tGhG-BIAVmCW", + "colab_type": "text" + }, + "source": [ + "# Quantum Generator\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "q8nF0dBAelvH", + "colab_type": "text" + }, + "source": [ + "Each layer of a quantum generator consists of a layer of parameterised $R_y$ rotations, and a layer of $CZ$ gates to entangle all the qubits.\n", + "\n", + "The quantum generator you will be using only is only one layer deep. To represent more complex structures a larger circuit depth would need to be used." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2kVGCmeaV7nQ", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 326 + }, + "outputId": "a98c7664-260a-4dfe-db10-ea02457e1a14" + }, + "source": [ + "def quantum_generator_model(initial_distribution_tensor):\n", + " # Create parameters for each qubit\n", + " theta = sympy.symbols(f'a0:{num_qubits}')\n", + "\n", + " # Set the input to the network\n", + " inputs = tf.keras.Input(shape=(), dtype=tf.dtypes.string)\n", + "\n", + " # Create the parameterised Ry rotation layer circuit\n", + " parameterized_circuit = cirq.Circuit(cirq.Moment(\n", + " [cirq.ry(t)(q) for t, q in zip(theta,qubits)]))\n", + "\n", + " # Entangle all the qubits by applying CZ in a circular fashion\n", + " # except when there are only two qubits and then just apply one CZ\n", + " entangle_circuit = cirq.Circuit(\n", + " [cirq.CZ(q1, q2) for q1, q2 in zip(qubits[0:-1], qubits[1:])])\n", + " if(num_qubits > 2):\n", + " entangle_circuit.append([cirq.CZ(qubits[0], qubits[-1])])\n", + " \n", + " # Combine the parameterized circuit layer and the entanglement circuit layer\n", + " layer_circuit = parameterized_circuit + entangle_circuit\n", + " print(layer_circuit)\n", + "\n", + " # Add this circuit layer to the network with the output configured\n", + " # to return a decimal value equivalent to the binary produced from the Z \n", + " # measurement with -1 mapping to 0, 1 mapping to 1\n", + " observable = sum((cirq.Z(qubits[i])+1)/2*2**i for i in range(num_qubits))\n", + " # Repetitions is set to 1 so integers are output, rather than averages\n", + " layer = tfq.layers.PQC(layer_circuit, observable , repetitions=1)(inputs)\n", + " \n", + " model = tf.keras.Model(inputs=[inputs], outputs=[layer])\n", + " #model.summary()\n", + " return tf.cast(tf.reshape(\n", + " model(initial_distribution_tensor),\n", + " (initial_distribution_tensor.shape[0] // sample_size,\n", + " sample_size)),dtype=tf.float32)\n", + "\n", + "# Test the quantum generator\n", + "noise, real_data = generate_data()\n", + "data = quantum_generator_model(noise)\n", + "print(data)\n", + "print(real_data)" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "tf.Tensor(\n", + "[[0. 2. 1. ... 0. 2. 1.]\n", + " [0. 0. 1. ... 1. 1. 1.]\n", + " [0. 1. 1. ... 0. 1. 1.]\n", + " ...\n", + " [1. 1. 1. ... 1. 1. 1.]\n", + " [1. 1. 3. ... 2. 1. 1.]\n", + " [3. 1. 1. ... 1. 0. 2.]], shape=(598, 50), dtype=float32)\n", + "tf.Tensor(\n", + "[[2. 3. 0. ... 2. 2. 3.]\n", + " [3. 3. 1. ... 1. 3. 1.]\n", + " [1. 2. 0. ... 3. 3. 3.]\n", + " ...\n", + " [1. 3. 2. ... 3. 3. 1.]\n", + " [1. 3. 3. ... 1. 1. 3.]\n", + " [3. 1. 1. ... 2. 1. 2.]], shape=(598, 50), dtype=float32)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "w2Sh5UwR40fg", + "colab_type": "text" + }, + "source": [ + "# Discriminator" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4NQcpLm1KCCa", + "colab_type": "text" + }, + "source": [ + "The discriminator is a classical neural network. You will use a 3-layer network with an input layer, a hidden layer with 50 hidden nodes, a hidden layer with 20 hidden nodes and 1 output node. The structure of the discriminator is picked so it is equally balanced with the generator by emperical methods (we have just used the same structure as https://www.nature.com/articles/s41534-019-0223-2)." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "DHHwHieb7QLj", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "535d3188-7104-42f0-e703-a0d0e72e3c0b" + }, + "source": [ + "def discriminator_model(real_input, gen_inputs):\n", + " \n", + " model = tf.keras.Sequential()\n", + " model.add(tf.keras.Input(shape=(sample_size,)))\n", + " model.add(tf.keras.layers.Dense(20, activation=\"relu\"))\n", + " model.add(tf.keras.layers.Dense(1, activation=\"sigmoid\"))\n", + " #model.summary()\n", + " print(real_input)\n", + " \n", + " return model(real_input)\n", + "\n", + "d1 = discriminator_model(data, noise)\n", + "print(d1)\n", + "d2 = discriminator_model(real_data, noise)\n", + "print(d2)" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "text": [ + "tf.Tensor(\n", + "[[0. 2. 1. ... 0. 2. 1.]\n", + " [0. 0. 1. ... 1. 1. 1.]\n", + " [0. 1. 1. ... 0. 1. 1.]\n", + " ...\n", + " [1. 1. 1. ... 1. 1. 1.]\n", + " [1. 1. 3. ... 2. 1. 1.]\n", + " [3. 1. 1. ... 1. 0. 2.]], shape=(598, 50), dtype=float32)\n", + "tf.Tensor(\n", + "[[0.04196338]\n", + " [0.27266592]\n", + " [0.20387009]\n", + " [0.10551755]\n", + " [0.33895066]\n", + " [0.5607761 ]\n", + " [0.01904764]\n", + " [0.5698652 ]\n", + " [0.06592283]\n", + " [0.17044581]\n", + " [0.10697818]\n", + " [0.29591376]\n", + " [0.11277947]\n", + " [0.14306422]\n", + " [0.278469 ]\n", + " [0.17531624]\n", + " [0.39308968]\n", + " [0.09315131]\n", + " [0.29625157]\n", + " [0.15907799]\n", + " [0.2871086 ]\n", + " [0.12121072]\n", + " [0.3500702 ]\n", + " [0.3817374 ]\n", + " [0.20325089]\n", + " [0.3309933 ]\n", + " [0.01982394]\n", + " [0.13464607]\n", + " [0.20136324]\n", + " [0.21777107]\n", + " [0.11375783]\n", + " [0.09663168]\n", + " [0.16167657]\n", + " [0.3930824 ]\n", + " [0.23511837]\n", + " [0.17967328]\n", + " [0.15124165]\n", + " [0.14190216]\n", + " [0.3723028 ]\n", + " [0.21404546]\n", + " [0.24877833]\n", + " [0.16717948]\n", + " [0.1358577 ]\n", + " [0.20491494]\n", + " [0.22274303]\n", + " [0.07413235]\n", + " [0.11708534]\n", + " [0.30987257]\n", + " [0.12337372]\n", + " [0.20173752]\n", + " [0.06520469]\n", + " [0.5435832 ]\n", + " [0.10337945]\n", + " [0.23658587]\n", + " [0.16840404]\n", + " [0.5805596 ]\n", + " [0.36362392]\n", + " [0.11897162]\n", + " [0.07900479]\n", + " [0.19759305]\n", + " [0.09132273]\n", + " [0.2922706 ]\n", + " [0.16292569]\n", + " [0.20711577]\n", + " [0.15527584]\n", + " [0.24857406]\n", + " [0.42944127]\n", + " [0.08555594]\n", + " [0.31653142]\n", + " [0.11382154]\n", + " [0.27301946]\n", + " [0.3312118 ]\n", + " [0.12812293]\n", + " [0.09796012]\n", + " [0.14760566]\n", + " [0.18759163]\n", + " [0.5132539 ]\n", + " [0.25072643]\n", + " [0.22716676]\n", + " [0.09929606]\n", + " [0.17957759]\n", + " [0.21764185]\n", + " [0.21378581]\n", + " [0.2936371 ]\n", + " [0.33228248]\n", + " [0.3479959 ]\n", + " [0.28782567]\n", + " [0.53356403]\n", + " [0.13577795]\n", + " [0.18961726]\n", + " [0.24788024]\n", + " [0.3533282 ]\n", + " [0.2546042 ]\n", + " [0.20243661]\n", + " [0.2862381 ]\n", + " [0.08501486]\n", + " [0.07385254]\n", + " [0.21679498]\n", + " [0.16410054]\n", + " [0.32516328]\n", + " [0.05822 ]\n", + " [0.11608237]\n", + " [0.3578469 ]\n", + " [0.22392389]\n", + " [0.34429163]\n", + " [0.10261083]\n", + " [0.2088847 ]\n", + " [0.30106467]\n", + " [0.45299026]\n", + " [0.49620607]\n", + " [0.20326409]\n", + " [0.06778032]\n", + " [0.7153322 ]\n", + " [0.30489525]\n", + " [0.16668092]\n", + " [0.22238383]\n", + " [0.0691215 ]\n", + " [0.01659771]\n", + " [0.30600655]\n", + " [0.36269993]\n", + " [0.29198226]\n", + " [0.41954267]\n", + " [0.26866135]\n", + " [0.21288632]\n", + " [0.14493528]\n", + " [0.14216948]\n", + " [0.29651895]\n", + " [0.27291197]\n", + " [0.20239069]\n", + " [0.35704246]\n", + " [0.5428234 ]\n", + " [0.2600717 ]\n", + " [0.21347351]\n", + " [0.2968389 ]\n", + " [0.09215328]\n", + " [0.35460672]\n", + " [0.23257974]\n", + " [0.26780102]\n", + " [0.04146734]\n", + " [0.2559512 ]\n", + " [0.6137853 ]\n", + " [0.09937537]\n", + " [0.35039848]\n", + " [0.13428591]\n", + " [0.5188672 ]\n", + " [0.4413665 ]\n", + " [0.5276289 ]\n", + " [0.26431334]\n", + " [0.36197078]\n", + " [0.15760385]\n", + " [0.27921703]\n", + " [0.05298775]\n", + " [0.4846103 ]\n", + " [0.05334086]\n", + " [0.18913414]\n", + " [0.46737018]\n", + " [0.15556085]\n", + " [0.28005055]\n", + " [0.08902469]\n", + " [0.07966176]\n", + " [0.12418076]\n", + " [0.46383002]\n", + " [0.17478414]\n", + " [0.25536498]\n", + " [0.09822258]\n", + " [0.10366845]\n", + " [0.23505408]\n", + " [0.5360304 ]\n", + " [0.17596556]\n", + " [0.22558813]\n", + " [0.07362123]\n", + " [0.02400539]\n", + " [0.66499877]\n", + " [0.22945385]\n", + " [0.10318703]\n", + " [0.0573759 ]\n", + " [0.15454674]\n", + " [0.34921587]\n", + " [0.1442583 ]\n", + " [0.22983047]\n", + " [0.2714374 ]\n", + " [0.30758095]\n", + " [0.18718617]\n", + " [0.19894713]\n", + " [0.20480075]\n", + " [0.09426221]\n", + " [0.2495385 ]\n", + " [0.19955698]\n", + " [0.23072147]\n", + " [0.20177914]\n", + " [0.28022075]\n", + " [0.14812301]\n", + " [0.4967185 ]\n", + " [0.0834794 ]\n", + " [0.28931916]\n", + " [0.38114804]\n", + " [0.5260778 ]\n", + " [0.30080977]\n", + " [0.333921 ]\n", + " [0.5146654 ]\n", + " [0.39540526]\n", + " [0.35677415]\n", + " [0.05867711]\n", + " [0.14411446]\n", + " [0.22264235]\n", + " [0.2521497 ]\n", + " [0.18305856]\n", + " [0.05115403]\n", + " [0.05842955]\n", + " [0.3428932 ]\n", + " [0.20221955]\n", + " [0.12698591]\n", + " [0.09053931]\n", + " [0.43108705]\n", + " [0.05923652]\n", + " [0.1732673 ]\n", + " [0.23359935]\n", + " [0.20609319]\n", + " [0.12625048]\n", + " [0.15840346]\n", + " [0.17453499]\n", + " [0.29175007]\n", + " [0.26664305]\n", + " [0.18714043]\n", + " [0.2999413 ]\n", + " [0.2264876 ]\n", + " [0.15357219]\n", + " [0.17315981]\n", + " [0.15065736]\n", + " [0.23067361]\n", + " [0.2469291 ]\n", + " [0.21044287]\n", + " [0.21314237]\n", + " [0.20511949]\n", + " [0.3538142 ]\n", + " [0.49692377]\n", + " [0.23420133]\n", + " [0.17143868]\n", + " [0.14640422]\n", + " [0.20905313]\n", + " [0.20226274]\n", + " [0.09016147]\n", + " [0.33379847]\n", + " [0.16767494]\n", + " [0.20347783]\n", + " [0.5059603 ]\n", + " [0.15795374]\n", + " [0.2572828 ]\n", + " [0.41002694]\n", + " [0.16238885]\n", + " [0.14137325]\n", + " [0.06370486]\n", + " [0.21260238]\n", + " [0.1645925 ]\n", + " [0.47247514]\n", + " [0.34375778]\n", + " [0.38453177]\n", + " [0.23575582]\n", + " [0.25774348]\n", + " [0.04792204]\n", + " [0.569437 ]\n", + " [0.2955854 ]\n", + " [0.27705386]\n", + " [0.10557642]\n", + " [0.20393282]\n", + " [0.14561383]\n", + " [0.05324625]\n", + " [0.22931498]\n", + " [0.15958767]\n", + " [0.3626034 ]\n", + " [0.13262722]\n", + " [0.1618069 ]\n", + " [0.2540402 ]\n", + " [0.16565791]\n", + " [0.27463427]\n", + " [0.2831662 ]\n", + " [0.14039251]\n", + " [0.20909214]\n", + " [0.07961019]\n", + " [0.16831307]\n", + " [0.10632644]\n", + " [0.25511187]\n", + " [0.09688626]\n", + " [0.20517573]\n", + " [0.11844373]\n", + " [0.20770128]\n", + " [0.14695282]\n", + " [0.31517062]\n", + " [0.22533385]\n", + " [0.24190234]\n", + " [0.16312993]\n", + " [0.16552967]\n", + " [0.4888069 ]\n", + " [0.16425274]\n", + " [0.38187623]\n", + " [0.1650453 ]\n", + " [0.14045842]\n", + " [0.06928426]\n", + " [0.22263008]\n", + " [0.5264675 ]\n", + " [0.28602433]\n", + " [0.52334535]\n", + " [0.02883768]\n", + " [0.24169372]\n", + " [0.07624766]\n", + " [0.31751004]\n", + " [0.2381358 ]\n", + " [0.14546728]\n", + " [0.31778744]\n", + " [0.33224759]\n", + " [0.3875114 ]\n", + " [0.5812336 ]\n", + " [0.1248336 ]\n", + " [0.33186853]\n", + " [0.08693488]\n", + " [0.1027406 ]\n", + " [0.20401256]\n", + " [0.16501682]\n", + " [0.257053 ]\n", + " [0.2999533 ]\n", + " [0.1880433 ]\n", + " [0.4551139 ]\n", + " [0.08139996]\n", + " [0.24146016]\n", + " [0.03616939]\n", + " [0.14949146]\n", + " [0.07616481]\n", + " [0.19771416]\n", + " [0.18213002]\n", + " [0.25529233]\n", + " [0.21642266]\n", + " [0.32596007]\n", + " [0.06352209]\n", + " [0.14417818]\n", + " [0.24210833]\n", + " [0.31664437]\n", + " [0.54726255]\n", + " [0.24967906]\n", + " [0.12247737]\n", + " [0.02382281]\n", + " [0.2465969 ]\n", + " [0.33479652]\n", + " [0.53202474]\n", + " [0.37575385]\n", + " [0.07474129]\n", + " [0.08552162]\n", + " [0.14891662]\n", + " [0.25678536]\n", + " [0.08189192]\n", + " [0.08045605]\n", + " [0.2407956 ]\n", + " [0.42066586]\n", + " [0.11638436]\n", + " [0.3459558 ]\n", + " [0.37828517]\n", + " [0.322379 ]\n", + " [0.14576693]\n", + " [0.24561949]\n", + " [0.3985174 ]\n", + " [0.14532189]\n", + " [0.18124813]\n", + " [0.17489175]\n", + " [0.2156855 ]\n", + " [0.30889946]\n", + " [0.14050354]\n", + " [0.17264499]\n", + " [0.20653333]\n", + " [0.4559961 ]\n", + " [0.06637115]\n", + " [0.1834941 ]\n", + " [0.36058605]\n", + " [0.28912166]\n", + " [0.369655 ]\n", + " [0.17515448]\n", + " [0.24777527]\n", + " [0.28620407]\n", + " [0.43685597]\n", + " [0.07065373]\n", + " [0.27370307]\n", + " [0.20748658]\n", + " [0.17665856]\n", + " [0.41364956]\n", + " [0.2475368 ]\n", + " [0.15191613]\n", + " [0.1673217 ]\n", + " [0.36673826]\n", + " [0.11719473]\n", + " [0.2842986 ]\n", + " [0.54968727]\n", + " [0.31903666]\n", + " [0.11326081]\n", + " [0.37971175]\n", + " [0.20474686]\n", + " [0.50539595]\n", + " [0.35092223]\n", + " [0.25941768]\n", + " [0.08607735]\n", + " [0.19609231]\n", + " [0.2408513 ]\n", + " [0.17480162]\n", + " [0.31879988]\n", + " [0.49730992]\n", + " [0.22114252]\n", + " [0.12075013]\n", + " [0.32476375]\n", + " [0.25239417]\n", + " [0.17155732]\n", + " [0.14845702]\n", + " [0.03558386]\n", + " [0.35078603]\n", + " [0.25448224]\n", + " [0.26713368]\n", + " [0.2843436 ]\n", + " [0.44375214]\n", + " [0.19955687]\n", + " [0.0954298 ]\n", + " [0.2542985 ]\n", + " [0.13361049]\n", + " [0.38135955]\n", + " [0.06391115]\n", + " [0.65258795]\n", + " [0.21519053]\n", + " [0.19181447]\n", + " [0.23294452]\n", + " [0.07242561]\n", + " [0.0778003 ]\n", + " [0.16877253]\n", + " [0.24931924]\n", + " [0.08310208]\n", + " [0.19791771]\n", + " [0.07280671]\n", + " [0.25628674]\n", + " [0.34585625]\n", + " [0.28831047]\n", + " [0.24650058]\n", + " [0.17257272]\n", + " [0.21304518]\n", + " [0.21622375]\n", + " [0.39263085]\n", + " [0.03938529]\n", + " [0.18365335]\n", + " [0.15527907]\n", + " [0.30346307]\n", + " [0.49784225]\n", + " [0.15342298]\n", + " [0.23868872]\n", + " [0.28039926]\n", + " [0.13138989]\n", + " [0.19770853]\n", + " [0.2037362 ]\n", + " [0.21072417]\n", + " [0.08982147]\n", + " [0.2661378 ]\n", + " [0.16485366]\n", + " [0.27717093]\n", + " [0.1909351 ]\n", + " [0.21820287]\n", + " [0.10254977]\n", + " [0.42412156]\n", + " [0.04674362]\n", + " [0.33249056]\n", + " [0.3499401 ]\n", + " [0.14735359]\n", + " [0.5039261 ]\n", + " [0.20162386]\n", + " [0.1673276 ]\n", + " [0.11144502]\n", + " [0.21589693]\n", + " [0.22901464]\n", + " [0.19643717]\n", + " [0.2680652 ]\n", + " [0.30890402]\n", + " [0.21406654]\n", + " [0.16533034]\n", + " [0.06075254]\n", + " [0.24708393]\n", + " [0.2639951 ]\n", + " [0.28149787]\n", + " [0.11919478]\n", + " [0.24682243]\n", + " [0.14861739]\n", + " [0.19917142]\n", + " [0.41258243]\n", + " [0.1799623 ]\n", + " [0.5735443 ]\n", + " [0.16717482]\n", + " [0.26629344]\n", + " [0.11048511]\n", + " [0.4952673 ]\n", + " [0.4526377 ]\n", + " [0.19535977]\n", + " [0.06626617]\n", + " [0.33475742]\n", + " [0.06720635]\n", + " [0.08385573]\n", + " [0.1121798 ]\n", + " [0.31087905]\n", + " [0.12289668]\n", + " [0.15838534]\n", + " [0.27525762]\n", + " [0.19710286]\n", + " [0.02224989]\n", + " [0.1643247 ]\n", + " [0.18117583]\n", + " [0.10004789]\n", + " [0.3126958 ]\n", + " [0.5073968 ]\n", + " [0.06604595]\n", + " [0.23116034]\n", + " [0.26035616]\n", + " [0.547022 ]\n", + " [0.32462084]\n", + " [0.17698197]\n", + " [0.19240218]\n", + " [0.38143814]\n", + " [0.14820035]\n", + " [0.26924554]\n", + " [0.15207438]\n", + " [0.17088087]\n", + " [0.07925367]\n", + " [0.26647896]\n", + " [0.18787514]\n", + " [0.27638745]\n", + " [0.08865101]\n", + " [0.05531118]\n", + " [0.24228154]\n", + " [0.19018891]\n", + " [0.15765657]\n", + " [0.0786178 ]\n", + " [0.48079845]\n", + " [0.3999899 ]\n", + " [0.10195612]\n", + " [0.2854506 ]\n", + " [0.19202003]\n", + " [0.19121581]\n", + " [0.15751633]\n", + " [0.46584582]\n", + " [0.16630237]\n", + " [0.30417612]\n", + " [0.15639372]\n", + " [0.33175594]\n", + " [0.16355573]\n", + " [0.44345146]\n", + " [0.20871682]\n", + " [0.12381209]\n", + " [0.18935768]\n", + " [0.3908467 ]\n", + " [0.39171422]\n", + " [0.11608682]\n", + " [0.32409567]\n", + " [0.30906728]\n", + " [0.19744052]\n", + " [0.11891425]\n", + " [0.08129691]\n", + " [0.40198848]\n", + " [0.32710394]\n", + " [0.22634101]\n", + " [0.52401453]\n", + " [0.21226768]\n", + " [0.3429694 ]\n", + " [0.25928158]\n", + " [0.28640515]\n", + " [0.08866087]\n", + " [0.3528072 ]\n", + " [0.26521546]\n", + " [0.12900673]\n", + " [0.14514545]\n", + " [0.39863023]\n", + " [0.12124092]\n", + " [0.42681038]\n", + " [0.18479452]\n", + " [0.43985346]\n", + " [0.17029096]\n", + " [0.27200192]\n", + " [0.07560325]\n", + " [0.20954564]\n", + " [0.31230366]\n", + " [0.41816765]\n", + " [0.2439235 ]\n", + " [0.23260842]\n", + " [0.05858685]\n", + " [0.14346725]\n", + " [0.21496671]\n", + " [0.03333722]\n", + " [0.12495941]\n", + " [0.14928788]\n", + " [0.17594676]\n", + " [0.31654304]\n", + " [0.07051434]\n", + " [0.33569866]\n", + " [0.12206015]\n", + " [0.49229306]\n", + " [0.41293693]\n", + " [0.44663113]\n", + " [0.20950605]\n", + " [0.10715698]\n", + " [0.25055453]\n", + " [0.17048258]], shape=(598, 1), dtype=float32)\n", + "tf.Tensor(\n", + "[[2. 3. 0. ... 2. 2. 3.]\n", + " [3. 3. 1. ... 1. 3. 1.]\n", + " [1. 2. 0. ... 3. 3. 3.]\n", + " ...\n", + " [1. 3. 2. ... 3. 3. 1.]\n", + " [1. 3. 3. ... 1. 1. 3.]\n", + " [3. 1. 1. ... 2. 1. 2.]], shape=(598, 50), dtype=float32)\n", + "tf.Tensor(\n", + "[[0.9777599 ]\n", + " [0.9863303 ]\n", + " [0.9863275 ]\n", + " [0.9840344 ]\n", + " [0.8239314 ]\n", + " [0.9940065 ]\n", + " [0.8922725 ]\n", + " [0.999403 ]\n", + " [0.99125004]\n", + " [0.8953877 ]\n", + " [0.9940084 ]\n", + " [0.9532425 ]\n", + " [0.91427076]\n", + " [0.98880184]\n", + " [0.8724105 ]\n", + " [0.9005273 ]\n", + " [0.99594456]\n", + " [0.9922369 ]\n", + " [0.94222546]\n", + " [0.9963691 ]\n", + " [0.9912498 ]\n", + " [0.9392533 ]\n", + " [0.9229871 ]\n", + " [0.9725041 ]\n", + " [0.9960542 ]\n", + " [0.99135244]\n", + " [0.94842684]\n", + " [0.98254573]\n", + " [0.9071129 ]\n", + " [0.99438715]\n", + " [0.987165 ]\n", + " [0.9306451 ]\n", + " [0.9453016 ]\n", + " [0.95491266]\n", + " [0.9953276 ]\n", + " [0.970555 ]\n", + " [0.99884534]\n", + " [0.9783959 ]\n", + " [0.9479516 ]\n", + " [0.9747959 ]\n", + " [0.99654573]\n", + " [0.9210691 ]\n", + " [0.96842146]\n", + " [0.99192894]\n", + " [0.98199445]\n", + " [0.90674204]\n", + " [0.83208627]\n", + " [0.8270503 ]\n", + " [0.98264676]\n", + " [0.97583485]\n", + " [0.9943528 ]\n", + " [0.9679588 ]\n", + " [0.99765885]\n", + " [0.9971564 ]\n", + " [0.9989907 ]\n", + " [0.9916459 ]\n", + " [0.984278 ]\n", + " [0.99109674]\n", + " [0.9808295 ]\n", + " [0.9887 ]\n", + " [0.9884405 ]\n", + " [0.998538 ]\n", + " [0.96653104]\n", + " [0.96877915]\n", + " [0.9922806 ]\n", + " [0.9813571 ]\n", + " [0.8007392 ]\n", + " [0.7364327 ]\n", + " [0.994499 ]\n", + " [0.99700874]\n", + " [0.97632897]\n", + " [0.990324 ]\n", + " [0.9779218 ]\n", + " [0.9763188 ]\n", + " [0.95736593]\n", + " [0.99657637]\n", + " [0.9324984 ]\n", + " [0.9953589 ]\n", + " [0.99449474]\n", + " [0.96582365]\n", + " [0.9971596 ]\n", + " [0.99528706]\n", + " [0.96220684]\n", + " [0.99656063]\n", + " [0.99256223]\n", + " [0.95945334]\n", + " [0.9983317 ]\n", + " [0.9086087 ]\n", + " [0.98994243]\n", + " [0.9860218 ]\n", + " [0.9811483 ]\n", + " [0.9553281 ]\n", + " [0.9784676 ]\n", + " [0.9655916 ]\n", + " [0.98192734]\n", + " [0.9985701 ]\n", + " [0.99448305]\n", + " [0.9241972 ]\n", + " [0.99939394]\n", + " [0.991117 ]\n", + " [0.99153674]\n", + " [0.8028728 ]\n", + " [0.9891685 ]\n", + " [0.96327865]\n", + " [0.9630788 ]\n", + " [0.9894051 ]\n", + " [0.98917025]\n", + " [0.99748516]\n", + " [0.9941123 ]\n", + " [0.975997 ]\n", + " [0.99663395]\n", + " [0.92264307]\n", + " [0.99574006]\n", + " [0.9820983 ]\n", + " [0.9989594 ]\n", + " [0.8531755 ]\n", + " [0.99879456]\n", + " [0.97140425]\n", + " [0.97094846]\n", + " [0.9884643 ]\n", + " [0.99798286]\n", + " [0.98691505]\n", + " [0.99822146]\n", + " [0.97236055]\n", + " [0.9811528 ]\n", + " [0.99690115]\n", + " [0.82486504]\n", + " [0.99475056]\n", + " [0.9992668 ]\n", + " [0.9933828 ]\n", + " [0.96602607]\n", + " [0.8932046 ]\n", + " [0.98856944]\n", + " [0.9960951 ]\n", + " [0.9341425 ]\n", + " [0.99837166]\n", + " [0.93498296]\n", + " [0.99180496]\n", + " [0.9807356 ]\n", + " [0.9980598 ]\n", + " [0.9796037 ]\n", + " [0.92678374]\n", + " [0.9793305 ]\n", + " [0.987591 ]\n", + " [0.99503505]\n", + " [0.9988784 ]\n", + " [0.99335396]\n", + " [0.97802347]\n", + " [0.9722519 ]\n", + " [0.9125066 ]\n", + " [0.8964589 ]\n", + " [0.98640984]\n", + " [0.9686915 ]\n", + " [0.9978162 ]\n", + " [0.91813624]\n", + " [0.99645376]\n", + " [0.9920183 ]\n", + " [0.99983287]\n", + " [0.8925005 ]\n", + " [0.9978204 ]\n", + " [0.99924505]\n", + " [0.9894785 ]\n", + " [0.89713067]\n", + " [0.9913394 ]\n", + " [0.9960069 ]\n", + " [0.9949774 ]\n", + " [0.71827006]\n", + " [0.99683326]\n", + " [0.99135673]\n", + " [0.99712425]\n", + " [0.9572756 ]\n", + " [0.9993506 ]\n", + " [0.9978801 ]\n", + " [0.9995074 ]\n", + " [0.9905702 ]\n", + " [0.9231906 ]\n", + " [0.98951143]\n", + " [0.7717949 ]\n", + " [0.92293733]\n", + " [0.9967217 ]\n", + " [0.7655146 ]\n", + " [0.9584887 ]\n", + " [0.99363106]\n", + " [0.9910883 ]\n", + " [0.96778464]\n", + " [0.98796797]\n", + " [0.9874072 ]\n", + " [0.8671845 ]\n", + " [0.9923649 ]\n", + " [0.99690706]\n", + " [0.99395233]\n", + " [0.98612845]\n", + " [0.93725884]\n", + " [0.9927187 ]\n", + " [0.9883956 ]\n", + " [0.9536047 ]\n", + " [0.9971475 ]\n", + " [0.9873351 ]\n", + " [0.9841576 ]\n", + " [0.9501855 ]\n", + " [0.9016285 ]\n", + " [0.98901165]\n", + " [0.99162394]\n", + " [0.985911 ]\n", + " [0.9994116 ]\n", + " [0.9840099 ]\n", + " [0.9896926 ]\n", + " [0.99390465]\n", + " [0.9837737 ]\n", + " [0.9879389 ]\n", + " [0.9849358 ]\n", + " [0.95444214]\n", + " [0.96185106]\n", + " [0.98583764]\n", + " [0.9853887 ]\n", + " [0.96530604]\n", + " [0.9577175 ]\n", + " [0.99209654]\n", + " [0.99182796]\n", + " [0.9970042 ]\n", + " [0.96313506]\n", + " [0.99665725]\n", + " [0.99876225]\n", + " [0.9759604 ]\n", + " [0.9753566 ]\n", + " [0.94357455]\n", + " [0.9939639 ]\n", + " [0.9975822 ]\n", + " [0.9581607 ]\n", + " [0.7264057 ]\n", + " [0.90340513]\n", + " [0.990231 ]\n", + " [0.88551056]\n", + " [0.9924867 ]\n", + " [0.8890426 ]\n", + " [0.9955445 ]\n", + " [0.9477519 ]\n", + " [0.9626575 ]\n", + " [0.8927224 ]\n", + " [0.9731145 ]\n", + " [0.95368886]\n", + " [0.9925754 ]\n", + " [0.96909136]\n", + " [0.9865371 ]\n", + " [0.99098164]\n", + " [0.99682367]\n", + " [0.9978574 ]\n", + " [0.9680195 ]\n", + " [0.9926634 ]\n", + " [0.9746379 ]\n", + " [0.9966265 ]\n", + " [0.9998901 ]\n", + " [0.9713291 ]\n", + " [0.9950132 ]\n", + " [0.9958442 ]\n", + " [0.76255816]\n", + " [0.99455076]\n", + " [0.99374866]\n", + " [0.9055506 ]\n", + " [0.98487365]\n", + " [0.98789865]\n", + " [0.9974554 ]\n", + " [0.9921153 ]\n", + " [0.99307597]\n", + " [0.9962943 ]\n", + " [0.99538213]\n", + " [0.91977525]\n", + " [0.97862715]\n", + " [0.9989808 ]\n", + " [0.98903465]\n", + " [0.98844856]\n", + " [0.97251344]\n", + " [0.9740209 ]\n", + " [0.99541867]\n", + " [0.9888009 ]\n", + " [0.9933815 ]\n", + " [0.9661086 ]\n", + " [0.97533935]\n", + " [0.99521685]\n", + " [0.8713212 ]\n", + " [0.9987118 ]\n", + " [0.9930655 ]\n", + " [0.9917338 ]\n", + " [0.9680951 ]\n", + " [0.9979837 ]\n", + " [0.9833829 ]\n", + " [0.9975721 ]\n", + " [0.9794351 ]\n", + " [0.99949396]\n", + " [0.99854004]\n", + " [0.9841129 ]\n", + " [0.9975897 ]\n", + " [0.8182254 ]\n", + " [0.9975799 ]\n", + " [0.987058 ]\n", + " [0.96534294]\n", + " [0.9412237 ]\n", + " [0.97617936]\n", + " [0.96353686]\n", + " [0.99826896]\n", + " [0.99806195]\n", + " [0.99664634]\n", + " [0.99624157]\n", + " [0.83291 ]\n", + " [0.96318394]\n", + " [0.99731857]\n", + " [0.9907126 ]\n", + " [0.98717207]\n", + " [0.9940282 ]\n", + " [0.9981206 ]\n", + " [0.96425235]\n", + " [0.99548596]\n", + " [0.73197335]\n", + " [0.98325104]\n", + " [0.9797626 ]\n", + " [0.8972077 ]\n", + " [0.9165122 ]\n", + " [0.99880195]\n", + " [0.9910808 ]\n", + " [0.99641883]\n", + " [0.9984005 ]\n", + " [0.9972716 ]\n", + " [0.9597902 ]\n", + " [0.99109954]\n", + " [0.94714653]\n", + " [0.9839405 ]\n", + " [0.98746014]\n", + " [0.8297749 ]\n", + " [0.98105836]\n", + " [0.9527131 ]\n", + " [0.9817244 ]\n", + " [0.99557894]\n", + " [0.90665406]\n", + " [0.9853733 ]\n", + " [0.9990928 ]\n", + " [0.9860756 ]\n", + " [0.97990465]\n", + " [0.97841316]\n", + " [0.99897885]\n", + " [0.9977437 ]\n", + " [0.997695 ]\n", + " [0.9901085 ]\n", + " [0.8306896 ]\n", + " [0.96802527]\n", + " [0.971312 ]\n", + " [0.72074664]\n", + " [0.8460156 ]\n", + " [0.9898733 ]\n", + " [0.9975541 ]\n", + " [0.9869484 ]\n", + " [0.97605443]\n", + " [0.9917005 ]\n", + " [0.9050897 ]\n", + " [0.99558026]\n", + " [0.98022455]\n", + " [0.9734471 ]\n", + " [0.994484 ]\n", + " [0.98737013]\n", + " [0.99581414]\n", + " [0.9929905 ]\n", + " [0.8427623 ]\n", + " [0.76278067]\n", + " [0.98167545]\n", + " [0.99067265]\n", + " [0.97734493]\n", + " [0.9303689 ]\n", + " [0.9639088 ]\n", + " [0.9192448 ]\n", + " [0.9721788 ]\n", + " [0.87672526]\n", + " [0.99951243]\n", + " [0.9984988 ]\n", + " [0.99651706]\n", + " [0.89290285]\n", + " [0.9909025 ]\n", + " [0.99884474]\n", + " [0.99123925]\n", + " [0.9986527 ]\n", + " [0.99287874]\n", + " [0.9690683 ]\n", + " [0.9606018 ]\n", + " [0.9375396 ]\n", + " [0.99837434]\n", + " [0.9916848 ]\n", + " [0.98857087]\n", + " [0.879761 ]\n", + " [0.98254323]\n", + " [0.95356655]\n", + " [0.9961041 ]\n", + " [0.9931426 ]\n", + " [0.9542254 ]\n", + " [0.9927912 ]\n", + " [0.9568587 ]\n", + " [0.96016794]\n", + " [0.68044466]\n", + " [0.9977792 ]\n", + " [0.9692128 ]\n", + " [0.99516135]\n", + " [0.9218072 ]\n", + " [0.99541086]\n", + " [0.9970843 ]\n", + " [0.99882776]\n", + " [0.97770965]\n", + " [0.9805741 ]\n", + " [0.91887116]\n", + " [0.99754435]\n", + " [0.9462496 ]\n", + " [0.9954247 ]\n", + " [0.97386116]\n", + " [0.8984086 ]\n", + " [0.98214906]\n", + " [0.8711413 ]\n", + " [0.99081236]\n", + " [0.9771293 ]\n", + " [0.9918087 ]\n", + " [0.8415312 ]\n", + " [0.98301184]\n", + " [0.9952857 ]\n", + " [0.962767 ]\n", + " [0.9556806 ]\n", + " [0.9336488 ]\n", + " [0.9763722 ]\n", + " [0.99564594]\n", + " [0.9526287 ]\n", + " [0.97115874]\n", + " [0.99972063]\n", + " [0.91972774]\n", + " [0.99254954]\n", + " [0.99420375]\n", + " [0.9913105 ]\n", + " [0.992679 ]\n", + " [0.97849965]\n", + " [0.96279484]\n", + " [0.96888834]\n", + " [0.9660808 ]\n", + " [0.9893729 ]\n", + " [0.92404985]\n", + " [0.9280869 ]\n", + " [0.99440974]\n", + " [0.98688877]\n", + " [0.9745617 ]\n", + " [0.9621764 ]\n", + " [0.9850927 ]\n", + " [0.9857566 ]\n", + " [0.93095064]\n", + " [0.9977549 ]\n", + " [0.9812232 ]\n", + " [0.9126662 ]\n", + " [0.9566443 ]\n", + " [0.8646174 ]\n", + " [0.50228536]\n", + " [0.9522517 ]\n", + " [0.96511346]\n", + " [0.9949055 ]\n", + " [0.9948192 ]\n", + " [0.9600249 ]\n", + " [0.9916999 ]\n", + " [0.9961384 ]\n", + " [0.97903305]\n", + " [0.9978885 ]\n", + " [0.9987017 ]\n", + " [0.9840058 ]\n", + " [0.99888045]\n", + " [0.9568232 ]\n", + " [0.96701294]\n", + " [0.99321824]\n", + " [0.9512193 ]\n", + " [0.99558455]\n", + " [0.96378917]\n", + " [0.9913681 ]\n", + " [0.9959472 ]\n", + " [0.95682937]\n", + " [0.9726681 ]\n", + " [0.9287377 ]\n", + " [0.9847638 ]\n", + " [0.9635327 ]\n", + " [0.9574488 ]\n", + " [0.9904744 ]\n", + " [0.9894666 ]\n", + " [0.97807115]\n", + " [0.9650212 ]\n", + " [0.9982539 ]\n", + " [0.9924304 ]\n", + " [0.8373775 ]\n", + " [0.9977938 ]\n", + " [0.9845254 ]\n", + " [0.9694584 ]\n", + " [0.98908806]\n", + " [0.97541624]\n", + " [0.9640077 ]\n", + " [0.9721547 ]\n", + " [0.906111 ]\n", + " [0.9784305 ]\n", + " [0.98105145]\n", + " [0.9368743 ]\n", + " [0.9953949 ]\n", + " [0.9806919 ]\n", + " [0.97262716]\n", + " [0.908168 ]\n", + " [0.8312944 ]\n", + " [0.9938699 ]\n", + " [0.99518436]\n", + " [0.99618894]\n", + " [0.9482542 ]\n", + " [0.99034435]\n", + " [0.9455495 ]\n", + " [0.88142455]\n", + " [0.974901 ]\n", + " [0.95971745]\n", + " [0.9652954 ]\n", + " [0.95488346]\n", + " [0.99204975]\n", + " [0.99632096]\n", + " [0.9414955 ]\n", + " [0.99402076]\n", + " [0.9972193 ]\n", + " [0.97236496]\n", + " [0.9111573 ]\n", + " [0.997451 ]\n", + " [0.97536236]\n", + " [0.9942204 ]\n", + " [0.9766573 ]\n", + " [0.99488926]\n", + " [0.9934136 ]\n", + " [0.9972235 ]\n", + " [0.9821973 ]\n", + " [0.77461237]\n", + " [0.9422089 ]\n", + " [0.99545044]\n", + " [0.9571677 ]\n", + " [0.9987326 ]\n", + " [0.98533547]\n", + " [0.9930688 ]\n", + " [0.9769747 ]\n", + " [0.9558447 ]\n", + " [0.96666 ]\n", + " [0.99129736]\n", + " [0.77438045]\n", + " [0.9905688 ]\n", + " [0.91357446]\n", + " [0.9675626 ]\n", + " [0.99785405]\n", + " [0.9983891 ]\n", + " [0.9875373 ]\n", + " [0.99442273]\n", + " [0.98508203]\n", + " [0.9974554 ]\n", + " [0.99498147]\n", + " [0.9937528 ]\n", + " [0.9844578 ]\n", + " [0.99076146]\n", + " [0.9901904 ]\n", + " [0.96884435]\n", + " [0.98003656]\n", + " [0.9905089 ]\n", + " [0.9816591 ]\n", + " [0.9902226 ]\n", + " [0.9891377 ]\n", + " [0.7547166 ]\n", + " [0.93586457]\n", + " [0.9727118 ]\n", + " [0.98243284]\n", + " [0.993082 ]\n", + " [0.986894 ]\n", + " [0.97965264]\n", + " [0.98201525]\n", + " [0.98979354]\n", + " [0.95748913]\n", + " [0.9981375 ]\n", + " [0.98155767]\n", + " [0.96112615]\n", + " [0.9385618 ]\n", + " [0.98897713]\n", + " [0.9958942 ]\n", + " [0.98520434]\n", + " [0.99545336]\n", + " [0.84992796]\n", + " [0.96527183]\n", + " [0.98988694]\n", + " [0.9977718 ]\n", + " [0.9738715 ]\n", + " [0.9973437 ]\n", + " [0.9461605 ]\n", + " [0.991856 ]\n", + " [0.99376464]\n", + " [0.9867771 ]\n", + " [0.99058175]\n", + " [0.98116404]\n", + " [0.9940236 ]\n", + " [0.7476264 ]\n", + " [0.90638494]\n", + " [0.9893499 ]\n", + " [0.9479379 ]\n", + " [0.9984478 ]\n", + " [0.9630943 ]\n", + " [0.9964647 ]\n", + " [0.98212415]\n", + " [0.9980027 ]], shape=(598, 1), dtype=float32)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EF4uYrrbLx-Z", + "colab_type": "text" + }, + "source": [ + "# Evaluate model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "nNHvJtnEL2sP", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def get_eval_metric_ops_fn(gan_model):\n", + " real_data_logits = tf.reduce_mean(gan_model.discriminator_real_outputs)\n", + " gen_data_logits = tf.reduce_mean(gan_model.discriminator_gen_outputs)\n", + " \n", + " # Attempt to calculate entropy to see how accurate the network is \n", + " # (but this doesn't work yet)\n", + " cce = tf.keras.losses.CategoricalCrossentropy()\n", + " entropy = cce(gan_model.generated_data, gan_model.real_data)\n", + " return {\n", + " 'real_data_logits': tf.compat.v1.metrics.mean(real_data_logits),\n", + " 'gen_data_logits': tf.compat.v1.metrics.mean(gen_data_logits),\n", + " 'entropy':tf.compat.v1.metrics.mean(entropy),\n", + " }" + ], + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L82bU_YpLm-m", + "colab_type": "text" + }, + "source": [ + "# GANEstimator" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Ayp5JoOqLrXX", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "10b6155b-e73c-4fac-dcc0-ca6d26583168" + }, + "source": [ + "tf.get_logger().setLevel('INFO')\n", + "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO) \n", + "tf.autograph.set_verbosity(0, False)\n", + "\n", + "generator_lr = 0.001\n", + "discriminator_lr = 0.0002\n", + "\n", + "# Configure the GAN estimator with all the functions from above\n", + "gan_estimator = tfg.estimator.GANEstimator(\n", + " generator_fn=quantum_generator_model,\n", + " discriminator_fn=discriminator_model,\n", + " generator_loss_fn=tfg.losses.modified_generator_loss,\n", + " discriminator_loss_fn=tfg.losses.modified_discriminator_loss,\n", + " generator_optimizer=tf.compat.v1.train.AdamOptimizer(generator_lr),\n", + " discriminator_optimizer=tf.compat.v1.train.AdamOptimizer(discriminator_lr),\n", + " get_eval_metric_ops_fn=get_eval_metric_ops_fn)\n", + "\n", + "\n", + "steps_per_eval = 500#@param\n", + "max_train_steps = 5000#@param\n", + "batches_for_eval_metrics = 100 #@param\n", + "\n", + "# Used to track metrics.\n", + "steps = []\n", + "real_logits, fake_logits = [], []\n", + "frequencies = []\n", + "entropy = []\n", + "\n", + "cur_step = 0\n", + "while cur_step < max_train_steps:\n", + " next_step = min(cur_step + steps_per_eval, max_train_steps)\n", + " gan_estimator.train(generate_data, max_steps=next_step)\n", + " steps_taken = next_step - cur_step\n", + " cur_step = next_step\n", + " \n", + " # Calculate some metrics.\n", + " metrics = gan_estimator.evaluate(generate_data, \n", + " steps=batches_for_eval_metrics)\n", + " \n", + " # Generate predictions\n", + " iterator = gan_estimator.predict(generate_data)\n", + " predictions = np.array([next(iterator) for _ in range(10)])\n", + " frequency = np.mean(\n", + " [np.bincount(p.astype(int), minlength=4) for p in predictions], axis=0)\n", + " print(frequency)\n", + " steps.append(cur_step)\n", + " real_logits.append(metrics['real_data_logits'])\n", + " fake_logits.append(metrics['gen_data_logits'])\n", + " print('Average discriminator output on Real: %.2f Fake: %.2f' % (\n", + " real_logits[-1], fake_logits[-1]))\n", + " plt.figure()\n", + " plt.bar(np.arange(0,4), frequency)\n", + " frequencies.append(frequency)\n", + " entropy.append(metrics['entropy'])\n", + "\n", + "plt.figure()\n", + "plt.plot(steps, frequencies)\n", + "plt.figure()\n", + "plt.plot(steps, entropy)" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "text": [ + "INFO:tensorflow:Using default config.\n", + "WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpel1pa8ez\n", + "INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpel1pa8ez', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true\n", + "graph_options {\n", + " rewrite_options {\n", + " meta_optimizer_iterations: ONE\n", + " }\n", + "}\n", + ", '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}\n", + "WARNING:tensorflow:Estimator's model_fn (._model_fn at 0x7fe36b9979d8>) includes params argument, but params are not passed to Estimator.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.6590546, step = 0\n", + "INFO:tensorflow:global_step/sec: 1.38187\n", + "INFO:tensorflow:loss = 1.2525809, step = 101 (72.368 sec)\n", + "INFO:tensorflow:global_step/sec: 1.37959\n", + "WARNING:tensorflow:It seems that global step (tf.train.get_global_step) has not been increased. Current value (could be stable): 200 vs previous value: 200. You could increase the global step by passing tf.train.get_global_step() to Optimizer.apply_gradients or Optimizer.minimize.\n", + "INFO:tensorflow:loss = 1.1954446, step = 200 (72.487 sec)\n", + "INFO:tensorflow:global_step/sec: 1.38145\n", + "WARNING:tensorflow:It seems that global step (tf.train.get_global_step) has not been increased. Current value (could be stable): 300 vs previous value: 300. You could increase the global step by passing tf.train.get_global_step() to Optimizer.apply_gradients or Optimizer.minimize.\n", + "INFO:tensorflow:loss = 1.1788788, step = 300 (72.386 sec)\n", + "INFO:tensorflow:global_step/sec: 1.36622\n", + "WARNING:tensorflow:It seems that global step (tf.train.get_global_step) has not been increased. Current value (could be stable): 400 vs previous value: 400. You could increase the global step by passing tf.train.get_global_step() to Optimizer.apply_gradients or Optimizer.minimize.\n", + "INFO:tensorflow:loss = 1.1599461, step = 400 (73.197 sec)\n", + "INFO:tensorflow:Saving checkpoints for 500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.1716442.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:03:09Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.06482s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:03:21\n", + "INFO:tensorflow:Saving dict for global step 500: discriminator_loss = 1.171289, entropy = 95.706894, gen_data_logits = 0.07700764, generator_loss = 0.655901, global_step = 500, loss = 1.171289, real_data_logits = 0.9991762\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 500: /tmp/tmpel1pa8ez/model.ckpt-500\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "[34.5 12.5 2.6 0.4]\n", + "Average discriminator output on Real: 1.00 Fake: 0.08\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-500\n", + "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/training/saver.py:1069: get_checkpoint_mtimes (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Use standard file utilities to get mtimes.\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.1754822, step = 500\n", + "WARNING:tensorflow:It seems that global step (tf.train.get_global_step) has not been increased. Current value (could be stable): 507 vs previous value: 507. You could increase the global step by passing tf.train.get_global_step() to Optimizer.apply_gradients or Optimizer.minimize.\n", + "INFO:tensorflow:global_step/sec: 1.36919\n", + "INFO:tensorflow:loss = 1.1780654, step = 601 (73.040 sec)\n", + "INFO:tensorflow:global_step/sec: 1.37143\n", + "INFO:tensorflow:loss = 1.2177453, step = 701 (72.919 sec)\n", + "INFO:tensorflow:global_step/sec: 1.36622\n", + "INFO:tensorflow:loss = 1.2526287, step = 801 (73.191 sec)\n", + "INFO:tensorflow:global_step/sec: 1.36489\n", + "INFO:tensorflow:loss = 1.2591925, step = 901 (73.268 sec)\n", + "INFO:tensorflow:Saving checkpoints for 1000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.262226.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:09:34Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.34748s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:09:46\n", + "INFO:tensorflow:Saving dict for global step 1000: discriminator_loss = 1.2652749, entropy = 4.1560354, gen_data_logits = 0.25137702, generator_loss = 0.57563394, global_step = 1000, loss = 1.2652749, real_data_logits = 0.9999847\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1000: /tmp/tmpel1pa8ez/model.ckpt-1000\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "[49. 1. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.25\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 1000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.2678082, step = 1000\n", + "INFO:tensorflow:global_step/sec: 1.34818\n", + "INFO:tensorflow:loss = 1.2553058, step = 1100 (74.175 sec)\n", + "INFO:tensorflow:global_step/sec: 1.34396\n", + "INFO:tensorflow:loss = 1.250981, step = 1200 (74.407 sec)\n", + "INFO:tensorflow:global_step/sec: 1.35216\n", + "INFO:tensorflow:loss = 1.237549, step = 1300 (73.956 sec)\n", + "INFO:tensorflow:global_step/sec: 1.34592\n", + "INFO:tensorflow:loss = 1.2266576, step = 1400 (74.299 sec)\n", + "INFO:tensorflow:Saving checkpoints for 1500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.2159001.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:16:04Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.58863s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:16:16\n", + "INFO:tensorflow:Saving dict for global step 1500: discriminator_loss = 1.2157844, entropy = 0.031484038, gen_data_logits = 0.16217975, generator_loss = 0.6153425, global_step = 1500, loss = 1.2157844, real_data_logits = 0.99999297\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1500: /tmp/tmpel1pa8ez/model.ckpt-1500\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.16\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(61, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(61, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:5 out of the last 5 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 1500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.2157978, step = 1500\n", + "INFO:tensorflow:global_step/sec: 1.30643\n", + "INFO:tensorflow:loss = 1.20623, step = 1601 (76.550 sec)\n", + "INFO:tensorflow:global_step/sec: 1.30414\n", + "INFO:tensorflow:loss = 1.1978114, step = 1701 (76.678 sec)\n", + "INFO:tensorflow:global_step/sec: 1.30355\n", + "INFO:tensorflow:loss = 1.190416, step = 1801 (76.713 sec)\n", + "INFO:tensorflow:global_step/sec: 1.30091\n", + "INFO:tensorflow:loss = 1.1839253, step = 1901 (76.869 sec)\n", + "INFO:tensorflow:Saving checkpoints for 2000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.1782837.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:22:48Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.64373s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:23:00\n", + "INFO:tensorflow:Saving dict for global step 2000: discriminator_loss = 1.1782838, entropy = 0.0, gen_data_logits = 0.09164946, generator_loss = 0.6483724, global_step = 2000, loss = 1.1782838, real_data_logits = 0.99999243\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 2000: /tmp/tmpel1pa8ez/model.ckpt-2000\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.09\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:6 out of the last 6 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 2000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.178231, step = 2000\n", + "INFO:tensorflow:global_step/sec: 1.33459\n", + "INFO:tensorflow:loss = 1.1732332, step = 2100 (74.934 sec)\n", + "INFO:tensorflow:global_step/sec: 1.33674\n", + "INFO:tensorflow:loss = 1.1688447, step = 2200 (74.806 sec)\n", + "INFO:tensorflow:global_step/sec: 1.33758\n", + "INFO:tensorflow:loss = 1.1649867, step = 2300 (74.764 sec)\n", + "INFO:tensorflow:global_step/sec: 1.33663\n", + "INFO:tensorflow:loss = 1.1615903, step = 2400 (74.816 sec)\n", + "INFO:tensorflow:Saving checkpoints for 2500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/training/saver.py:963: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Use standard file APIs to delete files with this prefix.\n", + "INFO:tensorflow:Loss for final step: 1.1586235.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:29:22Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.98509s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:29:35\n", + "INFO:tensorflow:Saving dict for global step 2500: discriminator_loss = 1.1586211, entropy = 0.0011491607, gen_data_logits = 0.053703655, generator_loss = 0.6666554, global_step = 2500, loss = 1.1586211, real_data_logits = 0.9999994\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 2500: /tmp/tmpel1pa8ez/model.ckpt-2500\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.05\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(60, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(60, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:7 out of the last 7 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 2500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.158595, step = 2500\n", + "INFO:tensorflow:global_step/sec: 1.30067\n", + "INFO:tensorflow:loss = 1.1559485, step = 2600 (76.884 sec)\n", + "INFO:tensorflow:global_step/sec: 1.29186\n", + "INFO:tensorflow:loss = 1.153605, step = 2700 (77.408 sec)\n", + "INFO:tensorflow:global_step/sec: 1.30234\n", + "INFO:tensorflow:loss = 1.1515256, step = 2800 (76.785 sec)\n", + "INFO:tensorflow:global_step/sec: 1.29929\n", + "INFO:tensorflow:loss = 1.1496762, step = 2900 (76.965 sec)\n", + "INFO:tensorflow:Saving checkpoints for 3000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.1480436.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(58, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(58, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:36:06Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.80878s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:36:19\n", + "INFO:tensorflow:Saving dict for global step 3000: discriminator_loss = 1.1480428, entropy = 0.0, gen_data_logits = 0.032997075, generator_loss = 0.67678475, global_step = 3000, loss = 1.1480428, real_data_logits = 0.9999998\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 3000: /tmp/tmpel1pa8ez/model.ckpt-3000\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.03\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:8 out of the last 8 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 3000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.1480281, step = 3000\n", + "INFO:tensorflow:global_step/sec: 1.32242\n", + "INFO:tensorflow:loss = 1.1465555, step = 3101 (75.623 sec)\n", + "INFO:tensorflow:global_step/sec: 1.32462\n", + "INFO:tensorflow:loss = 1.145237, step = 3201 (75.491 sec)\n", + "INFO:tensorflow:global_step/sec: 1.31498\n", + "INFO:tensorflow:loss = 1.1440542, step = 3301 (76.049 sec)\n", + "INFO:tensorflow:global_step/sec: 1.31537\n", + "INFO:tensorflow:loss = 1.1429904, step = 3401 (76.024 sec)\n", + "INFO:tensorflow:Saving checkpoints for 3500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.142041.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:42:46Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 13.14910s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:42:59\n", + "INFO:tensorflow:Saving dict for global step 3500: discriminator_loss = 1.142042, entropy = 0.0, gen_data_logits = 0.021151995, generator_loss = 0.68262756, global_step = 3500, loss = 1.142042, real_data_logits = 0.99999994\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 3500: /tmp/tmpel1pa8ez/model.ckpt-3500\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.02\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(60, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(60, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:9 out of the last 9 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 3500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.1420317, step = 3500\n", + "INFO:tensorflow:global_step/sec: 1.29036\n", + "INFO:tensorflow:loss = 1.1411664, step = 3600 (77.502 sec)\n", + "INFO:tensorflow:global_step/sec: 1.28633\n", + "INFO:tensorflow:loss = 1.1403836, step = 3701 (77.738 sec)\n", + "INFO:tensorflow:global_step/sec: 1.28885\n", + "INFO:tensorflow:loss = 1.1396741, step = 3801 (77.588 sec)\n", + "INFO:tensorflow:global_step/sec: 1.28762\n", + "INFO:tensorflow:loss = 1.1390302, step = 3901 (77.663 sec)\n", + "INFO:tensorflow:Saving checkpoints for 4000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.13845.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(58, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(58, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:49:34Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.98739s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:49:47\n", + "INFO:tensorflow:Saving dict for global step 4000: discriminator_loss = 1.1384505, entropy = 0.0, gen_data_logits = 0.014032635, generator_loss = 0.68615633, global_step = 4000, loss = 1.1384505, real_data_logits = 0.9999998\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 4000: /tmp/tmpel1pa8ez/model.ckpt-4000\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.01\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(60, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(60, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:10 out of the last 10 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 4000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.1384443, step = 4000\n", + "INFO:tensorflow:global_step/sec: 1.27837\n", + "INFO:tensorflow:loss = 1.1379107, step = 4100 (78.225 sec)\n", + "INFO:tensorflow:global_step/sec: 1.2788\n", + "INFO:tensorflow:loss = 1.1374239, step = 4200 (78.198 sec)\n", + "INFO:tensorflow:global_step/sec: 1.2881\n", + "INFO:tensorflow:loss = 1.1369787, step = 4300 (77.634 sec)\n", + "INFO:tensorflow:global_step/sec: 1.28532\n", + "INFO:tensorflow:loss = 1.1365716, step = 4400 (77.802 sec)\n", + "INFO:tensorflow:Saving checkpoints for 4500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.1362021.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(61, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(61, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:56:23Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 13.69038s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:56:37\n", + "INFO:tensorflow:Saving dict for global step 4500: discriminator_loss = 1.1362015, entropy = 0.0, gen_data_logits = 0.009563566, generator_loss = 0.68837714, global_step = 4500, loss = 1.1362015, real_data_logits = 0.99999994\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 4500: /tmp/tmpel1pa8ez/model.ckpt-4500\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.01\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Create CheckpointSaverHook.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 4500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.1361986, step = 4500\n", + "INFO:tensorflow:global_step/sec: 1.29659\n", + "INFO:tensorflow:loss = 1.1358563, step = 4601 (77.127 sec)\n", + "INFO:tensorflow:global_step/sec: 1.29879\n", + "INFO:tensorflow:loss = 1.1355416, step = 4701 (76.995 sec)\n", + "INFO:tensorflow:global_step/sec: 1.29646\n", + "INFO:tensorflow:loss = 1.1352522, step = 4801 (77.133 sec)\n", + "INFO:tensorflow:global_step/sec: 1.2988\n", + "INFO:tensorflow:loss = 1.1349857, step = 4901 (76.994 sec)\n", + "INFO:tensorflow:Saving checkpoints for 5000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.1347424.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T11:03:10Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-5000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 13.37736s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-11:03:23\n", + "INFO:tensorflow:Saving dict for global step 5000: discriminator_loss = 1.1347426, entropy = 0.0, gen_data_logits = 0.0066559273, generator_loss = 0.6898243, global_step = 5000, loss = 1.1347426, real_data_logits = 0.99999994\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 5000: /tmp/tmpel1pa8ez/model.ckpt-5000\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-5000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.01\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 9 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXEAAAD4CAYAAAAaT9YAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAANt0lEQVR4nO3df6zd9V3H8efLtoxFpsB6rQ0lu8wRF1zGD28qG4uZMAyCoU0khGm0S2qaRZewaKJVkyUzJoJ/bPNXYhog1mRuINtsZT+060oWEym7/C50k0Ig0hR6x/j5z7T49o/7LV7uzuGc++Oc0w95PpKT8/3xuf2+8infV7/ne885pKqQJLXpxyYdQJK0fJa4JDXMEpekhlniktQwS1ySGrZ2nAdbv359TU9Pj/OQktS8++677/tVNdVr31hLfHp6mtnZ2XEeUpKal+Tpfvu8nSJJDRvqSjzJU8ArwGvAiaqaSXI2cDswDTwFXF9VL4wmpiSpl6Vcif9SVV1UVTPd+k5gf1WdD+zv1iVJY7SS2ylbgN3d8m5g68rjSJKWYtgSL+DfktyXZEe3bUNVHeuWnwU29PrBJDuSzCaZnZubW2FcSdJCw7475UNVdTTJTwH7knx34c6qqiQ9v0mrqnYBuwBmZmb8ti1JWkVDXYlX1dHu+TjwFWAz8FySjQDd8/FRhZQk9TawxJP8eJJ3nFwGfhk4BOwFtnXDtgF7RhVSktTbMLdTNgBfSXJy/D9W1TeSfAe4I8l24Gng+tHFlCT1MrDEq+pJ4MIe258HrhhFqF6md351XIc6JT110zWTjiDpFOQnNiWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1bOgST7ImyQNJ7urWz0tyMMmRJLcnOW10MSVJvSzlSvxG4PCC9ZuBz1bVe4AXgO2rGUySNNhQJZ5kE3ANcEu3HuBy4M5uyG5g6ygCSpL6G/ZK/HPAHwD/262/E3ixqk50688A5/T6wSQ7kswmmZ2bm1tRWEnSGw0s8SS/ChyvqvuWc4Cq2lVVM1U1MzU1tZw/QpLUx9ohxlwGXJvkauB04CeAvwTOTLK2uxrfBBwdXUxJUi8Dr8Sr6o+qalNVTQM3AN+qqt8ADgDXdcO2AXtGllKS1NNK3if+h8DvJTnC/D3yW1cnkiRpWMPcTnldVd0N3N0tPwlsXv1IkqRh+YlNSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlq2MAST3J6knuTPJTk0SSf7rafl+RgkiNJbk9y2ujjSpIWGuZK/IfA5VV1IXARcFWSS4Gbgc9W1XuAF4Dto4spSeplYInXvFe71XXdo4DLgTu77buBrSNJKEnqa6h74knWJHkQOA7sA54AXqyqE92QZ4Bz+vzsjiSzSWbn5uZWI7MkqTNUiVfVa1V1EbAJ2Ay8d9gDVNWuqpqpqpmpqallxpQk9bKkd6dU1YvAAeADwJlJ1na7NgFHVzmbJGmAYd6dMpXkzG757cCVwGHmy/y6btg2YM+oQkqSels7eAgbgd1J1jBf+ndU1V1JHgO+mOTPgAeAW0eYU5LUw8ASr6qHgYt7bH+S+fvjkqQJ8RObktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUsIElnuTcJAeSPJbk0SQ3dtvPTrIvyePd81mjjytJWmiYK/ETwO9X1QXApcDvJrkA2Ansr6rzgf3duiRpjAaWeFUdq6r7u+VXgMPAOcAWYHc3bDewdVQhJUm9LemeeJJp4GLgILChqo51u54FNvT5mR1JZpPMzs3NrSCqJGmxoUs8yRnAl4BPVtXLC/dVVQHV6+eqaldVzVTVzNTU1IrCSpLeaKgST7KO+QL/fFV9udv8XJKN3f6NwPHRRJQk9TPMu1MC3AocrqrPLNi1F9jWLW8D9qx+PEnSm1k7xJjLgN8EHknyYLftj4GbgDuSbAeeBq4fTURJUj8DS7yq/h1In91XrG4cSdJS+IlNSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlq2MAST3JbkuNJDi3YdnaSfUke757PGm1MSVIvw1yJ/z1w1aJtO4H9VXU+sL9blySN2cASr6pvAz9YtHkLsLtb3g1sXeVckqQhLPee+IaqOtYtPwtsWKU8kqQlWPEvNquqgOq3P8mOJLNJZufm5lZ6OEnSAsst8eeSbATono/3G1hVu6pqpqpmpqamlnk4SVIvyy3xvcC2bnkbsGd14kiSlmKYtxh+AfgP4GeTPJNkO3ATcGWSx4GPdOuSpDFbO2hAVX20z64rVjmLJGmJ/MSmJDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1bO2kA2g8pnd+ddIRJuqpm66ZdARpJFZ0JZ7kqiTfS3Ikyc7VCiVJGs6ySzzJGuBvgV8BLgA+muSC1QomSRpsJVfim4EjVfVkVf038EVgy+rEkiQNYyX3xM8B/mvB+jPALywelGQHsKNbfTXJ9/r8eeuB768gz6hNNF9uHjjE+XsTzt/ImW9lBuV7V78dI//FZlXtAnYNGpdktqpmRp1nucy3MuZbGfOtzFs530pupxwFzl2wvqnbJkkak5WU+HeA85Ocl+Q04AZg7+rEkiQNY9m3U6rqRJJPAP8KrAFuq6pHV5Bl4C2XCTPfyphvZcy3Mm/ZfKmq1QwiSRojP3YvSQ2zxCWpYRMr8SRnJ9mX5PHu+aw+415L8mD3GPkvTgd9lUCStyW5vdt/MMn0qDMtMd/HkswtmLPfHmO225IcT3Koz/4k+asu+8NJLhlXtiHzfTjJSwvm7lNjzndukgNJHkvyaJIbe4yZ2BwOmW9ic5jk9CT3Jnmoy/fpHmMmdv4OmW/p529VTeQB/AWws1veCdzcZ9yrY8y0BngCeDdwGvAQcMGiMb8D/F23fANw+ymW72PA30zo7/QXgUuAQ332Xw18HQhwKXDwFMv3YeCuScxdd/yNwCXd8juA/+zx9zuxORwy38TmsJuTM7rldcBB4NJFYyZ5/g6Tb8nn7yRvp2wBdnfLu4GtE8xy0jBfJbAw953AFUlyCuWbmKr6NvCDNxmyBfiHmncPcGaSjeNJN1S+iaqqY1V1f7f8CnCY+U9GLzSxORwy38R0c/Jqt7queyx+58bEzt8h8y3ZJEt8Q1Ud65afBTb0GXd6ktkk9yQZddH3+iqBxf+Rvj6mqk4ALwHvHHGuHzl2p1c+gF/rXmrfmeTcHvsnZdj8k/SB7uXu15P83KRCdC/zL2b+am2hU2IO3yQfTHAOk6xJ8iBwHNhXVX3nbwLn7zD5YInn70hLPMk3kxzq8XjD1WPNv47o9y/Su2r+46i/Dnwuyc+MMvNbwL8A01X1fmAf/3/VocHuZ/6/twuBvwb+eRIhkpwBfAn4ZFW9PIkMb2ZAvonOYVW9VlUXMf8J8s1J3jfO4w8yRL4ln78jLfGq+khVva/HYw/w3MmXgd3z8T5/xtHu+Ungbub/9R+VYb5K4PUxSdYCPwk8P8JMPY/d+ZF8VfV8Vf2wW70F+PkxZRvGKf1VDVX18smXu1X1NWBdkvXjzJBkHfMF+fmq+nKPIROdw0H5ToU57I79InAAuGrRrkmev6/rl2855+8kb6fsBbZ1y9uAPYsHJDkrydu65fXAZcBjI8w0zFcJLMx9HfCt7pXEOAzMt+j+6LXM37c8VewFfqt7h8WlwEsLbqlNXJKfPnl/NMlm5s+PsZ3g3bFvBQ5X1Wf6DJvYHA6Tb5JzmGQqyZnd8tuBK4HvLho2sfN3mHzLOn/H9ZvZxQ/m70PtBx4Hvgmc3W2fAW7plj8IPML8uzAeAbaPIdfVzP/W/QngT7ptfwpc2y2fDvwTcAS4F3j3mOdtUL4/Bx7t5uwA8N4xZvsCcAz4H+bv1W4HPg58vNsf5v9HIk90f58zY567Qfk+sWDu7gE+OOZ8H2L+tuLDwIPd4+pTZQ6HzDexOQTeDzzQ5TsEfKrbfkqcv0PmW/L568fuJalhfmJTkhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SG/R/gJn1iBGNnTAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + } + ] +} \ No newline at end of file From 5095336b286677c23f33d51420bfc0845e0fc440 Mon Sep 17 00:00:00 2001 From: Oliver O'Brien Date: Tue, 25 Aug 2020 12:06:32 +0100 Subject: [PATCH 7/7] updated version --- docs/tutorials/qGAN.ipynb | 2492 ++++++++++++++++++++++++++++------ qgan.ipynb | 2644 ------------------------------------- 2 files changed, 2074 insertions(+), 3062 deletions(-) delete mode 100644 qgan.ipynb diff --git a/docs/tutorials/qGAN.ipynb b/docs/tutorials/qGAN.ipynb index 07b4d9616..9488f58ac 100644 --- a/docs/tutorials/qGAN.ipynb +++ b/docs/tutorials/qGAN.ipynb @@ -5,7 +5,7 @@ "colab": { "name": "qgan.ipynb", "provenance": [], - "authorship_tag": "ABX9TyOX4sjMKPZJM1QBJQSL21l1", + "authorship_tag": "ABX9TyPeqyBT5OtzJ8bOp2rTKI2y", "include_colab_link": true }, "kernelspec": { @@ -33,13 +33,13 @@ "source": [ "# Quantum Generative Adversarial Network (qGAN)\n", "\n", - "Loading an arbitary random probability distribution into a n qubit quantum state normally requires $O(2^n)$ gates which in most algorithms will dominate the complexity of the quantum algorithm and make it useless. By using a qGAN this loading can be done in $O(poly(n))$ gates [[1](https://https://www.nature.com/articles/s41534-019-0223-2)]. \n", + "Loading an arbitrary random probability distribution into an n-qubit quantum state normally requires $O(2^n)$ gates which in most algorithms will dominate the complexity of the quantum algorithm and make it useless. By using a qGAN this loading can be done in $O(poly(n))$ gates [[1](https://https://www.nature.com/articles/s41534-019-0223-2)]. \n", "\n", - "A qGAN is a version of a [Generative Adversarial Network](https://papers.nips.cc/paper/5423-generative-adversarial-nets) with a quantum generator and a classical discriminator. The quantum generator is trained to transform a given n-qubit input into:\n", + "A qGAN is a quantum version of a [Generative Adversarial Network](https://papers.nips.cc/paper/5423-generative-adversarial-nets) with a quantum generator and a classical discriminator. The quantum generator is trained to transform a given n-qubit input into:\n", "$$\n", "\\sum_{j=0}^{2^n-1} \\sqrt{p^j_{\\theta}}\\left| j \\right\\rangle\n", "$$\n", - "where $p^j_{\\theta}$ relate to the probabilty of the state $j$. The discriminator has to try and distinguish between the output of the generator and the training data set. The two networks train alternatively and will eventaully reach a nash equilibrium where the discriminator cannot tell apart the generator and the training set data. The aim of this process is for $p^j_{\\theta}$ to approximate the distribution of the training data.\n", + "where $p^j_{\\theta}$ is the probabilty of the state $j$. The discriminator has to try and distinguish between the output of the generator and the training data set. The two networks train alternatively and will eventaully reach a nash equilibrium where the discriminator cannot tell apart the generator and the training set data. The aim of this process is for $p^j_{\\theta}$ to approximate the distribution of the training data.\n", "\n", "This tutorial will guide you through using a qGAN to load a lognormal distribution to a 2 qubit system." ] @@ -59,13 +59,161 @@ "metadata": { "id": "u4g8Xz0auW9z", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "0e451dc5-96c1-4ddb-8df1-979716b51dd1" }, "source": [ "!pip install --upgrade tensorflow==2.1.0 tensorflow-quantum tensorflow-gan tensorflow-probability==0.9 tensorflow-datasets" ], - "execution_count": null, - "outputs": [] + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Collecting tensorflow==2.1.0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/85/d4/c0cd1057b331bc38b65478302114194bd8e1b9c2bbc06e300935c0e93d90/tensorflow-2.1.0-cp36-cp36m-manylinux2010_x86_64.whl (421.8MB)\n", + "\u001b[K |████████████████████████████████| 421.8MB 32kB/s \n", + "\u001b[?25hCollecting tensorflow-quantum\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/eb/76/766f7ef3f57abf1467bf1a591a5e6776f1166420a90ea05af9ca5e25d768/tensorflow_quantum-0.3.1-cp36-cp36m-manylinux2010_x86_64.whl (3.9MB)\n", + "\u001b[K |████████████████████████████████| 3.9MB 46.6MB/s \n", + "\u001b[?25hCollecting tensorflow-gan\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/0c/2e/62922111d7d50e1900e3030764743ea7735540ce103b3ab30fd5cd2d8a2b/tensorflow_gan-2.0.0-py2.py3-none-any.whl (365kB)\n", + "\u001b[K |████████████████████████████████| 368kB 41.4MB/s \n", + "\u001b[?25hCollecting tensorflow-probability==0.9\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/9b/ed/f587d64127bbb85e539f06a2aace1240b7b5c6b4267bea94f232230551a5/tensorflow_probability-0.9.0-py2.py3-none-any.whl (3.2MB)\n", + "\u001b[K |████████████████████████████████| 3.2MB 40.3MB/s \n", + "\u001b[?25hCollecting tensorflow-datasets\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/ca/c9/d97bdf931edbae9aebc767633d088bd674136d5fe7587ef693b7cb6a1883/tensorflow_datasets-3.2.1-py3-none-any.whl (3.4MB)\n", + "\u001b[K |████████████████████████████████| 3.4MB 48.3MB/s \n", + "\u001b[?25hRequirement already satisfied, skipping upgrade: six>=1.12.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.15.0)\n", + "Collecting keras-applications>=1.0.8\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/71/e3/19762fdfc62877ae9102edf6342d71b28fbfd9dea3d2f96a882ce099b03f/Keras_Applications-1.0.8-py3-none-any.whl (50kB)\n", + "\u001b[K |████████████████████████████████| 51kB 7.2MB/s \n", + "\u001b[?25hRequirement already satisfied, skipping upgrade: astor>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (0.8.1)\n", + "Requirement already satisfied, skipping upgrade: absl-py>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (0.9.0)\n", + "Requirement already satisfied, skipping upgrade: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (0.34.2)\n", + "Requirement already satisfied, skipping upgrade: wrapt>=1.11.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.12.1)\n", + "Requirement already satisfied, skipping upgrade: keras-preprocessing>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.1.2)\n", + "Requirement already satisfied, skipping upgrade: protobuf>=3.8.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (3.12.4)\n", + "Requirement already satisfied, skipping upgrade: termcolor>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.1.0)\n", + "Collecting tensorflow-estimator<2.2.0,>=2.1.0rc0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/18/90/b77c328a1304437ab1310b463e533fa7689f4bfc41549593056d812fab8e/tensorflow_estimator-2.1.0-py2.py3-none-any.whl (448kB)\n", + "\u001b[K |████████████████████████████████| 450kB 37.6MB/s \n", + "\u001b[?25hRequirement already satisfied, skipping upgrade: opt-einsum>=2.3.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (3.3.0)\n", + "Requirement already satisfied, skipping upgrade: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.31.0)\n", + "Collecting tensorboard<2.2.0,>=2.1.0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/d9/41/bbf49b61370e4f4d245d4c6051dfb6db80cec672605c91b1652ac8cc3d38/tensorboard-2.1.1-py3-none-any.whl (3.8MB)\n", + "\u001b[K |████████████████████████████████| 3.9MB 44.6MB/s \n", + "\u001b[?25hRequirement already satisfied, skipping upgrade: scipy==1.4.1; python_version >= \"3\" in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.4.1)\n", + "Requirement already satisfied, skipping upgrade: numpy<2.0,>=1.16.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.18.5)\n", + "Collecting gast==0.2.2\n", + " Downloading https://files.pythonhosted.org/packages/4e/35/11749bf99b2d4e3cceb4d55ca22590b0d7c2c62b9de38ac4a4a7f4687421/gast-0.2.2.tar.gz\n", + "Requirement already satisfied, skipping upgrade: google-pasta>=0.1.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (0.2.0)\n", + "Collecting sympy==1.4\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/21/21/f4105795ca7f35c541d82c5b06be684dd2f5cb4f508fb487cd7aea4de776/sympy-1.4-py2.py3-none-any.whl (5.3MB)\n", + "\u001b[K |████████████████████████████████| 5.3MB 37.9MB/s \n", + "\u001b[?25hCollecting pathos==0.2.5\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/c6/a2/cd59f73d5ede4f122687bf8f63de5d671c9561e493ca699241f05b038278/pathos-0.2.5.tar.gz (162kB)\n", + "\u001b[K |████████████████████████████████| 163kB 50.9MB/s \n", + "\u001b[?25hCollecting cirq==0.8.0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/b8/cf/d95635b4b0de2227956077687277426299883ccdb9e6418fa6e599893ea3/cirq-0.8.0-py3-none-any.whl (1.4MB)\n", + "\u001b[K |████████████████████████████████| 1.4MB 44.8MB/s \n", + "\u001b[?25hRequirement already satisfied, skipping upgrade: tensorflow-hub>=0.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gan) (0.8.0)\n", + "Requirement already satisfied, skipping upgrade: decorator in /usr/local/lib/python3.6/dist-packages (from tensorflow-probability==0.9) (4.4.2)\n", + "Requirement already satisfied, skipping upgrade: cloudpickle>=1.2.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow-probability==0.9) (1.3.0)\n", + "Requirement already satisfied, skipping upgrade: tensorflow-metadata in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (0.22.2)\n", + "Requirement already satisfied, skipping upgrade: requests>=2.19.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (2.23.0)\n", + "Requirement already satisfied, skipping upgrade: dill in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (0.3.2)\n", + "Requirement already satisfied, skipping upgrade: promise in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (2.3)\n", + "Requirement already satisfied, skipping upgrade: attrs>=18.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (19.3.0)\n", + "Requirement already satisfied, skipping upgrade: tqdm in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (4.41.1)\n", + "Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (0.16.0)\n", + "Requirement already satisfied, skipping upgrade: h5py in /usr/local/lib/python3.6/dist-packages (from keras-applications>=1.0.8->tensorflow==2.1.0) (2.10.0)\n", + "Requirement already satisfied, skipping upgrade: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.8.0->tensorflow==2.1.0) (49.2.0)\n", + "Requirement already satisfied, skipping upgrade: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (3.2.2)\n", + "Requirement already satisfied, skipping upgrade: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (1.0.1)\n", + "Requirement already satisfied, skipping upgrade: google-auth<2,>=1.6.3 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (1.17.2)\n", + "Requirement already satisfied, skipping upgrade: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (0.4.1)\n", + "Requirement already satisfied, skipping upgrade: mpmath>=0.19 in /usr/local/lib/python3.6/dist-packages (from sympy==1.4->tensorflow-quantum) (1.1.0)\n", + "Collecting ppft>=1.6.6.1\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/2b/fb/fa21f6e9aedc4823448473ed96e8eab64af1cb248c18165f045a90e1c6b4/ppft-1.6.6.2.zip (106kB)\n", + "\u001b[K |████████████████████████████████| 112kB 48.6MB/s \n", + "\u001b[?25hCollecting pox>=0.2.7\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/1a/0c/ec447fb0ed88bc1c09bf0dadf00e40ea05fda17e841d15bb351a52d9e192/pox-0.2.8.zip (128kB)\n", + "\u001b[K |████████████████████████████████| 133kB 48.6MB/s \n", + "\u001b[?25hRequirement already satisfied, skipping upgrade: multiprocess>=0.70.9 in /usr/local/lib/python3.6/dist-packages (from pathos==0.2.5->tensorflow-quantum) (0.70.10)\n", + "Requirement already satisfied, skipping upgrade: pandas in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (1.0.5)\n", + "Requirement already satisfied, skipping upgrade: dataclasses; python_version < \"3.7\" in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (0.7)\n", + "Requirement already satisfied, skipping upgrade: networkx~=2.4 in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (2.4)\n", + "Requirement already satisfied, skipping upgrade: matplotlib~=3.0 in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (3.2.2)\n", + "Requirement already satisfied, skipping upgrade: sortedcontainers~=2.0 in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (2.2.2)\n", + "Requirement already satisfied, skipping upgrade: typing-extensions in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (3.7.4.2)\n", + "Collecting freezegun~=0.3.15\n", + " Downloading https://files.pythonhosted.org/packages/17/5d/1b9d6d3c7995fff473f35861d674e0113a5f0bd5a72fe0199c3f254665c7/freezegun-0.3.15-py2.py3-none-any.whl\n", + "Requirement already satisfied, skipping upgrade: google-api-core[grpc]<2.0.0dev,>=1.14.0 in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (1.16.0)\n", + "Requirement already satisfied, skipping upgrade: googleapis-common-protos in /usr/local/lib/python3.6/dist-packages (from tensorflow-metadata->tensorflow-datasets) (1.52.0)\n", + "Requirement already satisfied, skipping upgrade: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow-datasets) (1.24.3)\n", + "Requirement already satisfied, skipping upgrade: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow-datasets) (2020.6.20)\n", + "Requirement already satisfied, skipping upgrade: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow-datasets) (2.10)\n", + "Requirement already satisfied, skipping upgrade: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow-datasets) (3.0.4)\n", + "Requirement already satisfied, skipping upgrade: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.6/dist-packages (from markdown>=2.6.8->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (1.7.0)\n", + "Requirement already satisfied, skipping upgrade: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (0.2.8)\n", + "Requirement already satisfied, skipping upgrade: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (4.1.1)\n", + "Requirement already satisfied, skipping upgrade: rsa<5,>=3.1.4; python_version >= \"3\" in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (4.6)\n", + "Requirement already satisfied, skipping upgrade: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (1.3.0)\n", + "Requirement already satisfied, skipping upgrade: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas->cirq==0.8.0->tensorflow-quantum) (2.8.1)\n", + "Requirement already satisfied, skipping upgrade: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas->cirq==0.8.0->tensorflow-quantum) (2018.9)\n", + "Requirement already satisfied, skipping upgrade: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib~=3.0->cirq==0.8.0->tensorflow-quantum) (2.4.7)\n", + "Requirement already satisfied, skipping upgrade: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib~=3.0->cirq==0.8.0->tensorflow-quantum) (1.2.0)\n", + "Requirement already satisfied, skipping upgrade: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib~=3.0->cirq==0.8.0->tensorflow-quantum) (0.10.0)\n", + "Requirement already satisfied, skipping upgrade: zipp>=0.5 in /usr/local/lib/python3.6/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (3.1.0)\n", + "Requirement already satisfied, skipping upgrade: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.6/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (0.4.8)\n", + "Requirement already satisfied, skipping upgrade: oauthlib>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (3.1.0)\n", + "Building wheels for collected packages: gast, pathos, ppft, pox\n", + " Building wheel for gast (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for gast: filename=gast-0.2.2-cp36-none-any.whl size=7540 sha256=2ad6cbdc07e51d75f24df6a3c5431e851f78bdf88af71c690910e7e848ef4f5e\n", + " Stored in directory: /root/.cache/pip/wheels/5c/2e/7e/a1d4d4fcebe6c381f378ce7743a3ced3699feb89bcfbdadadd\n", + " Building wheel for pathos (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for pathos: filename=pathos-0.2.5-cp36-none-any.whl size=77577 sha256=343c596b255ac0aacd0809ba6d675783772d715ee8822532e84af24239f89ebb\n", + " Stored in directory: /root/.cache/pip/wheels/61/6d/83/90b0c3d2c271da2c4850731e894798c98f8dbedbac74e8eff0\n", + " Building wheel for ppft (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for ppft: filename=ppft-1.6.6.2-cp36-none-any.whl size=64743 sha256=8f1da4f2e681b1565a8a86757300af1eb50de1cf1530f7308bb208d3f2827963\n", + " Stored in directory: /root/.cache/pip/wheels/db/d2/2d/0ee21ede61786bb13247dbc69079373fd500c2bb0481913084\n", + " Building wheel for pox (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for pox: filename=pox-0.2.8-cp36-none-any.whl size=28290 sha256=bf2b329588e208ed398a506e3f3f94fb45284cf1a70df4d8a0dd42e429525219\n", + " Stored in directory: /root/.cache/pip/wheels/39/ed/ce/a93103746b327e18bffaeb99ba0d57a88b392f31d719cea700\n", + "Successfully built gast pathos ppft pox\n", + "\u001b[31mERROR: cirq 0.8.0 has requirement protobuf==3.8.0, but you'll have protobuf 3.12.4 which is incompatible.\u001b[0m\n", + "Installing collected packages: keras-applications, tensorflow-estimator, tensorboard, gast, tensorflow, sympy, ppft, pox, pathos, freezegun, cirq, tensorflow-quantum, tensorflow-probability, tensorflow-gan, tensorflow-datasets\n", + " Found existing installation: tensorflow-estimator 2.3.0\n", + " Uninstalling tensorflow-estimator-2.3.0:\n", + " Successfully uninstalled tensorflow-estimator-2.3.0\n", + " Found existing installation: tensorboard 2.3.0\n", + " Uninstalling tensorboard-2.3.0:\n", + " Successfully uninstalled tensorboard-2.3.0\n", + " Found existing installation: gast 0.3.3\n", + " Uninstalling gast-0.3.3:\n", + " Successfully uninstalled gast-0.3.3\n", + " Found existing installation: tensorflow 2.3.0\n", + " Uninstalling tensorflow-2.3.0:\n", + " Successfully uninstalled tensorflow-2.3.0\n", + " Found existing installation: sympy 1.1.1\n", + " Uninstalling sympy-1.1.1:\n", + " Successfully uninstalled sympy-1.1.1\n", + " Found existing installation: tensorflow-probability 0.11.0\n", + " Uninstalling tensorflow-probability-0.11.0:\n", + " Successfully uninstalled tensorflow-probability-0.11.0\n", + " Found existing installation: tensorflow-datasets 2.1.0\n", + " Uninstalling tensorflow-datasets-2.1.0:\n", + " Successfully uninstalled tensorflow-datasets-2.1.0\n", + "Successfully installed cirq-0.8.0 freezegun-0.3.15 gast-0.2.2 keras-applications-1.0.8 pathos-0.2.5 pox-0.2.8 ppft-1.6.6.2 sympy-1.4 tensorboard-2.1.1 tensorflow-2.1.0 tensorflow-datasets-3.2.1 tensorflow-estimator-2.1.0 tensorflow-gan-2.0.0 tensorflow-probability-0.9.0 tensorflow-quantum-0.3.1\n" + ], + "name": "stdout" + } + ] }, { "cell_type": "code", @@ -87,11 +235,14 @@ "\n", "import matplotlib.pyplot as plt\n", "\n", - "# Intialise qubits\n", - "num_qubits = 2 #@param\n", - "qubits = [cirq.GridQubit(x,0) for x in range(num_qubits)]\n" + "# Initialize qubits\n", + "num_qubits = 2#@param\n", + "qubits = [cirq.GridQubit(x,0) for x in range(num_qubits)]\n", + "num_of_samples = 100 # Size of training data set\n", + "sample_size = 50\n", + "tf.keras.backend.set_floatx('float32')\n" ], - "execution_count": 31, + "execution_count": 8, "outputs": [] }, { @@ -128,32 +279,47 @@ " Bundles this with noise for generator to use\n", " \"\"\"\n", "\n", - " size = 1000 # Size of training data set\n", - "\n", - " # Take samples of lognormal distribution with mean = 1 and standard deviation =1\n", + " # Take samples of lognormal distribution with mean = 1 \n", + " # and standard deviation =1\n", " mu =1\n", " sigma =1\n", - " continous_data = np.random.lognormal(mean=mu, sigma=sigma, size=size)\n", + "\n", + " total = []\n", " \n", - " # Remove all samples that lie outside the range expressible in the given number of qubits\n", - " continous_data = continous_data[continous_data <= 2**num_qubits-0.5]\n", "\n", - " # Discretize the remaining samples so the continous distribution can be approximated by a discrete distribution\n", - " discrete_data = tf.convert_to_tensor(np.digitize(continous_data,[i - 0.5 for i in range(1,2**num_qubits)]),dtype=tf.dtypes.int32)\n", + " continuous_data = np.random.lognormal(\n", + " mean=mu, sigma=sigma, size=sample_size*num_of_samples)\n", + " \n", + " # Remove all samples that lie outside the range \n", + " # expressible in the given number of qubits\n", + " continuous_data = continuous_data[continuous_data < 2**num_qubits-0.5]\n", + "\n", + " # Crop the data so it is a multiple of the sample size\n", + " # This can cause problems if the sample size is very low (e.g. 1) as it can\n", + " # crop all the way to empty\n", + " continuous_data = continuous_data[:len(continuous_data)\n", + " //sample_size* sample_size]\n", "\n", - " # Convert the decimal into binary tensor\n", - " discrete_data = tf.cast(tf.math.mod(tf.bitwise.right_shift(tf.expand_dims(discrete_data,1), tf.range(num_qubits)), 2),dtype=tf.float32)\n", + " # Discretize the remaining data so the continuous distribution can be \n", + " # approximated by a discrete distribution\n", + " discrete_data = tf.convert_to_tensor(\n", + " np.around(continuous_data, decimals=0), dtype=tf.dtypes.float32)\n", " \n", - " # Intialise the same number of circuits as the discrete tensor to a uniform distribution by applying multiple hardardman gates\n", - " noise = []\n", - " for n in range(discrete_data.shape[0]):\n", - " noise.append(cirq.Circuit(cirq.Moment(cirq.H.on_each(qubits))))\n", - " noise = tfq.convert_to_tensor(noise)\n", + " # Split the data into batches of the required sample size\n", + " batches = tf.reshape(\n", + " discrete_data,(len(continuous_data)//sample_size,sample_size))\n", "\n", - " return noise, discrete_data\n", + " # Initialize the same number of circuits as the discrete tensor to a uniform \n", + " # distribution by applying multiple Hadamard gates\n", + " noise = tfq.convert_to_tensor(\n", + " [cirq.Circuit(\n", + " cirq.H.on_each(qubits)\n", + " ) for _ in range(len(continuous_data))])\n", + "\n", + " return noise, batches\n", "\n" ], - "execution_count": 26, + "execution_count": 3, "outputs": [] }, { @@ -185,106 +351,82 @@ "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", - "height": 358 + "height": 326 }, - "outputId": "98b4f238-d6a3-4513-c35f-66136974074d" + "outputId": "a98c7664-260a-4dfe-db10-ea02457e1a14" }, "source": [ "def quantum_generator_model(initial_distribution_tensor):\n", " # Create parameters for each qubit\n", - " theta = sympy.symbols('a0:%d'%num_qubits)\n", + " theta = sympy.symbols(f'a0:{num_qubits}')\n", "\n", " # Set the input to the network\n", - " inputs = tf.keras.Input(shape=(),dtype=tf.dtypes.string)\n", + " inputs = tf.keras.Input(shape=(), dtype=tf.dtypes.string)\n", "\n", " # Create the parameterised Ry rotation layer circuit\n", - " parameterized_circuit = cirq.Circuit(cirq.Moment([cirq.ry(theta[i])(qubits[i]) for i in range(num_qubits)]))\n", + " parameterized_circuit = cirq.Circuit(cirq.Moment(\n", + " [cirq.ry(t)(q) for t, q in zip(theta,qubits)]))\n", "\n", - " # Entangle all the qubits by applying CZ in a circular fashion - except when there are only two qubits and then just apply one CZ\n", - " entangle_circuit = cirq.Circuit()\n", + " # Entangle all the qubits by applying CZ in a circular fashion\n", + " # except when there are only two qubits and then just apply one CZ\n", + " entangle_circuit = cirq.Circuit(\n", + " [cirq.CZ(q1, q2) for q1, q2 in zip(qubits[0:-1], qubits[1:])])\n", " if(num_qubits > 2):\n", - " for i in range(num_qubits):\n", - " entangle_circuit.append([cirq.CZ(qubits[i], qubits[(i + 1) % num_qubits])])\n", - " else:\n", - " entangle_circuit.append([cirq.CZ(qubits[0],qubits[1])])\n", + " entangle_circuit.append([cirq.CZ(qubits[0], qubits[-1])])\n", " \n", " # Combine the parameterized circuit layer and the entanglement circuit layer\n", " layer_circuit = parameterized_circuit + entangle_circuit\n", " print(layer_circuit)\n", "\n", - " # Add this circuit layer to the network with an output on measurements on in the Z component\n", - " # Manipulate the output so it maps the -1, 1 outputs to 0, 1 like the binary discrete data generated by generate_data\n", - " layer = tfq.layers.PQC(layer_circuit, [(cirq.Z(qubits[i])+1)/2 for i in range(num_qubits)], repetitions=1)(inputs) #Important to have repetition =1\n", + " # Add this circuit layer to the network with the output configured\n", + " # to return a decimal value equivalent to the binary produced from the Z \n", + " # measurement with -1 mapping to 0, 1 mapping to 1\n", + " observable = sum((cirq.Z(qubits[i])+1)/2*2**i for i in range(num_qubits))\n", + " # Repetitions is set to 1 so integers are output, rather than averages\n", + " layer = tfq.layers.PQC(layer_circuit, observable , repetitions=1)(inputs)\n", + " \n", " model = tf.keras.Model(inputs=[inputs], outputs=[layer])\n", - "\n", " #model.summary()\n", - "\n", - " return model(initial_distribution_tensor)\n", + " return tf.cast(tf.reshape(\n", + " model(initial_distribution_tensor),\n", + " (initial_distribution_tensor.shape[0] // sample_size,\n", + " sample_size)),dtype=tf.float32)\n", "\n", "# Test the quantum generator\n", "noise, real_data = generate_data()\n", - "print(quantum_generator_model(noise))\n", + "data = quantum_generator_model(noise)\n", + "print(data)\n", "print(real_data)" ], - "execution_count": 27, + "execution_count": 4, "outputs": [ { "output_type": "stream", "text": [ - "(0, 0): ───Ry(a0)───@───────@───\n", - " │ │\n", - "(1, 0): ───Ry(a1)───@───@───┼───\n", - " │ │\n", - "(2, 0): ───Ry(a2)───────@───@───\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", "tf.Tensor(\n", - "[[1. 0. 0.]\n", - " [0. 1. 0.]\n", - " [1. 1. 0.]\n", + "[[0. 2. 1. ... 0. 2. 1.]\n", + " [0. 0. 1. ... 1. 1. 1.]\n", + " [0. 1. 1. ... 0. 1. 1.]\n", " ...\n", - " [1. 0. 0.]\n", - " [1. 0. 0.]\n", - " [1. 0. 0.]], shape=(856, 3), dtype=float32)\n", + " [1. 1. 1. ... 1. 1. 1.]\n", + " [1. 1. 3. ... 2. 1. 1.]\n", + " [3. 1. 1. ... 1. 0. 2.]], shape=(598, 50), dtype=float32)\n", "tf.Tensor(\n", - "[[0. 0. 0.]\n", - " [1. 0. 0.]\n", - " [0. 1. 0.]\n", + "[[2. 3. 0. ... 2. 2. 3.]\n", + " [3. 3. 1. ... 1. 3. 1.]\n", + " [1. 2. 0. ... 3. 3. 3.]\n", " ...\n", - " [1. 0. 0.]\n", - " [0. 0. 1.]\n", - " [1. 1. 0.]], shape=(856, 3), dtype=float32)\n" + " [1. 3. 2. ... 3. 3. 1.]\n", + " [1. 3. 3. ... 1. 1. 3.]\n", + " [3. 1. 1. ... 2. 1. 2.]], shape=(598, 50), dtype=float32)\n" ], "name": "stdout" } ] }, - { - "cell_type": "markdown", - "metadata": { - "id": "NfzqbvDmR1m1", - "colab_type": "text" - }, - "source": [ - "## Generator Loss Function" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "7IgRsGmCR43s", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def generator_loss_function(gan_model):\n", - " # Function from https://www.nature.com/articles/s41534-019-0223-2\n", - " m = gan_model.discriminator_gen_outputs.shape[0]\n", - " sum = tf.math.reduce_sum(tf.math.log(gan_model.discriminator_gen_outputs))\n", - " sum = 1/m * sum\n", - " return sum" - ], - "execution_count": 19, - "outputs": [] - }, { "cell_type": "markdown", "metadata": { @@ -302,7 +444,7 @@ "colab_type": "text" }, "source": [ - "The discriminator is a classical neural network. You will use a 3-layer network with 50 input nodes, 20 hidden nodes and 1 output nodes. The structure of the discriminator is picked so it is equally balanced with the generator by emperical methods (we have just used the same structure as https://www.nature.com/articles/s41534-019-0223-2)." + "The discriminator is a classical neural network. You will use a 3-layer network with an input layer, a hidden layer with 50 hidden nodes, a hidden layer with 20 hidden nodes and 1 output node. The structure of the discriminator is picked so it is equally balanced with the generator by emperical methods (we have just used the same structure as https://www.nature.com/articles/s41534-019-0223-2)." ] }, { @@ -310,54 +452,1253 @@ "metadata": { "id": "DHHwHieb7QLj", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "535d3188-7104-42f0-e703-a0d0e72e3c0b" }, "source": [ "def discriminator_model(real_input, gen_inputs):\n", + " \n", " model = tf.keras.Sequential()\n", - " model.add(tf.keras.Input(shape=(num_qubits,)))\n", - " model.add(tf.keras.layers.Dense(50, activation=\"relu\"))\n", + " model.add(tf.keras.Input(shape=(sample_size,)))\n", " model.add(tf.keras.layers.Dense(20, activation=\"relu\"))\n", " model.add(tf.keras.layers.Dense(1, activation=\"sigmoid\"))\n", " #model.summary()\n", - " #print(real_input)\n", + " print(real_input)\n", " \n", " return model(real_input)\n", "\n", - "#discriminator = make_discriminator_model()\n", - "#tf.keras.utils.plot_model(discriminator,show_shapes=True, show_layer_names=False, dpi=70)" + "d1 = discriminator_model(data, noise)\n", + "print(d1)\n", + "d2 = discriminator_model(real_data, noise)\n", + "print(d2)" ], - "execution_count": 20, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "S2lrCLuLMfFc", - "colab_type": "text" - }, - "source": [ - "## Discriminator loss function" + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "text": [ + "tf.Tensor(\n", + "[[0. 2. 1. ... 0. 2. 1.]\n", + " [0. 0. 1. ... 1. 1. 1.]\n", + " [0. 1. 1. ... 0. 1. 1.]\n", + " ...\n", + " [1. 1. 1. ... 1. 1. 1.]\n", + " [1. 1. 3. ... 2. 1. 1.]\n", + " [3. 1. 1. ... 1. 0. 2.]], shape=(598, 50), dtype=float32)\n", + "tf.Tensor(\n", + "[[0.04196338]\n", + " [0.27266592]\n", + " [0.20387009]\n", + " [0.10551755]\n", + " [0.33895066]\n", + " [0.5607761 ]\n", + " [0.01904764]\n", + " [0.5698652 ]\n", + " [0.06592283]\n", + " [0.17044581]\n", + " [0.10697818]\n", + " [0.29591376]\n", + " [0.11277947]\n", + " [0.14306422]\n", + " [0.278469 ]\n", + " [0.17531624]\n", + " [0.39308968]\n", + " [0.09315131]\n", + " [0.29625157]\n", + " [0.15907799]\n", + " [0.2871086 ]\n", + " [0.12121072]\n", + " [0.3500702 ]\n", + " [0.3817374 ]\n", + " [0.20325089]\n", + " [0.3309933 ]\n", + " [0.01982394]\n", + " [0.13464607]\n", + " [0.20136324]\n", + " [0.21777107]\n", + " [0.11375783]\n", + " [0.09663168]\n", + " [0.16167657]\n", + " [0.3930824 ]\n", + " [0.23511837]\n", + " [0.17967328]\n", + " [0.15124165]\n", + " [0.14190216]\n", + " [0.3723028 ]\n", + " [0.21404546]\n", + " [0.24877833]\n", + " [0.16717948]\n", + " [0.1358577 ]\n", + " [0.20491494]\n", + " [0.22274303]\n", + " [0.07413235]\n", + " [0.11708534]\n", + " [0.30987257]\n", + " [0.12337372]\n", + " [0.20173752]\n", + " [0.06520469]\n", + " [0.5435832 ]\n", + " [0.10337945]\n", + " [0.23658587]\n", + " [0.16840404]\n", + " [0.5805596 ]\n", + " [0.36362392]\n", + " [0.11897162]\n", + " [0.07900479]\n", + " [0.19759305]\n", + " [0.09132273]\n", + " [0.2922706 ]\n", + " [0.16292569]\n", + " [0.20711577]\n", + " [0.15527584]\n", + " [0.24857406]\n", + " [0.42944127]\n", + " [0.08555594]\n", + " [0.31653142]\n", + " [0.11382154]\n", + " [0.27301946]\n", + " [0.3312118 ]\n", + " [0.12812293]\n", + " [0.09796012]\n", + " [0.14760566]\n", + " [0.18759163]\n", + " [0.5132539 ]\n", + " [0.25072643]\n", + " [0.22716676]\n", + " [0.09929606]\n", + " [0.17957759]\n", + " [0.21764185]\n", + " [0.21378581]\n", + " [0.2936371 ]\n", + " [0.33228248]\n", + " [0.3479959 ]\n", + " [0.28782567]\n", + " [0.53356403]\n", + " [0.13577795]\n", + " [0.18961726]\n", + " [0.24788024]\n", + " [0.3533282 ]\n", + " [0.2546042 ]\n", + " [0.20243661]\n", + " [0.2862381 ]\n", + " [0.08501486]\n", + " [0.07385254]\n", + " [0.21679498]\n", + " [0.16410054]\n", + " [0.32516328]\n", + " [0.05822 ]\n", + " [0.11608237]\n", + " [0.3578469 ]\n", + " [0.22392389]\n", + " [0.34429163]\n", + " [0.10261083]\n", + " [0.2088847 ]\n", + " [0.30106467]\n", + " [0.45299026]\n", + " [0.49620607]\n", + " [0.20326409]\n", + " [0.06778032]\n", + " [0.7153322 ]\n", + " [0.30489525]\n", + " [0.16668092]\n", + " [0.22238383]\n", + " [0.0691215 ]\n", + " [0.01659771]\n", + " [0.30600655]\n", + " [0.36269993]\n", + " [0.29198226]\n", + " [0.41954267]\n", + " [0.26866135]\n", + " [0.21288632]\n", + " [0.14493528]\n", + " [0.14216948]\n", + " [0.29651895]\n", + " [0.27291197]\n", + " [0.20239069]\n", + " [0.35704246]\n", + " [0.5428234 ]\n", + " [0.2600717 ]\n", + " [0.21347351]\n", + " [0.2968389 ]\n", + " [0.09215328]\n", + " [0.35460672]\n", + " [0.23257974]\n", + " [0.26780102]\n", + " [0.04146734]\n", + " [0.2559512 ]\n", + " [0.6137853 ]\n", + " [0.09937537]\n", + " [0.35039848]\n", + " [0.13428591]\n", + " [0.5188672 ]\n", + " [0.4413665 ]\n", + " [0.5276289 ]\n", + " [0.26431334]\n", + " [0.36197078]\n", + " [0.15760385]\n", + " [0.27921703]\n", + " [0.05298775]\n", + " [0.4846103 ]\n", + " [0.05334086]\n", + " [0.18913414]\n", + " [0.46737018]\n", + " [0.15556085]\n", + " [0.28005055]\n", + " [0.08902469]\n", + " [0.07966176]\n", + " [0.12418076]\n", + " [0.46383002]\n", + " [0.17478414]\n", + " [0.25536498]\n", + " [0.09822258]\n", + " [0.10366845]\n", + " [0.23505408]\n", + " [0.5360304 ]\n", + " [0.17596556]\n", + " [0.22558813]\n", + " [0.07362123]\n", + " [0.02400539]\n", + " [0.66499877]\n", + " [0.22945385]\n", + " [0.10318703]\n", + " [0.0573759 ]\n", + " [0.15454674]\n", + " [0.34921587]\n", + " [0.1442583 ]\n", + " [0.22983047]\n", + " [0.2714374 ]\n", + " [0.30758095]\n", + " [0.18718617]\n", + " [0.19894713]\n", + " [0.20480075]\n", + " [0.09426221]\n", + " [0.2495385 ]\n", + " [0.19955698]\n", + " [0.23072147]\n", + " [0.20177914]\n", + " [0.28022075]\n", + " [0.14812301]\n", + " [0.4967185 ]\n", + " [0.0834794 ]\n", + " [0.28931916]\n", + " [0.38114804]\n", + " [0.5260778 ]\n", + " [0.30080977]\n", + " [0.333921 ]\n", + " [0.5146654 ]\n", + " [0.39540526]\n", + " [0.35677415]\n", + " [0.05867711]\n", + " [0.14411446]\n", + " [0.22264235]\n", + " [0.2521497 ]\n", + " [0.18305856]\n", + " [0.05115403]\n", + " [0.05842955]\n", + " [0.3428932 ]\n", + " [0.20221955]\n", + " [0.12698591]\n", + " [0.09053931]\n", + " [0.43108705]\n", + " [0.05923652]\n", + " [0.1732673 ]\n", + " [0.23359935]\n", + " [0.20609319]\n", + " [0.12625048]\n", + " [0.15840346]\n", + " [0.17453499]\n", + " [0.29175007]\n", + " [0.26664305]\n", + " [0.18714043]\n", + " [0.2999413 ]\n", + " [0.2264876 ]\n", + " [0.15357219]\n", + " [0.17315981]\n", + " [0.15065736]\n", + " [0.23067361]\n", + " [0.2469291 ]\n", + " [0.21044287]\n", + " [0.21314237]\n", + " [0.20511949]\n", + " [0.3538142 ]\n", + " [0.49692377]\n", + " [0.23420133]\n", + " [0.17143868]\n", + " [0.14640422]\n", + " [0.20905313]\n", + " [0.20226274]\n", + " [0.09016147]\n", + " [0.33379847]\n", + " [0.16767494]\n", + " [0.20347783]\n", + " [0.5059603 ]\n", + " [0.15795374]\n", + " [0.2572828 ]\n", + " [0.41002694]\n", + " [0.16238885]\n", + " [0.14137325]\n", + " [0.06370486]\n", + " [0.21260238]\n", + " [0.1645925 ]\n", + " [0.47247514]\n", + " [0.34375778]\n", + " [0.38453177]\n", + " [0.23575582]\n", + " [0.25774348]\n", + " [0.04792204]\n", + " [0.569437 ]\n", + " [0.2955854 ]\n", + " [0.27705386]\n", + " [0.10557642]\n", + " [0.20393282]\n", + " [0.14561383]\n", + " [0.05324625]\n", + " [0.22931498]\n", + " [0.15958767]\n", + " [0.3626034 ]\n", + " [0.13262722]\n", + " [0.1618069 ]\n", + " [0.2540402 ]\n", + " [0.16565791]\n", + " [0.27463427]\n", + " [0.2831662 ]\n", + " [0.14039251]\n", + " [0.20909214]\n", + " [0.07961019]\n", + " [0.16831307]\n", + " [0.10632644]\n", + " [0.25511187]\n", + " [0.09688626]\n", + " [0.20517573]\n", + " [0.11844373]\n", + " [0.20770128]\n", + " [0.14695282]\n", + " [0.31517062]\n", + " [0.22533385]\n", + " [0.24190234]\n", + " [0.16312993]\n", + " [0.16552967]\n", + " [0.4888069 ]\n", + " [0.16425274]\n", + " [0.38187623]\n", + " [0.1650453 ]\n", + " [0.14045842]\n", + " [0.06928426]\n", + " [0.22263008]\n", + " [0.5264675 ]\n", + " [0.28602433]\n", + " [0.52334535]\n", + " [0.02883768]\n", + " [0.24169372]\n", + " [0.07624766]\n", + " [0.31751004]\n", + " [0.2381358 ]\n", + " [0.14546728]\n", + " [0.31778744]\n", + " [0.33224759]\n", + " [0.3875114 ]\n", + " [0.5812336 ]\n", + " [0.1248336 ]\n", + " [0.33186853]\n", + " [0.08693488]\n", + " [0.1027406 ]\n", + " [0.20401256]\n", + " [0.16501682]\n", + " [0.257053 ]\n", + " [0.2999533 ]\n", + " [0.1880433 ]\n", + " [0.4551139 ]\n", + " [0.08139996]\n", + " [0.24146016]\n", + " [0.03616939]\n", + " [0.14949146]\n", + " [0.07616481]\n", + " [0.19771416]\n", + " [0.18213002]\n", + " [0.25529233]\n", + " [0.21642266]\n", + " [0.32596007]\n", + " [0.06352209]\n", + " [0.14417818]\n", + " [0.24210833]\n", + " [0.31664437]\n", + " [0.54726255]\n", + " [0.24967906]\n", + " [0.12247737]\n", + " [0.02382281]\n", + " [0.2465969 ]\n", + " [0.33479652]\n", + " [0.53202474]\n", + " [0.37575385]\n", + " [0.07474129]\n", + " [0.08552162]\n", + " [0.14891662]\n", + " [0.25678536]\n", + " [0.08189192]\n", + " [0.08045605]\n", + " [0.2407956 ]\n", + " [0.42066586]\n", + " [0.11638436]\n", + " [0.3459558 ]\n", + " [0.37828517]\n", + " [0.322379 ]\n", + " [0.14576693]\n", + " [0.24561949]\n", + " [0.3985174 ]\n", + " [0.14532189]\n", + " [0.18124813]\n", + " [0.17489175]\n", + " [0.2156855 ]\n", + " [0.30889946]\n", + " [0.14050354]\n", + " [0.17264499]\n", + " [0.20653333]\n", + " [0.4559961 ]\n", + " [0.06637115]\n", + " [0.1834941 ]\n", + " [0.36058605]\n", + " [0.28912166]\n", + " [0.369655 ]\n", + " [0.17515448]\n", + " [0.24777527]\n", + " [0.28620407]\n", + " [0.43685597]\n", + " [0.07065373]\n", + " [0.27370307]\n", + " [0.20748658]\n", + " [0.17665856]\n", + " [0.41364956]\n", + " [0.2475368 ]\n", + " [0.15191613]\n", + " [0.1673217 ]\n", + " [0.36673826]\n", + " [0.11719473]\n", + " [0.2842986 ]\n", + " [0.54968727]\n", + " [0.31903666]\n", + " [0.11326081]\n", + " [0.37971175]\n", + " [0.20474686]\n", + " [0.50539595]\n", + " [0.35092223]\n", + " [0.25941768]\n", + " [0.08607735]\n", + " [0.19609231]\n", + " [0.2408513 ]\n", + " [0.17480162]\n", + " [0.31879988]\n", + " [0.49730992]\n", + " [0.22114252]\n", + " [0.12075013]\n", + " [0.32476375]\n", + " [0.25239417]\n", + " [0.17155732]\n", + " [0.14845702]\n", + " [0.03558386]\n", + " [0.35078603]\n", + " [0.25448224]\n", + " [0.26713368]\n", + " [0.2843436 ]\n", + " [0.44375214]\n", + " [0.19955687]\n", + " [0.0954298 ]\n", + " [0.2542985 ]\n", + " [0.13361049]\n", + " [0.38135955]\n", + " [0.06391115]\n", + " [0.65258795]\n", + " [0.21519053]\n", + " [0.19181447]\n", + " [0.23294452]\n", + " [0.07242561]\n", + " [0.0778003 ]\n", + " [0.16877253]\n", + " [0.24931924]\n", + " [0.08310208]\n", + " [0.19791771]\n", + " [0.07280671]\n", + " [0.25628674]\n", + " [0.34585625]\n", + " [0.28831047]\n", + " [0.24650058]\n", + " [0.17257272]\n", + " [0.21304518]\n", + " [0.21622375]\n", + " [0.39263085]\n", + " [0.03938529]\n", + " [0.18365335]\n", + " [0.15527907]\n", + " [0.30346307]\n", + " [0.49784225]\n", + " [0.15342298]\n", + " [0.23868872]\n", + " [0.28039926]\n", + " [0.13138989]\n", + " [0.19770853]\n", + " [0.2037362 ]\n", + " [0.21072417]\n", + " [0.08982147]\n", + " [0.2661378 ]\n", + " [0.16485366]\n", + " [0.27717093]\n", + " [0.1909351 ]\n", + " [0.21820287]\n", + " [0.10254977]\n", + " [0.42412156]\n", + " [0.04674362]\n", + " [0.33249056]\n", + " [0.3499401 ]\n", + " [0.14735359]\n", + " [0.5039261 ]\n", + " [0.20162386]\n", + " [0.1673276 ]\n", + " [0.11144502]\n", + " [0.21589693]\n", + " [0.22901464]\n", + " [0.19643717]\n", + " [0.2680652 ]\n", + " [0.30890402]\n", + " [0.21406654]\n", + " [0.16533034]\n", + " [0.06075254]\n", + " [0.24708393]\n", + " [0.2639951 ]\n", + " [0.28149787]\n", + " [0.11919478]\n", + " [0.24682243]\n", + " [0.14861739]\n", + " [0.19917142]\n", + " [0.41258243]\n", + " [0.1799623 ]\n", + " [0.5735443 ]\n", + " [0.16717482]\n", + " [0.26629344]\n", + " [0.11048511]\n", + " [0.4952673 ]\n", + " [0.4526377 ]\n", + " [0.19535977]\n", + " [0.06626617]\n", + " [0.33475742]\n", + " [0.06720635]\n", + " [0.08385573]\n", + " [0.1121798 ]\n", + " [0.31087905]\n", + " [0.12289668]\n", + " [0.15838534]\n", + " [0.27525762]\n", + " [0.19710286]\n", + " [0.02224989]\n", + " [0.1643247 ]\n", + " [0.18117583]\n", + " [0.10004789]\n", + " [0.3126958 ]\n", + " [0.5073968 ]\n", + " [0.06604595]\n", + " [0.23116034]\n", + " [0.26035616]\n", + " [0.547022 ]\n", + " [0.32462084]\n", + " [0.17698197]\n", + " [0.19240218]\n", + " [0.38143814]\n", + " [0.14820035]\n", + " [0.26924554]\n", + " [0.15207438]\n", + " [0.17088087]\n", + " [0.07925367]\n", + " [0.26647896]\n", + " [0.18787514]\n", + " [0.27638745]\n", + " [0.08865101]\n", + " [0.05531118]\n", + " [0.24228154]\n", + " [0.19018891]\n", + " [0.15765657]\n", + " [0.0786178 ]\n", + " [0.48079845]\n", + " [0.3999899 ]\n", + " [0.10195612]\n", + " [0.2854506 ]\n", + " [0.19202003]\n", + " [0.19121581]\n", + " [0.15751633]\n", + " [0.46584582]\n", + " [0.16630237]\n", + " [0.30417612]\n", + " [0.15639372]\n", + " [0.33175594]\n", + " [0.16355573]\n", + " [0.44345146]\n", + " [0.20871682]\n", + " [0.12381209]\n", + " [0.18935768]\n", + " [0.3908467 ]\n", + " [0.39171422]\n", + " [0.11608682]\n", + " [0.32409567]\n", + " [0.30906728]\n", + " [0.19744052]\n", + " [0.11891425]\n", + " [0.08129691]\n", + " [0.40198848]\n", + " [0.32710394]\n", + " [0.22634101]\n", + " [0.52401453]\n", + " [0.21226768]\n", + " [0.3429694 ]\n", + " [0.25928158]\n", + " [0.28640515]\n", + " [0.08866087]\n", + " [0.3528072 ]\n", + " [0.26521546]\n", + " [0.12900673]\n", + " [0.14514545]\n", + " [0.39863023]\n", + " [0.12124092]\n", + " [0.42681038]\n", + " [0.18479452]\n", + " [0.43985346]\n", + " [0.17029096]\n", + " [0.27200192]\n", + " [0.07560325]\n", + " [0.20954564]\n", + " [0.31230366]\n", + " [0.41816765]\n", + " [0.2439235 ]\n", + " [0.23260842]\n", + " [0.05858685]\n", + " [0.14346725]\n", + " [0.21496671]\n", + " [0.03333722]\n", + " [0.12495941]\n", + " [0.14928788]\n", + " [0.17594676]\n", + " [0.31654304]\n", + " [0.07051434]\n", + " [0.33569866]\n", + " [0.12206015]\n", + " [0.49229306]\n", + " [0.41293693]\n", + " [0.44663113]\n", + " [0.20950605]\n", + " [0.10715698]\n", + " [0.25055453]\n", + " [0.17048258]], shape=(598, 1), dtype=float32)\n", + "tf.Tensor(\n", + "[[2. 3. 0. ... 2. 2. 3.]\n", + " [3. 3. 1. ... 1. 3. 1.]\n", + " [1. 2. 0. ... 3. 3. 3.]\n", + " ...\n", + " [1. 3. 2. ... 3. 3. 1.]\n", + " [1. 3. 3. ... 1. 1. 3.]\n", + " [3. 1. 1. ... 2. 1. 2.]], shape=(598, 50), dtype=float32)\n", + "tf.Tensor(\n", + "[[0.9777599 ]\n", + " [0.9863303 ]\n", + " [0.9863275 ]\n", + " [0.9840344 ]\n", + " [0.8239314 ]\n", + " [0.9940065 ]\n", + " [0.8922725 ]\n", + " [0.999403 ]\n", + " [0.99125004]\n", + " [0.8953877 ]\n", + " [0.9940084 ]\n", + " [0.9532425 ]\n", + " [0.91427076]\n", + " [0.98880184]\n", + " [0.8724105 ]\n", + " [0.9005273 ]\n", + " [0.99594456]\n", + " [0.9922369 ]\n", + " [0.94222546]\n", + " [0.9963691 ]\n", + " [0.9912498 ]\n", + " [0.9392533 ]\n", + " [0.9229871 ]\n", + " [0.9725041 ]\n", + " [0.9960542 ]\n", + " [0.99135244]\n", + " [0.94842684]\n", + " [0.98254573]\n", + " [0.9071129 ]\n", + " [0.99438715]\n", + " [0.987165 ]\n", + " [0.9306451 ]\n", + " [0.9453016 ]\n", + " [0.95491266]\n", + " [0.9953276 ]\n", + " [0.970555 ]\n", + " [0.99884534]\n", + " [0.9783959 ]\n", + " [0.9479516 ]\n", + " [0.9747959 ]\n", + " [0.99654573]\n", + " [0.9210691 ]\n", + " [0.96842146]\n", + " [0.99192894]\n", + " [0.98199445]\n", + " [0.90674204]\n", + " [0.83208627]\n", + " [0.8270503 ]\n", + " [0.98264676]\n", + " [0.97583485]\n", + " [0.9943528 ]\n", + " [0.9679588 ]\n", + " [0.99765885]\n", + " [0.9971564 ]\n", + " [0.9989907 ]\n", + " [0.9916459 ]\n", + " [0.984278 ]\n", + " [0.99109674]\n", + " [0.9808295 ]\n", + " [0.9887 ]\n", + " [0.9884405 ]\n", + " [0.998538 ]\n", + " [0.96653104]\n", + " [0.96877915]\n", + " [0.9922806 ]\n", + " [0.9813571 ]\n", + " [0.8007392 ]\n", + " [0.7364327 ]\n", + " [0.994499 ]\n", + " [0.99700874]\n", + " [0.97632897]\n", + " [0.990324 ]\n", + " [0.9779218 ]\n", + " [0.9763188 ]\n", + " [0.95736593]\n", + " [0.99657637]\n", + " [0.9324984 ]\n", + " [0.9953589 ]\n", + " [0.99449474]\n", + " [0.96582365]\n", + " [0.9971596 ]\n", + " [0.99528706]\n", + " [0.96220684]\n", + " [0.99656063]\n", + " [0.99256223]\n", + " [0.95945334]\n", + " [0.9983317 ]\n", + " [0.9086087 ]\n", + " [0.98994243]\n", + " [0.9860218 ]\n", + " [0.9811483 ]\n", + " [0.9553281 ]\n", + " [0.9784676 ]\n", + " [0.9655916 ]\n", + " [0.98192734]\n", + " [0.9985701 ]\n", + " [0.99448305]\n", + " [0.9241972 ]\n", + " [0.99939394]\n", + " [0.991117 ]\n", + " [0.99153674]\n", + " [0.8028728 ]\n", + " [0.9891685 ]\n", + " [0.96327865]\n", + " [0.9630788 ]\n", + " [0.9894051 ]\n", + " [0.98917025]\n", + " [0.99748516]\n", + " [0.9941123 ]\n", + " [0.975997 ]\n", + " [0.99663395]\n", + " [0.92264307]\n", + " [0.99574006]\n", + " [0.9820983 ]\n", + " [0.9989594 ]\n", + " [0.8531755 ]\n", + " [0.99879456]\n", + " [0.97140425]\n", + " [0.97094846]\n", + " [0.9884643 ]\n", + " [0.99798286]\n", + " [0.98691505]\n", + " [0.99822146]\n", + " [0.97236055]\n", + " [0.9811528 ]\n", + " [0.99690115]\n", + " [0.82486504]\n", + " [0.99475056]\n", + " [0.9992668 ]\n", + " [0.9933828 ]\n", + " [0.96602607]\n", + " [0.8932046 ]\n", + " [0.98856944]\n", + " [0.9960951 ]\n", + " [0.9341425 ]\n", + " [0.99837166]\n", + " [0.93498296]\n", + " [0.99180496]\n", + " [0.9807356 ]\n", + " [0.9980598 ]\n", + " [0.9796037 ]\n", + " [0.92678374]\n", + " [0.9793305 ]\n", + " [0.987591 ]\n", + " [0.99503505]\n", + " [0.9988784 ]\n", + " [0.99335396]\n", + " [0.97802347]\n", + " [0.9722519 ]\n", + " [0.9125066 ]\n", + " [0.8964589 ]\n", + " [0.98640984]\n", + " [0.9686915 ]\n", + " [0.9978162 ]\n", + " [0.91813624]\n", + " [0.99645376]\n", + " [0.9920183 ]\n", + " [0.99983287]\n", + " [0.8925005 ]\n", + " [0.9978204 ]\n", + " [0.99924505]\n", + " [0.9894785 ]\n", + " [0.89713067]\n", + " [0.9913394 ]\n", + " [0.9960069 ]\n", + " [0.9949774 ]\n", + " [0.71827006]\n", + " [0.99683326]\n", + " [0.99135673]\n", + " [0.99712425]\n", + " [0.9572756 ]\n", + " [0.9993506 ]\n", + " [0.9978801 ]\n", + " [0.9995074 ]\n", + " [0.9905702 ]\n", + " [0.9231906 ]\n", + " [0.98951143]\n", + " [0.7717949 ]\n", + " [0.92293733]\n", + " [0.9967217 ]\n", + " [0.7655146 ]\n", + " [0.9584887 ]\n", + " [0.99363106]\n", + " [0.9910883 ]\n", + " [0.96778464]\n", + " [0.98796797]\n", + " [0.9874072 ]\n", + " [0.8671845 ]\n", + " [0.9923649 ]\n", + " [0.99690706]\n", + " [0.99395233]\n", + " [0.98612845]\n", + " [0.93725884]\n", + " [0.9927187 ]\n", + " [0.9883956 ]\n", + " [0.9536047 ]\n", + " [0.9971475 ]\n", + " [0.9873351 ]\n", + " [0.9841576 ]\n", + " [0.9501855 ]\n", + " [0.9016285 ]\n", + " [0.98901165]\n", + " [0.99162394]\n", + " [0.985911 ]\n", + " [0.9994116 ]\n", + " [0.9840099 ]\n", + " [0.9896926 ]\n", + " [0.99390465]\n", + " [0.9837737 ]\n", + " [0.9879389 ]\n", + " [0.9849358 ]\n", + " [0.95444214]\n", + " [0.96185106]\n", + " [0.98583764]\n", + " [0.9853887 ]\n", + " [0.96530604]\n", + " [0.9577175 ]\n", + " [0.99209654]\n", + " [0.99182796]\n", + " [0.9970042 ]\n", + " [0.96313506]\n", + " [0.99665725]\n", + " [0.99876225]\n", + " [0.9759604 ]\n", + " [0.9753566 ]\n", + " [0.94357455]\n", + " [0.9939639 ]\n", + " [0.9975822 ]\n", + " [0.9581607 ]\n", + " [0.7264057 ]\n", + " [0.90340513]\n", + " [0.990231 ]\n", + " [0.88551056]\n", + " [0.9924867 ]\n", + " [0.8890426 ]\n", + " [0.9955445 ]\n", + " [0.9477519 ]\n", + " [0.9626575 ]\n", + " [0.8927224 ]\n", + " [0.9731145 ]\n", + " [0.95368886]\n", + " [0.9925754 ]\n", + " [0.96909136]\n", + " [0.9865371 ]\n", + " [0.99098164]\n", + " [0.99682367]\n", + " [0.9978574 ]\n", + " [0.9680195 ]\n", + " [0.9926634 ]\n", + " [0.9746379 ]\n", + " [0.9966265 ]\n", + " [0.9998901 ]\n", + " [0.9713291 ]\n", + " [0.9950132 ]\n", + " [0.9958442 ]\n", + " [0.76255816]\n", + " [0.99455076]\n", + " [0.99374866]\n", + " [0.9055506 ]\n", + " [0.98487365]\n", + " [0.98789865]\n", + " [0.9974554 ]\n", + " [0.9921153 ]\n", + " [0.99307597]\n", + " [0.9962943 ]\n", + " [0.99538213]\n", + " [0.91977525]\n", + " [0.97862715]\n", + " [0.9989808 ]\n", + " [0.98903465]\n", + " [0.98844856]\n", + " [0.97251344]\n", + " [0.9740209 ]\n", + " [0.99541867]\n", + " [0.9888009 ]\n", + " [0.9933815 ]\n", + " [0.9661086 ]\n", + " [0.97533935]\n", + " [0.99521685]\n", + " [0.8713212 ]\n", + " [0.9987118 ]\n", + " [0.9930655 ]\n", + " [0.9917338 ]\n", + " [0.9680951 ]\n", + " [0.9979837 ]\n", + " [0.9833829 ]\n", + " [0.9975721 ]\n", + " [0.9794351 ]\n", + " [0.99949396]\n", + " [0.99854004]\n", + " [0.9841129 ]\n", + " [0.9975897 ]\n", + " [0.8182254 ]\n", + " [0.9975799 ]\n", + " [0.987058 ]\n", + " [0.96534294]\n", + " [0.9412237 ]\n", + " [0.97617936]\n", + " [0.96353686]\n", + " [0.99826896]\n", + " [0.99806195]\n", + " [0.99664634]\n", + " [0.99624157]\n", + " [0.83291 ]\n", + " [0.96318394]\n", + " [0.99731857]\n", + " [0.9907126 ]\n", + " [0.98717207]\n", + " [0.9940282 ]\n", + " [0.9981206 ]\n", + " [0.96425235]\n", + " [0.99548596]\n", + " [0.73197335]\n", + " [0.98325104]\n", + " [0.9797626 ]\n", + " [0.8972077 ]\n", + " [0.9165122 ]\n", + " [0.99880195]\n", + " [0.9910808 ]\n", + " [0.99641883]\n", + " [0.9984005 ]\n", + " [0.9972716 ]\n", + " [0.9597902 ]\n", + " [0.99109954]\n", + " [0.94714653]\n", + " [0.9839405 ]\n", + " [0.98746014]\n", + " [0.8297749 ]\n", + " [0.98105836]\n", + " [0.9527131 ]\n", + " [0.9817244 ]\n", + " [0.99557894]\n", + " [0.90665406]\n", + " [0.9853733 ]\n", + " [0.9990928 ]\n", + " [0.9860756 ]\n", + " [0.97990465]\n", + " [0.97841316]\n", + " [0.99897885]\n", + " [0.9977437 ]\n", + " [0.997695 ]\n", + " [0.9901085 ]\n", + " [0.8306896 ]\n", + " [0.96802527]\n", + " [0.971312 ]\n", + " [0.72074664]\n", + " [0.8460156 ]\n", + " [0.9898733 ]\n", + " [0.9975541 ]\n", + " [0.9869484 ]\n", + " [0.97605443]\n", + " [0.9917005 ]\n", + " [0.9050897 ]\n", + " [0.99558026]\n", + " [0.98022455]\n", + " [0.9734471 ]\n", + " [0.994484 ]\n", + " [0.98737013]\n", + " [0.99581414]\n", + " [0.9929905 ]\n", + " [0.8427623 ]\n", + " [0.76278067]\n", + " [0.98167545]\n", + " [0.99067265]\n", + " [0.97734493]\n", + " [0.9303689 ]\n", + " [0.9639088 ]\n", + " [0.9192448 ]\n", + " [0.9721788 ]\n", + " [0.87672526]\n", + " [0.99951243]\n", + " [0.9984988 ]\n", + " [0.99651706]\n", + " [0.89290285]\n", + " [0.9909025 ]\n", + " [0.99884474]\n", + " [0.99123925]\n", + " [0.9986527 ]\n", + " [0.99287874]\n", + " [0.9690683 ]\n", + " [0.9606018 ]\n", + " [0.9375396 ]\n", + " [0.99837434]\n", + " [0.9916848 ]\n", + " [0.98857087]\n", + " [0.879761 ]\n", + " [0.98254323]\n", + " [0.95356655]\n", + " [0.9961041 ]\n", + " [0.9931426 ]\n", + " [0.9542254 ]\n", + " [0.9927912 ]\n", + " [0.9568587 ]\n", + " [0.96016794]\n", + " [0.68044466]\n", + " [0.9977792 ]\n", + " [0.9692128 ]\n", + " [0.99516135]\n", + " [0.9218072 ]\n", + " [0.99541086]\n", + " [0.9970843 ]\n", + " [0.99882776]\n", + " [0.97770965]\n", + " [0.9805741 ]\n", + " [0.91887116]\n", + " [0.99754435]\n", + " [0.9462496 ]\n", + " [0.9954247 ]\n", + " [0.97386116]\n", + " [0.8984086 ]\n", + " [0.98214906]\n", + " [0.8711413 ]\n", + " [0.99081236]\n", + " [0.9771293 ]\n", + " [0.9918087 ]\n", + " [0.8415312 ]\n", + " [0.98301184]\n", + " [0.9952857 ]\n", + " [0.962767 ]\n", + " [0.9556806 ]\n", + " [0.9336488 ]\n", + " [0.9763722 ]\n", + " [0.99564594]\n", + " [0.9526287 ]\n", + " [0.97115874]\n", + " [0.99972063]\n", + " [0.91972774]\n", + " [0.99254954]\n", + " [0.99420375]\n", + " [0.9913105 ]\n", + " [0.992679 ]\n", + " [0.97849965]\n", + " [0.96279484]\n", + " [0.96888834]\n", + " [0.9660808 ]\n", + " [0.9893729 ]\n", + " [0.92404985]\n", + " [0.9280869 ]\n", + " [0.99440974]\n", + " [0.98688877]\n", + " [0.9745617 ]\n", + " [0.9621764 ]\n", + " [0.9850927 ]\n", + " [0.9857566 ]\n", + " [0.93095064]\n", + " [0.9977549 ]\n", + " [0.9812232 ]\n", + " [0.9126662 ]\n", + " [0.9566443 ]\n", + " [0.8646174 ]\n", + " [0.50228536]\n", + " [0.9522517 ]\n", + " [0.96511346]\n", + " [0.9949055 ]\n", + " [0.9948192 ]\n", + " [0.9600249 ]\n", + " [0.9916999 ]\n", + " [0.9961384 ]\n", + " [0.97903305]\n", + " [0.9978885 ]\n", + " [0.9987017 ]\n", + " [0.9840058 ]\n", + " [0.99888045]\n", + " [0.9568232 ]\n", + " [0.96701294]\n", + " [0.99321824]\n", + " [0.9512193 ]\n", + " [0.99558455]\n", + " [0.96378917]\n", + " [0.9913681 ]\n", + " [0.9959472 ]\n", + " [0.95682937]\n", + " [0.9726681 ]\n", + " [0.9287377 ]\n", + " [0.9847638 ]\n", + " [0.9635327 ]\n", + " [0.9574488 ]\n", + " [0.9904744 ]\n", + " [0.9894666 ]\n", + " [0.97807115]\n", + " [0.9650212 ]\n", + " [0.9982539 ]\n", + " [0.9924304 ]\n", + " [0.8373775 ]\n", + " [0.9977938 ]\n", + " [0.9845254 ]\n", + " [0.9694584 ]\n", + " [0.98908806]\n", + " [0.97541624]\n", + " [0.9640077 ]\n", + " [0.9721547 ]\n", + " [0.906111 ]\n", + " [0.9784305 ]\n", + " [0.98105145]\n", + " [0.9368743 ]\n", + " [0.9953949 ]\n", + " [0.9806919 ]\n", + " [0.97262716]\n", + " [0.908168 ]\n", + " [0.8312944 ]\n", + " [0.9938699 ]\n", + " [0.99518436]\n", + " [0.99618894]\n", + " [0.9482542 ]\n", + " [0.99034435]\n", + " [0.9455495 ]\n", + " [0.88142455]\n", + " [0.974901 ]\n", + " [0.95971745]\n", + " [0.9652954 ]\n", + " [0.95488346]\n", + " [0.99204975]\n", + " [0.99632096]\n", + " [0.9414955 ]\n", + " [0.99402076]\n", + " [0.9972193 ]\n", + " [0.97236496]\n", + " [0.9111573 ]\n", + " [0.997451 ]\n", + " [0.97536236]\n", + " [0.9942204 ]\n", + " [0.9766573 ]\n", + " [0.99488926]\n", + " [0.9934136 ]\n", + " [0.9972235 ]\n", + " [0.9821973 ]\n", + " [0.77461237]\n", + " [0.9422089 ]\n", + " [0.99545044]\n", + " [0.9571677 ]\n", + " [0.9987326 ]\n", + " [0.98533547]\n", + " [0.9930688 ]\n", + " [0.9769747 ]\n", + " [0.9558447 ]\n", + " [0.96666 ]\n", + " [0.99129736]\n", + " [0.77438045]\n", + " [0.9905688 ]\n", + " [0.91357446]\n", + " [0.9675626 ]\n", + " [0.99785405]\n", + " [0.9983891 ]\n", + " [0.9875373 ]\n", + " [0.99442273]\n", + " [0.98508203]\n", + " [0.9974554 ]\n", + " [0.99498147]\n", + " [0.9937528 ]\n", + " [0.9844578 ]\n", + " [0.99076146]\n", + " [0.9901904 ]\n", + " [0.96884435]\n", + " [0.98003656]\n", + " [0.9905089 ]\n", + " [0.9816591 ]\n", + " [0.9902226 ]\n", + " [0.9891377 ]\n", + " [0.7547166 ]\n", + " [0.93586457]\n", + " [0.9727118 ]\n", + " [0.98243284]\n", + " [0.993082 ]\n", + " [0.986894 ]\n", + " [0.97965264]\n", + " [0.98201525]\n", + " [0.98979354]\n", + " [0.95748913]\n", + " [0.9981375 ]\n", + " [0.98155767]\n", + " [0.96112615]\n", + " [0.9385618 ]\n", + " [0.98897713]\n", + " [0.9958942 ]\n", + " [0.98520434]\n", + " [0.99545336]\n", + " [0.84992796]\n", + " [0.96527183]\n", + " [0.98988694]\n", + " [0.9977718 ]\n", + " [0.9738715 ]\n", + " [0.9973437 ]\n", + " [0.9461605 ]\n", + " [0.991856 ]\n", + " [0.99376464]\n", + " [0.9867771 ]\n", + " [0.99058175]\n", + " [0.98116404]\n", + " [0.9940236 ]\n", + " [0.7476264 ]\n", + " [0.90638494]\n", + " [0.9893499 ]\n", + " [0.9479379 ]\n", + " [0.9984478 ]\n", + " [0.9630943 ]\n", + " [0.9964647 ]\n", + " [0.98212415]\n", + " [0.9980027 ]], shape=(598, 1), dtype=float32)\n" + ], + "name": "stdout" + } ] }, - { - "cell_type": "code", - "metadata": { - "id": "ezQQLtBGMn2h", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def discriminator_loss_function(gan_model):\n", - " # function from https://www.nature.com/articles/s41534-019-0223-2\n", - " m = gan_model.discriminator_gen_outputs.shape[0]\n", - " sum = tf.math.reduce_sum(tf.math.log(gan_model.discriminator_real_outputs) + tf.math.log(1-gan_model.discriminator_gen_outputs))\n", - " sum = 1/m * sum\n", - " return sum" - ], - "execution_count": 21, - "outputs": [] - }, { "cell_type": "markdown", "metadata": { @@ -379,31 +1720,18 @@ "def get_eval_metric_ops_fn(gan_model):\n", " real_data_logits = tf.reduce_mean(gan_model.discriminator_real_outputs)\n", " gen_data_logits = tf.reduce_mean(gan_model.discriminator_gen_outputs)\n", - "\n", - " # Convert 2 bit binary tensor into single decimal tensor\n", - " sum_tensor = tf.reduce_sum(tf.map_fn(lambda t: t * 2 ** tf.range(tf.cast(gan_model.generated_data.shape[1], dtype=tf.int64)),\n", - " tf.cast(tf.reverse(tensor=gan_model.generated_data, axis=[1]), dtype=tf.int64)), axis=1)\n", " \n", - " # Create labels to compare sum_tensor to so we can return the percentage of each result at every evaluation\n", - " zeros = tf.zeros(sum_tensor.shape)\n", - " ones = tf.ones(sum_tensor.shape)\n", - " twos = tf.ones(sum_tensor.shape) * 2\n", - " threes = tf.ones(sum_tensor.shape) * 3\n", - "\n", - " # Attempt to calculate entropy to see how accurate the network is (but this doesn't work yet - just gives nan)\n", + " # Attempt to calculate entropy to see how accurate the network is \n", + " # (but this doesn't work yet)\n", " cce = tf.keras.losses.CategoricalCrossentropy()\n", " entropy = cce(gan_model.generated_data, gan_model.real_data)\n", " return {\n", " 'real_data_logits': tf.compat.v1.metrics.mean(real_data_logits),\n", " 'gen_data_logits': tf.compat.v1.metrics.mean(gen_data_logits),\n", - " 'zeros': tf.compat.v1.metrics.accuracy(zeros,sum_tensor),\n", - " 'ones':tf.compat.v1.metrics.accuracy(ones,sum_tensor),\n", - " 'twos':tf.compat.v1.metrics.accuracy(twos,sum_tensor),\n", - " 'threes':tf.compat.v1.metrics.accuracy(threes,sum_tensor),\n", " 'entropy':tf.compat.v1.metrics.mean(entropy),\n", " }" ], - "execution_count": 22, + "execution_count": 6, "outputs": [] }, { @@ -425,32 +1753,38 @@ "base_uri": "https://localhost:8080/", "height": 1000 }, - "outputId": "bc38a488-2ac6-4daa-fbf4-7ff2fd4b784c" + "outputId": "10b6155b-e73c-4fac-dcc0-ca6d26583168" }, "source": [ + "tf.get_logger().setLevel('INFO')\n", + "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO) \n", + "tf.autograph.set_verbosity(0, False)\n", + "\n", "generator_lr = 0.001\n", "discriminator_lr = 0.0002\n", "\n", "# Configure the GAN estimator with all the functions from above\n", - "gan_estimator = tfg.estimator.GANEstimator(generator_fn=quantum_generator_model,\n", - " discriminator_fn=discriminator_model,\n", - " generator_loss_fn=generator_loss_function,\n", - " discriminator_loss_fn=discriminator_loss_function,\n", - " generator_optimizer=tf.compat.v1.train.AdamOptimizer(generator_lr, 0.5),\n", - " discriminator_optimizer=tf.compat.v1.train.AdamOptimizer(discriminator_lr, 0.5),\n", - " get_eval_metric_ops_fn=get_eval_metric_ops_fn)\n", + "gan_estimator = tfg.estimator.GANEstimator(\n", + " generator_fn=quantum_generator_model,\n", + " discriminator_fn=discriminator_model,\n", + " generator_loss_fn=tfg.losses.modified_generator_loss,\n", + " discriminator_loss_fn=tfg.losses.modified_discriminator_loss,\n", + " generator_optimizer=tf.compat.v1.train.AdamOptimizer(generator_lr),\n", + " discriminator_optimizer=tf.compat.v1.train.AdamOptimizer(discriminator_lr),\n", + " get_eval_metric_ops_fn=get_eval_metric_ops_fn)\n", "\n", - "steps_per_eval = 10 #@param\n", - "max_train_steps = 100 #@param\n", - "batches_for_eval_metrics = 10 #@param\n", + "\n", + "steps_per_eval = 500#@param\n", + "max_train_steps = 5000#@param\n", + "batches_for_eval_metrics = 100 #@param\n", "\n", "# Used to track metrics.\n", "steps = []\n", "real_logits, fake_logits = [], []\n", - "zeros, ones, twos, threes = [],[],[],[]\n", + "frequencies = []\n", + "entropy = []\n", "\n", "cur_step = 0\n", - "start_time = time.time()\n", "while cur_step < max_train_steps:\n", " next_step = min(cur_step + steps_per_eval, max_train_steps)\n", " gan_estimator.train(generate_data, max_steps=next_step)\n", @@ -458,447 +1792,681 @@ " cur_step = next_step\n", " \n", " # Calculate some metrics.\n", - " metrics = gan_estimator.evaluate(generate_data, steps=batches_for_eval_metrics)\n", + " metrics = gan_estimator.evaluate(generate_data, \n", + " steps=batches_for_eval_metrics)\n", + " \n", + " # Generate predictions\n", + " iterator = gan_estimator.predict(generate_data)\n", + " predictions = np.array([next(iterator) for _ in range(10)])\n", + " frequency = np.mean(\n", + " [np.bincount(p.astype(int), minlength=4) for p in predictions], axis=0)\n", + " print(frequency)\n", " steps.append(cur_step)\n", " real_logits.append(metrics['real_data_logits'])\n", " fake_logits.append(metrics['gen_data_logits'])\n", " print('Average discriminator output on Real: %.2f Fake: %.2f' % (\n", " real_logits[-1], fake_logits[-1]))\n", " plt.figure()\n", - " plt.bar(np.arange(0,4), [metrics['zeros'],metrics['ones'],metrics['twos'],metrics['threes']])\n", - " zeros.append(metrics['zeros'])\n", - " ones.append(metrics['ones'])\n", - " twos.append(metrics['twos'])\n", - " threes.append(metrics['threes'])\n", - " print(metrics['entropy'])\n", + " plt.bar(np.arange(0,4), frequency)\n", + " frequencies.append(frequency)\n", + " entropy.append(metrics['entropy'])\n", "\n", "plt.figure()\n", - "plt.plot(steps, zeros, steps, ones, steps, twos, steps, threes)\n" + "plt.plot(steps, frequencies)\n", + "plt.figure()\n", + "plt.plot(steps, entropy)" ], - "execution_count": null, + "execution_count": 9, "outputs": [ { "output_type": "stream", "text": [ "INFO:tensorflow:Using default config.\n", - "WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpjlrkso7q\n", - "INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpjlrkso7q', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true\n", + "WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpel1pa8ez\n", + "INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpel1pa8ez', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true\n", "graph_options {\n", " rewrite_options {\n", " meta_optimizer_iterations: ONE\n", " }\n", "}\n", ", '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}\n", - "WARNING:tensorflow:Estimator's model_fn (._model_fn at 0x7fae7b7432f0>) includes params argument, but params are not passed to Estimator.\n", + "WARNING:tensorflow:Estimator's model_fn (._model_fn at 0x7fe36b9979d8>) includes params argument, but params are not passed to Estimator.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", "INFO:tensorflow:Done calling model_fn.\n", "INFO:tensorflow:Create CheckpointSaverHook.\n", "INFO:tensorflow:Graph was finalized.\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.321094, step = 0\n", - "INFO:tensorflow:Saving checkpoints for 10 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.3661062.\n", + "INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.6590546, step = 0\n", + "INFO:tensorflow:global_step/sec: 1.38187\n", + "INFO:tensorflow:loss = 1.2525809, step = 101 (72.368 sec)\n", + "INFO:tensorflow:global_step/sec: 1.37959\n", + "WARNING:tensorflow:It seems that global step (tf.train.get_global_step) has not been increased. Current value (could be stable): 200 vs previous value: 200. You could increase the global step by passing tf.train.get_global_step() to Optimizer.apply_gradients or Optimizer.minimize.\n", + "INFO:tensorflow:loss = 1.1954446, step = 200 (72.487 sec)\n", + "INFO:tensorflow:global_step/sec: 1.38145\n", + "WARNING:tensorflow:It seems that global step (tf.train.get_global_step) has not been increased. Current value (could be stable): 300 vs previous value: 300. You could increase the global step by passing tf.train.get_global_step() to Optimizer.apply_gradients or Optimizer.minimize.\n", + "INFO:tensorflow:loss = 1.1788788, step = 300 (72.386 sec)\n", + "INFO:tensorflow:global_step/sec: 1.36622\n", + "WARNING:tensorflow:It seems that global step (tf.train.get_global_step) has not been increased. Current value (could be stable): 400 vs previous value: 400. You could increase the global step by passing tf.train.get_global_step() to Optimizer.apply_gradients or Optimizer.minimize.\n", + "INFO:tensorflow:loss = 1.1599461, step = 400 (73.197 sec)\n", + "INFO:tensorflow:Saving checkpoints for 500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.1716442.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:03:09Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.06482s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:03:21\n", + "INFO:tensorflow:Saving dict for global step 500: discriminator_loss = 1.171289, entropy = 95.706894, gen_data_logits = 0.07700764, generator_loss = 0.655901, global_step = 500, loss = 1.171289, real_data_logits = 0.9991762\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 500: /tmp/tmpel1pa8ez/model.ckpt-500\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:49:52Z\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-10\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-500\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.92984s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:49:53\n", - "INFO:tensorflow:Saving dict for global step 10: discriminator_loss = -1.3667452, entropy = nan, gen_data_logits = 0.511203, generator_loss = -0.6710436, global_step = 10, loss = -1.3667452, ones = 0.0053333333, real_data_logits = 0.5217606, threes = 0.55733335, twos = 0.4335, zeros = 0.0038333333\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 10: /tmp/tmpjlrkso7q/model.ckpt-10\n", - "Average discriminator output on Real: 0.52 Fake: 0.51\n", - "nan\n", + "[34.5 12.5 2.6 0.4]\n", + "Average discriminator output on Real: 1.00 Fake: 0.08\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", "INFO:tensorflow:Done calling model_fn.\n", "INFO:tensorflow:Create CheckpointSaverHook.\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-10\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-500\n", + "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/training/saver.py:1069: get_checkpoint_mtimes (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Use standard file utilities to get mtimes.\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 10 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.3706237, step = 10\n", - "INFO:tensorflow:Saving checkpoints for 20 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.4174153.\n", + "INFO:tensorflow:Saving checkpoints for 500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.1754822, step = 500\n", + "WARNING:tensorflow:It seems that global step (tf.train.get_global_step) has not been increased. Current value (could be stable): 507 vs previous value: 507. You could increase the global step by passing tf.train.get_global_step() to Optimizer.apply_gradients or Optimizer.minimize.\n", + "INFO:tensorflow:global_step/sec: 1.36919\n", + "INFO:tensorflow:loss = 1.1780654, step = 601 (73.040 sec)\n", + "INFO:tensorflow:global_step/sec: 1.37143\n", + "INFO:tensorflow:loss = 1.2177453, step = 701 (72.919 sec)\n", + "INFO:tensorflow:global_step/sec: 1.36622\n", + "INFO:tensorflow:loss = 1.2526287, step = 801 (73.191 sec)\n", + "INFO:tensorflow:global_step/sec: 1.36489\n", + "INFO:tensorflow:loss = 1.2591925, step = 901 (73.268 sec)\n", + "INFO:tensorflow:Saving checkpoints for 1000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.262226.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:49:59Z\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:09:34Z\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-20\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1000\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.99218s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:00\n", - "INFO:tensorflow:Saving dict for global step 20: discriminator_loss = -1.4193214, entropy = nan, gen_data_logits = 0.524186, generator_loss = -0.64598644, global_step = 20, loss = -1.4193214, ones = 0.0059322035, real_data_logits = 0.50851995, threes = 0.5622034, twos = 0.42762712, zeros = 0.004237288\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 20: /tmp/tmpjlrkso7q/model.ckpt-20\n", - "Average discriminator output on Real: 0.51 Fake: 0.52\n", - "nan\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.34748s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:09:46\n", + "INFO:tensorflow:Saving dict for global step 1000: discriminator_loss = 1.2652749, entropy = 4.1560354, gen_data_logits = 0.25137702, generator_loss = 0.57563394, global_step = 1000, loss = 1.2652749, real_data_logits = 0.9999847\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1000: /tmp/tmpel1pa8ez/model.ckpt-1000\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "[49. 1. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.25\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", "INFO:tensorflow:Done calling model_fn.\n", "INFO:tensorflow:Create CheckpointSaverHook.\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-20\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 1000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.2678082, step = 1000\n", + "INFO:tensorflow:global_step/sec: 1.34818\n", + "INFO:tensorflow:loss = 1.2553058, step = 1100 (74.175 sec)\n", + "INFO:tensorflow:global_step/sec: 1.34396\n", + "INFO:tensorflow:loss = 1.250981, step = 1200 (74.407 sec)\n", + "INFO:tensorflow:global_step/sec: 1.35216\n", + "INFO:tensorflow:loss = 1.237549, step = 1300 (73.956 sec)\n", + "INFO:tensorflow:global_step/sec: 1.34592\n", + "INFO:tensorflow:loss = 1.2266576, step = 1400 (74.299 sec)\n", + "INFO:tensorflow:Saving checkpoints for 1500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.2159001.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:16:04Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1500\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 20 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.42323, step = 20\n", - "INFO:tensorflow:Saving checkpoints for 30 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.4711331.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.58863s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:16:16\n", + "INFO:tensorflow:Saving dict for global step 1500: discriminator_loss = 1.2157844, entropy = 0.031484038, gen_data_logits = 0.16217975, generator_loss = 0.6153425, global_step = 1500, loss = 1.2157844, real_data_logits = 0.99999297\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1500: /tmp/tmpel1pa8ez/model.ckpt-1500\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:06Z\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-30\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1500\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.96922s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:07\n", - "INFO:tensorflow:Saving dict for global step 30: discriminator_loss = -1.4720995, entropy = nan, gen_data_logits = 0.537337, generator_loss = -0.62125856, global_step = 30, loss = -1.4720995, ones = 0.0067357514, real_data_logits = 0.49611425, threes = 0.5580311, twos = 0.4300518, zeros = 0.005181347\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 30: /tmp/tmpjlrkso7q/model.ckpt-30\n", - "Average discriminator output on Real: 0.50 Fake: 0.54\n", - "nan\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.16\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "Tensor(\"Generator/Reshape:0\", shape=(61, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(61, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:5 out of the last 5 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", "INFO:tensorflow:Done calling model_fn.\n", "INFO:tensorflow:Create CheckpointSaverHook.\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-30\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1500\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 30 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.4787662, step = 30\n", - "INFO:tensorflow:Saving checkpoints for 40 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.525995.\n", + "INFO:tensorflow:Saving checkpoints for 1500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.2157978, step = 1500\n", + "INFO:tensorflow:global_step/sec: 1.30643\n", + "INFO:tensorflow:loss = 1.20623, step = 1601 (76.550 sec)\n", + "INFO:tensorflow:global_step/sec: 1.30414\n", + "INFO:tensorflow:loss = 1.1978114, step = 1701 (76.678 sec)\n", + "INFO:tensorflow:global_step/sec: 1.30355\n", + "INFO:tensorflow:loss = 1.190416, step = 1801 (76.713 sec)\n", + "INFO:tensorflow:global_step/sec: 1.30091\n", + "INFO:tensorflow:loss = 1.1839253, step = 1901 (76.869 sec)\n", + "INFO:tensorflow:Saving checkpoints for 2000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.1782837.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:13Z\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:22:48Z\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-40\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2000\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.97511s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:14\n", - "INFO:tensorflow:Saving dict for global step 40: discriminator_loss = -1.5259699, entropy = nan, gen_data_logits = 0.5501564, generator_loss = -0.5977688, global_step = 40, loss = -1.5259699, ones = 0.008373591, real_data_logits = 0.48356724, threes = 0.55152977, twos = 0.4347826, zeros = 0.0053140097\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 40: /tmp/tmpjlrkso7q/model.ckpt-40\n", - "Average discriminator output on Real: 0.48 Fake: 0.55\n", - "nan\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.64373s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:23:00\n", + "INFO:tensorflow:Saving dict for global step 2000: discriminator_loss = 1.1782838, entropy = 0.0, gen_data_logits = 0.09164946, generator_loss = 0.6483724, global_step = 2000, loss = 1.1782838, real_data_logits = 0.99999243\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 2000: /tmp/tmpel1pa8ez/model.ckpt-2000\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.09\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:6 out of the last 6 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", "INFO:tensorflow:Done calling model_fn.\n", "INFO:tensorflow:Create CheckpointSaverHook.\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-40\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 2000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.178231, step = 2000\n", + "INFO:tensorflow:global_step/sec: 1.33459\n", + "INFO:tensorflow:loss = 1.1732332, step = 2100 (74.934 sec)\n", + "INFO:tensorflow:global_step/sec: 1.33674\n", + "INFO:tensorflow:loss = 1.1688447, step = 2200 (74.806 sec)\n", + "INFO:tensorflow:global_step/sec: 1.33758\n", + "INFO:tensorflow:loss = 1.1649867, step = 2300 (74.764 sec)\n", + "INFO:tensorflow:global_step/sec: 1.33663\n", + "INFO:tensorflow:loss = 1.1615903, step = 2400 (74.816 sec)\n", + "INFO:tensorflow:Saving checkpoints for 2500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/training/saver.py:963: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Use standard file APIs to delete files with this prefix.\n", + "INFO:tensorflow:Loss for final step: 1.1586235.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:29:22Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2500\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 40 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.5313491, step = 40\n", - "INFO:tensorflow:Saving checkpoints for 50 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.5814705.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.98509s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:29:35\n", + "INFO:tensorflow:Saving dict for global step 2500: discriminator_loss = 1.1586211, entropy = 0.0011491607, gen_data_logits = 0.053703655, generator_loss = 0.6666554, global_step = 2500, loss = 1.1586211, real_data_logits = 0.9999994\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 2500: /tmp/tmpel1pa8ez/model.ckpt-2500\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:20Z\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-50\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2500\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.96375s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:21\n", - "INFO:tensorflow:Saving dict for global step 50: discriminator_loss = -1.5813547, entropy = nan, gen_data_logits = 0.56256807, generator_loss = -0.57556635, global_step = 50, loss = -1.5813547, ones = 0.007894737, real_data_logits = 0.4706164, threes = 0.53125, twos = 0.45427632, zeros = 0.0065789474\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 50: /tmp/tmpjlrkso7q/model.ckpt-50\n", - "Average discriminator output on Real: 0.47 Fake: 0.56\n", - "nan\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.05\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "Tensor(\"Generator/Reshape:0\", shape=(60, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(60, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:7 out of the last 7 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", "INFO:tensorflow:Done calling model_fn.\n", "INFO:tensorflow:Create CheckpointSaverHook.\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-50\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 2500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.158595, step = 2500\n", + "INFO:tensorflow:global_step/sec: 1.30067\n", + "INFO:tensorflow:loss = 1.1559485, step = 2600 (76.884 sec)\n", + "INFO:tensorflow:global_step/sec: 1.29186\n", + "INFO:tensorflow:loss = 1.153605, step = 2700 (77.408 sec)\n", + "INFO:tensorflow:global_step/sec: 1.30234\n", + "INFO:tensorflow:loss = 1.1515256, step = 2800 (76.785 sec)\n", + "INFO:tensorflow:global_step/sec: 1.29929\n", + "INFO:tensorflow:loss = 1.1496762, step = 2900 (76.965 sec)\n", + "INFO:tensorflow:Saving checkpoints for 3000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.1480436.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(58, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(58, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:36:06Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3000\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 50 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.5888276, step = 50\n", - "INFO:tensorflow:Saving checkpoints for 60 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.6451112.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.80878s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:36:19\n", + "INFO:tensorflow:Saving dict for global step 3000: discriminator_loss = 1.1480428, entropy = 0.0, gen_data_logits = 0.032997075, generator_loss = 0.67678475, global_step = 3000, loss = 1.1480428, real_data_logits = 0.9999998\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 3000: /tmp/tmpel1pa8ez/model.ckpt-3000\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:27Z\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-60\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3000\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.96454s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:28\n", - "INFO:tensorflow:Saving dict for global step 60: discriminator_loss = -1.6422592, entropy = nan, gen_data_logits = 0.57580954, generator_loss = -0.55242676, global_step = 60, loss = -1.6422592, ones = 0.0072847684, real_data_logits = 0.45681602, threes = 0.535596, twos = 0.452649, zeros = 0.004470199\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 60: /tmp/tmpjlrkso7q/model.ckpt-60\n", - "Average discriminator output on Real: 0.46 Fake: 0.58\n", - "nan\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.03\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:8 out of the last 8 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", "INFO:tensorflow:Done calling model_fn.\n", "INFO:tensorflow:Create CheckpointSaverHook.\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-60\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3000\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 3000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.1480281, step = 3000\n", + "INFO:tensorflow:global_step/sec: 1.32242\n", + "INFO:tensorflow:loss = 1.1465555, step = 3101 (75.623 sec)\n", + "INFO:tensorflow:global_step/sec: 1.32462\n", + "INFO:tensorflow:loss = 1.145237, step = 3201 (75.491 sec)\n", + "INFO:tensorflow:global_step/sec: 1.31498\n", + "INFO:tensorflow:loss = 1.1440542, step = 3301 (76.049 sec)\n", + "INFO:tensorflow:global_step/sec: 1.31537\n", + "INFO:tensorflow:loss = 1.1429904, step = 3401 (76.024 sec)\n", + "INFO:tensorflow:Saving checkpoints for 3500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.142041.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:42:46Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3500\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 60 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.6509174, step = 60\n", - "INFO:tensorflow:Saving checkpoints for 70 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.709187.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 13.14910s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:42:59\n", + "INFO:tensorflow:Saving dict for global step 3500: discriminator_loss = 1.142042, entropy = 0.0, gen_data_logits = 0.021151995, generator_loss = 0.68262756, global_step = 3500, loss = 1.142042, real_data_logits = 0.99999994\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 3500: /tmp/tmpel1pa8ez/model.ckpt-3500\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:33Z\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-70\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3500\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 1.00544s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:34\n", - "INFO:tensorflow:Saving dict for global step 70: discriminator_loss = -1.7091427, entropy = nan, gen_data_logits = 0.59141445, generator_loss = -0.52594554, global_step = 70, loss = -1.7091427, ones = 0.00928, real_data_logits = 0.44395787, threes = 0.5432, twos = 0.4392, zeros = 0.00832\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 70: /tmp/tmpjlrkso7q/model.ckpt-70\n", - "Average discriminator output on Real: 0.44 Fake: 0.59\n", - "nan\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.02\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "Tensor(\"Generator/Reshape:0\", shape=(60, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(60, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:9 out of the last 9 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", "INFO:tensorflow:Done calling model_fn.\n", "INFO:tensorflow:Create CheckpointSaverHook.\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-70\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 3500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.1420317, step = 3500\n", + "INFO:tensorflow:global_step/sec: 1.29036\n", + "INFO:tensorflow:loss = 1.1411664, step = 3600 (77.502 sec)\n", + "INFO:tensorflow:global_step/sec: 1.28633\n", + "INFO:tensorflow:loss = 1.1403836, step = 3701 (77.738 sec)\n", + "INFO:tensorflow:global_step/sec: 1.28885\n", + "INFO:tensorflow:loss = 1.1396741, step = 3801 (77.588 sec)\n", + "INFO:tensorflow:global_step/sec: 1.28762\n", + "INFO:tensorflow:loss = 1.1390302, step = 3901 (77.663 sec)\n", + "INFO:tensorflow:Saving checkpoints for 4000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.13845.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(58, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(58, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:49:34Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4000\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 70 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.7174889, step = 70\n", - "INFO:tensorflow:Saving checkpoints for 80 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.790208.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 12.98739s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:49:47\n", + "INFO:tensorflow:Saving dict for global step 4000: discriminator_loss = 1.1384505, entropy = 0.0, gen_data_logits = 0.014032635, generator_loss = 0.68615633, global_step = 4000, loss = 1.1384505, real_data_logits = 0.9999998\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 4000: /tmp/tmpel1pa8ez/model.ckpt-4000\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:40Z\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-80\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4000\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.98008s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:41\n", - "INFO:tensorflow:Saving dict for global step 80: discriminator_loss = -1.7832139, entropy = nan, gen_data_logits = 0.60673684, generator_loss = -0.50064135, global_step = 80, loss = -1.7832139, ones = 0.008952702, real_data_logits = 0.4287591, threes = 0.51317567, twos = 0.46976352, zeros = 0.008108108\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 80: /tmp/tmpjlrkso7q/model.ckpt-80\n", - "Average discriminator output on Real: 0.43 Fake: 0.61\n", - "nan\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.01\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "Tensor(\"Generator/Reshape:0\", shape=(60, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(60, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:10 out of the last 10 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", "INFO:tensorflow:Done calling model_fn.\n", "INFO:tensorflow:Create CheckpointSaverHook.\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-80\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4000\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 80 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.7944455, step = 80\n", - "INFO:tensorflow:Saving checkpoints for 90 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.8660104.\n", + "INFO:tensorflow:Saving checkpoints for 4000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.1384443, step = 4000\n", + "INFO:tensorflow:global_step/sec: 1.27837\n", + "INFO:tensorflow:loss = 1.1379107, step = 4100 (78.225 sec)\n", + "INFO:tensorflow:global_step/sec: 1.2788\n", + "INFO:tensorflow:loss = 1.1374239, step = 4200 (78.198 sec)\n", + "INFO:tensorflow:global_step/sec: 1.2881\n", + "INFO:tensorflow:loss = 1.1369787, step = 4300 (77.634 sec)\n", + "INFO:tensorflow:global_step/sec: 1.28532\n", + "INFO:tensorflow:loss = 1.1365716, step = 4400 (77.802 sec)\n", + "INFO:tensorflow:Saving checkpoints for 4500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.1362021.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(61, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(61, 50), dtype=float32, device=/device:CPU:0)\n", "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:47Z\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T10:56:23Z\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-90\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4500\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 1.00737s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:48\n", - "INFO:tensorflow:Saving dict for global step 90: discriminator_loss = -1.8626773, entropy = nan, gen_data_logits = 0.6255778, generator_loss = -0.47029623, global_step = 90, loss = -1.8626773, ones = 0.009298532, real_data_logits = 0.4165743, threes = 0.50522023, twos = 0.47553018, zeros = 0.009951061\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 90: /tmp/tmpjlrkso7q/model.ckpt-90\n", - "Average discriminator output on Real: 0.42 Fake: 0.63\n", - "nan\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 13.69038s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-10:56:37\n", + "INFO:tensorflow:Saving dict for global step 4500: discriminator_loss = 1.1362015, entropy = 0.0, gen_data_logits = 0.009563566, generator_loss = 0.68837714, global_step = 4500, loss = 1.1362015, real_data_logits = 0.99999994\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 4500: /tmp/tmpel1pa8ez/model.ckpt-4500\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.01\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", "INFO:tensorflow:Done calling model_fn.\n", "INFO:tensorflow:Create CheckpointSaverHook.\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-90\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4500\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Saving checkpoints for 4500 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:loss = 1.1361986, step = 4500\n", + "INFO:tensorflow:global_step/sec: 1.29659\n", + "INFO:tensorflow:loss = 1.1358563, step = 4601 (77.127 sec)\n", + "INFO:tensorflow:global_step/sec: 1.29879\n", + "INFO:tensorflow:loss = 1.1355416, step = 4701 (76.995 sec)\n", + "INFO:tensorflow:global_step/sec: 1.29646\n", + "INFO:tensorflow:loss = 1.1352522, step = 4801 (77.133 sec)\n", + "INFO:tensorflow:global_step/sec: 1.2988\n", + "INFO:tensorflow:loss = 1.1349857, step = 4901 (76.994 sec)\n", + "INFO:tensorflow:Saving checkpoints for 5000 into /tmp/tmpel1pa8ez/model.ckpt.\n", + "INFO:tensorflow:Loss for final step: 1.1347424.\n", + "INFO:tensorflow:Calling model_fn.\n", + "(0, 0): ───Ry(a0)───@───\n", + " │\n", + "(1, 0): ───Ry(a1)───@───\n", + "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", + "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2020-08-25T11:03:10Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-5000\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 90 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:loss = -1.8747579, step = 90\n", - "INFO:tensorflow:Saving checkpoints for 100 into /tmp/tmpjlrkso7q/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: -1.9657041.\n", + "INFO:tensorflow:Evaluation [10/100]\n", + "INFO:tensorflow:Evaluation [20/100]\n", + "INFO:tensorflow:Evaluation [30/100]\n", + "INFO:tensorflow:Evaluation [40/100]\n", + "INFO:tensorflow:Evaluation [50/100]\n", + "INFO:tensorflow:Evaluation [60/100]\n", + "INFO:tensorflow:Evaluation [70/100]\n", + "INFO:tensorflow:Evaluation [80/100]\n", + "INFO:tensorflow:Evaluation [90/100]\n", + "INFO:tensorflow:Evaluation [100/100]\n", + "INFO:tensorflow:Inference Time : 13.37736s\n", + "INFO:tensorflow:Finished evaluation at 2020-08-25-11:03:23\n", + "INFO:tensorflow:Saving dict for global step 5000: discriminator_loss = 1.1347426, entropy = 0.0, gen_data_logits = 0.0066559273, generator_loss = 0.6898243, global_step = 5000, loss = 1.1347426, real_data_logits = 0.99999994\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 5000: /tmp/tmpel1pa8ez/model.ckpt-5000\n", + "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", "INFO:tensorflow:Calling model_fn.\n", "(0, 0): ───Ry(a0)───@───\n", " │\n", "(1, 0): ───Ry(a1)───@───\n", "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-12T09:50:54Z\n", "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpjlrkso7q/model.ckpt-100\n", + "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-5000\n", "INFO:tensorflow:Running local_init_op.\n", "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [1/10]\n", - "INFO:tensorflow:Evaluation [2/10]\n", - "INFO:tensorflow:Evaluation [3/10]\n", - "INFO:tensorflow:Evaluation [4/10]\n", - "INFO:tensorflow:Evaluation [5/10]\n", - "INFO:tensorflow:Evaluation [6/10]\n", - "INFO:tensorflow:Evaluation [7/10]\n", - "INFO:tensorflow:Evaluation [8/10]\n", - "INFO:tensorflow:Evaluation [9/10]\n", - "INFO:tensorflow:Evaluation [10/10]\n", - "INFO:tensorflow:Inference Time : 0.95951s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-12-09:50:55\n", - "INFO:tensorflow:Saving dict for global step 100: discriminator_loss = -1.9677017, entropy = nan, gen_data_logits = 0.6510126, generator_loss = -0.43074673, global_step = 100, loss = -1.9677017, ones = 0.010296412, real_data_logits = 0.4033714, threes = 0.50031203, twos = 0.4778471, zeros = 0.011544461\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 100: /tmp/tmpjlrkso7q/model.ckpt-100\n", - "Average discriminator output on Real: 0.40 Fake: 0.65\n", - "nan\n" + "[50. 0. 0. 0.]\n", + "Average discriminator output on Real: 1.00 Fake: 0.01\n" ], "name": "stdout" }, @@ -906,21 +2474,109 @@ "output_type": "execute_result", "data": { "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ]" + "[]" ] }, "metadata": { "tags": [] }, - "execution_count": 32 + "execution_count": 9 + }, + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXEAAAD4CAYAAAAaT9YAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAPKElEQVR4nO3dfYwcd33H8fentklQg5qkPrlWEmGgCJQicNKrGx6E0kAqEyQSVFSRStRIQQaVSCChqi6VKFStGqpC+igqQ1JcKeWhITQpD21NcIWQitNLcBw7Ls1Dg5rIxAc0JPknJebbP3ZMj2PXu3d7u3u/9P2SRjs789ubj+Y8H+/Ozu6lqpAkteknZh1AkrR6lrgkNcwSl6SGWeKS1DBLXJIatnGaG9u8eXNt27ZtmpuUpObdeeed366quX7rplri27ZtY2FhYZqblKTmJfnmoHWeTpGkhlniktQwS1ySGja0xJOcmeSOJHcnOZrkA93yjyf5zySHumn75ONKkpYa5Y3Np4DLqurJJJuAryb5YrfuN6vq5snFkySdztASr943ZD3Z3d3UTX5rliStAyOdE0+yIckh4ASwv6oOdqv+IMnhJNcnOWPAY3cnWUiysLi4uEaxJUkwYolX1cmq2g6cD+xI8hLgt4EXA78AnAv81oDH7q2q+aqan5vre626JGmVVnR1SlU9BhwAdlbV8ep5CvhrYMckAkqSBht6TjzJHPD9qnosybOBy4EPJtlaVceTBLgKODLJoNv2fH6SP37de+i61886gqR1aJSrU7YC+5JsoPfM/dNV9bkkX+4KPsAh4B0TzClJ6mOUq1MOAxf1WX7ZRBJJkkbmJzYlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGja0xJOcmeSOJHcnOZrkA93y5yU5mOT+JJ9K8qzJx5UkLTXKM/GngMuq6mXAdmBnkkuADwLXV9XPAv8NXDO5mJKkfoaWePU82d3d1E0FXAbc3C3fB1w1kYSSpIFGOieeZEOSQ8AJYD/wAPBYVT3dDXkYOG/AY3cnWUiysLi4uBaZJUmdkUq8qk5W1XbgfGAH8OJRN1BVe6tqvqrm5+bmVhlTktTPiq5OqarHgAPAy4Gzk2zsVp0PPLLG2SRJQ4xydcpckrO7+WcDlwPH6JX5m7phu4BbJxVSktTfxuFD2ArsS7KBXul/uqo+l+Re4JNJfh/4OnDDBHNKkvoYWuJVdRi4qM/yB+mdH5ckzYif2JSkhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlq2NAST3JBkgNJ7k1yNMm7uuXvT/JIkkPddMXk40qSlto4wpingfdU1V1JngPcmWR/t+76qvrjycWTJJ3O0BKvquPA8W7+iSTHgPMmHUySNNyKzokn2QZcBBzsFl2b5HCSG5OcM+Axu5MsJFlYXFwcK6wk6UeNXOJJzgI+A7y7qh4HPgK8ANhO75n6h/o9rqr2VtV8Vc3Pzc2tQWRJ0ikjlXiSTfQK/KaqugWgqh6tqpNV9QPgo8COycWUJPUzytUpAW4AjlXVh5cs37pk2BuBI2sfT5J0OqNcnfJK4C3APUkOdcveC1ydZDtQwEPA2yeSUJI00ChXp3wVSJ9VX1j7OJKklfATm5LUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNG1riSS5IciDJvUmOJnlXt/zcJPuT3NfdnjP5uJKkpUZ5Jv408J6quhC4BHhnkguBPcDtVfVC4PbuviRpioaWeFUdr6q7uvkngGPAecCVwL5u2D7gqkmFlCT1t6Jz4km2ARcBB4EtVXW8W/UtYMuAx+xOspBkYXFxcYyokqTlRi7xJGcBnwHeXVWPL11XVQVUv8dV1d6qmq+q+bm5ubHCSpJ+1EglnmQTvQK/qapu6RY/mmRrt34rcGIyESVJg4xydUqAG4BjVfXhJatuA3Z187uAW9c+niTpdDaOMOaVwFuAe5Ic6pa9F7gO+HSSa4BvAr86mYiSpEGGlnhVfRXIgNWvWds4kqSV8BObktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ0bWuJJbkxyIsmRJcven+SRJIe66YrJxpQk9TPKM/GPAzv7LL++qrZ30xfWNpYkaRRDS7yqvgJ8dwpZJEkrNM458WuTHO5Ot5wzaFCS3UkWkiwsLi6OsTlJ0nKrLfGPAC8AtgPHgQ8NGlhVe6tqvqrm5+bmVrk5SVI/qyrxqnq0qk5W1Q+AjwI71jaWJGkUqyrxJFuX3H0jcGTQWEnS5GwcNiDJJ4BLgc1JHgZ+F7g0yXaggIeAt08woyRpgKElXlVX91l8wwSySJJWyE9sSlLDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSw4Z+YlPPDNv2fH7WEWbqoeteP+sI0kT4TFySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWrY0BJPcmOSE0mOLFl2bpL9Se7rbs+ZbExJUj+jPBP/OLBz2bI9wO1V9ULg9u6+JGnKhpZ4VX0F+O6yxVcC+7r5fcBVa5xLkjSC1Z4T31JVx7v5bwFbBg1MsjvJQpKFxcXFVW5OktTP2G9sVlUBdZr1e6tqvqrm5+bmxt2cJGmJ1Zb4o0m2AnS3J9YukiRpVKst8duAXd38LuDWtYkjSVqJUS4x/ATwr8CLkjyc5BrgOuDyJPcBr+3uS5KmbOjf2Kyqqweses0aZ5EkrZCf2JSkhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlq2NC/dn86SR4CngBOAk9X1fxahJIkjWasEu/8UlV9ew1+jiRphTydIkkNG7fEC/jnJHcm2d1vQJLdSRaSLCwuLo65OUnSUuOW+Kuq6mLgdcA7k7x6+YCq2ltV81U1Pzc3N+bmJElLjVXiVfVId3sC+CywYy1CSZJGs+oST/KTSZ5zah74ZeDIWgWTJA03ztUpW4DPJjn1c/62qv5xTVJJkkay6hKvqgeBl61hFknSCnmJoSQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalha/F94tIz3rY9n591hJl66LrXzzqCBvCZuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaNtYXYCXZCfwpsAH4WFVdtyapJD2j/H//AjGY3JeIrfqZeJINwF8CrwMuBK5OcuFaBZMkDTfO6ZQdwP1V9WBV/Q/wSeDKtYklSRpFqmp1D0zeBOysqrd1998C/GJVXbts3G5gd3f3RcA3BvzIzcC3VxVmOsw3HvONx3zjWe/54PQZn1tVc/1WTPyPQlTVXmDvsHFJFqpqftJ5Vst84zHfeMw3nvWeD1afcZzTKY8AFyy5f363TJI0JeOU+L8BL0zyvCTPAt4M3LY2sSRJo1j16ZSqejrJtcA/0bvE8MaqOjpGlqGnXGbMfOMx33jMN571ng9WmXHVb2xKkmbPT2xKUsMscUlq2MxKPMm5SfYnua+7PWfAuJNJDnXTxN84TbIzyTeS3J9kT5/1ZyT5VLf+YJJtk860wnxvTbK4ZJ+9bYrZbkxyIsmRAeuT5M+67IeTXDytbCPmuzTJ95bsu/dNOd8FSQ4kuTfJ0STv6jNmZvtwxHwz24dJzkxyR5K7u3wf6DNmZsfviPlWfvxW1Uwm4I+APd38HuCDA8Y9OcVMG4AHgOcDzwLuBi5cNuY3gL/q5t8MfGqd5Xsr8Bcz+p2+GrgYODJg/RXAF4EAlwAH11m+S4HPzWLfddvfClzczT8H+I8+v9+Z7cMR881sH3b75KxufhNwELhk2ZhZHr+j5Fvx8TvL0ylXAvu6+X3AVTPMcsooXyWwNPfNwGuSZB3lm5mq+grw3dMMuRL4m+r5GnB2kq3TSTdSvpmqquNVdVc3/wRwDDhv2bCZ7cMR881Mt0+e7O5u6qblV27M7PgdMd+KzbLEt1TV8W7+W8CWAePOTLKQ5GtJJl305wH/teT+w/z4P9Ifjqmqp4HvAT894Vw/tu1Ov3wAv9K91L45yQV91s/KqPln6eXdy90vJvm5WYXoXuZfRO/Z2lLrYh+eJh/McB8m2ZDkEHAC2F9VA/ffDI7fUfLBCo/fiZZ4ki8lOdJn+pFnj9V7HTHof6TnVu+jqL8G/EmSF0wy8zPAPwDbquqlwH7+71mHhruL3r+3lwF/Dvz9LEIkOQv4DPDuqnp8FhlOZ0i+me7DqjpZVdvpfYJ8R5KXTHP7w4yQb8XH70RLvKpeW1Uv6TPdCjx66mVgd3tiwM94pLt9EPgXev/7T8ooXyXwwzFJNgI/BXxngpn6brvzY/mq6jtV9VR392PAz08p2yjW9Vc1VNXjp17uVtUXgE1JNk8zQ5JN9Arypqq6pc+Qme7DYfnWwz7stv0YcADYuWzVLI/fHxqUbzXH7yxPp9wG7OrmdwG3Lh+Q5JwkZ3Tzm4FXAvdOMNMoXyWwNPebgC93rySmYWi+ZedH30DvvOV6cRvw690VFpcA31tySm3mkvzMqfOjSXbQOz6mdoB3274BOFZVHx4wbGb7cJR8s9yHSeaSnN3NPxu4HPj3ZcNmdvyOkm9Vx++03pldPtE7D3U7cB/wJeDcbvk8vb8SBPAK4B56V2HcA1wzhVxX0HvX/QHgd7plvwe8oZs/E/g74H7gDuD5U95vw/L9IXC022cHgBdPMdsngOPA9+mdq70GeAfwjm596P0hkQe63+f8lPfdsHzXLtl3XwNeMeV8r6J3WvEwcKibrlgv+3DEfDPbh8BLga93+Y4A7+uWr4vjd8R8Kz5+/di9JDXMT2xKUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktSw/wXZ/xtzwG/W9QAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXEAAAD4CAYAAAAaT9YAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAANo0lEQVR4nO3df6zd9V3H8efLtoxFpsC41oYfK3PEBZfxw5vKxmImbAaZARIJYRrtkppm0SUsmmjVZMmMieAf2/yVaAPEmswNZJut6NSuK1lMpOzyu9BNCoFIU+gd4+c/U/DtH/cLXi7ncr73nnvO6Yc8H8nJ+f74nPt95dN+Xz3ne885TVUhSWrTD007gCRp9SxxSWqYJS5JDbPEJalhlrgkNWz9JA922mmn1ebNmyd5SElq3t133/29qpoZtG+iJb5582bm5uYmeUhJal6SJ5bb5+UUSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1LBebzFM8jjwIvAK8HJVzSY5FbgF2Aw8DlxTVc+OJ6YkaZCVPBP/uao6v6pmu/UdwL6qOgfY161LkiZolMspVwK7uuVdwFWjx5EkrUTfT2wW8G9JCvjrqtoJbKyqo93+p4CNgx6YZDuwHeCss85addDNO/5p1Y99K3j8+o9NO4Kk41DfEv9QVR1J8mPA3iTfWbyzqqor+DfoCn8nwOzsrP+NkCStoV6XU6rqSHd/DPgasAV4OskmgO7+2LhCSpIGG1riSX44yTteXQZ+HjgI7AG2dsO2ArvHFVKSNFifyykbga8leXX831XVvyT5NnBrkm3AE8A144spSRpkaIlX1WPAeQO2PwNcOo5QkqR+/MSmJDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWG9SzzJuiT3Jrm9Wz87yYEkh5PckuSE8cWUJA2ykmfi1wGHFq3fAHy+qt4DPAtsW8tgkqThepV4kjOAjwE3dusBLgFu64bsAq4aR0BJ0vL6PhP/AvA7wP926+8Enquql7v1J4HTBz0wyfYkc0nm5ufnRworSXq9oSWe5BeBY1V192oOUFU7q2q2qmZnZmZW8yMkSctY32PMxcAVSS4HTgR+BPhT4OQk67tn42cAR8YXU5I0yNBn4lX1e1V1RlVtBq4FvllVvwLsB67uhm0Fdo8tpSRpoFHeJ/67wG8lOczCNfKb1iaSJKmvPpdTXlNVdwB3dMuPAVvWPpIkqS8/sSlJDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlq2NAST3JikruS3J/koSSf7bafneRAksNJbklywvjjSpIW6/NM/AfAJVV1HnA+cFmSi4AbgM9X1XuAZ4Ft44spSRpkaInXgpe61Q3drYBLgNu67buAq8aSUJK0rF7XxJOsS3IfcAzYCzwKPFdVL3dDngROH09ESdJyepV4Vb1SVecDZwBbgPf2PUCS7UnmkszNz8+vMqYkaZAVvTulqp4D9gMfAE5Osr7bdQZwZJnH7Kyq2aqanZmZGSmsJOn1+rw7ZSbJyd3y24GPAodYKPOru2Fbgd3jCilJGmz98CFsAnYlWcdC6d9aVbcneRj4cpI/Au4FbhpjTknSAENLvKoeAC4YsP0xFq6PS5KmxE9sSlLDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSw4aWeJIzk+xP8nCSh5Jc120/NcneJI9096eMP64kabE+z8RfBn67qs4FLgJ+M8m5wA5gX1WdA+zr1iVJEzS0xKvqaFXd0y2/CBwCTgeuBHZ1w3YBV40rpCRpsBVdE0+yGbgAOABsrKqj3a6ngI3LPGZ7krkkc/Pz8yNElSQt1bvEk5wEfAX4dFW9sHhfVRVQgx5XVTuraraqZmdmZkYKK0l6vV4lnmQDCwX+xar6arf56SSbuv2bgGPjiShJWk6fd6cEuAk4VFWfW7RrD7C1W94K7F77eJKkN7O+x5iLgV8FHkxyX7ft94HrgVuTbAOeAK4ZT0RJ0nKGlnhV/TuQZXZfurZxJEkr4Sc2JalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ0bWuJJbk5yLMnBRdtOTbI3ySPd/SnjjSlJGqTPM/G/AS5bsm0HsK+qzgH2deuSpAkbWuJV9S3g+0s2Xwns6pZ3AVetcS5JUg+rvSa+saqOdstPARuXG5hke5K5JHPz8/OrPJwkaZCRf7FZVQXUm+zfWVWzVTU7MzMz6uEkSYustsSfTrIJoLs/tnaRJEl9rbbE9wBbu+WtwO61iSNJWok+bzH8EvAfwE8meTLJNuB64KNJHgE+0q1LkiZs/bABVfXxZXZdusZZJEkr5Cc2JalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYSOVeJLLknw3yeEkO9YqlCSpn1WXeJJ1wF8CvwCcC3w8yblrFUySNNwoz8S3AIer6rGq+m/gy8CVaxNLktTH+hEeezrwX4vWnwR+ZumgJNuB7d3qS0m+u8zPOw343gh5xm2q+XLD0CHO32jMNxrzjWZYvnctt2OUEu+lqnYCO4eNSzJXVbPjzrNa5huN+UZjvtG8lfONcjnlCHDmovUzum2SpAkZpcS/DZyT5OwkJwDXAnvWJpYkqY9VX06pqpeTfAr4V2AdcHNVPTRClqGXXKbMfKMx32jMN5q3bL5U1VoGkSRNkJ/YlKSGWeKS1LCplXiSU5PsTfJId3/KMuNeSXJfdxv7L06HfZVAkrcluaXbfyDJ5nFnWmG+TySZXzRnvz7BbDcnOZbk4DL7k+TPuuwPJLlwUtl65vtwkucXzd1nJpzvzCT7kzyc5KEk1w0YM7U57JlvanOY5MQkdyW5v8v32QFjpnb+9sy38vO3qqZyA/4E2NEt7wBuWGbcSxPMtA54FHg3cAJwP3DukjG/AfxVt3wtcMtxlu8TwF9M6c/0Z4ELgYPL7L8c+DoQ4CLgwHGW78PA7dOYu+74m4ALu+V3AP854M93anPYM9/U5rCbk5O65Q3AAeCiJWOmef72ybfi83eal1OuBHZ1y7uAq6aY5VV9vkpgce7bgEuT5DjKNzVV9S3g+28y5Ergb2vBncDJSTZNJl2vfFNVVUer6p5u+UXgEAufjF5sanPYM9/UdHPyUre6obstfefG1M7fnvlWbJolvrGqjnbLTwEblxl3YpK5JHcmGXfRD/oqgaV/SV8bU1UvA88D7xxzrjccuzMoH8AvdS+1b0ty5oD909I3/zR9oHu5+/UkPzWtEN3L/AtYeLa22HExh2+SD6Y4h0nWJbkPOAbsrapl528K52+ffLDC83esJZ7kG0kODri97tljLbyOWO5fpHfVwsdRfxn4QpKfGGfmt4B/BDZX1fuBvfz/sw4Ndw8Lf9/OA/4c+IdphEhyEvAV4NNV9cI0MryZIfmmOodV9UpVnc/CJ8i3JHnfJI8/TI98Kz5/x1riVfWRqnrfgNtu4OlXXwZ298eW+RlHuvvHgDtY+Nd/XPp8lcBrY5KsB34UeGaMmQYeu/OGfFX1TFX9oFu9EfjpCWXr47j+qoaqeuHVl7tV9c/AhiSnTTJDkg0sFOQXq+qrA4ZMdQ6H5Tse5rA79nPAfuCyJbumef6+Zrl8qzl/p3k5ZQ+wtVveCuxeOiDJKUne1i2fBlwMPDzGTH2+SmBx7quBb3avJCZhaL4l10evYOG65fFiD/Br3TssLgKeX3RJbeqS/Pir10eTbGHh/JjYCd4d+ybgUFV9bplhU5vDPvmmOYdJZpKc3C2/Hfgo8J0lw6Z2/vbJt6rzd1K/mV16Y+E61D7gEeAbwKnd9lngxm75g8CDLLwL40Fg2wRyXc7Cb90fBf6g2/aHwBXd8onA3wOHgbuAd0943obl+2PgoW7O9gPvnWC2LwFHgf9h4VrtNuCTwCe7/WHhPxJ5tPvznJ3w3A3L96lFc3cn8MEJ5/sQC5cVHwDu626XHy9z2DPf1OYQeD9wb5fvIPCZbvtxcf72zLfi89eP3UtSw/zEpiQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDfs/M0t6Mpc7KFcAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } }, { "output_type": "display_data", "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXEAAAD4CAYAAAAaT9YAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAANo0lEQVR4nO3df6zd9V3H8efLtoxFpsC41oYfK3PEBZfxw5vKxmImbAaZARIJYRrtkppm0SUsmmjVZMmMieAf2/yVaAPEmswNZJut6NSuK1lMpOzyu9BNCoFIU+gd4+c/U/DtH/cLXi7ncr73nnvO6Yc8H8nJ+f74nPt95dN+Xz3ne885TVUhSWrTD007gCRp9SxxSWqYJS5JDbPEJalhlrgkNWz9JA922mmn1ebNmyd5SElq3t133/29qpoZtG+iJb5582bm5uYmeUhJal6SJ5bb5+UUSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1LBebzFM8jjwIvAK8HJVzSY5FbgF2Aw8DlxTVc+OJ6YkaZCVPBP/uao6v6pmu/UdwL6qOgfY161LkiZolMspVwK7uuVdwFWjx5EkrUTfT2wW8G9JCvjrqtoJbKyqo93+p4CNgx6YZDuwHeCss85addDNO/5p1Y99K3j8+o9NO4Kk41DfEv9QVR1J8mPA3iTfWbyzqqor+DfoCn8nwOzsrP+NkCStoV6XU6rqSHd/DPgasAV4OskmgO7+2LhCSpIGG1riSX44yTteXQZ+HjgI7AG2dsO2ArvHFVKSNFifyykbga8leXX831XVvyT5NnBrkm3AE8A144spSRpkaIlX1WPAeQO2PwNcOo5QkqR+/MSmJDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWG9SzzJuiT3Jrm9Wz87yYEkh5PckuSE8cWUJA2ykmfi1wGHFq3fAHy+qt4DPAtsW8tgkqThepV4kjOAjwE3dusBLgFu64bsAq4aR0BJ0vL6PhP/AvA7wP926+8Enquql7v1J4HTBz0wyfYkc0nm5ufnRworSXq9oSWe5BeBY1V192oOUFU7q2q2qmZnZmZW8yMkSctY32PMxcAVSS4HTgR+BPhT4OQk67tn42cAR8YXU5I0yNBn4lX1e1V1RlVtBq4FvllVvwLsB67uhm0Fdo8tpSRpoFHeJ/67wG8lOczCNfKb1iaSJKmvPpdTXlNVdwB3dMuPAVvWPpIkqS8/sSlJDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlq2NAST3JikruS3J/koSSf7bafneRAksNJbklywvjjSpIW6/NM/AfAJVV1HnA+cFmSi4AbgM9X1XuAZ4Ft44spSRpkaInXgpe61Q3drYBLgNu67buAq8aSUJK0rF7XxJOsS3IfcAzYCzwKPFdVL3dDngROH09ESdJyepV4Vb1SVecDZwBbgPf2PUCS7UnmkszNz8+vMqYkaZAVvTulqp4D9gMfAE5Osr7bdQZwZJnH7Kyq2aqanZmZGSmsJOn1+rw7ZSbJyd3y24GPAodYKPOru2Fbgd3jCilJGmz98CFsAnYlWcdC6d9aVbcneRj4cpI/Au4FbhpjTknSAENLvKoeAC4YsP0xFq6PS5KmxE9sSlLDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSw4aWeJIzk+xP8nCSh5Jc120/NcneJI9096eMP64kabE+z8RfBn67qs4FLgJ+M8m5wA5gX1WdA+zr1iVJEzS0xKvqaFXd0y2/CBwCTgeuBHZ1w3YBV40rpCRpsBVdE0+yGbgAOABsrKqj3a6ngI3LPGZ7krkkc/Pz8yNElSQt1bvEk5wEfAX4dFW9sHhfVRVQgx5XVTuraraqZmdmZkYKK0l6vV4lnmQDCwX+xar6arf56SSbuv2bgGPjiShJWk6fd6cEuAk4VFWfW7RrD7C1W94K7F77eJKkN7O+x5iLgV8FHkxyX7ft94HrgVuTbAOeAK4ZT0RJ0nKGlnhV/TuQZXZfurZxJEkr4Sc2JalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ0bWuJJbk5yLMnBRdtOTbI3ySPd/SnjjSlJGqTPM/G/AS5bsm0HsK+qzgH2deuSpAkbWuJV9S3g+0s2Xwns6pZ3AVetcS5JUg+rvSa+saqOdstPARuXG5hke5K5JHPz8/OrPJwkaZCRf7FZVQXUm+zfWVWzVTU7MzMz6uEkSYustsSfTrIJoLs/tnaRJEl9rbbE9wBbu+WtwO61iSNJWok+bzH8EvAfwE8meTLJNuB64KNJHgE+0q1LkiZs/bABVfXxZXZdusZZJEkr5Cc2JalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYSOVeJLLknw3yeEkO9YqlCSpn1WXeJJ1wF8CvwCcC3w8yblrFUySNNwoz8S3AIer6rGq+m/gy8CVaxNLktTH+hEeezrwX4vWnwR+ZumgJNuB7d3qS0m+u8zPOw343gh5xm2q+XLD0CHO32jMNxrzjWZYvnctt2OUEu+lqnYCO4eNSzJXVbPjzrNa5huN+UZjvtG8lfONcjnlCHDmovUzum2SpAkZpcS/DZyT5OwkJwDXAnvWJpYkqY9VX06pqpeTfAr4V2AdcHNVPTRClqGXXKbMfKMx32jMN5q3bL5U1VoGkSRNkJ/YlKSGWeKS1LCplXiSU5PsTfJId3/KMuNeSXJfdxv7L06HfZVAkrcluaXbfyDJ5nFnWmG+TySZXzRnvz7BbDcnOZbk4DL7k+TPuuwPJLlwUtl65vtwkucXzd1nJpzvzCT7kzyc5KEk1w0YM7U57JlvanOY5MQkdyW5v8v32QFjpnb+9sy38vO3qqZyA/4E2NEt7wBuWGbcSxPMtA54FHg3cAJwP3DukjG/AfxVt3wtcMtxlu8TwF9M6c/0Z4ELgYPL7L8c+DoQ4CLgwHGW78PA7dOYu+74m4ALu+V3AP854M93anPYM9/U5rCbk5O65Q3AAeCiJWOmef72ybfi83eal1OuBHZ1y7uAq6aY5VV9vkpgce7bgEuT5DjKNzVV9S3g+28y5Ergb2vBncDJSTZNJl2vfFNVVUer6p5u+UXgEAufjF5sanPYM9/UdHPyUre6obstfefG1M7fnvlWbJolvrGqjnbLTwEblxl3YpK5JHcmGXfRD/oqgaV/SV8bU1UvA88D7xxzrjccuzMoH8AvdS+1b0ty5oD909I3/zR9oHu5+/UkPzWtEN3L/AtYeLa22HExh2+SD6Y4h0nWJbkPOAbsrapl528K52+ffLDC83esJZ7kG0kODri97tljLbyOWO5fpHfVwsdRfxn4QpKfGGfmt4B/BDZX1fuBvfz/sw4Ndw8Lf9/OA/4c+IdphEhyEvAV4NNV9cI0MryZIfmmOodV9UpVnc/CJ8i3JHnfJI8/TI98Kz5/x1riVfWRqnrfgNtu4OlXXwZ298eW+RlHuvvHgDtY+Nd/XPp8lcBrY5KsB34UeGaMmQYeu/OGfFX1TFX9oFu9EfjpCWXr47j+qoaqeuHVl7tV9c/AhiSnTTJDkg0sFOQXq+qrA4ZMdQ6H5Tse5rA79nPAfuCyJbumef6+Zrl8qzl/p3k5ZQ+wtVveCuxeOiDJKUne1i2fBlwMPDzGTH2+SmBx7quBb3avJCZhaL4l10evYOG65fFiD/Br3TssLgKeX3RJbeqS/Pir10eTbGHh/JjYCd4d+ybgUFV9bplhU5vDPvmmOYdJZpKc3C2/Hfgo8J0lw6Z2/vbJt6rzd1K/mV16Y+E61D7gEeAbwKnd9lngxm75g8CDLLwL40Fg2wRyXc7Cb90fBf6g2/aHwBXd8onA3wOHgbuAd0943obl+2PgoW7O9gPvnWC2LwFHgf9h4VrtNuCTwCe7/WHhPxJ5tPvznJ3w3A3L96lFc3cn8MEJ5/sQC5cVHwDu626XHy9z2DPf1OYQeD9wb5fvIPCZbvtxcf72zLfi89eP3UtSw/zEpiQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDfs/M0t6Mpc7KFcAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] @@ -933,7 +2589,7 @@ { "output_type": "display_data", "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -946,7 +2602,7 @@ { "output_type": "display_data", "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -959,7 +2615,7 @@ { "output_type": "display_data", "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAOX0lEQVR4nO3db4ylZ13G8e/FtgtGiICdYNNdmIKbmBUrlHGpaJBoSbY02SUBw9YYaVKyIbqxBl+4BLOJ6wtbSBr/bSIbaAJGXKAYGWRJU7DE+KJlByil27oy3VS7m2qHgq3ESFn8+eI8C6fTM3ue2TkzZ3rz/SQn8/y5d87Ve+a5+sxz/qWqkCQ99z1v2gEkSZNhoUtSIyx0SWqEhS5JjbDQJakRl0zrji+77LKanZ2d1t1L0nPSl7/85W9W1cyofVMr9NnZWRYWFqZ195L0nJTk31ba5yUXSWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqxNReKSrpR9fswc9OO8JUPXLL9evyfT1Dl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqRG9Cj3J7iSnkiwmOThi/41JlpLc193eNfmokqQLGfsBF0m2AEeANwNngBNJ5qvqwWVDP15VB9YhoySphz5n6LuAxao6XVVPA8eAvesbS5K0Wn0K/Qrg0aH1M9225d6W5P4kdyTZPuobJdmfZCHJwtLS0kXElSStZFIPin4GmK2qq4C7gI+MGlRVR6tqrqrmZmZmJnTXkiToV+hngeEz7m3dth+oqieq6rvd6oeA100mniSprz6FfgLYkeTKJFuBfcD88IAklw+t7gEemlxESVIfY5/lUlXnkhwA7gS2ALdX1ckkh4GFqpoHfjfJHuAc8C3gxnXMLEkaYWyhA1TVceD4sm2HhpbfC7x3stEkSavhK0UlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRvT6TFFJPzR78LPTjjB1j9xy/bQjaATP0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmN6FXoSXYnOZVkMcnBC4x7W5JKMje5iJKkPsYWepItwBHgOmAncEOSnSPGvQi4Gbh30iElSeP1OUPfBSxW1emqeho4BuwdMe6PgVuB/51gPklST30K/Qrg0aH1M922H0hyNbC9qnyTC0makjU/KJrkecBtwO/3GLs/yUKShaWlpbXetSRpSJ9CPwtsH1rf1m0770XAq4EvJnkEuAaYH/XAaFUdraq5qpqbmZm5+NSSpGfpU+gngB1JrkyyFdgHzJ/fWVVPVtVlVTVbVbPAPcCeqlpYl8SSpJHGFnpVnQMOAHcCDwGfqKqTSQ4n2bPeASVJ/fT6gIuqOg4cX7bt0Apj37T2WJKk1fKVopLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjehV6El2JzmVZDHJwRH7353k60nuS/LPSXZOPqok6ULGFnqSLcAR4DpgJ3DDiML+WFX9XFW9Bng/cNvEk0qSLqjPGfouYLGqTlfV08AxYO/wgKp6amj1x4GaXERJUh+X9BhzBfDo0PoZ4PXLByX5HeA9wFbgV0d9oyT7gf0AL3/5y1ebVZJ0ARN7ULSqjlTVq4A/AP5whTFHq2ququZmZmYmddeSJPoV+llg+9D6tm7bSo4Bb11LKEnS6vUp9BPAjiRXJtkK7APmhwck2TG0ej3wjclFlCT1MfYaelWdS3IAuBPYAtxeVSeTHAYWqmoeOJDkWuB7wLeBd65naEnSs/V5UJSqOg4cX7bt0NDyzRPOJUlaJV8pKkmNsNAlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEZY6JLUiF6FnmR3klNJFpMcHLH/PUkeTHJ/ki8kecXko0qSLmRsoSfZAhwBrgN2Ajck2bls2FeBuaq6CrgDeP+kg0qSLqzPGfouYLGqTlfV08AxYO/wgKq6u6r+p1u9B9g22ZiSpHH6FPoVwKND62e6bSu5CfjcqB1J9idZSLKwtLTUP6UkaayJPiia5DeBOeADo/ZX1dGqmququZmZmUnetST9yLukx5izwPah9W3dtmdIci3wPuBXquq7k4knSeqrzxn6CWBHkiuTbAX2AfPDA5K8FvggsKeqHp98TEnSOGMLvarOAQeAO4GHgE9U1ckkh5Ps6YZ9AHgh8Mkk9yWZX+HbSZLWSZ9LLlTVceD4sm2HhpavnXAuSdIq+UpRSWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNaJXoSfZneRUksUkB0fsf2OSryQ5l+Ttk48pSRpnbKEn2QIcAa4DdgI3JNm5bNi/AzcCH5t0QElSP5f0GLMLWKyq0wBJjgF7gQfPD6iqR7p9/7cOGSVJPfS55HIF8OjQ+plu26ol2Z9kIcnC0tLSxXwLSdIKNvRB0ao6WlVzVTU3MzOzkXctSc3rU+hnge1D69u6bZKkTaRPoZ8AdiS5MslWYB8wv76xJEmrNbbQq+occAC4E3gI+ERVnUxyOMkegCS/kOQM8OvAB5OcXM/QkqRn6/MsF6rqOHB82bZDQ8snGFyKkSRNia8UlaRGWOiS1AgLXZIaYaFLUiMsdElqhIUuSY2w0CWpERa6JDXCQpekRljoktQIC12SGmGhS1IjLHRJaoSFLkmNsNAlqREWuiQ1wkKXpEZY6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakRFrokNcJCl6RGWOiS1AgLXZIaYaFLUiMsdElqxCV9BiXZDfwZsAX4UFXdsmz/84GPAq8DngDeUVWPTDaqJmX24GenHWGqHrnl+mlHkNbF2EJPsgU4ArwZOAOcSDJfVQ8ODbsJ+HZV/XSSfcCtwDvWIzBYSBaSpFH6XHLZBSxW1emqeho4BuxdNmYv8JFu+Q7g15JkcjElSeP0ueRyBfDo0PoZ4PUrjamqc0meBH4S+ObwoCT7gf3d6neSnFrhPi9b/m83manmy61jhzh/F9DA/IFzuFbP5fl7xUr/qNc19EmpqqPA0XHjkixU1dwGRLoo5lsb863dZs9ovrW52Hx9LrmcBbYPrW/rto0ck+QS4CcYPDgqSdogfQr9BLAjyZVJtgL7gPllY+aBd3bLbwf+sapqcjElSeOMveTSXRM/ANzJ4GmLt1fVySSHgYWqmgc+DPx1kkXgWwxKfy3GXpaZMvOtjfnWbrNnNN/aXFS+eCItSW3wlaKS1AgLXZIasSkKPclLk9yV5Bvd15esMO77Se7rbssfmF2PXLuTnEqymOTgiP3PT/Lxbv+9SWbXO9Mq892YZGlozt61wfluT/J4kgdW2J8kf97lvz/J1Zss35uSPDk0f4c2MNv2JHcneTDJySQ3jxgztfnrmW+a8/eCJF9K8rUu3x+NGDO147dnvtUfv1U19RvwfuBgt3wQuHWFcd/ZwExbgIeBVwJbga8BO5eN+W3gr7rlfcDHN1m+G4G/nOLP9Y3A1cADK+x/C/A5IMA1wL2bLN+bgH+Y0txdDlzdLb8I+NcRP9+pzV/PfNOcvwAv7JYvBe4Frlk2ZprHb598qz5+N8UZOs9864CPAG+dYpbzNvtbHvTJN1VV9U8MnvW0kr3AR2vgHuDFSS7fmHS98k1NVT1WVV/plv8beIjBK7KHTW3+euabmm5OvtOtXtrdlj8DZGrHb898q7ZZCv1lVfVYt/wfwMtWGPeCJAtJ7kmy3qU/6i0Plv/CPuMtD4Dzb3mwEfrkA3hb9+f4HUm2j9g/TX3/G6bpF7s/iz+X5GenEaC7FPBaBmdxwzbF/F0gH0xx/pJsSXIf8DhwV1WtOH9TOH775INVHr8bVuhJPp/kgRG3Z5xV1uBvjZX+T/WKGrwc9jeAP03yqvXO/Rz3GWC2qq4C7uKHZyPq5ysMfud+HvgL4O83OkCSFwKfAn6vqp7a6PsfZ0y+qc5fVX2/ql7D4NXtu5K8eiPvf5we+VZ9/G5YoVfVtVX16hG3TwP/ef5Pxe7r4yt8j7Pd19PAFxmcFayXzf6WB2PzVdUTVfXdbvVDDN6vfjPpM8dTU1VPnf+zuKqOA5cmuWyj7j/JpQzK8m+q6u9GDJnq/I3LN+35G8rxX8DdwO5luzbFW5aslO9ijt/Ncsll+K0D3gl8evmAJC/J4IM06H4pfgl4cPm4Cdrsb3kwNt+y66l7GFzn3Ezmgd/qnq1xDfDk0KW3qUvyU+evqSbZxeB42ZADvrvfDwMPVdVtKwyb2vz1yTfl+ZtJ8uJu+ccYfJ7DvywbNrXjt0++izp+N+pR3QvdGFy3+gLwDeDzwEu77XMMPiEJ4A3A1xk8m+PrwE0bkOstDB69fxh4X7ftMLCnW34B8ElgEfgS8MoNnrdx+f4EONnN2d3Az2xwvr8FHgO+x+D67k3Au4F3d/vD4MNTHu5+pnObLN+Bofm7B3jDBmb7ZQaXHu8H7utub9ks89cz3zTn7yrgq12+B4BD3fZNcfz2zLfq49eX/ktSIzbLJRdJ0hpZ6JLUCAtdkhphoUtSIyx0SWqEhS5JjbDQJakR/w/y3OlzuajoJwAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -972,7 +2628,7 @@ { "output_type": "display_data", "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] diff --git a/qgan.ipynb b/qgan.ipynb deleted file mode 100644 index 9488f58ac..000000000 --- a/qgan.ipynb +++ /dev/null @@ -1,2644 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "qgan.ipynb", - "provenance": [], - "authorship_tag": "ABX9TyPeqyBT5OtzJ8bOp2rTKI2y", - "include_colab_link": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - } - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "view-in-github", - "colab_type": "text" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ldLDoEjQtx8g", - "colab_type": "text" - }, - "source": [ - "# Quantum Generative Adversarial Network (qGAN)\n", - "\n", - "Loading an arbitrary random probability distribution into an n-qubit quantum state normally requires $O(2^n)$ gates which in most algorithms will dominate the complexity of the quantum algorithm and make it useless. By using a qGAN this loading can be done in $O(poly(n))$ gates [[1](https://https://www.nature.com/articles/s41534-019-0223-2)]. \n", - "\n", - "A qGAN is a quantum version of a [Generative Adversarial Network](https://papers.nips.cc/paper/5423-generative-adversarial-nets) with a quantum generator and a classical discriminator. The quantum generator is trained to transform a given n-qubit input into:\n", - "$$\n", - "\\sum_{j=0}^{2^n-1} \\sqrt{p^j_{\\theta}}\\left| j \\right\\rangle\n", - "$$\n", - "where $p^j_{\\theta}$ is the probabilty of the state $j$. The discriminator has to try and distinguish between the output of the generator and the training data set. The two networks train alternatively and will eventaully reach a nash equilibrium where the discriminator cannot tell apart the generator and the training set data. The aim of this process is for $p^j_{\\theta}$ to approximate the distribution of the training data.\n", - "\n", - "This tutorial will guide you through using a qGAN to load a lognormal distribution to a 2 qubit system." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "uwQzoKsCuSrY", - "colab_type": "text" - }, - "source": [ - "# Setup" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "u4g8Xz0auW9z", - "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "outputId": "0e451dc5-96c1-4ddb-8df1-979716b51dd1" - }, - "source": [ - "!pip install --upgrade tensorflow==2.1.0 tensorflow-quantum tensorflow-gan tensorflow-probability==0.9 tensorflow-datasets" - ], - "execution_count": 1, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Collecting tensorflow==2.1.0\n", - "\u001b[?25l Downloading https://files.pythonhosted.org/packages/85/d4/c0cd1057b331bc38b65478302114194bd8e1b9c2bbc06e300935c0e93d90/tensorflow-2.1.0-cp36-cp36m-manylinux2010_x86_64.whl (421.8MB)\n", - "\u001b[K |████████████████████████████████| 421.8MB 32kB/s \n", - "\u001b[?25hCollecting tensorflow-quantum\n", - "\u001b[?25l Downloading https://files.pythonhosted.org/packages/eb/76/766f7ef3f57abf1467bf1a591a5e6776f1166420a90ea05af9ca5e25d768/tensorflow_quantum-0.3.1-cp36-cp36m-manylinux2010_x86_64.whl (3.9MB)\n", - "\u001b[K |████████████████████████████████| 3.9MB 46.6MB/s \n", - "\u001b[?25hCollecting tensorflow-gan\n", - "\u001b[?25l Downloading https://files.pythonhosted.org/packages/0c/2e/62922111d7d50e1900e3030764743ea7735540ce103b3ab30fd5cd2d8a2b/tensorflow_gan-2.0.0-py2.py3-none-any.whl (365kB)\n", - "\u001b[K |████████████████████████████████| 368kB 41.4MB/s \n", - "\u001b[?25hCollecting tensorflow-probability==0.9\n", - "\u001b[?25l Downloading https://files.pythonhosted.org/packages/9b/ed/f587d64127bbb85e539f06a2aace1240b7b5c6b4267bea94f232230551a5/tensorflow_probability-0.9.0-py2.py3-none-any.whl (3.2MB)\n", - "\u001b[K |████████████████████████████████| 3.2MB 40.3MB/s \n", - "\u001b[?25hCollecting tensorflow-datasets\n", - "\u001b[?25l Downloading https://files.pythonhosted.org/packages/ca/c9/d97bdf931edbae9aebc767633d088bd674136d5fe7587ef693b7cb6a1883/tensorflow_datasets-3.2.1-py3-none-any.whl (3.4MB)\n", - "\u001b[K |████████████████████████████████| 3.4MB 48.3MB/s \n", - "\u001b[?25hRequirement already satisfied, skipping upgrade: six>=1.12.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.15.0)\n", - "Collecting keras-applications>=1.0.8\n", - "\u001b[?25l Downloading https://files.pythonhosted.org/packages/71/e3/19762fdfc62877ae9102edf6342d71b28fbfd9dea3d2f96a882ce099b03f/Keras_Applications-1.0.8-py3-none-any.whl (50kB)\n", - "\u001b[K |████████████████████████████████| 51kB 7.2MB/s \n", - "\u001b[?25hRequirement already satisfied, skipping upgrade: astor>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (0.8.1)\n", - "Requirement already satisfied, skipping upgrade: absl-py>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (0.9.0)\n", - "Requirement already satisfied, skipping upgrade: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (0.34.2)\n", - "Requirement already satisfied, skipping upgrade: wrapt>=1.11.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.12.1)\n", - "Requirement already satisfied, skipping upgrade: keras-preprocessing>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.1.2)\n", - "Requirement already satisfied, skipping upgrade: protobuf>=3.8.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (3.12.4)\n", - "Requirement already satisfied, skipping upgrade: termcolor>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.1.0)\n", - "Collecting tensorflow-estimator<2.2.0,>=2.1.0rc0\n", - "\u001b[?25l Downloading https://files.pythonhosted.org/packages/18/90/b77c328a1304437ab1310b463e533fa7689f4bfc41549593056d812fab8e/tensorflow_estimator-2.1.0-py2.py3-none-any.whl (448kB)\n", - "\u001b[K |████████████████████████████████| 450kB 37.6MB/s \n", - "\u001b[?25hRequirement already satisfied, skipping upgrade: opt-einsum>=2.3.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (3.3.0)\n", - "Requirement already satisfied, skipping upgrade: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.31.0)\n", - "Collecting tensorboard<2.2.0,>=2.1.0\n", - "\u001b[?25l Downloading https://files.pythonhosted.org/packages/d9/41/bbf49b61370e4f4d245d4c6051dfb6db80cec672605c91b1652ac8cc3d38/tensorboard-2.1.1-py3-none-any.whl (3.8MB)\n", - "\u001b[K |████████████████████████████████| 3.9MB 44.6MB/s \n", - "\u001b[?25hRequirement already satisfied, skipping upgrade: scipy==1.4.1; python_version >= \"3\" in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.4.1)\n", - "Requirement already satisfied, skipping upgrade: numpy<2.0,>=1.16.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (1.18.5)\n", - "Collecting gast==0.2.2\n", - " Downloading https://files.pythonhosted.org/packages/4e/35/11749bf99b2d4e3cceb4d55ca22590b0d7c2c62b9de38ac4a4a7f4687421/gast-0.2.2.tar.gz\n", - "Requirement already satisfied, skipping upgrade: google-pasta>=0.1.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.1.0) (0.2.0)\n", - "Collecting sympy==1.4\n", - "\u001b[?25l Downloading https://files.pythonhosted.org/packages/21/21/f4105795ca7f35c541d82c5b06be684dd2f5cb4f508fb487cd7aea4de776/sympy-1.4-py2.py3-none-any.whl (5.3MB)\n", - "\u001b[K |████████████████████████████████| 5.3MB 37.9MB/s \n", - "\u001b[?25hCollecting pathos==0.2.5\n", - "\u001b[?25l Downloading https://files.pythonhosted.org/packages/c6/a2/cd59f73d5ede4f122687bf8f63de5d671c9561e493ca699241f05b038278/pathos-0.2.5.tar.gz (162kB)\n", - "\u001b[K |████████████████████████████████| 163kB 50.9MB/s \n", - "\u001b[?25hCollecting cirq==0.8.0\n", - "\u001b[?25l Downloading https://files.pythonhosted.org/packages/b8/cf/d95635b4b0de2227956077687277426299883ccdb9e6418fa6e599893ea3/cirq-0.8.0-py3-none-any.whl (1.4MB)\n", - "\u001b[K |████████████████████████████████| 1.4MB 44.8MB/s \n", - "\u001b[?25hRequirement already satisfied, skipping upgrade: tensorflow-hub>=0.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gan) (0.8.0)\n", - "Requirement already satisfied, skipping upgrade: decorator in /usr/local/lib/python3.6/dist-packages (from tensorflow-probability==0.9) (4.4.2)\n", - "Requirement already satisfied, skipping upgrade: cloudpickle>=1.2.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow-probability==0.9) (1.3.0)\n", - "Requirement already satisfied, skipping upgrade: tensorflow-metadata in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (0.22.2)\n", - "Requirement already satisfied, skipping upgrade: requests>=2.19.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (2.23.0)\n", - "Requirement already satisfied, skipping upgrade: dill in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (0.3.2)\n", - "Requirement already satisfied, skipping upgrade: promise in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (2.3)\n", - "Requirement already satisfied, skipping upgrade: attrs>=18.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (19.3.0)\n", - "Requirement already satisfied, skipping upgrade: tqdm in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (4.41.1)\n", - "Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets) (0.16.0)\n", - "Requirement already satisfied, skipping upgrade: h5py in /usr/local/lib/python3.6/dist-packages (from keras-applications>=1.0.8->tensorflow==2.1.0) (2.10.0)\n", - "Requirement already satisfied, skipping upgrade: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.8.0->tensorflow==2.1.0) (49.2.0)\n", - "Requirement already satisfied, skipping upgrade: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (3.2.2)\n", - "Requirement already satisfied, skipping upgrade: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (1.0.1)\n", - "Requirement already satisfied, skipping upgrade: google-auth<2,>=1.6.3 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (1.17.2)\n", - "Requirement already satisfied, skipping upgrade: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (0.4.1)\n", - "Requirement already satisfied, skipping upgrade: mpmath>=0.19 in /usr/local/lib/python3.6/dist-packages (from sympy==1.4->tensorflow-quantum) (1.1.0)\n", - "Collecting ppft>=1.6.6.1\n", - "\u001b[?25l Downloading https://files.pythonhosted.org/packages/2b/fb/fa21f6e9aedc4823448473ed96e8eab64af1cb248c18165f045a90e1c6b4/ppft-1.6.6.2.zip (106kB)\n", - "\u001b[K |████████████████████████████████| 112kB 48.6MB/s \n", - "\u001b[?25hCollecting pox>=0.2.7\n", - "\u001b[?25l Downloading https://files.pythonhosted.org/packages/1a/0c/ec447fb0ed88bc1c09bf0dadf00e40ea05fda17e841d15bb351a52d9e192/pox-0.2.8.zip (128kB)\n", - "\u001b[K |████████████████████████████████| 133kB 48.6MB/s \n", - "\u001b[?25hRequirement already satisfied, skipping upgrade: multiprocess>=0.70.9 in /usr/local/lib/python3.6/dist-packages (from pathos==0.2.5->tensorflow-quantum) (0.70.10)\n", - "Requirement already satisfied, skipping upgrade: pandas in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (1.0.5)\n", - "Requirement already satisfied, skipping upgrade: dataclasses; python_version < \"3.7\" in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (0.7)\n", - "Requirement already satisfied, skipping upgrade: networkx~=2.4 in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (2.4)\n", - "Requirement already satisfied, skipping upgrade: matplotlib~=3.0 in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (3.2.2)\n", - "Requirement already satisfied, skipping upgrade: sortedcontainers~=2.0 in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (2.2.2)\n", - "Requirement already satisfied, skipping upgrade: typing-extensions in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (3.7.4.2)\n", - "Collecting freezegun~=0.3.15\n", - " Downloading https://files.pythonhosted.org/packages/17/5d/1b9d6d3c7995fff473f35861d674e0113a5f0bd5a72fe0199c3f254665c7/freezegun-0.3.15-py2.py3-none-any.whl\n", - "Requirement already satisfied, skipping upgrade: google-api-core[grpc]<2.0.0dev,>=1.14.0 in /usr/local/lib/python3.6/dist-packages (from cirq==0.8.0->tensorflow-quantum) (1.16.0)\n", - "Requirement already satisfied, skipping upgrade: googleapis-common-protos in /usr/local/lib/python3.6/dist-packages (from tensorflow-metadata->tensorflow-datasets) (1.52.0)\n", - "Requirement already satisfied, skipping upgrade: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow-datasets) (1.24.3)\n", - "Requirement already satisfied, skipping upgrade: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow-datasets) (2020.6.20)\n", - "Requirement already satisfied, skipping upgrade: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow-datasets) (2.10)\n", - "Requirement already satisfied, skipping upgrade: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow-datasets) (3.0.4)\n", - "Requirement already satisfied, skipping upgrade: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.6/dist-packages (from markdown>=2.6.8->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (1.7.0)\n", - "Requirement already satisfied, skipping upgrade: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (0.2.8)\n", - "Requirement already satisfied, skipping upgrade: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (4.1.1)\n", - "Requirement already satisfied, skipping upgrade: rsa<5,>=3.1.4; python_version >= \"3\" in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (4.6)\n", - "Requirement already satisfied, skipping upgrade: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (1.3.0)\n", - "Requirement already satisfied, skipping upgrade: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas->cirq==0.8.0->tensorflow-quantum) (2.8.1)\n", - "Requirement already satisfied, skipping upgrade: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas->cirq==0.8.0->tensorflow-quantum) (2018.9)\n", - "Requirement already satisfied, skipping upgrade: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib~=3.0->cirq==0.8.0->tensorflow-quantum) (2.4.7)\n", - "Requirement already satisfied, skipping upgrade: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib~=3.0->cirq==0.8.0->tensorflow-quantum) (1.2.0)\n", - "Requirement already satisfied, skipping upgrade: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib~=3.0->cirq==0.8.0->tensorflow-quantum) (0.10.0)\n", - "Requirement already satisfied, skipping upgrade: zipp>=0.5 in /usr/local/lib/python3.6/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (3.1.0)\n", - "Requirement already satisfied, skipping upgrade: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.6/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (0.4.8)\n", - "Requirement already satisfied, skipping upgrade: oauthlib>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.2.0,>=2.1.0->tensorflow==2.1.0) (3.1.0)\n", - "Building wheels for collected packages: gast, pathos, ppft, pox\n", - " Building wheel for gast (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for gast: filename=gast-0.2.2-cp36-none-any.whl size=7540 sha256=2ad6cbdc07e51d75f24df6a3c5431e851f78bdf88af71c690910e7e848ef4f5e\n", - " Stored in directory: /root/.cache/pip/wheels/5c/2e/7e/a1d4d4fcebe6c381f378ce7743a3ced3699feb89bcfbdadadd\n", - " Building wheel for pathos (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for pathos: filename=pathos-0.2.5-cp36-none-any.whl size=77577 sha256=343c596b255ac0aacd0809ba6d675783772d715ee8822532e84af24239f89ebb\n", - " Stored in directory: /root/.cache/pip/wheels/61/6d/83/90b0c3d2c271da2c4850731e894798c98f8dbedbac74e8eff0\n", - " Building wheel for ppft (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for ppft: filename=ppft-1.6.6.2-cp36-none-any.whl size=64743 sha256=8f1da4f2e681b1565a8a86757300af1eb50de1cf1530f7308bb208d3f2827963\n", - " Stored in directory: /root/.cache/pip/wheels/db/d2/2d/0ee21ede61786bb13247dbc69079373fd500c2bb0481913084\n", - " Building wheel for pox (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for pox: filename=pox-0.2.8-cp36-none-any.whl size=28290 sha256=bf2b329588e208ed398a506e3f3f94fb45284cf1a70df4d8a0dd42e429525219\n", - " Stored in directory: /root/.cache/pip/wheels/39/ed/ce/a93103746b327e18bffaeb99ba0d57a88b392f31d719cea700\n", - "Successfully built gast pathos ppft pox\n", - "\u001b[31mERROR: cirq 0.8.0 has requirement protobuf==3.8.0, but you'll have protobuf 3.12.4 which is incompatible.\u001b[0m\n", - "Installing collected packages: keras-applications, tensorflow-estimator, tensorboard, gast, tensorflow, sympy, ppft, pox, pathos, freezegun, cirq, tensorflow-quantum, tensorflow-probability, tensorflow-gan, tensorflow-datasets\n", - " Found existing installation: tensorflow-estimator 2.3.0\n", - " Uninstalling tensorflow-estimator-2.3.0:\n", - " Successfully uninstalled tensorflow-estimator-2.3.0\n", - " Found existing installation: tensorboard 2.3.0\n", - " Uninstalling tensorboard-2.3.0:\n", - " Successfully uninstalled tensorboard-2.3.0\n", - " Found existing installation: gast 0.3.3\n", - " Uninstalling gast-0.3.3:\n", - " Successfully uninstalled gast-0.3.3\n", - " Found existing installation: tensorflow 2.3.0\n", - " Uninstalling tensorflow-2.3.0:\n", - " Successfully uninstalled tensorflow-2.3.0\n", - " Found existing installation: sympy 1.1.1\n", - " Uninstalling sympy-1.1.1:\n", - " Successfully uninstalled sympy-1.1.1\n", - " Found existing installation: tensorflow-probability 0.11.0\n", - " Uninstalling tensorflow-probability-0.11.0:\n", - " Successfully uninstalled tensorflow-probability-0.11.0\n", - " Found existing installation: tensorflow-datasets 2.1.0\n", - " Uninstalling tensorflow-datasets-2.1.0:\n", - " Successfully uninstalled tensorflow-datasets-2.1.0\n", - "Successfully installed cirq-0.8.0 freezegun-0.3.15 gast-0.2.2 keras-applications-1.0.8 pathos-0.2.5 pox-0.2.8 ppft-1.6.6.2 sympy-1.4 tensorboard-2.1.1 tensorflow-2.1.0 tensorflow-datasets-3.2.1 tensorflow-estimator-2.1.0 tensorflow-gan-2.0.0 tensorflow-probability-0.9.0 tensorflow-quantum-0.3.1\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "fVNr2dGRvtFv", - "colab_type": "code", - "colab": {} - }, - "source": [ - "import tensorflow as tf\n", - "import tensorflow_quantum as tfq\n", - "import tensorflow_gan as tfg\n", - "\n", - "import cirq\n", - "import sympy\n", - "import numpy as np\n", - "import collections\n", - "import math\n", - "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "# Initialize qubits\n", - "num_qubits = 2#@param\n", - "qubits = [cirq.GridQubit(x,0) for x in range(num_qubits)]\n", - "num_of_samples = 100 # Size of training data set\n", - "sample_size = 50\n", - "tf.keras.backend.set_floatx('float32')\n" - ], - "execution_count": 8, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Wn7A2fP1KnQL", - "colab_type": "text" - }, - "source": [ - "# Load Training Data" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tOoK9Y-NKxSV", - "colab_type": "text" - }, - "source": [ - "Before building the model, you need to generate the training data set." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "gd3G6JxNOQe4", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def generate_data():\n", - " \"\"\"Generate training data for discriminator\n", - " \n", - " Bundles this with noise for generator to use\n", - " \"\"\"\n", - "\n", - " # Take samples of lognormal distribution with mean = 1 \n", - " # and standard deviation =1\n", - " mu =1\n", - " sigma =1\n", - "\n", - " total = []\n", - " \n", - "\n", - " continuous_data = np.random.lognormal(\n", - " mean=mu, sigma=sigma, size=sample_size*num_of_samples)\n", - " \n", - " # Remove all samples that lie outside the range \n", - " # expressible in the given number of qubits\n", - " continuous_data = continuous_data[continuous_data < 2**num_qubits-0.5]\n", - "\n", - " # Crop the data so it is a multiple of the sample size\n", - " # This can cause problems if the sample size is very low (e.g. 1) as it can\n", - " # crop all the way to empty\n", - " continuous_data = continuous_data[:len(continuous_data)\n", - " //sample_size* sample_size]\n", - "\n", - " # Discretize the remaining data so the continuous distribution can be \n", - " # approximated by a discrete distribution\n", - " discrete_data = tf.convert_to_tensor(\n", - " np.around(continuous_data, decimals=0), dtype=tf.dtypes.float32)\n", - " \n", - " # Split the data into batches of the required sample size\n", - " batches = tf.reshape(\n", - " discrete_data,(len(continuous_data)//sample_size,sample_size))\n", - "\n", - " # Initialize the same number of circuits as the discrete tensor to a uniform \n", - " # distribution by applying multiple Hadamard gates\n", - " noise = tfq.convert_to_tensor(\n", - " [cirq.Circuit(\n", - " cirq.H.on_each(qubits)\n", - " ) for _ in range(len(continuous_data))])\n", - "\n", - " return noise, batches\n", - "\n" - ], - "execution_count": 3, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tGhG-BIAVmCW", - "colab_type": "text" - }, - "source": [ - "# Quantum Generator\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "q8nF0dBAelvH", - "colab_type": "text" - }, - "source": [ - "Each layer of a quantum generator consists of a layer of parameterised $R_y$ rotations, and a layer of $CZ$ gates to entangle all the qubits.\n", - "\n", - "The quantum generator you will be using only is only one layer deep. To represent more complex structures a larger circuit depth would need to be used." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "2kVGCmeaV7nQ", - "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 326 - }, - "outputId": "a98c7664-260a-4dfe-db10-ea02457e1a14" - }, - "source": [ - "def quantum_generator_model(initial_distribution_tensor):\n", - " # Create parameters for each qubit\n", - " theta = sympy.symbols(f'a0:{num_qubits}')\n", - "\n", - " # Set the input to the network\n", - " inputs = tf.keras.Input(shape=(), dtype=tf.dtypes.string)\n", - "\n", - " # Create the parameterised Ry rotation layer circuit\n", - " parameterized_circuit = cirq.Circuit(cirq.Moment(\n", - " [cirq.ry(t)(q) for t, q in zip(theta,qubits)]))\n", - "\n", - " # Entangle all the qubits by applying CZ in a circular fashion\n", - " # except when there are only two qubits and then just apply one CZ\n", - " entangle_circuit = cirq.Circuit(\n", - " [cirq.CZ(q1, q2) for q1, q2 in zip(qubits[0:-1], qubits[1:])])\n", - " if(num_qubits > 2):\n", - " entangle_circuit.append([cirq.CZ(qubits[0], qubits[-1])])\n", - " \n", - " # Combine the parameterized circuit layer and the entanglement circuit layer\n", - " layer_circuit = parameterized_circuit + entangle_circuit\n", - " print(layer_circuit)\n", - "\n", - " # Add this circuit layer to the network with the output configured\n", - " # to return a decimal value equivalent to the binary produced from the Z \n", - " # measurement with -1 mapping to 0, 1 mapping to 1\n", - " observable = sum((cirq.Z(qubits[i])+1)/2*2**i for i in range(num_qubits))\n", - " # Repetitions is set to 1 so integers are output, rather than averages\n", - " layer = tfq.layers.PQC(layer_circuit, observable , repetitions=1)(inputs)\n", - " \n", - " model = tf.keras.Model(inputs=[inputs], outputs=[layer])\n", - " #model.summary()\n", - " return tf.cast(tf.reshape(\n", - " model(initial_distribution_tensor),\n", - " (initial_distribution_tensor.shape[0] // sample_size,\n", - " sample_size)),dtype=tf.float32)\n", - "\n", - "# Test the quantum generator\n", - "noise, real_data = generate_data()\n", - "data = quantum_generator_model(noise)\n", - "print(data)\n", - "print(real_data)" - ], - "execution_count": 4, - "outputs": [ - { - "output_type": "stream", - "text": [ - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "tf.Tensor(\n", - "[[0. 2. 1. ... 0. 2. 1.]\n", - " [0. 0. 1. ... 1. 1. 1.]\n", - " [0. 1. 1. ... 0. 1. 1.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 3. ... 2. 1. 1.]\n", - " [3. 1. 1. ... 1. 0. 2.]], shape=(598, 50), dtype=float32)\n", - "tf.Tensor(\n", - "[[2. 3. 0. ... 2. 2. 3.]\n", - " [3. 3. 1. ... 1. 3. 1.]\n", - " [1. 2. 0. ... 3. 3. 3.]\n", - " ...\n", - " [1. 3. 2. ... 3. 3. 1.]\n", - " [1. 3. 3. ... 1. 1. 3.]\n", - " [3. 1. 1. ... 2. 1. 2.]], shape=(598, 50), dtype=float32)\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "w2Sh5UwR40fg", - "colab_type": "text" - }, - "source": [ - "# Discriminator" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4NQcpLm1KCCa", - "colab_type": "text" - }, - "source": [ - "The discriminator is a classical neural network. You will use a 3-layer network with an input layer, a hidden layer with 50 hidden nodes, a hidden layer with 20 hidden nodes and 1 output node. The structure of the discriminator is picked so it is equally balanced with the generator by emperical methods (we have just used the same structure as https://www.nature.com/articles/s41534-019-0223-2)." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "DHHwHieb7QLj", - "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "outputId": "535d3188-7104-42f0-e703-a0d0e72e3c0b" - }, - "source": [ - "def discriminator_model(real_input, gen_inputs):\n", - " \n", - " model = tf.keras.Sequential()\n", - " model.add(tf.keras.Input(shape=(sample_size,)))\n", - " model.add(tf.keras.layers.Dense(20, activation=\"relu\"))\n", - " model.add(tf.keras.layers.Dense(1, activation=\"sigmoid\"))\n", - " #model.summary()\n", - " print(real_input)\n", - " \n", - " return model(real_input)\n", - "\n", - "d1 = discriminator_model(data, noise)\n", - "print(d1)\n", - "d2 = discriminator_model(real_data, noise)\n", - "print(d2)" - ], - "execution_count": 5, - "outputs": [ - { - "output_type": "stream", - "text": [ - "tf.Tensor(\n", - "[[0. 2. 1. ... 0. 2. 1.]\n", - " [0. 0. 1. ... 1. 1. 1.]\n", - " [0. 1. 1. ... 0. 1. 1.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 3. ... 2. 1. 1.]\n", - " [3. 1. 1. ... 1. 0. 2.]], shape=(598, 50), dtype=float32)\n", - "tf.Tensor(\n", - "[[0.04196338]\n", - " [0.27266592]\n", - " [0.20387009]\n", - " [0.10551755]\n", - " [0.33895066]\n", - " [0.5607761 ]\n", - " [0.01904764]\n", - " [0.5698652 ]\n", - " [0.06592283]\n", - " [0.17044581]\n", - " [0.10697818]\n", - " [0.29591376]\n", - " [0.11277947]\n", - " [0.14306422]\n", - " [0.278469 ]\n", - " [0.17531624]\n", - " [0.39308968]\n", - " [0.09315131]\n", - " [0.29625157]\n", - " [0.15907799]\n", - " [0.2871086 ]\n", - " [0.12121072]\n", - " [0.3500702 ]\n", - " [0.3817374 ]\n", - " [0.20325089]\n", - " [0.3309933 ]\n", - " [0.01982394]\n", - " [0.13464607]\n", - " [0.20136324]\n", - " [0.21777107]\n", - " [0.11375783]\n", - " [0.09663168]\n", - " [0.16167657]\n", - " [0.3930824 ]\n", - " [0.23511837]\n", - " [0.17967328]\n", - " [0.15124165]\n", - " [0.14190216]\n", - " [0.3723028 ]\n", - " [0.21404546]\n", - " [0.24877833]\n", - " [0.16717948]\n", - " [0.1358577 ]\n", - " [0.20491494]\n", - " [0.22274303]\n", - " [0.07413235]\n", - " [0.11708534]\n", - " [0.30987257]\n", - " [0.12337372]\n", - " [0.20173752]\n", - " [0.06520469]\n", - " [0.5435832 ]\n", - " [0.10337945]\n", - " [0.23658587]\n", - " [0.16840404]\n", - " [0.5805596 ]\n", - " [0.36362392]\n", - " [0.11897162]\n", - " [0.07900479]\n", - " [0.19759305]\n", - " [0.09132273]\n", - " [0.2922706 ]\n", - " [0.16292569]\n", - " [0.20711577]\n", - " [0.15527584]\n", - " [0.24857406]\n", - " [0.42944127]\n", - " [0.08555594]\n", - " [0.31653142]\n", - " [0.11382154]\n", - " [0.27301946]\n", - " [0.3312118 ]\n", - " [0.12812293]\n", - " [0.09796012]\n", - " [0.14760566]\n", - " [0.18759163]\n", - " [0.5132539 ]\n", - " [0.25072643]\n", - " [0.22716676]\n", - " [0.09929606]\n", - " [0.17957759]\n", - " [0.21764185]\n", - " [0.21378581]\n", - " [0.2936371 ]\n", - " [0.33228248]\n", - " [0.3479959 ]\n", - " [0.28782567]\n", - " [0.53356403]\n", - " [0.13577795]\n", - " [0.18961726]\n", - " [0.24788024]\n", - " [0.3533282 ]\n", - " [0.2546042 ]\n", - " [0.20243661]\n", - " [0.2862381 ]\n", - " [0.08501486]\n", - " [0.07385254]\n", - " [0.21679498]\n", - " [0.16410054]\n", - " [0.32516328]\n", - " [0.05822 ]\n", - " [0.11608237]\n", - " [0.3578469 ]\n", - " [0.22392389]\n", - " [0.34429163]\n", - " [0.10261083]\n", - " [0.2088847 ]\n", - " [0.30106467]\n", - " [0.45299026]\n", - " [0.49620607]\n", - " [0.20326409]\n", - " [0.06778032]\n", - " [0.7153322 ]\n", - " [0.30489525]\n", - " [0.16668092]\n", - " [0.22238383]\n", - " [0.0691215 ]\n", - " [0.01659771]\n", - " [0.30600655]\n", - " [0.36269993]\n", - " [0.29198226]\n", - " [0.41954267]\n", - " [0.26866135]\n", - " [0.21288632]\n", - " [0.14493528]\n", - " [0.14216948]\n", - " [0.29651895]\n", - " [0.27291197]\n", - " [0.20239069]\n", - " [0.35704246]\n", - " [0.5428234 ]\n", - " [0.2600717 ]\n", - " [0.21347351]\n", - " [0.2968389 ]\n", - " [0.09215328]\n", - " [0.35460672]\n", - " [0.23257974]\n", - " [0.26780102]\n", - " [0.04146734]\n", - " [0.2559512 ]\n", - " [0.6137853 ]\n", - " [0.09937537]\n", - " [0.35039848]\n", - " [0.13428591]\n", - " [0.5188672 ]\n", - " [0.4413665 ]\n", - " [0.5276289 ]\n", - " [0.26431334]\n", - " [0.36197078]\n", - " [0.15760385]\n", - " [0.27921703]\n", - " [0.05298775]\n", - " [0.4846103 ]\n", - " [0.05334086]\n", - " [0.18913414]\n", - " [0.46737018]\n", - " [0.15556085]\n", - " [0.28005055]\n", - " [0.08902469]\n", - " [0.07966176]\n", - " [0.12418076]\n", - " [0.46383002]\n", - " [0.17478414]\n", - " [0.25536498]\n", - " [0.09822258]\n", - " [0.10366845]\n", - " [0.23505408]\n", - " [0.5360304 ]\n", - " [0.17596556]\n", - " [0.22558813]\n", - " [0.07362123]\n", - " [0.02400539]\n", - " [0.66499877]\n", - " [0.22945385]\n", - " [0.10318703]\n", - " [0.0573759 ]\n", - " [0.15454674]\n", - " [0.34921587]\n", - " [0.1442583 ]\n", - " [0.22983047]\n", - " [0.2714374 ]\n", - " [0.30758095]\n", - " [0.18718617]\n", - " [0.19894713]\n", - " [0.20480075]\n", - " [0.09426221]\n", - " [0.2495385 ]\n", - " [0.19955698]\n", - " [0.23072147]\n", - " [0.20177914]\n", - " [0.28022075]\n", - " [0.14812301]\n", - " [0.4967185 ]\n", - " [0.0834794 ]\n", - " [0.28931916]\n", - " [0.38114804]\n", - " [0.5260778 ]\n", - " [0.30080977]\n", - " [0.333921 ]\n", - " [0.5146654 ]\n", - " [0.39540526]\n", - " [0.35677415]\n", - " [0.05867711]\n", - " [0.14411446]\n", - " [0.22264235]\n", - " [0.2521497 ]\n", - " [0.18305856]\n", - " [0.05115403]\n", - " [0.05842955]\n", - " [0.3428932 ]\n", - " [0.20221955]\n", - " [0.12698591]\n", - " [0.09053931]\n", - " [0.43108705]\n", - " [0.05923652]\n", - " [0.1732673 ]\n", - " [0.23359935]\n", - " [0.20609319]\n", - " [0.12625048]\n", - " [0.15840346]\n", - " [0.17453499]\n", - " [0.29175007]\n", - " [0.26664305]\n", - " [0.18714043]\n", - " [0.2999413 ]\n", - " [0.2264876 ]\n", - " [0.15357219]\n", - " [0.17315981]\n", - " [0.15065736]\n", - " [0.23067361]\n", - " [0.2469291 ]\n", - " [0.21044287]\n", - " [0.21314237]\n", - " [0.20511949]\n", - " [0.3538142 ]\n", - " [0.49692377]\n", - " [0.23420133]\n", - " [0.17143868]\n", - " [0.14640422]\n", - " [0.20905313]\n", - " [0.20226274]\n", - " [0.09016147]\n", - " [0.33379847]\n", - " [0.16767494]\n", - " [0.20347783]\n", - " [0.5059603 ]\n", - " [0.15795374]\n", - " [0.2572828 ]\n", - " [0.41002694]\n", - " [0.16238885]\n", - " [0.14137325]\n", - " [0.06370486]\n", - " [0.21260238]\n", - " [0.1645925 ]\n", - " [0.47247514]\n", - " [0.34375778]\n", - " [0.38453177]\n", - " [0.23575582]\n", - " [0.25774348]\n", - " [0.04792204]\n", - " [0.569437 ]\n", - " [0.2955854 ]\n", - " [0.27705386]\n", - " [0.10557642]\n", - " [0.20393282]\n", - " [0.14561383]\n", - " [0.05324625]\n", - " [0.22931498]\n", - " [0.15958767]\n", - " [0.3626034 ]\n", - " [0.13262722]\n", - " [0.1618069 ]\n", - " [0.2540402 ]\n", - " [0.16565791]\n", - " [0.27463427]\n", - " [0.2831662 ]\n", - " [0.14039251]\n", - " [0.20909214]\n", - " [0.07961019]\n", - " [0.16831307]\n", - " [0.10632644]\n", - " [0.25511187]\n", - " [0.09688626]\n", - " [0.20517573]\n", - " [0.11844373]\n", - " [0.20770128]\n", - " [0.14695282]\n", - " [0.31517062]\n", - " [0.22533385]\n", - " [0.24190234]\n", - " [0.16312993]\n", - " [0.16552967]\n", - " [0.4888069 ]\n", - " [0.16425274]\n", - " [0.38187623]\n", - " [0.1650453 ]\n", - " [0.14045842]\n", - " [0.06928426]\n", - " [0.22263008]\n", - " [0.5264675 ]\n", - " [0.28602433]\n", - " [0.52334535]\n", - " [0.02883768]\n", - " [0.24169372]\n", - " [0.07624766]\n", - " [0.31751004]\n", - " [0.2381358 ]\n", - " [0.14546728]\n", - " [0.31778744]\n", - " [0.33224759]\n", - " [0.3875114 ]\n", - " [0.5812336 ]\n", - " [0.1248336 ]\n", - " [0.33186853]\n", - " [0.08693488]\n", - " [0.1027406 ]\n", - " [0.20401256]\n", - " [0.16501682]\n", - " [0.257053 ]\n", - " [0.2999533 ]\n", - " [0.1880433 ]\n", - " [0.4551139 ]\n", - " [0.08139996]\n", - " [0.24146016]\n", - " [0.03616939]\n", - " [0.14949146]\n", - " [0.07616481]\n", - " [0.19771416]\n", - " [0.18213002]\n", - " [0.25529233]\n", - " [0.21642266]\n", - " [0.32596007]\n", - " [0.06352209]\n", - " [0.14417818]\n", - " [0.24210833]\n", - " [0.31664437]\n", - " [0.54726255]\n", - " [0.24967906]\n", - " [0.12247737]\n", - " [0.02382281]\n", - " [0.2465969 ]\n", - " [0.33479652]\n", - " [0.53202474]\n", - " [0.37575385]\n", - " [0.07474129]\n", - " [0.08552162]\n", - " [0.14891662]\n", - " [0.25678536]\n", - " [0.08189192]\n", - " [0.08045605]\n", - " [0.2407956 ]\n", - " [0.42066586]\n", - " [0.11638436]\n", - " [0.3459558 ]\n", - " [0.37828517]\n", - " [0.322379 ]\n", - " [0.14576693]\n", - " [0.24561949]\n", - " [0.3985174 ]\n", - " [0.14532189]\n", - " [0.18124813]\n", - " [0.17489175]\n", - " [0.2156855 ]\n", - " [0.30889946]\n", - " [0.14050354]\n", - " [0.17264499]\n", - " [0.20653333]\n", - " [0.4559961 ]\n", - " [0.06637115]\n", - " [0.1834941 ]\n", - " [0.36058605]\n", - " [0.28912166]\n", - " [0.369655 ]\n", - " [0.17515448]\n", - " [0.24777527]\n", - " [0.28620407]\n", - " [0.43685597]\n", - " [0.07065373]\n", - " [0.27370307]\n", - " [0.20748658]\n", - " [0.17665856]\n", - " [0.41364956]\n", - " [0.2475368 ]\n", - " [0.15191613]\n", - " [0.1673217 ]\n", - " [0.36673826]\n", - " [0.11719473]\n", - " [0.2842986 ]\n", - " [0.54968727]\n", - " [0.31903666]\n", - " [0.11326081]\n", - " [0.37971175]\n", - " [0.20474686]\n", - " [0.50539595]\n", - " [0.35092223]\n", - " [0.25941768]\n", - " [0.08607735]\n", - " [0.19609231]\n", - " [0.2408513 ]\n", - " [0.17480162]\n", - " [0.31879988]\n", - " [0.49730992]\n", - " [0.22114252]\n", - " [0.12075013]\n", - " [0.32476375]\n", - " [0.25239417]\n", - " [0.17155732]\n", - " [0.14845702]\n", - " [0.03558386]\n", - " [0.35078603]\n", - " [0.25448224]\n", - " [0.26713368]\n", - " [0.2843436 ]\n", - " [0.44375214]\n", - " [0.19955687]\n", - " [0.0954298 ]\n", - " [0.2542985 ]\n", - " [0.13361049]\n", - " [0.38135955]\n", - " [0.06391115]\n", - " [0.65258795]\n", - " [0.21519053]\n", - " [0.19181447]\n", - " [0.23294452]\n", - " [0.07242561]\n", - " [0.0778003 ]\n", - " [0.16877253]\n", - " [0.24931924]\n", - " [0.08310208]\n", - " [0.19791771]\n", - " [0.07280671]\n", - " [0.25628674]\n", - " [0.34585625]\n", - " [0.28831047]\n", - " [0.24650058]\n", - " [0.17257272]\n", - " [0.21304518]\n", - " [0.21622375]\n", - " [0.39263085]\n", - " [0.03938529]\n", - " [0.18365335]\n", - " [0.15527907]\n", - " [0.30346307]\n", - " [0.49784225]\n", - " [0.15342298]\n", - " [0.23868872]\n", - " [0.28039926]\n", - " [0.13138989]\n", - " [0.19770853]\n", - " [0.2037362 ]\n", - " [0.21072417]\n", - " [0.08982147]\n", - " [0.2661378 ]\n", - " [0.16485366]\n", - " [0.27717093]\n", - " [0.1909351 ]\n", - " [0.21820287]\n", - " [0.10254977]\n", - " [0.42412156]\n", - " [0.04674362]\n", - " [0.33249056]\n", - " [0.3499401 ]\n", - " [0.14735359]\n", - " [0.5039261 ]\n", - " [0.20162386]\n", - " [0.1673276 ]\n", - " [0.11144502]\n", - " [0.21589693]\n", - " [0.22901464]\n", - " [0.19643717]\n", - " [0.2680652 ]\n", - " [0.30890402]\n", - " [0.21406654]\n", - " [0.16533034]\n", - " [0.06075254]\n", - " [0.24708393]\n", - " [0.2639951 ]\n", - " [0.28149787]\n", - " [0.11919478]\n", - " [0.24682243]\n", - " [0.14861739]\n", - " [0.19917142]\n", - " [0.41258243]\n", - " [0.1799623 ]\n", - " [0.5735443 ]\n", - " [0.16717482]\n", - " [0.26629344]\n", - " [0.11048511]\n", - " [0.4952673 ]\n", - " [0.4526377 ]\n", - " [0.19535977]\n", - " [0.06626617]\n", - " [0.33475742]\n", - " [0.06720635]\n", - " [0.08385573]\n", - " [0.1121798 ]\n", - " [0.31087905]\n", - " [0.12289668]\n", - " [0.15838534]\n", - " [0.27525762]\n", - " [0.19710286]\n", - " [0.02224989]\n", - " [0.1643247 ]\n", - " [0.18117583]\n", - " [0.10004789]\n", - " [0.3126958 ]\n", - " [0.5073968 ]\n", - " [0.06604595]\n", - " [0.23116034]\n", - " [0.26035616]\n", - " [0.547022 ]\n", - " [0.32462084]\n", - " [0.17698197]\n", - " [0.19240218]\n", - " [0.38143814]\n", - " [0.14820035]\n", - " [0.26924554]\n", - " [0.15207438]\n", - " [0.17088087]\n", - " [0.07925367]\n", - " [0.26647896]\n", - " [0.18787514]\n", - " [0.27638745]\n", - " [0.08865101]\n", - " [0.05531118]\n", - " [0.24228154]\n", - " [0.19018891]\n", - " [0.15765657]\n", - " [0.0786178 ]\n", - " [0.48079845]\n", - " [0.3999899 ]\n", - " [0.10195612]\n", - " [0.2854506 ]\n", - " [0.19202003]\n", - " [0.19121581]\n", - " [0.15751633]\n", - " [0.46584582]\n", - " [0.16630237]\n", - " [0.30417612]\n", - " [0.15639372]\n", - " [0.33175594]\n", - " [0.16355573]\n", - " [0.44345146]\n", - " [0.20871682]\n", - " [0.12381209]\n", - " [0.18935768]\n", - " [0.3908467 ]\n", - " [0.39171422]\n", - " [0.11608682]\n", - " [0.32409567]\n", - " [0.30906728]\n", - " [0.19744052]\n", - " [0.11891425]\n", - " [0.08129691]\n", - " [0.40198848]\n", - " [0.32710394]\n", - " [0.22634101]\n", - " [0.52401453]\n", - " [0.21226768]\n", - " [0.3429694 ]\n", - " [0.25928158]\n", - " [0.28640515]\n", - " [0.08866087]\n", - " [0.3528072 ]\n", - " [0.26521546]\n", - " [0.12900673]\n", - " [0.14514545]\n", - " [0.39863023]\n", - " [0.12124092]\n", - " [0.42681038]\n", - " [0.18479452]\n", - " [0.43985346]\n", - " [0.17029096]\n", - " [0.27200192]\n", - " [0.07560325]\n", - " [0.20954564]\n", - " [0.31230366]\n", - " [0.41816765]\n", - " [0.2439235 ]\n", - " [0.23260842]\n", - " [0.05858685]\n", - " [0.14346725]\n", - " [0.21496671]\n", - " [0.03333722]\n", - " [0.12495941]\n", - " [0.14928788]\n", - " [0.17594676]\n", - " [0.31654304]\n", - " [0.07051434]\n", - " [0.33569866]\n", - " [0.12206015]\n", - " [0.49229306]\n", - " [0.41293693]\n", - " [0.44663113]\n", - " [0.20950605]\n", - " [0.10715698]\n", - " [0.25055453]\n", - " [0.17048258]], shape=(598, 1), dtype=float32)\n", - "tf.Tensor(\n", - "[[2. 3. 0. ... 2. 2. 3.]\n", - " [3. 3. 1. ... 1. 3. 1.]\n", - " [1. 2. 0. ... 3. 3. 3.]\n", - " ...\n", - " [1. 3. 2. ... 3. 3. 1.]\n", - " [1. 3. 3. ... 1. 1. 3.]\n", - " [3. 1. 1. ... 2. 1. 2.]], shape=(598, 50), dtype=float32)\n", - "tf.Tensor(\n", - "[[0.9777599 ]\n", - " [0.9863303 ]\n", - " [0.9863275 ]\n", - " [0.9840344 ]\n", - " [0.8239314 ]\n", - " [0.9940065 ]\n", - " [0.8922725 ]\n", - " [0.999403 ]\n", - " [0.99125004]\n", - " [0.8953877 ]\n", - " [0.9940084 ]\n", - " [0.9532425 ]\n", - " [0.91427076]\n", - " [0.98880184]\n", - " [0.8724105 ]\n", - " [0.9005273 ]\n", - " [0.99594456]\n", - " [0.9922369 ]\n", - " [0.94222546]\n", - " [0.9963691 ]\n", - " [0.9912498 ]\n", - " [0.9392533 ]\n", - " [0.9229871 ]\n", - " [0.9725041 ]\n", - " [0.9960542 ]\n", - " [0.99135244]\n", - " [0.94842684]\n", - " [0.98254573]\n", - " [0.9071129 ]\n", - " [0.99438715]\n", - " [0.987165 ]\n", - " [0.9306451 ]\n", - " [0.9453016 ]\n", - " [0.95491266]\n", - " [0.9953276 ]\n", - " [0.970555 ]\n", - " [0.99884534]\n", - " [0.9783959 ]\n", - " [0.9479516 ]\n", - " [0.9747959 ]\n", - " [0.99654573]\n", - " [0.9210691 ]\n", - " [0.96842146]\n", - " [0.99192894]\n", - " [0.98199445]\n", - " [0.90674204]\n", - " [0.83208627]\n", - " [0.8270503 ]\n", - " [0.98264676]\n", - " [0.97583485]\n", - " [0.9943528 ]\n", - " [0.9679588 ]\n", - " [0.99765885]\n", - " [0.9971564 ]\n", - " [0.9989907 ]\n", - " [0.9916459 ]\n", - " [0.984278 ]\n", - " [0.99109674]\n", - " [0.9808295 ]\n", - " [0.9887 ]\n", - " [0.9884405 ]\n", - " [0.998538 ]\n", - " [0.96653104]\n", - " [0.96877915]\n", - " [0.9922806 ]\n", - " [0.9813571 ]\n", - " [0.8007392 ]\n", - " [0.7364327 ]\n", - " [0.994499 ]\n", - " [0.99700874]\n", - " [0.97632897]\n", - " [0.990324 ]\n", - " [0.9779218 ]\n", - " [0.9763188 ]\n", - " [0.95736593]\n", - " [0.99657637]\n", - " [0.9324984 ]\n", - " [0.9953589 ]\n", - " [0.99449474]\n", - " [0.96582365]\n", - " [0.9971596 ]\n", - " [0.99528706]\n", - " [0.96220684]\n", - " [0.99656063]\n", - " [0.99256223]\n", - " [0.95945334]\n", - " [0.9983317 ]\n", - " [0.9086087 ]\n", - " [0.98994243]\n", - " [0.9860218 ]\n", - " [0.9811483 ]\n", - " [0.9553281 ]\n", - " [0.9784676 ]\n", - " [0.9655916 ]\n", - " [0.98192734]\n", - " [0.9985701 ]\n", - " [0.99448305]\n", - " [0.9241972 ]\n", - " [0.99939394]\n", - " [0.991117 ]\n", - " [0.99153674]\n", - " [0.8028728 ]\n", - " [0.9891685 ]\n", - " [0.96327865]\n", - " [0.9630788 ]\n", - " [0.9894051 ]\n", - " [0.98917025]\n", - " [0.99748516]\n", - " [0.9941123 ]\n", - " [0.975997 ]\n", - " [0.99663395]\n", - " [0.92264307]\n", - " [0.99574006]\n", - " [0.9820983 ]\n", - " [0.9989594 ]\n", - " [0.8531755 ]\n", - " [0.99879456]\n", - " [0.97140425]\n", - " [0.97094846]\n", - " [0.9884643 ]\n", - " [0.99798286]\n", - " [0.98691505]\n", - " [0.99822146]\n", - " [0.97236055]\n", - " [0.9811528 ]\n", - " [0.99690115]\n", - " [0.82486504]\n", - " [0.99475056]\n", - " [0.9992668 ]\n", - " [0.9933828 ]\n", - " [0.96602607]\n", - " [0.8932046 ]\n", - " [0.98856944]\n", - " [0.9960951 ]\n", - " [0.9341425 ]\n", - " [0.99837166]\n", - " [0.93498296]\n", - " [0.99180496]\n", - " [0.9807356 ]\n", - " [0.9980598 ]\n", - " [0.9796037 ]\n", - " [0.92678374]\n", - " [0.9793305 ]\n", - " [0.987591 ]\n", - " [0.99503505]\n", - " [0.9988784 ]\n", - " [0.99335396]\n", - " [0.97802347]\n", - " [0.9722519 ]\n", - " [0.9125066 ]\n", - " [0.8964589 ]\n", - " [0.98640984]\n", - " [0.9686915 ]\n", - " [0.9978162 ]\n", - " [0.91813624]\n", - " [0.99645376]\n", - " [0.9920183 ]\n", - " [0.99983287]\n", - " [0.8925005 ]\n", - " [0.9978204 ]\n", - " [0.99924505]\n", - " [0.9894785 ]\n", - " [0.89713067]\n", - " [0.9913394 ]\n", - " [0.9960069 ]\n", - " [0.9949774 ]\n", - " [0.71827006]\n", - " [0.99683326]\n", - " [0.99135673]\n", - " [0.99712425]\n", - " [0.9572756 ]\n", - " [0.9993506 ]\n", - " [0.9978801 ]\n", - " [0.9995074 ]\n", - " [0.9905702 ]\n", - " [0.9231906 ]\n", - " [0.98951143]\n", - " [0.7717949 ]\n", - " [0.92293733]\n", - " [0.9967217 ]\n", - " [0.7655146 ]\n", - " [0.9584887 ]\n", - " [0.99363106]\n", - " [0.9910883 ]\n", - " [0.96778464]\n", - " [0.98796797]\n", - " [0.9874072 ]\n", - " [0.8671845 ]\n", - " [0.9923649 ]\n", - " [0.99690706]\n", - " [0.99395233]\n", - " [0.98612845]\n", - " [0.93725884]\n", - " [0.9927187 ]\n", - " [0.9883956 ]\n", - " [0.9536047 ]\n", - " [0.9971475 ]\n", - " [0.9873351 ]\n", - " [0.9841576 ]\n", - " [0.9501855 ]\n", - " [0.9016285 ]\n", - " [0.98901165]\n", - " [0.99162394]\n", - " [0.985911 ]\n", - " [0.9994116 ]\n", - " [0.9840099 ]\n", - " [0.9896926 ]\n", - " [0.99390465]\n", - " [0.9837737 ]\n", - " [0.9879389 ]\n", - " [0.9849358 ]\n", - " [0.95444214]\n", - " [0.96185106]\n", - " [0.98583764]\n", - " [0.9853887 ]\n", - " [0.96530604]\n", - " [0.9577175 ]\n", - " [0.99209654]\n", - " [0.99182796]\n", - " [0.9970042 ]\n", - " [0.96313506]\n", - " [0.99665725]\n", - " [0.99876225]\n", - " [0.9759604 ]\n", - " [0.9753566 ]\n", - " [0.94357455]\n", - " [0.9939639 ]\n", - " [0.9975822 ]\n", - " [0.9581607 ]\n", - " [0.7264057 ]\n", - " [0.90340513]\n", - " [0.990231 ]\n", - " [0.88551056]\n", - " [0.9924867 ]\n", - " [0.8890426 ]\n", - " [0.9955445 ]\n", - " [0.9477519 ]\n", - " [0.9626575 ]\n", - " [0.8927224 ]\n", - " [0.9731145 ]\n", - " [0.95368886]\n", - " [0.9925754 ]\n", - " [0.96909136]\n", - " [0.9865371 ]\n", - " [0.99098164]\n", - " [0.99682367]\n", - " [0.9978574 ]\n", - " [0.9680195 ]\n", - " [0.9926634 ]\n", - " [0.9746379 ]\n", - " [0.9966265 ]\n", - " [0.9998901 ]\n", - " [0.9713291 ]\n", - " [0.9950132 ]\n", - " [0.9958442 ]\n", - " [0.76255816]\n", - " [0.99455076]\n", - " [0.99374866]\n", - " [0.9055506 ]\n", - " [0.98487365]\n", - " [0.98789865]\n", - " [0.9974554 ]\n", - " [0.9921153 ]\n", - " [0.99307597]\n", - " [0.9962943 ]\n", - " [0.99538213]\n", - " [0.91977525]\n", - " [0.97862715]\n", - " [0.9989808 ]\n", - " [0.98903465]\n", - " [0.98844856]\n", - " [0.97251344]\n", - " [0.9740209 ]\n", - " [0.99541867]\n", - " [0.9888009 ]\n", - " [0.9933815 ]\n", - " [0.9661086 ]\n", - " [0.97533935]\n", - " [0.99521685]\n", - " [0.8713212 ]\n", - " [0.9987118 ]\n", - " [0.9930655 ]\n", - " [0.9917338 ]\n", - " [0.9680951 ]\n", - " [0.9979837 ]\n", - " [0.9833829 ]\n", - " [0.9975721 ]\n", - " [0.9794351 ]\n", - " [0.99949396]\n", - " [0.99854004]\n", - " [0.9841129 ]\n", - " [0.9975897 ]\n", - " [0.8182254 ]\n", - " [0.9975799 ]\n", - " [0.987058 ]\n", - " [0.96534294]\n", - " [0.9412237 ]\n", - " [0.97617936]\n", - " [0.96353686]\n", - " [0.99826896]\n", - " [0.99806195]\n", - " [0.99664634]\n", - " [0.99624157]\n", - " [0.83291 ]\n", - " [0.96318394]\n", - " [0.99731857]\n", - " [0.9907126 ]\n", - " [0.98717207]\n", - " [0.9940282 ]\n", - " [0.9981206 ]\n", - " [0.96425235]\n", - " [0.99548596]\n", - " [0.73197335]\n", - " [0.98325104]\n", - " [0.9797626 ]\n", - " [0.8972077 ]\n", - " [0.9165122 ]\n", - " [0.99880195]\n", - " [0.9910808 ]\n", - " [0.99641883]\n", - " [0.9984005 ]\n", - " [0.9972716 ]\n", - " [0.9597902 ]\n", - " [0.99109954]\n", - " [0.94714653]\n", - " [0.9839405 ]\n", - " [0.98746014]\n", - " [0.8297749 ]\n", - " [0.98105836]\n", - " [0.9527131 ]\n", - " [0.9817244 ]\n", - " [0.99557894]\n", - " [0.90665406]\n", - " [0.9853733 ]\n", - " [0.9990928 ]\n", - " [0.9860756 ]\n", - " [0.97990465]\n", - " [0.97841316]\n", - " [0.99897885]\n", - " [0.9977437 ]\n", - " [0.997695 ]\n", - " [0.9901085 ]\n", - " [0.8306896 ]\n", - " [0.96802527]\n", - " [0.971312 ]\n", - " [0.72074664]\n", - " [0.8460156 ]\n", - " [0.9898733 ]\n", - " [0.9975541 ]\n", - " [0.9869484 ]\n", - " [0.97605443]\n", - " [0.9917005 ]\n", - " [0.9050897 ]\n", - " [0.99558026]\n", - " [0.98022455]\n", - " [0.9734471 ]\n", - " [0.994484 ]\n", - " [0.98737013]\n", - " [0.99581414]\n", - " [0.9929905 ]\n", - " [0.8427623 ]\n", - " [0.76278067]\n", - " [0.98167545]\n", - " [0.99067265]\n", - " [0.97734493]\n", - " [0.9303689 ]\n", - " [0.9639088 ]\n", - " [0.9192448 ]\n", - " [0.9721788 ]\n", - " [0.87672526]\n", - " [0.99951243]\n", - " [0.9984988 ]\n", - " [0.99651706]\n", - " [0.89290285]\n", - " [0.9909025 ]\n", - " [0.99884474]\n", - " [0.99123925]\n", - " [0.9986527 ]\n", - " [0.99287874]\n", - " [0.9690683 ]\n", - " [0.9606018 ]\n", - " [0.9375396 ]\n", - " [0.99837434]\n", - " [0.9916848 ]\n", - " [0.98857087]\n", - " [0.879761 ]\n", - " [0.98254323]\n", - " [0.95356655]\n", - " [0.9961041 ]\n", - " [0.9931426 ]\n", - " [0.9542254 ]\n", - " [0.9927912 ]\n", - " [0.9568587 ]\n", - " [0.96016794]\n", - " [0.68044466]\n", - " [0.9977792 ]\n", - " [0.9692128 ]\n", - " [0.99516135]\n", - " [0.9218072 ]\n", - " [0.99541086]\n", - " [0.9970843 ]\n", - " [0.99882776]\n", - " [0.97770965]\n", - " [0.9805741 ]\n", - " [0.91887116]\n", - " [0.99754435]\n", - " [0.9462496 ]\n", - " [0.9954247 ]\n", - " [0.97386116]\n", - " [0.8984086 ]\n", - " [0.98214906]\n", - " [0.8711413 ]\n", - " [0.99081236]\n", - " [0.9771293 ]\n", - " [0.9918087 ]\n", - " [0.8415312 ]\n", - " [0.98301184]\n", - " [0.9952857 ]\n", - " [0.962767 ]\n", - " [0.9556806 ]\n", - " [0.9336488 ]\n", - " [0.9763722 ]\n", - " [0.99564594]\n", - " [0.9526287 ]\n", - " [0.97115874]\n", - " [0.99972063]\n", - " [0.91972774]\n", - " [0.99254954]\n", - " [0.99420375]\n", - " [0.9913105 ]\n", - " [0.992679 ]\n", - " [0.97849965]\n", - " [0.96279484]\n", - " [0.96888834]\n", - " [0.9660808 ]\n", - " [0.9893729 ]\n", - " [0.92404985]\n", - " [0.9280869 ]\n", - " [0.99440974]\n", - " [0.98688877]\n", - " [0.9745617 ]\n", - " [0.9621764 ]\n", - " [0.9850927 ]\n", - " [0.9857566 ]\n", - " [0.93095064]\n", - " [0.9977549 ]\n", - " [0.9812232 ]\n", - " [0.9126662 ]\n", - " [0.9566443 ]\n", - " [0.8646174 ]\n", - " [0.50228536]\n", - " [0.9522517 ]\n", - " [0.96511346]\n", - " [0.9949055 ]\n", - " [0.9948192 ]\n", - " [0.9600249 ]\n", - " [0.9916999 ]\n", - " [0.9961384 ]\n", - " [0.97903305]\n", - " [0.9978885 ]\n", - " [0.9987017 ]\n", - " [0.9840058 ]\n", - " [0.99888045]\n", - " [0.9568232 ]\n", - " [0.96701294]\n", - " [0.99321824]\n", - " [0.9512193 ]\n", - " [0.99558455]\n", - " [0.96378917]\n", - " [0.9913681 ]\n", - " [0.9959472 ]\n", - " [0.95682937]\n", - " [0.9726681 ]\n", - " [0.9287377 ]\n", - " [0.9847638 ]\n", - " [0.9635327 ]\n", - " [0.9574488 ]\n", - " [0.9904744 ]\n", - " [0.9894666 ]\n", - " [0.97807115]\n", - " [0.9650212 ]\n", - " [0.9982539 ]\n", - " [0.9924304 ]\n", - " [0.8373775 ]\n", - " [0.9977938 ]\n", - " [0.9845254 ]\n", - " [0.9694584 ]\n", - " [0.98908806]\n", - " [0.97541624]\n", - " [0.9640077 ]\n", - " [0.9721547 ]\n", - " [0.906111 ]\n", - " [0.9784305 ]\n", - " [0.98105145]\n", - " [0.9368743 ]\n", - " [0.9953949 ]\n", - " [0.9806919 ]\n", - " [0.97262716]\n", - " [0.908168 ]\n", - " [0.8312944 ]\n", - " [0.9938699 ]\n", - " [0.99518436]\n", - " [0.99618894]\n", - " [0.9482542 ]\n", - " [0.99034435]\n", - " [0.9455495 ]\n", - " [0.88142455]\n", - " [0.974901 ]\n", - " [0.95971745]\n", - " [0.9652954 ]\n", - " [0.95488346]\n", - " [0.99204975]\n", - " [0.99632096]\n", - " [0.9414955 ]\n", - " [0.99402076]\n", - " [0.9972193 ]\n", - " [0.97236496]\n", - " [0.9111573 ]\n", - " [0.997451 ]\n", - " [0.97536236]\n", - " [0.9942204 ]\n", - " [0.9766573 ]\n", - " [0.99488926]\n", - " [0.9934136 ]\n", - " [0.9972235 ]\n", - " [0.9821973 ]\n", - " [0.77461237]\n", - " [0.9422089 ]\n", - " [0.99545044]\n", - " [0.9571677 ]\n", - " [0.9987326 ]\n", - " [0.98533547]\n", - " [0.9930688 ]\n", - " [0.9769747 ]\n", - " [0.9558447 ]\n", - " [0.96666 ]\n", - " [0.99129736]\n", - " [0.77438045]\n", - " [0.9905688 ]\n", - " [0.91357446]\n", - " [0.9675626 ]\n", - " [0.99785405]\n", - " [0.9983891 ]\n", - " [0.9875373 ]\n", - " [0.99442273]\n", - " [0.98508203]\n", - " [0.9974554 ]\n", - " [0.99498147]\n", - " [0.9937528 ]\n", - " [0.9844578 ]\n", - " [0.99076146]\n", - " [0.9901904 ]\n", - " [0.96884435]\n", - " [0.98003656]\n", - " [0.9905089 ]\n", - " [0.9816591 ]\n", - " [0.9902226 ]\n", - " [0.9891377 ]\n", - " [0.7547166 ]\n", - " [0.93586457]\n", - " [0.9727118 ]\n", - " [0.98243284]\n", - " [0.993082 ]\n", - " [0.986894 ]\n", - " [0.97965264]\n", - " [0.98201525]\n", - " [0.98979354]\n", - " [0.95748913]\n", - " [0.9981375 ]\n", - " [0.98155767]\n", - " [0.96112615]\n", - " [0.9385618 ]\n", - " [0.98897713]\n", - " [0.9958942 ]\n", - " [0.98520434]\n", - " [0.99545336]\n", - " [0.84992796]\n", - " [0.96527183]\n", - " [0.98988694]\n", - " [0.9977718 ]\n", - " [0.9738715 ]\n", - " [0.9973437 ]\n", - " [0.9461605 ]\n", - " [0.991856 ]\n", - " [0.99376464]\n", - " [0.9867771 ]\n", - " [0.99058175]\n", - " [0.98116404]\n", - " [0.9940236 ]\n", - " [0.7476264 ]\n", - " [0.90638494]\n", - " [0.9893499 ]\n", - " [0.9479379 ]\n", - " [0.9984478 ]\n", - " [0.9630943 ]\n", - " [0.9964647 ]\n", - " [0.98212415]\n", - " [0.9980027 ]], shape=(598, 1), dtype=float32)\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "EF4uYrrbLx-Z", - "colab_type": "text" - }, - "source": [ - "# Evaluate model" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "nNHvJtnEL2sP", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def get_eval_metric_ops_fn(gan_model):\n", - " real_data_logits = tf.reduce_mean(gan_model.discriminator_real_outputs)\n", - " gen_data_logits = tf.reduce_mean(gan_model.discriminator_gen_outputs)\n", - " \n", - " # Attempt to calculate entropy to see how accurate the network is \n", - " # (but this doesn't work yet)\n", - " cce = tf.keras.losses.CategoricalCrossentropy()\n", - " entropy = cce(gan_model.generated_data, gan_model.real_data)\n", - " return {\n", - " 'real_data_logits': tf.compat.v1.metrics.mean(real_data_logits),\n", - " 'gen_data_logits': tf.compat.v1.metrics.mean(gen_data_logits),\n", - " 'entropy':tf.compat.v1.metrics.mean(entropy),\n", - " }" - ], - "execution_count": 6, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "L82bU_YpLm-m", - "colab_type": "text" - }, - "source": [ - "# GANEstimator" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "Ayp5JoOqLrXX", - "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "outputId": "10b6155b-e73c-4fac-dcc0-ca6d26583168" - }, - "source": [ - "tf.get_logger().setLevel('INFO')\n", - "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO) \n", - "tf.autograph.set_verbosity(0, False)\n", - "\n", - "generator_lr = 0.001\n", - "discriminator_lr = 0.0002\n", - "\n", - "# Configure the GAN estimator with all the functions from above\n", - "gan_estimator = tfg.estimator.GANEstimator(\n", - " generator_fn=quantum_generator_model,\n", - " discriminator_fn=discriminator_model,\n", - " generator_loss_fn=tfg.losses.modified_generator_loss,\n", - " discriminator_loss_fn=tfg.losses.modified_discriminator_loss,\n", - " generator_optimizer=tf.compat.v1.train.AdamOptimizer(generator_lr),\n", - " discriminator_optimizer=tf.compat.v1.train.AdamOptimizer(discriminator_lr),\n", - " get_eval_metric_ops_fn=get_eval_metric_ops_fn)\n", - "\n", - "\n", - "steps_per_eval = 500#@param\n", - "max_train_steps = 5000#@param\n", - "batches_for_eval_metrics = 100 #@param\n", - "\n", - "# Used to track metrics.\n", - "steps = []\n", - "real_logits, fake_logits = [], []\n", - "frequencies = []\n", - "entropy = []\n", - "\n", - "cur_step = 0\n", - "while cur_step < max_train_steps:\n", - " next_step = min(cur_step + steps_per_eval, max_train_steps)\n", - " gan_estimator.train(generate_data, max_steps=next_step)\n", - " steps_taken = next_step - cur_step\n", - " cur_step = next_step\n", - " \n", - " # Calculate some metrics.\n", - " metrics = gan_estimator.evaluate(generate_data, \n", - " steps=batches_for_eval_metrics)\n", - " \n", - " # Generate predictions\n", - " iterator = gan_estimator.predict(generate_data)\n", - " predictions = np.array([next(iterator) for _ in range(10)])\n", - " frequency = np.mean(\n", - " [np.bincount(p.astype(int), minlength=4) for p in predictions], axis=0)\n", - " print(frequency)\n", - " steps.append(cur_step)\n", - " real_logits.append(metrics['real_data_logits'])\n", - " fake_logits.append(metrics['gen_data_logits'])\n", - " print('Average discriminator output on Real: %.2f Fake: %.2f' % (\n", - " real_logits[-1], fake_logits[-1]))\n", - " plt.figure()\n", - " plt.bar(np.arange(0,4), frequency)\n", - " frequencies.append(frequency)\n", - " entropy.append(metrics['entropy'])\n", - "\n", - "plt.figure()\n", - "plt.plot(steps, frequencies)\n", - "plt.figure()\n", - "plt.plot(steps, entropy)" - ], - "execution_count": 9, - "outputs": [ - { - "output_type": "stream", - "text": [ - "INFO:tensorflow:Using default config.\n", - "WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpel1pa8ez\n", - "INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpel1pa8ez', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true\n", - "graph_options {\n", - " rewrite_options {\n", - " meta_optimizer_iterations: ONE\n", - " }\n", - "}\n", - ", '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}\n", - "WARNING:tensorflow:Estimator's model_fn (._model_fn at 0x7fe36b9979d8>) includes params argument, but params are not passed to Estimator.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:loss = 1.6590546, step = 0\n", - "INFO:tensorflow:global_step/sec: 1.38187\n", - "INFO:tensorflow:loss = 1.2525809, step = 101 (72.368 sec)\n", - "INFO:tensorflow:global_step/sec: 1.37959\n", - "WARNING:tensorflow:It seems that global step (tf.train.get_global_step) has not been increased. Current value (could be stable): 200 vs previous value: 200. You could increase the global step by passing tf.train.get_global_step() to Optimizer.apply_gradients or Optimizer.minimize.\n", - "INFO:tensorflow:loss = 1.1954446, step = 200 (72.487 sec)\n", - "INFO:tensorflow:global_step/sec: 1.38145\n", - "WARNING:tensorflow:It seems that global step (tf.train.get_global_step) has not been increased. Current value (could be stable): 300 vs previous value: 300. You could increase the global step by passing tf.train.get_global_step() to Optimizer.apply_gradients or Optimizer.minimize.\n", - "INFO:tensorflow:loss = 1.1788788, step = 300 (72.386 sec)\n", - "INFO:tensorflow:global_step/sec: 1.36622\n", - "WARNING:tensorflow:It seems that global step (tf.train.get_global_step) has not been increased. Current value (could be stable): 400 vs previous value: 400. You could increase the global step by passing tf.train.get_global_step() to Optimizer.apply_gradients or Optimizer.minimize.\n", - "INFO:tensorflow:loss = 1.1599461, step = 400 (73.197 sec)\n", - "INFO:tensorflow:Saving checkpoints for 500 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: 1.1716442.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-25T10:03:09Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [10/100]\n", - "INFO:tensorflow:Evaluation [20/100]\n", - "INFO:tensorflow:Evaluation [30/100]\n", - "INFO:tensorflow:Evaluation [40/100]\n", - "INFO:tensorflow:Evaluation [50/100]\n", - "INFO:tensorflow:Evaluation [60/100]\n", - "INFO:tensorflow:Evaluation [70/100]\n", - "INFO:tensorflow:Evaluation [80/100]\n", - "INFO:tensorflow:Evaluation [90/100]\n", - "INFO:tensorflow:Evaluation [100/100]\n", - "INFO:tensorflow:Inference Time : 12.06482s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-25-10:03:21\n", - "INFO:tensorflow:Saving dict for global step 500: discriminator_loss = 1.171289, entropy = 95.706894, gen_data_logits = 0.07700764, generator_loss = 0.655901, global_step = 500, loss = 1.171289, real_data_logits = 0.9991762\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 500: /tmp/tmpel1pa8ez/model.ckpt-500\n", - "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "[34.5 12.5 2.6 0.4]\n", - "Average discriminator output on Real: 1.00 Fake: 0.08\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-500\n", - "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/training/saver.py:1069: get_checkpoint_mtimes (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Use standard file utilities to get mtimes.\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 500 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:loss = 1.1754822, step = 500\n", - "WARNING:tensorflow:It seems that global step (tf.train.get_global_step) has not been increased. Current value (could be stable): 507 vs previous value: 507. You could increase the global step by passing tf.train.get_global_step() to Optimizer.apply_gradients or Optimizer.minimize.\n", - "INFO:tensorflow:global_step/sec: 1.36919\n", - "INFO:tensorflow:loss = 1.1780654, step = 601 (73.040 sec)\n", - "INFO:tensorflow:global_step/sec: 1.37143\n", - "INFO:tensorflow:loss = 1.2177453, step = 701 (72.919 sec)\n", - "INFO:tensorflow:global_step/sec: 1.36622\n", - "INFO:tensorflow:loss = 1.2526287, step = 801 (73.191 sec)\n", - "INFO:tensorflow:global_step/sec: 1.36489\n", - "INFO:tensorflow:loss = 1.2591925, step = 901 (73.268 sec)\n", - "INFO:tensorflow:Saving checkpoints for 1000 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: 1.262226.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-25T10:09:34Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [10/100]\n", - "INFO:tensorflow:Evaluation [20/100]\n", - "INFO:tensorflow:Evaluation [30/100]\n", - "INFO:tensorflow:Evaluation [40/100]\n", - "INFO:tensorflow:Evaluation [50/100]\n", - "INFO:tensorflow:Evaluation [60/100]\n", - "INFO:tensorflow:Evaluation [70/100]\n", - "INFO:tensorflow:Evaluation [80/100]\n", - "INFO:tensorflow:Evaluation [90/100]\n", - "INFO:tensorflow:Evaluation [100/100]\n", - "INFO:tensorflow:Inference Time : 12.34748s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-25-10:09:46\n", - "INFO:tensorflow:Saving dict for global step 1000: discriminator_loss = 1.2652749, entropy = 4.1560354, gen_data_logits = 0.25137702, generator_loss = 0.57563394, global_step = 1000, loss = 1.2652749, real_data_logits = 0.9999847\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1000: /tmp/tmpel1pa8ez/model.ckpt-1000\n", - "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "[49. 1. 0. 0.]\n", - "Average discriminator output on Real: 1.00 Fake: 0.25\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 1000 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:loss = 1.2678082, step = 1000\n", - "INFO:tensorflow:global_step/sec: 1.34818\n", - "INFO:tensorflow:loss = 1.2553058, step = 1100 (74.175 sec)\n", - "INFO:tensorflow:global_step/sec: 1.34396\n", - "INFO:tensorflow:loss = 1.250981, step = 1200 (74.407 sec)\n", - "INFO:tensorflow:global_step/sec: 1.35216\n", - "INFO:tensorflow:loss = 1.237549, step = 1300 (73.956 sec)\n", - "INFO:tensorflow:global_step/sec: 1.34592\n", - "INFO:tensorflow:loss = 1.2266576, step = 1400 (74.299 sec)\n", - "INFO:tensorflow:Saving checkpoints for 1500 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: 1.2159001.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-25T10:16:04Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [10/100]\n", - "INFO:tensorflow:Evaluation [20/100]\n", - "INFO:tensorflow:Evaluation [30/100]\n", - "INFO:tensorflow:Evaluation [40/100]\n", - "INFO:tensorflow:Evaluation [50/100]\n", - "INFO:tensorflow:Evaluation [60/100]\n", - "INFO:tensorflow:Evaluation [70/100]\n", - "INFO:tensorflow:Evaluation [80/100]\n", - "INFO:tensorflow:Evaluation [90/100]\n", - "INFO:tensorflow:Evaluation [100/100]\n", - "INFO:tensorflow:Inference Time : 12.58863s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-25-10:16:16\n", - "INFO:tensorflow:Saving dict for global step 1500: discriminator_loss = 1.2157844, entropy = 0.031484038, gen_data_logits = 0.16217975, generator_loss = 0.6153425, global_step = 1500, loss = 1.2157844, real_data_logits = 0.99999297\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1500: /tmp/tmpel1pa8ez/model.ckpt-1500\n", - "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "[50. 0. 0. 0.]\n", - "Average discriminator output on Real: 1.00 Fake: 0.16\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(61, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(61, 50), dtype=float32, device=/device:CPU:0)\n", - "WARNING:tensorflow:5 out of the last 5 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-1500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 1500 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:loss = 1.2157978, step = 1500\n", - "INFO:tensorflow:global_step/sec: 1.30643\n", - "INFO:tensorflow:loss = 1.20623, step = 1601 (76.550 sec)\n", - "INFO:tensorflow:global_step/sec: 1.30414\n", - "INFO:tensorflow:loss = 1.1978114, step = 1701 (76.678 sec)\n", - "INFO:tensorflow:global_step/sec: 1.30355\n", - "INFO:tensorflow:loss = 1.190416, step = 1801 (76.713 sec)\n", - "INFO:tensorflow:global_step/sec: 1.30091\n", - "INFO:tensorflow:loss = 1.1839253, step = 1901 (76.869 sec)\n", - "INFO:tensorflow:Saving checkpoints for 2000 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: 1.1782837.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-25T10:22:48Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [10/100]\n", - "INFO:tensorflow:Evaluation [20/100]\n", - "INFO:tensorflow:Evaluation [30/100]\n", - "INFO:tensorflow:Evaluation [40/100]\n", - "INFO:tensorflow:Evaluation [50/100]\n", - "INFO:tensorflow:Evaluation [60/100]\n", - "INFO:tensorflow:Evaluation [70/100]\n", - "INFO:tensorflow:Evaluation [80/100]\n", - "INFO:tensorflow:Evaluation [90/100]\n", - "INFO:tensorflow:Evaluation [100/100]\n", - "INFO:tensorflow:Inference Time : 12.64373s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-25-10:23:00\n", - "INFO:tensorflow:Saving dict for global step 2000: discriminator_loss = 1.1782838, entropy = 0.0, gen_data_logits = 0.09164946, generator_loss = 0.6483724, global_step = 2000, loss = 1.1782838, real_data_logits = 0.99999243\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 2000: /tmp/tmpel1pa8ez/model.ckpt-2000\n", - "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "[50. 0. 0. 0.]\n", - "Average discriminator output on Real: 1.00 Fake: 0.09\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", - "WARNING:tensorflow:6 out of the last 6 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 2000 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:loss = 1.178231, step = 2000\n", - "INFO:tensorflow:global_step/sec: 1.33459\n", - "INFO:tensorflow:loss = 1.1732332, step = 2100 (74.934 sec)\n", - "INFO:tensorflow:global_step/sec: 1.33674\n", - "INFO:tensorflow:loss = 1.1688447, step = 2200 (74.806 sec)\n", - "INFO:tensorflow:global_step/sec: 1.33758\n", - "INFO:tensorflow:loss = 1.1649867, step = 2300 (74.764 sec)\n", - "INFO:tensorflow:global_step/sec: 1.33663\n", - "INFO:tensorflow:loss = 1.1615903, step = 2400 (74.816 sec)\n", - "INFO:tensorflow:Saving checkpoints for 2500 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/training/saver.py:963: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Use standard file APIs to delete files with this prefix.\n", - "INFO:tensorflow:Loss for final step: 1.1586235.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-25T10:29:22Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [10/100]\n", - "INFO:tensorflow:Evaluation [20/100]\n", - "INFO:tensorflow:Evaluation [30/100]\n", - "INFO:tensorflow:Evaluation [40/100]\n", - "INFO:tensorflow:Evaluation [50/100]\n", - "INFO:tensorflow:Evaluation [60/100]\n", - "INFO:tensorflow:Evaluation [70/100]\n", - "INFO:tensorflow:Evaluation [80/100]\n", - "INFO:tensorflow:Evaluation [90/100]\n", - "INFO:tensorflow:Evaluation [100/100]\n", - "INFO:tensorflow:Inference Time : 12.98509s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-25-10:29:35\n", - "INFO:tensorflow:Saving dict for global step 2500: discriminator_loss = 1.1586211, entropy = 0.0011491607, gen_data_logits = 0.053703655, generator_loss = 0.6666554, global_step = 2500, loss = 1.1586211, real_data_logits = 0.9999994\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 2500: /tmp/tmpel1pa8ez/model.ckpt-2500\n", - "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "[50. 0. 0. 0.]\n", - "Average discriminator output on Real: 1.00 Fake: 0.05\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(60, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(60, 50), dtype=float32, device=/device:CPU:0)\n", - "WARNING:tensorflow:7 out of the last 7 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-2500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 2500 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:loss = 1.158595, step = 2500\n", - "INFO:tensorflow:global_step/sec: 1.30067\n", - "INFO:tensorflow:loss = 1.1559485, step = 2600 (76.884 sec)\n", - "INFO:tensorflow:global_step/sec: 1.29186\n", - "INFO:tensorflow:loss = 1.153605, step = 2700 (77.408 sec)\n", - "INFO:tensorflow:global_step/sec: 1.30234\n", - "INFO:tensorflow:loss = 1.1515256, step = 2800 (76.785 sec)\n", - "INFO:tensorflow:global_step/sec: 1.29929\n", - "INFO:tensorflow:loss = 1.1496762, step = 2900 (76.965 sec)\n", - "INFO:tensorflow:Saving checkpoints for 3000 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: 1.1480436.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(58, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(58, 50), dtype=float32, device=/device:CPU:0)\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-25T10:36:06Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [10/100]\n", - "INFO:tensorflow:Evaluation [20/100]\n", - "INFO:tensorflow:Evaluation [30/100]\n", - "INFO:tensorflow:Evaluation [40/100]\n", - "INFO:tensorflow:Evaluation [50/100]\n", - "INFO:tensorflow:Evaluation [60/100]\n", - "INFO:tensorflow:Evaluation [70/100]\n", - "INFO:tensorflow:Evaluation [80/100]\n", - "INFO:tensorflow:Evaluation [90/100]\n", - "INFO:tensorflow:Evaluation [100/100]\n", - "INFO:tensorflow:Inference Time : 12.80878s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-25-10:36:19\n", - "INFO:tensorflow:Saving dict for global step 3000: discriminator_loss = 1.1480428, entropy = 0.0, gen_data_logits = 0.032997075, generator_loss = 0.67678475, global_step = 3000, loss = 1.1480428, real_data_logits = 0.9999998\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 3000: /tmp/tmpel1pa8ez/model.ckpt-3000\n", - "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "[50. 0. 0. 0.]\n", - "Average discriminator output on Real: 1.00 Fake: 0.03\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", - "WARNING:tensorflow:8 out of the last 8 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 3000 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:loss = 1.1480281, step = 3000\n", - "INFO:tensorflow:global_step/sec: 1.32242\n", - "INFO:tensorflow:loss = 1.1465555, step = 3101 (75.623 sec)\n", - "INFO:tensorflow:global_step/sec: 1.32462\n", - "INFO:tensorflow:loss = 1.145237, step = 3201 (75.491 sec)\n", - "INFO:tensorflow:global_step/sec: 1.31498\n", - "INFO:tensorflow:loss = 1.1440542, step = 3301 (76.049 sec)\n", - "INFO:tensorflow:global_step/sec: 1.31537\n", - "INFO:tensorflow:loss = 1.1429904, step = 3401 (76.024 sec)\n", - "INFO:tensorflow:Saving checkpoints for 3500 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: 1.142041.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-25T10:42:46Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [10/100]\n", - "INFO:tensorflow:Evaluation [20/100]\n", - "INFO:tensorflow:Evaluation [30/100]\n", - "INFO:tensorflow:Evaluation [40/100]\n", - "INFO:tensorflow:Evaluation [50/100]\n", - "INFO:tensorflow:Evaluation [60/100]\n", - "INFO:tensorflow:Evaluation [70/100]\n", - "INFO:tensorflow:Evaluation [80/100]\n", - "INFO:tensorflow:Evaluation [90/100]\n", - "INFO:tensorflow:Evaluation [100/100]\n", - "INFO:tensorflow:Inference Time : 13.14910s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-25-10:42:59\n", - "INFO:tensorflow:Saving dict for global step 3500: discriminator_loss = 1.142042, entropy = 0.0, gen_data_logits = 0.021151995, generator_loss = 0.68262756, global_step = 3500, loss = 1.142042, real_data_logits = 0.99999994\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 3500: /tmp/tmpel1pa8ez/model.ckpt-3500\n", - "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "[50. 0. 0. 0.]\n", - "Average discriminator output on Real: 1.00 Fake: 0.02\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(60, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(60, 50), dtype=float32, device=/device:CPU:0)\n", - "WARNING:tensorflow:9 out of the last 9 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-3500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 3500 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:loss = 1.1420317, step = 3500\n", - "INFO:tensorflow:global_step/sec: 1.29036\n", - "INFO:tensorflow:loss = 1.1411664, step = 3600 (77.502 sec)\n", - "INFO:tensorflow:global_step/sec: 1.28633\n", - "INFO:tensorflow:loss = 1.1403836, step = 3701 (77.738 sec)\n", - "INFO:tensorflow:global_step/sec: 1.28885\n", - "INFO:tensorflow:loss = 1.1396741, step = 3801 (77.588 sec)\n", - "INFO:tensorflow:global_step/sec: 1.28762\n", - "INFO:tensorflow:loss = 1.1390302, step = 3901 (77.663 sec)\n", - "INFO:tensorflow:Saving checkpoints for 4000 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: 1.13845.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(58, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(58, 50), dtype=float32, device=/device:CPU:0)\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-25T10:49:34Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [10/100]\n", - "INFO:tensorflow:Evaluation [20/100]\n", - "INFO:tensorflow:Evaluation [30/100]\n", - "INFO:tensorflow:Evaluation [40/100]\n", - "INFO:tensorflow:Evaluation [50/100]\n", - "INFO:tensorflow:Evaluation [60/100]\n", - "INFO:tensorflow:Evaluation [70/100]\n", - "INFO:tensorflow:Evaluation [80/100]\n", - "INFO:tensorflow:Evaluation [90/100]\n", - "INFO:tensorflow:Evaluation [100/100]\n", - "INFO:tensorflow:Inference Time : 12.98739s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-25-10:49:47\n", - "INFO:tensorflow:Saving dict for global step 4000: discriminator_loss = 1.1384505, entropy = 0.0, gen_data_logits = 0.014032635, generator_loss = 0.68615633, global_step = 4000, loss = 1.1384505, real_data_logits = 0.9999998\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 4000: /tmp/tmpel1pa8ez/model.ckpt-4000\n", - "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "[50. 0. 0. 0.]\n", - "Average discriminator output on Real: 1.00 Fake: 0.01\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(60, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(60, 50), dtype=float32, device=/device:CPU:0)\n", - "WARNING:tensorflow:10 out of the last 10 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 4000 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:loss = 1.1384443, step = 4000\n", - "INFO:tensorflow:global_step/sec: 1.27837\n", - "INFO:tensorflow:loss = 1.1379107, step = 4100 (78.225 sec)\n", - "INFO:tensorflow:global_step/sec: 1.2788\n", - "INFO:tensorflow:loss = 1.1374239, step = 4200 (78.198 sec)\n", - "INFO:tensorflow:global_step/sec: 1.2881\n", - "INFO:tensorflow:loss = 1.1369787, step = 4300 (77.634 sec)\n", - "INFO:tensorflow:global_step/sec: 1.28532\n", - "INFO:tensorflow:loss = 1.1365716, step = 4400 (77.802 sec)\n", - "INFO:tensorflow:Saving checkpoints for 4500 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: 1.1362021.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(61, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(61, 50), dtype=float32, device=/device:CPU:0)\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-25T10:56:23Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [10/100]\n", - "INFO:tensorflow:Evaluation [20/100]\n", - "INFO:tensorflow:Evaluation [30/100]\n", - "INFO:tensorflow:Evaluation [40/100]\n", - "INFO:tensorflow:Evaluation [50/100]\n", - "INFO:tensorflow:Evaluation [60/100]\n", - "INFO:tensorflow:Evaluation [70/100]\n", - "INFO:tensorflow:Evaluation [80/100]\n", - "INFO:tensorflow:Evaluation [90/100]\n", - "INFO:tensorflow:Evaluation [100/100]\n", - "INFO:tensorflow:Inference Time : 13.69038s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-25-10:56:37\n", - "INFO:tensorflow:Saving dict for global step 4500: discriminator_loss = 1.1362015, entropy = 0.0, gen_data_logits = 0.009563566, generator_loss = 0.68837714, global_step = 4500, loss = 1.1362015, real_data_logits = 0.99999994\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 4500: /tmp/tmpel1pa8ez/model.ckpt-4500\n", - "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "[50. 0. 0. 0.]\n", - "Average discriminator output on Real: 1.00 Fake: 0.01\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", - "WARNING:tensorflow:11 out of the last 11 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings is likely due to passing python objects instead of tensors. Also, tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. Please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Create CheckpointSaverHook.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-4500\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Saving checkpoints for 4500 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:loss = 1.1361986, step = 4500\n", - "INFO:tensorflow:global_step/sec: 1.29659\n", - "INFO:tensorflow:loss = 1.1358563, step = 4601 (77.127 sec)\n", - "INFO:tensorflow:global_step/sec: 1.29879\n", - "INFO:tensorflow:loss = 1.1355416, step = 4701 (76.995 sec)\n", - "INFO:tensorflow:global_step/sec: 1.29646\n", - "INFO:tensorflow:loss = 1.1352522, step = 4801 (77.133 sec)\n", - "INFO:tensorflow:global_step/sec: 1.2988\n", - "INFO:tensorflow:loss = 1.1349857, step = 4901 (76.994 sec)\n", - "INFO:tensorflow:Saving checkpoints for 5000 into /tmp/tmpel1pa8ez/model.ckpt.\n", - "INFO:tensorflow:Loss for final step: 1.1347424.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "Tensor(\"Generator/Reshape:0\", shape=(59, 50), dtype=float32)\n", - "Tensor(\"Reshape:0\", shape=(59, 50), dtype=float32, device=/device:CPU:0)\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Starting evaluation at 2020-08-25T11:03:10Z\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-5000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "INFO:tensorflow:Evaluation [10/100]\n", - "INFO:tensorflow:Evaluation [20/100]\n", - "INFO:tensorflow:Evaluation [30/100]\n", - "INFO:tensorflow:Evaluation [40/100]\n", - "INFO:tensorflow:Evaluation [50/100]\n", - "INFO:tensorflow:Evaluation [60/100]\n", - "INFO:tensorflow:Evaluation [70/100]\n", - "INFO:tensorflow:Evaluation [80/100]\n", - "INFO:tensorflow:Evaluation [90/100]\n", - "INFO:tensorflow:Evaluation [100/100]\n", - "INFO:tensorflow:Inference Time : 13.37736s\n", - "INFO:tensorflow:Finished evaluation at 2020-08-25-11:03:23\n", - "INFO:tensorflow:Saving dict for global step 5000: discriminator_loss = 1.1347426, entropy = 0.0, gen_data_logits = 0.0066559273, generator_loss = 0.6898243, global_step = 5000, loss = 1.1347426, real_data_logits = 0.99999994\n", - "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 5000: /tmp/tmpel1pa8ez/model.ckpt-5000\n", - "WARNING:tensorflow:Input graph does not use tf.data.Dataset or contain a QueueRunner. That means predict yields forever. This is probably a mistake.\n", - "INFO:tensorflow:Calling model_fn.\n", - "(0, 0): ───Ry(a0)───@───\n", - " │\n", - "(1, 0): ───Ry(a1)───@───\n", - "INFO:tensorflow:Done calling model_fn.\n", - "INFO:tensorflow:Graph was finalized.\n", - "INFO:tensorflow:Restoring parameters from /tmp/tmpel1pa8ez/model.ckpt-5000\n", - "INFO:tensorflow:Running local_init_op.\n", - "INFO:tensorflow:Done running local_init_op.\n", - "[50. 0. 0. 0.]\n", - "Average discriminator output on Real: 1.00 Fake: 0.01\n" - ], - "name": "stdout" - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[]" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 9 - }, - { - "output_type": "display_data", - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXEAAAD4CAYAAAAaT9YAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAPKElEQVR4nO3dfYwcd33H8fentklQg5qkPrlWEmGgCJQicNKrGx6E0kAqEyQSVFSRStRIQQaVSCChqi6VKFStGqpC+igqQ1JcKeWhITQpD21NcIWQitNLcBw7Ls1Dg5rIxAc0JPknJebbP3ZMj2PXu3d7u3u/9P2SRjs789ubj+Y8H+/Ozu6lqpAkteknZh1AkrR6lrgkNcwSl6SGWeKS1DBLXJIatnGaG9u8eXNt27ZtmpuUpObdeeed366quX7rplri27ZtY2FhYZqblKTmJfnmoHWeTpGkhlniktQwS1ySGja0xJOcmeSOJHcnOZrkA93yjyf5zySHumn75ONKkpYa5Y3Np4DLqurJJJuAryb5YrfuN6vq5snFkySdztASr943ZD3Z3d3UTX5rliStAyOdE0+yIckh4ASwv6oOdqv+IMnhJNcnOWPAY3cnWUiysLi4uEaxJUkwYolX1cmq2g6cD+xI8hLgt4EXA78AnAv81oDH7q2q+aqan5vre626JGmVVnR1SlU9BhwAdlbV8ep5CvhrYMckAkqSBht6TjzJHPD9qnosybOBy4EPJtlaVceTBLgKODLJoNv2fH6SP37de+i61886gqR1aJSrU7YC+5JsoPfM/dNV9bkkX+4KPsAh4B0TzClJ6mOUq1MOAxf1WX7ZRBJJkkbmJzYlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGja0xJOcmeSOJHcnOZrkA93y5yU5mOT+JJ9K8qzJx5UkLTXKM/GngMuq6mXAdmBnkkuADwLXV9XPAv8NXDO5mJKkfoaWePU82d3d1E0FXAbc3C3fB1w1kYSSpIFGOieeZEOSQ8AJYD/wAPBYVT3dDXkYOG/AY3cnWUiysLi4uBaZJUmdkUq8qk5W1XbgfGAH8OJRN1BVe6tqvqrm5+bmVhlTktTPiq5OqarHgAPAy4Gzk2zsVp0PPLLG2SRJQ4xydcpckrO7+WcDlwPH6JX5m7phu4BbJxVSktTfxuFD2ArsS7KBXul/uqo+l+Re4JNJfh/4OnDDBHNKkvoYWuJVdRi4qM/yB+mdH5ckzYif2JSkhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlq2NAST3JBkgNJ7k1yNMm7uuXvT/JIkkPddMXk40qSlto4wpingfdU1V1JngPcmWR/t+76qvrjycWTJJ3O0BKvquPA8W7+iSTHgPMmHUySNNyKzokn2QZcBBzsFl2b5HCSG5OcM+Axu5MsJFlYXFwcK6wk6UeNXOJJzgI+A7y7qh4HPgK8ANhO75n6h/o9rqr2VtV8Vc3Pzc2tQWRJ0ikjlXiSTfQK/KaqugWgqh6tqpNV9QPgo8COycWUJPUzytUpAW4AjlXVh5cs37pk2BuBI2sfT5J0OqNcnfJK4C3APUkOdcveC1ydZDtQwEPA2yeSUJI00ChXp3wVSJ9VX1j7OJKklfATm5LUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNG1riSS5IciDJvUmOJnlXt/zcJPuT3NfdnjP5uJKkpUZ5Jv408J6quhC4BHhnkguBPcDtVfVC4PbuviRpioaWeFUdr6q7uvkngGPAecCVwL5u2D7gqkmFlCT1t6Jz4km2ARcBB4EtVXW8W/UtYMuAx+xOspBkYXFxcYyokqTlRi7xJGcBnwHeXVWPL11XVQVUv8dV1d6qmq+q+bm5ubHCSpJ+1EglnmQTvQK/qapu6RY/mmRrt34rcGIyESVJg4xydUqAG4BjVfXhJatuA3Z187uAW9c+niTpdDaOMOaVwFuAe5Ic6pa9F7gO+HSSa4BvAr86mYiSpEGGlnhVfRXIgNWvWds4kqSV8BObktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ0bWuJJbkxyIsmRJcven+SRJIe66YrJxpQk9TPKM/GPAzv7LL++qrZ30xfWNpYkaRRDS7yqvgJ8dwpZJEkrNM458WuTHO5Ot5wzaFCS3UkWkiwsLi6OsTlJ0nKrLfGPAC8AtgPHgQ8NGlhVe6tqvqrm5+bmVrk5SVI/qyrxqnq0qk5W1Q+AjwI71jaWJGkUqyrxJFuX3H0jcGTQWEnS5GwcNiDJJ4BLgc1JHgZ+F7g0yXaggIeAt08woyRpgKElXlVX91l8wwSySJJWyE9sSlLDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSw4Z+YlPPDNv2fH7WEWbqoeteP+sI0kT4TFySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWrY0BJPcmOSE0mOLFl2bpL9Se7rbs+ZbExJUj+jPBP/OLBz2bI9wO1V9ULg9u6+JGnKhpZ4VX0F+O6yxVcC+7r5fcBVa5xLkjSC1Z4T31JVx7v5bwFbBg1MsjvJQpKFxcXFVW5OktTP2G9sVlUBdZr1e6tqvqrm5+bmxt2cJGmJ1Zb4o0m2AnS3J9YukiRpVKst8duAXd38LuDWtYkjSVqJUS4x/ATwr8CLkjyc5BrgOuDyJPcBr+3uS5KmbOjf2Kyqqweses0aZ5EkrZCf2JSkhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlq2NC/dn86SR4CngBOAk9X1fxahJIkjWasEu/8UlV9ew1+jiRphTydIkkNG7fEC/jnJHcm2d1vQJLdSRaSLCwuLo65OUnSUuOW+Kuq6mLgdcA7k7x6+YCq2ltV81U1Pzc3N+bmJElLjVXiVfVId3sC+CywYy1CSZJGs+oST/KTSZ5zah74ZeDIWgWTJA03ztUpW4DPJjn1c/62qv5xTVJJkkay6hKvqgeBl61hFknSCnmJoSQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalha/F94tIz3rY9n591hJl66LrXzzqCBvCZuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaNtYXYCXZCfwpsAH4WFVdtyapJD2j/H//AjGY3JeIrfqZeJINwF8CrwMuBK5OcuFaBZMkDTfO6ZQdwP1V9WBV/Q/wSeDKtYklSRpFqmp1D0zeBOysqrd1998C/GJVXbts3G5gd3f3RcA3BvzIzcC3VxVmOsw3HvONx3zjWe/54PQZn1tVc/1WTPyPQlTVXmDvsHFJFqpqftJ5Vst84zHfeMw3nvWeD1afcZzTKY8AFyy5f363TJI0JeOU+L8BL0zyvCTPAt4M3LY2sSRJo1j16ZSqejrJtcA/0bvE8MaqOjpGlqGnXGbMfOMx33jMN571ng9WmXHVb2xKkmbPT2xKUsMscUlq2MxKPMm5SfYnua+7PWfAuJNJDnXTxN84TbIzyTeS3J9kT5/1ZyT5VLf+YJJtk860wnxvTbK4ZJ+9bYrZbkxyIsmRAeuT5M+67IeTXDytbCPmuzTJ95bsu/dNOd8FSQ4kuTfJ0STv6jNmZvtwxHwz24dJzkxyR5K7u3wf6DNmZsfviPlWfvxW1Uwm4I+APd38HuCDA8Y9OcVMG4AHgOcDzwLuBi5cNuY3gL/q5t8MfGqd5Xsr8Bcz+p2+GrgYODJg/RXAF4EAlwAH11m+S4HPzWLfddvfClzczT8H+I8+v9+Z7cMR881sH3b75KxufhNwELhk2ZhZHr+j5Fvx8TvL0ylXAvu6+X3AVTPMcsooXyWwNPfNwGuSZB3lm5mq+grw3dMMuRL4m+r5GnB2kq3TSTdSvpmqquNVdVc3/wRwDDhv2bCZ7cMR881Mt0+e7O5u6qblV27M7PgdMd+KzbLEt1TV8W7+W8CWAePOTLKQ5GtJJl305wH/teT+w/z4P9Ifjqmqp4HvAT894Vw/tu1Ov3wAv9K91L45yQV91s/KqPln6eXdy90vJvm5WYXoXuZfRO/Z2lLrYh+eJh/McB8m2ZDkEHAC2F9VA/ffDI7fUfLBCo/fiZZ4ki8lOdJn+pFnj9V7HTHof6TnVu+jqL8G/EmSF0wy8zPAPwDbquqlwH7+71mHhruL3r+3lwF/Dvz9LEIkOQv4DPDuqnp8FhlOZ0i+me7DqjpZVdvpfYJ8R5KXTHP7w4yQb8XH70RLvKpeW1Uv6TPdCjx66mVgd3tiwM94pLt9EPgXev/7T8ooXyXwwzFJNgI/BXxngpn6brvzY/mq6jtV9VR392PAz08p2yjW9Vc1VNXjp17uVtUXgE1JNk8zQ5JN9Arypqq6pc+Qme7DYfnWwz7stv0YcADYuWzVLI/fHxqUbzXH7yxPp9wG7OrmdwG3Lh+Q5JwkZ3Tzm4FXAvdOMNMoXyWwNPebgC93rySmYWi+ZedH30DvvOV6cRvw690VFpcA31tySm3mkvzMqfOjSXbQOz6mdoB3274BOFZVHx4wbGb7cJR8s9yHSeaSnN3NPxu4HPj3ZcNmdvyOkm9Vx++03pldPtE7D3U7cB/wJeDcbvk8vb8SBPAK4B56V2HcA1wzhVxX0HvX/QHgd7plvwe8oZs/E/g74H7gDuD5U95vw/L9IXC022cHgBdPMdsngOPA9+mdq70GeAfwjm596P0hkQe63+f8lPfdsHzXLtl3XwNeMeV8r6J3WvEwcKibrlgv+3DEfDPbh8BLga93+Y4A7+uWr4vjd8R8Kz5+/di9JDXMT2xKUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktSw/wXZ/xtzwG/W9QAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXEAAAD4CAYAAAAaT9YAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAANo0lEQVR4nO3df6zd9V3H8efLtoxFpsC41oYfK3PEBZfxw5vKxmImbAaZARIJYRrtkppm0SUsmmjVZMmMieAf2/yVaAPEmswNZJut6NSuK1lMpOzyu9BNCoFIU+gd4+c/U/DtH/cLXi7ncr73nnvO6Yc8H8nJ+f74nPt95dN+Xz3ne885TVUhSWrTD007gCRp9SxxSWqYJS5JDbPEJalhlrgkNWz9JA922mmn1ebNmyd5SElq3t133/29qpoZtG+iJb5582bm5uYmeUhJal6SJ5bb5+UUSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1LBebzFM8jjwIvAK8HJVzSY5FbgF2Aw8DlxTVc+OJ6YkaZCVPBP/uao6v6pmu/UdwL6qOgfY161LkiZolMspVwK7uuVdwFWjx5EkrUTfT2wW8G9JCvjrqtoJbKyqo93+p4CNgx6YZDuwHeCss85addDNO/5p1Y99K3j8+o9NO4Kk41DfEv9QVR1J8mPA3iTfWbyzqqor+DfoCn8nwOzsrP+NkCStoV6XU6rqSHd/DPgasAV4OskmgO7+2LhCSpIGG1riSX44yTteXQZ+HjgI7AG2dsO2ArvHFVKSNFifyykbga8leXX831XVvyT5NnBrkm3AE8A144spSRpkaIlX1WPAeQO2PwNcOo5QkqR+/MSmJDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWG9SzzJuiT3Jrm9Wz87yYEkh5PckuSE8cWUJA2ykmfi1wGHFq3fAHy+qt4DPAtsW8tgkqThepV4kjOAjwE3dusBLgFu64bsAq4aR0BJ0vL6PhP/AvA7wP926+8Enquql7v1J4HTBz0wyfYkc0nm5ufnRworSXq9oSWe5BeBY1V192oOUFU7q2q2qmZnZmZW8yMkSctY32PMxcAVSS4HTgR+BPhT4OQk67tn42cAR8YXU5I0yNBn4lX1e1V1RlVtBq4FvllVvwLsB67uhm0Fdo8tpSRpoFHeJ/67wG8lOczCNfKb1iaSJKmvPpdTXlNVdwB3dMuPAVvWPpIkqS8/sSlJDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlq2NAST3JikruS3J/koSSf7bafneRAksNJbklywvjjSpIW6/NM/AfAJVV1HnA+cFmSi4AbgM9X1XuAZ4Ft44spSRpkaInXgpe61Q3drYBLgNu67buAq8aSUJK0rF7XxJOsS3IfcAzYCzwKPFdVL3dDngROH09ESdJyepV4Vb1SVecDZwBbgPf2PUCS7UnmkszNz8+vMqYkaZAVvTulqp4D9gMfAE5Osr7bdQZwZJnH7Kyq2aqanZmZGSmsJOn1+rw7ZSbJyd3y24GPAodYKPOru2Fbgd3jCilJGmz98CFsAnYlWcdC6d9aVbcneRj4cpI/Au4FbhpjTknSAENLvKoeAC4YsP0xFq6PS5KmxE9sSlLDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSw4aWeJIzk+xP8nCSh5Jc120/NcneJI9096eMP64kabE+z8RfBn67qs4FLgJ+M8m5wA5gX1WdA+zr1iVJEzS0xKvqaFXd0y2/CBwCTgeuBHZ1w3YBV40rpCRpsBVdE0+yGbgAOABsrKqj3a6ngI3LPGZ7krkkc/Pz8yNElSQt1bvEk5wEfAX4dFW9sHhfVRVQgx5XVTuraraqZmdmZkYKK0l6vV4lnmQDCwX+xar6arf56SSbuv2bgGPjiShJWk6fd6cEuAk4VFWfW7RrD7C1W94K7F77eJKkN7O+x5iLgV8FHkxyX7ft94HrgVuTbAOeAK4ZT0RJ0nKGlnhV/TuQZXZfurZxJEkr4Sc2JalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ0bWuJJbk5yLMnBRdtOTbI3ySPd/SnjjSlJGqTPM/G/AS5bsm0HsK+qzgH2deuSpAkbWuJV9S3g+0s2Xwns6pZ3AVetcS5JUg+rvSa+saqOdstPARuXG5hke5K5JHPz8/OrPJwkaZCRf7FZVQXUm+zfWVWzVTU7MzMz6uEkSYustsSfTrIJoLs/tnaRJEl9rbbE9wBbu+WtwO61iSNJWok+bzH8EvAfwE8meTLJNuB64KNJHgE+0q1LkiZs/bABVfXxZXZdusZZJEkr5Cc2JalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYZa4JDXMEpekhlniktQwS1ySGmaJS1LDLHFJapglLkkNs8QlqWGWuCQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDbPEJalhlrgkNcwSl6SGWeKS1DBLXJIaZolLUsMscUlqmCUuSQ2zxCWpYSOVeJLLknw3yeEkO9YqlCSpn1WXeJJ1wF8CvwCcC3w8yblrFUySNNwoz8S3AIer6rGq+m/gy8CVaxNLktTH+hEeezrwX4vWnwR+ZumgJNuB7d3qS0m+u8zPOw343gh5xm2q+XLD0CHO32jMNxrzjWZYvnctt2OUEu+lqnYCO4eNSzJXVbPjzrNa5huN+UZjvtG8lfONcjnlCHDmovUzum2SpAkZpcS/DZyT5OwkJwDXAnvWJpYkqY9VX06pqpeTfAr4V2AdcHNVPTRClqGXXKbMfKMx32jMN5q3bL5U1VoGkSRNkJ/YlKSGWeKS1LCplXiSU5PsTfJId3/KMuNeSXJfdxv7L06HfZVAkrcluaXbfyDJ5nFnWmG+TySZXzRnvz7BbDcnOZbk4DL7k+TPuuwPJLlwUtl65vtwkucXzd1nJpzvzCT7kzyc5KEk1w0YM7U57JlvanOY5MQkdyW5v8v32QFjpnb+9sy38vO3qqZyA/4E2NEt7wBuWGbcSxPMtA54FHg3cAJwP3DukjG/AfxVt3wtcMtxlu8TwF9M6c/0Z4ELgYPL7L8c+DoQ4CLgwHGW78PA7dOYu+74m4ALu+V3AP854M93anPYM9/U5rCbk5O65Q3AAeCiJWOmef72ybfi83eal1OuBHZ1y7uAq6aY5VV9vkpgce7bgEuT5DjKNzVV9S3g+28y5Ergb2vBncDJSTZNJl2vfFNVVUer6p5u+UXgEAufjF5sanPYM9/UdHPyUre6obstfefG1M7fnvlWbJolvrGqjnbLTwEblxl3YpK5JHcmGXfRD/oqgaV/SV8bU1UvA88D7xxzrjccuzMoH8AvdS+1b0ty5oD909I3/zR9oHu5+/UkPzWtEN3L/AtYeLa22HExh2+SD6Y4h0nWJbkPOAbsrapl528K52+ffLDC83esJZ7kG0kODri97tljLbyOWO5fpHfVwsdRfxn4QpKfGGfmt4B/BDZX1fuBvfz/sw4Ndw8Lf9/OA/4c+IdphEhyEvAV4NNV9cI0MryZIfmmOodV9UpVnc/CJ8i3JHnfJI8/TI98Kz5/x1riVfWRqnrfgNtu4OlXXwZ298eW+RlHuvvHgDtY+Nd/XPp8lcBrY5KsB34UeGaMmQYeu/OGfFX1TFX9oFu9EfjpCWXr47j+qoaqeuHVl7tV9c/AhiSnTTJDkg0sFOQXq+qrA4ZMdQ6H5Tse5rA79nPAfuCyJbumef6+Zrl8qzl/p3k5ZQ+wtVveCuxeOiDJKUne1i2fBlwMPDzGTH2+SmBx7quBb3avJCZhaL4l10evYOG65fFiD/Br3TssLgKeX3RJbeqS/Pir10eTbGHh/JjYCd4d+ybgUFV9bplhU5vDPvmmOYdJZpKc3C2/Hfgo8J0lw6Z2/vbJt6rzd1K/mV16Y+E61D7gEeAbwKnd9lngxm75g8CDLLwL40Fg2wRyXc7Cb90fBf6g2/aHwBXd8onA3wOHgbuAd0943obl+2PgoW7O9gPvnWC2LwFHgf9h4VrtNuCTwCe7/WHhPxJ5tPvznJ3w3A3L96lFc3cn8MEJ5/sQC5cVHwDu626XHy9z2DPf1OYQeD9wb5fvIPCZbvtxcf72zLfi89eP3UtSw/zEpiQ1zBKXpIZZ4pLUMEtckhpmiUtSwyxxSWqYJS5JDfs/M0t6Mpc7KFcAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAYZUlEQVR4nO3de3hU9Z3H8fc3F3IDEi4BQggGKxVxXYWNeKUCVrTeu7V9tN1dbGnpdu2uPrWtl26tWttqd3ux3W4t1Sq7265aq5Wi1iIGrG1Fg4gKiFwWCARIQMMlF8nlu3/MAZMQyCSZycnJfF7PM8+c85szc77n9zAfTn5zZn7m7oiISPSkhV2AiIj0jAJcRCSiFOAiIhGlABcRiSgFuIhIRGX05c5GjhzppaWlfblLEZHIW7FixW53L+zY3qcBXlpaSkVFRV/uUkQk8sxsS2ftGkIREYkoBbiISEQpwEVEIkoBLiISUQpwEZGIiusqFDPbDOwHWoBmdy8zs+HAI0ApsBn4hLu/m5wyRUSko+6cgc9099PcvSxYvxlY4u4TgSXBuoiI9JHeXAd+BTAjWF4ALAVu6mU90onGphZ27m2kqraB7bUN7NzbSFNLa9hliUg3zDm7lBGDsxL6mvEGuAN/MDMHfubu84HR7r4jeHwnMLqzJ5rZPGAewPjx43tZ7sDj7uw+cJCq2obDAb0jCOvYeiO7D7x3xPPMQihWRHrs8tOKQwvwc919u5mNAhab2VttH3R3D8L9CEHYzwcoKytLudkjGg62ULW3oV0gH1quqm2gam8jB5vbn03nDkpnbEEOYwtymDx2KGPzcw6vFxfkMDo/i6yM9JCOSET6i7gC3N23B/fVZvYEMA3YZWZF7r7DzIqA6iTW2S+1tjo1B95je9tArm08vL5jbyPv1B1s95w0g9FDsxlbkMMp4wq48K+yKS7IaRPS2eTnZGI6xRaRLnQZ4GaWB6S5+/5geTZwJ7AQmAPcHdw/mcxC+4OFq6pY+lZ1LKD3HhqLbv9HxZDsjCCMszmtpODwWfOhcB49NJvMdF29KSK9F88Z+GjgieCMMAP4lbv/3sxeAR41s7nAFuATySszfK9vq+X6h1cycnAWE0bk8Tfjh7Ub1hhbkENRQTZDszPDLlVEUkSXAe7um4BTO2nfA5yfjKL6m9ZW5xsLVzMiL4vnbzyPIQppEekH9Ld8HB5fuZ2VW2u5+SOTFN4i0m8owLuwr7GJu595iynjC/jbKcVhlyMiclifTugQRT96bj176t7jwWtPJy1NV4aISP+hM/Bj2FC9n4f+vJmrTy/hlHH5YZcjItKOAvwo3J3bF64hd1A6X559YtjliIgcQQF+FM+u3smLG3Zz4+wTE/71VxGRRFCAd6LhYAvfXLSWSWOG8Kkz9PstItI/6UPMTty3bCPbaxt4eN6ZZOhbkyLSTymdOqh8p56fLtvIZaeO5czjR4RdjojIUSnAO/jmojWkm3HrxZPCLkVE5JgU4G288HYNf1iziy/OOoGi/JywyxEROSYFeOBgcyu3/241pSNy+ez0CWGXIyLSJQV44KE//x+bauq47bLJmixBRCJBAQ5U72vk3ufWM2vSKGZN6nRmOBGRfkcBDtz9zFs0tTi3XTo57FJEROKW8gG+Yss7PL5yO5+dPoHSkXlhlyMiEreUDvCWVue2J1czZmg21808IexyRES6JaUD/OFXtrK6ah+3XnISeVn6UqqIREvKBnht/UH+/dl1nDFhOJf9dVHY5YiIdFvKBvj3/vA2exuauP3ykwkmbBYRiZSUDPA1Vfv45fIt/P2Zx3FS0dCwyxER6ZGUC/DYRA2rKcgdxJcu0EQNIhJdKRfgC1dV8fLmd/jKhSeSn6sZ5kUkulIqwOvea+bbT6/llOJ8PlFWEnY5IiK9klLXzv34+Q3s2vceP/27vyFdM8yLSMSlzBn4ppoDPPDiJj42dRxTxw8LuxwRkV5LiQB3d+5ctIasjHRu+og+uBSRgSElAnzJ2mqWrqvhhg9PZNSQ7LDLERFJiAEf4I1NLdy5aA0njBrMnLNLwy5HRCRhBvyHmPf/cRNb36nnf+aeQaZmmBeRAWRAJ1pVbQM/Kd/IRSeP4dyJI8MuR0QkoeIOcDNLN7OVZrYoWJ9gZsvNbIOZPWJmg5JXZs986+m1tLrztUtOCrsUEZGE684Z+PXA2jbr9wA/cPcTgHeBuYksrLf+vHE3T72+gy/M+AAlw3PDLkdEJOHiCnAzGwdcAtwfrBswC3gs2GQBcGUyCuyJ5pZW7li4hnHDcvjH8z4QdjkiIkkR7xn4D4GvAq3B+gig1t2bg/VtQHFnTzSzeWZWYWYVNTU1vSo2Xv/90hbW7drPv14ymexMzTAvIgNTlwFuZpcC1e6+oic7cPf57l7m7mWFhYU9eYlu2X3gPb6/+G2mTxzJhSdrhnkRGbjiuYzwHOByM7sYyAaGAvcCBWaWEZyFjwO2J6/M+P3b79fRcLCFb1ymiRpEZGDr8gzc3W9x93HuXgpcDTzv7p8CyoGrgs3mAE8mrco4raqs5dEVlXz6nFJOGDU47HJERJKqN9eB3wR8ycw2EBsTfyAxJfVMa6tz28LVjBycxb+cPzHMUkRE+kS3vonp7kuBpcHyJmBa4kvqmcde3caqylq+9/FTGZKtiRpEZOAbEN/E3NvQxHd//xZTxxfw0SmdXgwjIjLgDIjfQvnhc2+zp+4gD316GmmaqEFEUkTkz8DX7dzPf/1lC1efPp6/Ks4PuxwRkT4T6QA/NMP84KwMvnKhJmoQkdQS6QB/+o2d/GXTHm6c/UGG5/W739ISEUmqyAZ4/cFmvvXUGiaNGcInp40PuxwRkT4X2QD/6dKNVO1t5I7LTyZDEzWISAqKZPJt3VPPz17YxOWnjuWM40eEXY6ISCgiGeB3LlpDRppx68WaqEFEUlfkAnzpumqeW7uLL846gTH5mmFeRFJXpAL8YHMrd/5uDRNG5jH33AlhlyMiEqpIBfgv/vR/bNpdx22XTiYrQxM1iEhqi0yA79rXyI+XrOf8SaOYOWlU2OWIiIQuMgH+nafX0tTifP3SyWGXIiLSL0QiwF/Z/A6/fa2Kz31oAqUj88IuR0SkX4hEgN/zzFsU5Wdz3cwTwi5FRKTfiMTPyd57zRSqahvIHRSJckVE+kQkErG4IIfigpywyxAR6VciMYQiIiJHUoCLiESUAlxEJKIU4CIiEaUAFxGJKAW4iEhEKcBFRCJKAS4iElEKcBGRiFKAi4hElAJcRCSiFOAiIhHVZYCbWbaZvWxmq8xstZndEbRPMLPlZrbBzB4xs0HJL1dERA6J5wz8PWCWu58KnAZcZGZnAvcAP3D3E4B3gbnJK1NERDrqMsA95kCwmhncHJgFPBa0LwCuTEqFIiLSqbjGwM0s3cxeA6qBxcBGoNbdm4NNtgHFR3nuPDOrMLOKmpqaRNQsIiLEGeDu3uLupwHjgGnApHh34O7z3b3M3csKCwt7WKaIiHTUratQ3L0WKAfOAgrM7NCMPuOA7QmuTUREjiGeq1AKzawgWM4BLgDWEgvyq4LN5gBPJqtIERE5UjxzYhYBC8wsnVjgP+rui8xsDfCwmd0FrAQeSGKdIiLSQZcB7u6vA1M6ad9EbDxcRERCoG9iiohElAJcRCSiFOAiIhGlABcRiSgFuIhIRCnARUQiSgEuIhJRCnARkYhSgIuIRJQCXEQkohTgIiIRpQAXEYkoBbiISEQpwEVEIkoBLiISUQpwEZGIUoCLiESUAlxEJKIU4CIiEaUAFxGJKAW4iEhEKcBFRCJKAS4iElEKcBGRiFKAi4hElAJcRCSiFOAiIhGlABcRiSgFuIhIRCnARUQiSgEuIhJRXQa4mZWYWbmZrTGz1WZ2fdA+3MwWm9n64H5Y8ssVEZFD4jkDbwZudPfJwJnAdWY2GbgZWOLuE4ElwbqIiPSRLgPc3Xe4+6vB8n5gLVAMXAEsCDZbAFyZrCJFRORI3RoDN7NSYAqwHBjt7juCh3YCo4/ynHlmVmFmFTU1Nb0oVURE2oo7wM1sMPAb4AZ339f2MXd3wDt7nrvPd/cydy8rLCzsVbEiIvK+uALczDKJhfcv3f3xoHmXmRUFjxcB1ckpUUREOhPPVSgGPACsdffvt3loITAnWJ4DPJn48kRE5Ggy4tjmHODvgTfM7LWg7VbgbuBRM5sLbAE+kZwSRUSkM10GuLu/CNhRHj4/seWIiEi89E1MEZGIUoCLiESUAlxEJKIU4CIiEaUAFxGJKAW4iEhEKcBFRCJKAS4iElEKcBGRiFKAi4hElAJcRCSiFOAiIhGlABcRiSgFuIhIRCnARUQiSgEuIhJRCnARkYhSgIuIRJQCXEQkohTgIiIRpQAXEYkoBbiISERFI8D3boNtK8KuQkSkX+n/Ae4Oj30GHv4kHKgJuxoRkX6j/we4GVzyPWh4F574PLS2hl2RiEi/0P8DHGDMKXDRd2DjEvjTD8OuRkSkX4hGgAOUfQYmXwnP3wVbXwq7GhGR0EUnwM3g8h9BQQk8Nhfq3wm7IhGRUEUnwAGy8+GqB+HALvjtP8U+4BQRSVHRCnCA4qkw+y54+xl46T/DrkZEJDRdBriZ/cLMqs3szTZtw81ssZmtD+6HJbfMDs74PJx4CSz+hq4PF5GUFc8Z+EPARR3abgaWuPtEYEmw3nfM4Ir/gCFj4LFroaG2T3cvItIfdBng7v4C0PETwyuABcHyAuDKBNfVtdzhsfHwfVWw8IsaDxeRlNPTMfDR7r4jWN4JjD7ahmY2z8wqzKyipibB36QsOR3Ovw3W/g5euT+xry0i0s/1+kNMd3fgqKe/7j7f3cvcvaywsLC3uzvSWf8ME2fDs7fCjlWJf30RkX6qpwG+y8yKAIL76sSV1E1paXDlfZA7En59LTTuC60UEZG+1NMAXwjMCZbnAE8mppweyhsBVz0A726GRTdoPFxEUkI8lxH+L/AX4EQz22Zmc4G7gQvMbD3w4WA9XMedDTNvhTd/A68u6Hp7EZGIy+hqA3e/5igPnZ/gWnrv3C/B5hfhmZtg3Okw+uSwKxIRSZrofRPzWNLS4W9/DllDY+PhB+vCrkhEJGkGVoADDB4FH/s57F4PT3057GpERJJm4AU4wPEz4LyvwqpfwWu/CrsaEZGkGJgBDnDeTXDcufDUjVCzLuxqREQSbuAGeFp6bCglMyc2Ht7UEHZFIiIJNXADHGDoWPjofKheE7syRURkABnYAQ4w8cNwzg2xa8PfeCzsakREEmbgBzjArH+FkjPgd9fDno1hVyMikhCpEeDpmfCxByAtIxgPbwy7IhGRXkuNAIfYZMgfvQ92vg6Lvx52NSIivZY6AQ5w4kfgzOvg5fmwJtzf3xIR6a3UCnCAD98OY6fCk/8c+/VCEZGISr0AzxgEH38wtvzYZ6D5YLj1iIj0UOoFOMCwUrjix7B9BSy5I+xqRER6JDUDHGDyFXD65+Av/wHrngm7GhGRbkvdAAeYfReMOQV++wXYuy3sakREuiW1AzwzGz6+AFqaYuPhLU1hVyQiErfUDnCAER+Ay+6FyuVQ/q2wqxERiZsCHOCUq2DqP8CLP4ANz4VdjYhIXBTgh1x0D4yaDI9/HvbtCLsaEZEuKcAPGZQLH38Imurh8c9Ba0vYFYmIHJMCvK3CE+GS78HmP8Ky74ZdjYjIMUUiwKsOVFHfVN83Ozvtk3DqNbDsHti0rG/2KSLSA5EI8G8v/zbTH57OdUuu49dv/5rq+urk7vDif4eRE2NDKQeSvC8RkR7KCLuAeFx78rWUDClhaeVSXtj2AgAnjziZGSUzmFkykw8O+yBmlrgdZg2Gqx6E+8+Hx+fB3z0OaZH4v05EUoi5e5/trKyszCsqKnr8fHdn095NlFeWs7RyKa/XvI7jFOUVMaNkBjPGzeD0MaeTmZ6ZmIIrHoRFN8Csr8OHvpyY1xQR6SYzW+HuZUe0RynAO9rdsJs/bvsj5ZXlvLTjJRqaG8jLzOOcsecwo2QG04unU5Bd0PMduMNv5sLqJ+Dap+C4sxNWu4hIvAZkgLfV2NzIyztfpryynGWVy6hpqCHN0pgyagozS2Yyo2QGxw09rgcvvA/mnxebhu0fX4S8EYkvXkTkGAZ8gLfV6q2s3bP28FDLunfXATAhf8LhoZZTC08lPS09vheseg0euACOnwnXPKzxcBHpUykV4B1VHahiaeVSllYu5ZVdr9Dc2sywrGFMHzedmSUzOXvs2eRm5h77RZbPh2e+AuPPil2hkl8C+ePevw0thoysvjkgEUkpKR3gbR04eIA/Vf3p8BUt+w7uIzMtk2lF05g5bibnlZzHmLwxRz7RHZ6/CzY+H/vp2bpOLi8cPLpNqHcI+PwSyB0BibxaRkRSQlIC3MwuAu4F0oH73f3uY23f0wDfX15Oc00Nabl5pOXmBrecNsuxmw0a1K3XbW5tZmX1SpZVLqO8spyt+7cCcNLwk5hZEgvzk4af1Pklik2NsG97LMwP3yrbrzc3tH9ORvaRoT60uE3gF0NmTrf7R0QGtoQHuJmlA28DFwDbgFeAa9x9zdGe09MA3/rZz1H34otdb5iZeUSod3rLCwK/Q/tOr6Vi75v8+d1XeXX/WhoGOcOGjmbG+NiHoNPGTGNQepz/SbhD/Tuw7xgBv38n0KH/c0ce5Sw+WM4r1Bi8SIpJRoCfBdzu7hcG67cAuPt3jvacngZ4y4E6WusO0FpXT2t9Pa31dbTW1+P1h9aDW12H9Xa34DnBNvFyg8ZMaBgEBwelYRmJ/u6Tx8K+3XKHtiNoGEYkaib84G6Om3ZFj557tADvTRoVA5Vt1rcBZ3Sy43nAPIDx48f3aEfpg/NIH5zXo+d2xltb8cbGI0O+7sjAb62vp7nuALt2b6Fuz1aamt5LWB1xFhv7ZURvid0fWu7Dzy5EpPcG5eYn/DWT/lV6d58PzIfYGXiy9xcPS0s7PHwSr7FJrEdEpCd6M5i6HShpsz4uaBMRkT7QmwB/BZhoZhPMbBBwNbAwMWWJiEhXejyE4u7NZvZF4FlilxH+wt1XJ6wyERE5pl6Ngbv708DTCapFRES6QRcUi4hElAJcRCSiFOAiIhGlABcRiag+/TVCM6sBtvTZDpNjJLA77CL6CfVFe+qP9tQf7+ttXxzn7oUdG/s0wAcCM6vo7DcJUpH6oj31R3vqj/clqy80hCIiElEKcBGRiFKAd9/8sAvoR9QX7ak/2lN/vC8pfaExcBGRiNIZuIhIRCnARUQiKuUD3Mx+YWbVZvZmm7bhZrbYzNYH98OCdjOzH5nZBjN73cymtnnOnGD79WY2J4xjSQQzKzGzcjNbY2arzez6oD3l+sTMss3sZTNbFfTFHUH7BDNbHhzzI8HPKWNmWcH6huDx0javdUvQvs7MLgzniBLDzNLNbKWZLQrWU7Y/zGyzmb1hZq+ZWUXQ1nfvFXdP6RvwIWAq8Gabtu8CNwfLNwP3BMsXA88Qm5TyTGB50D4c2BTcDwuWh4V9bD3sjyJgarA8hNjE1ZNTsU+CYxocLGcCy4NjfBS4Omi/D/hCsPxPwH3B8tXAI8HyZGAVkAVMADYC6WEfXy/65UvAr4BFwXrK9gewGRjZoa3P3iuhd0B/uAGlHQJ8HVAULBcB64LlnwHXdNwOuAb4WZv2dttF+QY8CVyQ6n0C5AKvEpv3dTeQEbSfBTwbLD8LnBUsZwTbGXALcEub1zq8XdRuxGbeWgLMAhYFx5fK/dFZgPfZeyXlh1COYrS77wiWdwKjg+XOJnIuPkZ7pAV/8k4hduaZkn0SDBe8BlQDi4mdLda6e3OwSdvjOnzMweN7gREMkL4I/BD4KtAarI8gtfvDgT+Y2YpgAnfow/dK0ic1jjp3dzNLuWstzWww8BvgBnffZ2aHH0ulPnH3FuA0MysAngAmhVxSaMzsUqDa3VeY2Yyw6+knznX37WY2ClhsZm+1fTDZ7xWdgXdul5kVAQT31UH70SZyHlATPJtZJrHw/qW7Px40p3SfuHstUE5siKDAzA6d/LQ9rsPHHDyeD+xh4PTFOcDlZrYZeJjYMMq9pG5/4O7bg/tqYv/BT6MP3ysK8M4tBA59EjyH2DjwofZ/CD5NPhPYG/yp9Cww28yGBZ84zw7aIsdip9oPAGvd/fttHkq5PjGzwuDMGzPLIfZZwFpiQX5VsFnHvjjUR1cBz3tsUHMhcHVwVcYEYCLwct8cReK4+y3uPs7dS4l9KPm8u3+KFO0PM8szsyGHlon9G3+TvnyvhP0hQNg34H+BHUATsbGnucTG6ZYA64HngOHBtgb8hNg46BtAWZvX+QywIbh9Ouzj6kV/nEtsXO914LXgdnEq9gnw18DKoC/eBG4L2o8nFjgbgF8DWUF7drC+IXj8+Dav9bWgj9YBHwn72BLQNzN4/yqUlOyP4LhXBbfVwNeC9j57r+ir9CIiEaUhFBGRiFKAi4hElAJcRCSiFOAiIhGlABcRiSgFuIhIRCnARUQi6v8BOyTFLLqAOd4AAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - } - ] - } - ] -} \ No newline at end of file