diff --git a/docs/tutorials/qGAN.ipynb b/docs/tutorials/qGAN.ipynb new file mode 100644 index 000000000..9488f58ac --- /dev/null +++ b/docs/tutorials/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": "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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": "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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