Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ltiao/c066d22588d9494cb4b94a6cdd472392 to your computer and use it in GitHub Desktop.
Save ltiao/c066d22588d9494cb4b94a6cdd472392 to your computer and use it in GitHub Desktop.
Approximating the KL Divergence Between Implicit Distributions.ipynb
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Approximating the KL Divergence Between Implicit Distributions.ipynb",
"version": "0.3.2",
"provenance": [],
"collapsed_sections": [
"31TlGzqZ6W5v"
],
"include_colab_link": true
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"[View in Colaboratory](https://colab.research.google.com/gist/ltiao/c066d22588d9494cb4b94a6cdd472392/approximating-the-kl-divergence-between-implicit-distributions.ipynb)"
]
},
{
"metadata": {
"id": "ZCxh4vi36W3V",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"%matplotlib inline"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "PMLLQJUI6W3Y",
"colab_type": "code",
"colab": {},
"outputId": "ef6f26d7-4a60-4f99-b332-9f4fc478528b"
},
"cell_type": "code",
"source": [
"import numpy as np\n",
"from scipy.special import expit\n",
"\n",
"import tensorflow as tf\n",
"import tensorflow_probability as tfp\n",
"\n",
"from keras.models import Sequential, Model\n",
"from keras.layers import Input, Dense\n",
"from keras.callbacks import Callback\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import pandas as pd\n",
"\n",
"from matplotlib import animation\n",
"from IPython.display import HTML, SVG\n",
"from keras.utils.vis_utils import model_to_dot, plot_model"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"/usr/lib/python3/dist-packages/h5py/__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
" from ._conv import register_converters as _register_converters\n",
"Using TensorFlow backend.\n"
],
"name": "stderr"
}
]
},
{
"metadata": {
"id": "9tmDnLoW6W3f",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"plt.style.use('seaborn-colorblind')\n",
"\n",
"plt.rc('text', usetex=True)\n",
"plt.rc('font', family='serif', serif=['Lato'], size=16)\n",
"plt.rc('animation', convert_path='/usr/bin/convert')\n",
"\n",
"np.set_printoptions(precision=2,\n",
" edgeitems=3,\n",
" linewidth=80,\n",
" suppress=True)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "ozif4aoO6W3j",
"colab_type": "code",
"colab": {},
"outputId": "301b03a5-6b8c-47a8-a814-103efc28f1c1"
},
"cell_type": "code",
"source": [
"'TensorFlow version: ' + tf.__version__"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"'TensorFlow version: 1.10.0'"
]
},
"metadata": {
"tags": []
},
"execution_count": 4
}
]
},
{
"metadata": {
"id": "dahCiHQd6W3m",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"sess = tf.InteractiveSession()"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "kx4XvkMW6W3o",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"golden_size = lambda width: (width, 2. * width / (1 + np.sqrt(5)))"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "O4Yi5gaf6W3s",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"mu_p = 1.\n",
"sigma_p = 1."
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "wwLTcf7q6W3u",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"mu_q = 0.\n",
"sigma_q = 2."
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "BecEyMz16W3x",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"p = tfp.distributions.Normal(loc=mu_p, scale=sigma_p)\n",
"q = tfp.distributions.Normal(loc=mu_q, scale=sigma_q)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "NFSUkub86W3z",
"colab_type": "code",
"colab": {},
"outputId": "e5037d3f-3797-4cd7-a119-0f45a341759a"
},
"cell_type": "code",
"source": [
"xs = tf.expand_dims(tf.linspace(-5., 5., 500), 1)\n",
"xs"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<tf.Tensor 'ExpandDims:0' shape=(500, 1) dtype=float32>"
]
},
"metadata": {
"tags": []
},
"execution_count": 10
}
]
},
{
"metadata": {
"id": "FNL2B-pv6W33",
"colab_type": "code",
"colab": {},
"outputId": "9dfe0a67-0cf8-4286-ad99-f4b086b33239"
},
"cell_type": "code",
"source": [
"fig, ax = plt.subplots(figsize=golden_size(8))\n",
"\n",
"# ax.set_title('probability densities')\n",
"\n",
"ax.plot(xs.eval(), q.prob(xs).eval(), label='$q(x)$')\n",
"ax.plot(xs.eval(), p.prob(xs).eval(), label='$p(x)$')\n",
"\n",
"ax.set_xlim(-5.5, 5.5)\n",
"ax.set_ylim(0., .5)\n",
"\n",
"ax.set_xlabel('$x$')\n",
"ax.set_ylabel('density')\n",
"\n",
"ax.legend()\n",
"\n",
"plt.savefig('gaussian_1d_densities.svg', format='svg', dpi=1200)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fb784063d68>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "OXKu3Vi86W36",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"def log_density_ratio(p, q):\n",
"\n",
" def log_ratio(x):\n",
"\n",
" return p.log_prob(x) - q.log_prob(x)\n",
"\n",
" return log_ratio"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "Z3HmzusH6W3_",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"def density_ratio(p, q):\n",
"\n",
" log_ratio = log_density_ratio(p, q)\n",
"\n",
" def ratio(x):\n",
"\n",
" return tf.exp(log_ratio(x))\n",
"\n",
" return ratio"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "AxS34IgD6W4A",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"r = density_ratio(p, q)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "ZXaEdOKj6W4D",
"colab_type": "code",
"colab": {},
"outputId": "9dc456d3-a7d5-4d02-a671-ef5799751b51"
},
"cell_type": "code",
"source": [
"fig, ax = plt.subplots(figsize=golden_size(8))\n",
"\n",
"# ax.set_title('density ratio')\n",
"\n",
"ax.plot(xs.eval(), q.prob(xs).eval(), label='$f(x)=q(x)$')\n",
"ax.plot(xs.eval(), p.prob(xs).eval(), label='$f(x)=p(x)$')\n",
"\n",
"ax.plot(xs.eval(), r(xs).eval(), linestyle=':', label='$f(x)=\\\\frac{p(x)}{q(x)}$')\n",
"\n",
"ax.set_xlim(-5.5, 5.5)\n",
"ax.set_xlabel('$x$')\n",
"\n",
"ax.set_ylabel('$f(x)$')\n",
"\n",
"ax.legend()\n",
"\n",
"plt.savefig('gaussian_1d_density_ratios.svg', format='svg', dpi=1200)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fb7840634e0>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "wLjh5KTE6W4G",
"colab_type": "code",
"colab": {},
"outputId": "7d547cfd-d164-4ca4-a9e1-49648b838d35"
},
"cell_type": "code",
"source": [
"tfp.distributions.kl_divergence(p, q).eval()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.44314718"
]
},
"metadata": {
"tags": []
},
"execution_count": 16
}
]
},
{
"metadata": {
"id": "t_M4qCvH6W4K",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"$$\n",
"\\mathrm{KL}[p(x) || q(x)] = \n",
"\\mathbb{E}_{p(x)} \\left [ \\log \\frac{p(x)}{q(x)} \\right ].\n",
"$$"
]
},
{
"metadata": {
"id": "NLbrSp6J6W4K",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"p_samples = p.sample(5000, seed=8888)\n",
"q_samples = q.sample(5000, seed=8888)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "CbQUCIIK6W4O",
"colab_type": "code",
"colab": {},
"outputId": "020430e7-521c-45b4-a363-ccb5d6aa6d9c"
},
"cell_type": "code",
"source": [
"log_r = log_density_ratio(p, q)\n",
"tf.reduce_mean(log_r(p_samples)).eval()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.44670376"
]
},
"metadata": {
"tags": []
},
"execution_count": 18
}
]
},
{
"metadata": {
"id": "KskTv6BE6W4R",
"colab_type": "code",
"colab": {},
"outputId": "cd7c33bf-49aa-4e80-d296-4d4c9d508d2e"
},
"cell_type": "code",
"source": [
"tfp.monte_carlo.expectation(f=log_r, samples=p_samples).eval()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"WARNING:tensorflow:From /usr/local/lib/python3.5/dist-packages/tensorflow_probability/python/monte_carlo.py:161: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"keep_dims is deprecated, use keepdims instead\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.4581419"
]
},
"metadata": {
"tags": []
},
"execution_count": 19
}
]
},
{
"metadata": {
"id": "hlosGIej6W4U",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"$$\n",
"\\begin{align}\n",
"\\mathrm{KL}[p(x) || q(x)] \n",
"& = \\mathbb{E}_{q(x)} \\left [ \\frac{p(x)}{q(x)} \\log \\frac{p(x)}{q(x)} \\right ] \\\\\n",
"& = \\mathbb{E}_{q(x)} \\left [ f \\left ( \\frac{p(x)}{q(x)} \\right ) \\right ] \n",
"\\end{align}\n",
"$$\n",
"where\n",
"$$\n",
"f(u) = u \\log u\n",
"$$"
]
},
{
"metadata": {
"id": "qjFA3AcR6W4V",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"_kl_forward = lambda u: u * tf.log(u)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "tLPtvEIm6W4X",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"us = tf.linspace(0., 2., 500)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "EqaG3qzm6W4Z",
"colab_type": "code",
"colab": {},
"outputId": "fb148d47-5d03-46c8-c06a-bf2b3b5bf0f2"
},
"cell_type": "code",
"source": [
"fig, ax = plt.subplots(figsize=golden_size(8))\n",
"\n",
"ax.plot(us.eval(), tfp.vi.kl_forward(tf.log(us)).eval())\n",
"ax.plot(us.eval(), _kl_forward(us).eval())\n",
"\n",
"plt.show()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fb760019ac8>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "yqdwdSiS6W4c",
"colab_type": "code",
"colab": {},
"outputId": "9e829dcb-a699-4a6a-828f-5b1b8808634d"
},
"cell_type": "code",
"source": [
"tf.reduce_mean(_kl_forward(tf.exp(log_r(q_samples)))).eval()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.45856187"
]
},
"metadata": {
"tags": []
},
"execution_count": 23
}
]
},
{
"metadata": {
"id": "fCfjJcQT6W4i",
"colab_type": "code",
"colab": {},
"outputId": "5642fe2d-e8eb-43ad-afbe-9d1d190402d3"
},
"cell_type": "code",
"source": [
"tf.reduce_mean(tfp.vi.kl_forward(log_r(q_samples))).eval()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.4559041"
]
},
"metadata": {
"tags": []
},
"execution_count": 24
}
]
},
{
"metadata": {
"id": "N7renZK76W4l",
"colab_type": "code",
"colab": {},
"outputId": "be37c29d-2760-43a5-9488-fd5255c12476"
},
"cell_type": "code",
"source": [
"tfp.vi.monte_carlo_csiszar_f_divergence(f=tfp.vi.kl_forward,\n",
" p_log_prob=p.log_prob, q=q, \n",
" num_draws=5000, seed=888).eval()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.4430853"
]
},
"metadata": {
"tags": []
},
"execution_count": 25
}
]
},
{
"metadata": {
"id": "ZUaKHv5w6W4o",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"def optimal_classifier(p, q): \n",
" \n",
" def classifier(x):\n",
" \n",
" return tf.truediv(p.prob(x), p.prob(x) + q.prob(x))\n",
" \n",
" return classifier"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "At2-KnKJ6W4r",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"n_p = n_q = 200"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "XRh-OUP-6W4u",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"p_samples = p.sample(sample_shape=(n_p, 1), seed=8888)\n",
"q_samples = q.sample(sample_shape=(n_q, 1), seed=8888)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "w71oVJta6W4z",
"colab_type": "code",
"colab": {},
"outputId": "183140f3-e200-44e5-e231-0322ee021b2c"
},
"cell_type": "code",
"source": [
"X = tf.concat([p_samples, q_samples], axis=0)\n",
"X"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<tf.Tensor 'concat:0' shape=(400, 1) dtype=float32>"
]
},
"metadata": {
"tags": []
},
"execution_count": 29
}
]
},
{
"metadata": {
"id": "mbjCuwEf6W42",
"colab_type": "code",
"colab": {},
"outputId": "35bd61c5-a767-4e7a-c4de-b9f1bac20389"
},
"cell_type": "code",
"source": [
"y = tf.concat([tf.ones_like(p_samples), \n",
" tf.zeros_like(q_samples)], axis=0)\n",
"y"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<tf.Tensor 'concat_1:0' shape=(400, 1) dtype=float32>"
]
},
"metadata": {
"tags": []
},
"execution_count": 30
}
]
},
{
"metadata": {
"id": "-HPfyfr06W45",
"colab_type": "code",
"colab": {},
"outputId": "fdf0cb73-00fc-4c5d-8621-7d4c6570c6bc"
},
"cell_type": "code",
"source": [
"golden_size(8)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(8, 4.944271909999158)"
]
},
"metadata": {
"tags": []
},
"execution_count": 31
}
]
},
{
"metadata": {
"id": "gRjiXLVo6W47",
"colab_type": "code",
"colab": {},
"outputId": "02fa6510-d755-4cbe-ccc9-9dbba8ed1a31"
},
"cell_type": "code",
"source": [
"fig, ax1 = plt.subplots(figsize=(9, golden_size(8)[1]))\n",
"\n",
"ax1.scatter(X.eval(), y.eval(), c=y.eval(), s=12.**2, \n",
" marker='s', alpha=.2, cmap='coolwarm_r')\n",
"\n",
"ax1.set_xlabel('$x$')\n",
"ax1.set_xlim(-5.5, 5.5)\n",
"\n",
"ax1.set_ylim(-0.05, 1.05)\n",
"ax1.set_yticks([0, 1])\n",
"ax1.set_yticklabels(['$x_q^{(j)} \\sim q(x)$', \n",
" '$x_p^{(i)} \\sim p(x)$'])\n",
"\n",
"ax2 = ax1.twinx()\n",
"\n",
"ax2.set_ylim(-0.05, 1.05)\n",
"ax2.set_yticks([0, 1])\n",
"\n",
"# plt.show()\n",
"plt.savefig('dataset.svg', format='svg', dpi=1200)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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ICDCGAAAQECEMQAAgIAIYwAAAAERxgAAAAIijAEAAAREGAMAAAiIMAYAABAQYQwAACAgwhgAAEBAhDEAAICACGMAAAABEcYAAAACIowBAAAERBgDAAAIiDAGAAAQEGEMAAAgIMIYAABAQIQxAACAgAhjAAAAARHGAAAAAiKMAQAABEQYAwAACIgwBgAAEBBhDAAAICDCGAAAQECEMQAAgIAIYwAAAAERxgAAAAIijAEAAAREGAMAAAiIMAYAABAQYQwAACAgwhgAAEBAhDEAAICACGMAAAABEcYAAAACIowBAAAERBgDAAAIiDAGAAAQEGEMAAAgIMIYAABAQIQxAACAgAhjAAAAARHGAAAAAiKMAQAABEQYAwAACIgwBgAAEBBhDAAAICDCGAAAQECEMQAAgIAIYwAAAAERxgAAAAIijAEAAAREGAMAAAiIMAYAABAQYQwAACAgwhgAAEBAhDEAAICACGMAAAABEcYAAAACIowBAAAERBgDAAAIiDAGAAAQEGEMAAAgIMIYAABAQIQxAACAgAhjAAAAARHGAAAAAiKMAQAABEQYAwAACIgwBgAAEBBhDAAAICDCGAAAQECEMQAAgIAIYwAAAAERxgAAAAIijAEAAAREGAMAAAiIMAYAABAQYQwAACAgwhgAAEBAhDEAAICACGMAAAABEcYAAAACIowBAAAERBgDAAAIiDAGAAAQEGEMAAAgIMIYAABAQIQxAACAgAhjAAAAARHGAAAAAiKMAQAABEQYAwAACIgwBgAAEBBhDAAAICDCGAAAQECEMQAAgIAIYwAAAAERxgAAAAIijAEAAAREGAMAAAiIMAYAABAQYQwAACAgwhgAAEBAhDEAAICACGMAAAABEcYAAAACIowBAAAERBgDAAAIiDAGAAAQEGEMAAAgIMIYAABAQIQxAACAgAhjAAAAARHGAAAAAiKMAQAABEQYAwAACIgwBgAAEBBhDAAAICDCGAAAQECEMQAAgIAIYwAAAAERxgAAAAIijAEAAAREGAMAAAiIMAYAABAQYQwAACAgwhgAAEBAhDEAAICACGMAAAABEcYAAAACIowBAAAERBgDAAAIiDAGAAAQEGEMAAAgIMIYAABAQIQxAACAgAhjAAAAARHGAAAAAiKMAQAABEQYAwAACIgwBgAAEBBhDAAAICDCGAAAQECEMQAAgIAIYwAA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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fb74c6adf98>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "N1YtHMq76W4-",
"colab_type": "code",
"colab": {},
"outputId": "0c7197be-afe9-4a9e-a04e-0656181848d7"
},
"cell_type": "code",
"source": [
"fig, ax1 = plt.subplots(figsize=(9, golden_size(8)[1]))\n",
"\n",
"ax1.scatter(X.eval(), y.eval(), c=y.eval(), s=12.**2, \n",
" marker='s', alpha=.2, cmap='coolwarm_r')\n",
"\n",
"ax1.set_xlabel('$x$')\n",
"ax1.set_xlim(-5.5, 5.5)\n",
"\n",
"ax1.set_ylim(-0.05, 1.05)\n",
"ax1.set_yticks([0, 1])\n",
"ax1.set_yticklabels(['$x_q^{(j)} \\sim q(x)$', \n",
" '$x_p^{(i)} \\sim p(x)$'])\n",
"\n",
"ax2 = ax1.twinx()\n",
"\n",
"ax2.plot(xs.eval(), optimal_classifier(p, q)(xs).eval(), 'k-')\n",
"\n",
"ax2.set_xlim(-5.5, 5.5)\n",
"ax2.set_xlabel('$x$')\n",
"\n",
"ax2.set_ylim(-0.05, 1.05)\n",
"ax2.set_ylabel('$\\mathcal{P}(y=1 \\mid x)$')\n",
"\n",
"# plt.show()\n",
"plt.savefig('optimal_classifier.svg', format='svg', dpi=1200)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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9dc57bTT2LlzJ++88w4jRozA6/W6XVaTduqpp7J06VIuvvhi7rrrLq666ipKS0vdLksk3qYbY2ZHbxhjjq7toJFYCoMiIk2EtZaHH36Y3/3ud3Tq1IklS5ZoObY6aNu2La+++iqjR49m5syZ9OzZky1btrhdlkg8LbDWXha9Ya39Hsg3xpxXl4MoDIqINAGBQIDrr7+eBx54gGuuuYYPPvhA3cL7wRjDvffey7x58/jyyy857bTTWLFihdtlicTLOmPM4NjuYicQZtXlIAqDIiIuKyws5Le//S3PP/88DzzwAC+88AKpqalul9Ws9evXjw8//BBrLWeddRbvvfee2yWJxEMf4EYgzxiz2plbcDDQrS4HURgUEXHRli1b6NGjBwsXLmT69Ok8+OCDmi+vgXTt2pXPPvuMI488kr59+/KPf/zD7ZJEGtpaa+2p1loPcCmRFUhuBHLrchBNLRNHmlpGRPZl48aN9OrVi02bNjFnzhx+85vfuF1Si7Rz504uuugiPv/8c6ZPn87vf/97t0uSZqo2U8sYY4YTCWXZANbaaTXsnwXcAyxyHrPYWru0lvXcYK19port/ay1r9bmGKCWQRERV/zwww/06NGDzZs38/bbbysIxlF2djYLFiygV69e/OEPf+CJJ55wuyRpoYwx44B11tq5TgjsaIwZsI/9s4B3rLUjrLVznc331Pb5rLXPGGP6O2sUR485ljp2E6tlMI7UMigiVVm7di3nnXceBQUFvP3225x22mlul5QQysrKGDRoEK+++ipPPfUUt9xyi9slSTNTU8ugMWaXtbZtzO3ewAhrbZ9q9s8FlsS2Hhpjsqy1efWosSvQwVo7r9aPURiMH4VBEans+++/5+yzz6akpIQFCxaQk5PjdkkJJRAIcOmll/KPf/yDqVOncuONN7pdkjQj+wqDxpgcIq18bSttW2KtrfJCYGOMBTpaa9fFpeBa8rn55CIiieSnn36id+/eFBcX8/7773PiiSe6XVLCSUpKYvbs2QwYMICbbroJn8/H4MGD3S5LWoZsYGelbXlQdWufMaaD82MHJzRmA1nW2vFxr7QSXTMoItIItm/fTp8+ffj555956623FARdlJyczJw5c7jwwgsZMmQIM2fOdLskaRmycAaNxIiGw8rbAaJhkJhrDKPXHTYqhUERkTgrKCigb9++rFu3jn/+85+6RrAJSElJYd68efTo0YPrrruOBQsWuF2SNA8+Y8zimD9DYu6r6jq/aAis3GIYu21xzLaFwPAGqLNOFAZFROLI7/fzu9/9jhUrVjB37lx69uzpdkniSE1N5R//+AfHHnss/fr1Y8mSJW6XJE1f0JnXL/ondtqYney98kcWQDUDQvKquK+8W7kBa66RwqCISJxYaxk8eDDvvfcezz//PBdddJHbJUklmZmZzJ8/n3bt2vGb3/yG1atXu12SNFPO3ICVQ182kda+qvZfR2TlkA4xm/cVHuNGA0hEROLkoYce4qWXXuLPf/4zV111ldvlSDUOOeQQ3n77bX7961/Tt29fPvvsM9q3b+92WdI8TTPGDIiZM7APMauBOMEvJ+b+MUBvINrCeBkwoqoDG2OGUfW1h7Wxw1o7obo7NbVMHGlqGZHE9be//Y3rrruO3//+9zz77LNaYq4Z+PTTT+nZsyfdu3fnP//5D8nJyW6XJE1MHVcg6QDkVZpDcAgwMHbeQWf/ctWNJjbGZNandmttfrU1KwzGj8KgSGJ6//336dOnDz169GD+/PkkJSW5XZLU0syZM7nyyiu5/vrreeaZZxTipYLahMHmSN3EIiIN6IcffmDgwIEcc8wxzJ07V0GwmRk0aBDffPMNo0eP5vjjj+fOO+90uySRuFPLYBypZVAksRQXF3PWWWexdu1aPv/8czp16uR2SbIfwuEwAwcO5B//+Af/+te/tG60lGupLYMaTSwi0gCstQwZMoTly5czc+ZMBcFmzOPx8OKLL9KlSxcGDRrE999/73ZJInGlMCgi0gAmTZrEyy+/zMMPP6wpZFqAjIwMXn31VQD69+9PSUmJyxWJxI/CoIhIPX3wwQcMGzaMSy65hHvvvdftcqSBdOjQgZdeeolly5Zx2223uV2OSNwoDIqI1MP27du54oorOProo3nhhRfwePS12pJcfPHFjBw5kmeffZZnn33W7XJEasUYc3Jd9te3lojIfgqHw1xzzTVs27aNV155hTZt2rhdksTBQw89RK9evbjllltYvny52+WI1Ebvuuys0cRxpNHEIi3buHHjuPvuu5k8eTI333yz2+VIHG3bto2TTjqJzMxMFi9eTEZGixtQKrXg9mhiY8xYoDaTT19qrW1X2+OqZVBEZD989NFHjBw5koEDB3LTTTe5XY7E2QEHHMBLL73EqlWruOOOO9wuRxLXIqAjkF/Dn511OahaBuNILYMiLVN+fj4nnngiPp+PpUuXkplZr1WipBm55557GDt2LK+88goDBw50uxxpZG63DDo1DLPW/rW++8RSy6CISB3dfvvtbNq0iZdffllBMME8/PDDnHbaadxwww388MMPbpcjiWlpLfZZWJcDKgyKiNTB3LlzefHFFxk5ciTdu3d3uxxpZElJScyaNYtwOMxVV11FKBRyuyRJMNbad2qxz7K6HFNhUESkljZv3szQoUPp1q0bo0aNcrsccUmHDh2YMmUKH374IY899pjb5YjUm64ZjCNdMyjSclhrufDCC/nvf//LsmXLtNxcgrPW0r9/f958802WLl3Kcccd53ZJ0giawjWD8aCWQRGRWpg6dSpvvfUWEyZMUBAUjDE8/fTTtG7dmmuvvZZgMOh2SSL7TWFQRKQG3333HX/605/o27evppGRcgceeCBTp05l8eLFjB071u1yRPabuonjSN3EIs1fOBymZ8+efPnll3zzzTf84he/cLskaWKuuOIK5s6dy6JFizj55DqtAibNjLqJRUQS0NNPP80HH3zAY489piAoVXrqqado37491157LWVlZW6XIwnGGNOmqp/rQmFQRKQaGzZsYMSIEZx//vlce+21bpcjTVS7du145pln+OKLLxg9erTb5UjiGVfNz7WmMCgiUgVrLUOHDsVaS25uLsYYt0uSJuziiy/mqquuYuzYsXz99ddulyOJxVTzc60pDIqIVGHGjBm89dZbjBkzhqOOOsrtcqQZmDhxIm3atGHIkCGEw2G3y5HEYav5udYUBkVEKtm6dSt33HEHv/71r7nlllvcLkeaiQMOOICJEyfy8ccfk5ub63Y5kjjq3W2hMCgiUsntt99OUVER06dPx+PR16TU3tVXX03v3r25++672bRpk9vliNSKvuVERGK89dZbvPLKK4waNYrOnTu7XY40M9HJqP1+P7fddpvb5YjUisKgiIijpKSEW265hU6dOjFs2DC3y5FmqmPHjjz44IO89tprvPbaa26XI1IjhUEREceYMWNYt24dU6ZMISUlxe1ypBn7f//v/3HSSSdx6623UlBQ4HY5IvukMCgiQmTJuXHjxnHllVdy3nnnuV2ONHNJSUlMmzaNzZs38/DDD7tdjrRs9V5KTmFQRBKetZabb76ZtLQ0Hn30UbfL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eukl7rjjDgVBkSqMGTOGUCjEqFGj3C5Fmim1DMaRWgZF6sday7nnnsvXX3/NmjVryMzMdLskkSZp+PDhTJgwgaVLl3LyySe7XU6LpZZBEZFG9tprr/Hf//6Xhx56SEFQZB/uvfdesrOzueuuu1Ajj9SVWgbjSC2DIvuvpKSE4447jlatWrFs2TJ8Pp/bJYk0aU8++SS33347b7zxBr/97W/dLqdFaqktgwqDcaQwKLL/HnnkEe677z7eeecdzjvvPLfLEWnyAoEAJ554IsFgkK+++oqUlBS3S2pxWmoYVDexiDQ5GzduZMyYMfTr109BUKSWkpKSePzxx1mzZg2PPfaY2+VIM6KWwThSy6DI/hk0aBCvvvoqK1eu5Oijj3a7HJFm5Xe/+x0LFy5k1apVmmqmgallUESkEXz44YfMmjWL4cOHKwiK7IeJEycSDAYZMWKE26VIM6GWwThSy6BI3YRCIbp168a2bdv49ttvychocf8BF2kU9913H4888ggffPABZ511ltvltBhqGRQRibPnnnuOZcuW8de//lVBUKQe7r77bg477DBuu+02QqGQ2+VIE6cwKCJNQl5eHiNHjuTss8/msssuc7sckWYtIyODCRMmsHz5cqZPn+52OdLEqZs4jtRNLFJ7d955J48//jhLliyha9eubpcj0uxZa+nZsydff/013333HdnZ2W6X1Oypm1hEJE6WLVvGE088wdChQxUERRqIMYYnnniCXbt2cf/997tdjjRhahmMI7UMitQsFApx5plnsn79elatWkVWVpbbJYm0KLfeeitTp07l888/55RTTnG7nGatpbYMKgzGkcKgSM2efvppbrrpJmbMmMGVV17pdjkiLU5eXh7HHnsshxxyCJ999pmWdqyH2oRBY8xwYB2QDWCtnVaL/QG6AYusteMbota6UBiMI4VBkX3bunUrnTt3Jicnh4ULF2KMcbskkRZp9uzZXH755UyaNIk//vGPbpfTbNUUBo0x44gEurlV3a5i/1xr7dCY20uA2Y0dCHXNoIi45k9/+hNFRUVMnjxZQVAkji699FL69u3LqFGj2Lhxo9vltGRDKgW/BcDQqnY0xmQBeZU25wL3xKm2aikMiogr3n33XWbMmMGIESPo3Lmz2+WItGjGGCZPnkwwGFTLYJwYY3Kq2LwT6F3NQ7KB4caYDpW2N/qF0wqDItLoysrKuPnmm+nQoQP33nuv2+WIJIQOHTpw//338+qrr/LPf/7T7XJaomwi4S9WHpS3AlZgrV0HnOL8HdUHWBi3CquhMCgije6RRx5h1apVTJ48mbS0NLfLEUkYd911F8cffzy33noruqZ9v/iMMYtj/gyJuS8LZ9BIjGg4rHKSR2vt0ujPTmDsTTXdyvGkMCgijWrFihWMHTuWq6++mr59+7pdjkhCSU5OJjc3lw0bNjBq1Ci3y2mOgtbaU2P+xI4Urnz9H+wJgZVbDKsyB+hVqaWwUWg0cRxpNLFIRcFgkNNPP52NGzfyzTff0K5dO7dLEklIt9xyC1OnTuWDDz7g17/+tdvlNBv7Gk3sXDO4xFpr9rWtmseOAxZYaxu9ixjUMigijWjChAksXbqUKVOmKAiKuGjcuHEceeSR/P73v6ekpMTtcloEp8u3cutgNjVcA2iMGUBMEKxmIEpcKQyKSKP49ttvefDBB+nfvz/9+/d3uxyRhNaqVSueffZZVq9ezX333ed2OS3JNCfcRfUhMl0MAMaYDrH3G2N6EwmMi40xWc7I4ssardpoHeomjh91E4tEBINBzjnnHFatWsXXX3/NwQcf7HZJIgLcdNNN5Obm8tFHH3HGGWe4XU6TV8cVSDoAebHXFToDTgZaa/s4A0Z2VXGIudbagQ1Zd00UBuNIYVAkYvTo0YwaNYqXX36ZQYMGuV2OiDgKCws54YQTSEtLY9myZRrdX4OWujaxuolFJK4WL17Mgw8+yOWXX64gKNLEtG7dmueee45Vq1YxfPjwmh8gLZJaBuNILYOS6IqLi8nJyaGoqIgvvviCtm3bul2SiFThrrvuYuLEifz73//mwgsvdLucJqultgwqDMaRwqAkultvvZXJkyezcOFCevXq5XY5IlKNsrIyTjvtNLZs2cIXX3zBQQcd5HZJTVJLDYPqJhaRuJg/fz6TJ0/mzjvvVBAUaeJSUlKYOXMmBQUF/OEPf0ANRYlFYVBEGtzGjRu5+uqr6dKlC3/5y1/cLkdEauH4449nwoQJvPnmm0yePNntcqQRqZs4jtRNLIkoEAhw7rnnsmLFChYvXkynTp3cLklEaslay29/+1sWLFjARx99xKmnnup2SU2KuolFRGph1KhRfPTRR0ybNk1BUKSZMcbwt7/9jYMPPpgBAwawY8cOt0uSRqAwKCIN5l//+hfjx4/nxhtv5IorrnC7HBHZD+3atWPu3Lls3ryZq6++mnA47HZJEmcKgyLSIL7//nuuvfZaunbtymOPPeZ2OSJSD926dWPSpEnMnz9f1/0mAF0zGEe6ZlASRWFhIWeeeSabNm3i888/55hjjnG7JBGpJ2stV111FbNmzWL+/PlccMEFbpfkupZ6zaDCYBwpDEoiCIfD9OvXj3/961+89dZb9O7d2+2SRKSBFBUVccYZZ7BhwwY++eQTjj32WLdLclVLDYPqJhaRernvvvt4/fXXeeyxxxQERVqYjIwM/vnPf5KSksLFF1/M9u3b3S5J4kBhUET226xZs/jLX/7CDTfcwK233up2OSISB0ceeSSvv/46mzZtol+/fpSVlbldkjQwhUER2S/vv/8+1113Heeccw5PPfUUxhi3SxKROOnevTvPP/88H3zwAUOHDtUKJS2Mz+0CRKT5Wb58Of/7v//LMcccw2uvvUZycrLbJYlInF1xxRWsWrWKhx56iEMOOUSjjFsQhUERqZO1a9fSt29fMjMzefvtt8nOzna7JBFpJA888ACbN29mzJgxtG3blmHDhrldkjQAhUERqbWtW7dywQUXEAgEeO+99zjssMPcLklEGpExhilTppCXl8fw4cNp27YtgwcPdrssqSeFQRGpla1bt3LeeeexefNm3nnnnYSfYkIkUXm9Xl566SUKCgoYMmQIbdq04dJLL3W7LKkHDSARkRpt3ryZnj17sn79ev7973/TvXt3t0sSERclJyczb948zjzzTAYNGsSsWbPcLknqQWFQRPbpp59+omfPnvz444/Mnz+fnj17ul2SiDQB6enpzJ8/n7POOosrr7yS5557zu2SZD8pDIpItX744Qd69uzJTz/9xFtvvcU555zjdkki0oS0bt2aN998kz59+nD99dczefJkt0uS/aAwKCJVWr58OWeccQbbtm3j7bff5qyzznK7JBFpgtLT03njjTf4n//5H2699Vb+/Oc/ax7CZkZhUET2snDhQs455xy8Xi8ffvghZ555ptsliUgTlpKSwty5c7nmmmu4//77ufbaa7VSSTOiMCgi5ay1TJ48md/85jcceeSRfPLJJxx//PFulyUizUBSUhIvvPACf/7zn3nppZc4//zz2bFjh9tlSS0oDIoIAGVlZQwZMoRbb72VCy64gA8//FDzCIpInRhj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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fb74c1613c8>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "wOnn5JBv6W5B",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"log_ratio = Sequential([\n",
" Dense(16, input_dim=1, activation='relu'),\n",
" Dense(32, activation='relu'),\n",
" Dense(1),\n",
"])"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "TrcxCb166W5F",
"colab_type": "code",
"colab": {},
"outputId": "bc1437ca-cac1-4a64-ac0c-f23f25995cf9"
},
"cell_type": "code",
"source": [
"SVG(model_to_dot(log_ratio, show_layer_names=False, show_shapes=True)\n",
" .create(prog='dot', format='svg'))"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"image/svg+xml": "<svg height=\"294pt\" viewBox=\"0.00 0.00 189.00 294.00\" width=\"189pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 290)\">\n<title>G</title>\n<polygon fill=\"white\" points=\"-4,4 -4,-290 185,-290 185,4 -4,4\" stroke=\"none\"/>\n<!-- 140425234187656 -->\n<g class=\"node\" id=\"node1\"><title>140425234187656</title>\n<polygon fill=\"none\" points=\"0,-166.5 0,-212.5 181,-212.5 181,-166.5 0,-166.5\" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"25\" y=\"-185.8\">Dense</text>\n<polyline fill=\"none\" points=\"50,-166.5 50,-212.5 \" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"77.5\" y=\"-197.3\">input:</text>\n<polyline fill=\"none\" points=\"50,-189.5 105,-189.5 \" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"77.5\" y=\"-174.3\">output:</text>\n<polyline fill=\"none\" points=\"105,-166.5 105,-212.5 \" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"143\" y=\"-197.3\">(None, 1)</text>\n<polyline fill=\"none\" points=\"105,-189.5 181,-189.5 \" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"143\" y=\"-174.3\">(None, 16)</text>\n</g>\n<!-- 140425237803248 -->\n<g class=\"node\" id=\"node2\"><title>140425237803248</title>\n<polygon fill=\"none\" points=\"0,-83.5 0,-129.5 181,-129.5 181,-83.5 0,-83.5\" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"25\" y=\"-102.8\">Dense</text>\n<polyline fill=\"none\" points=\"50,-83.5 50,-129.5 \" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"77.5\" y=\"-114.3\">input:</text>\n<polyline fill=\"none\" points=\"50,-106.5 105,-106.5 \" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"77.5\" y=\"-91.3\">output:</text>\n<polyline fill=\"none\" points=\"105,-83.5 105,-129.5 \" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"143\" y=\"-114.3\">(None, 16)</text>\n<polyline fill=\"none\" points=\"105,-106.5 181,-106.5 \" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"143\" y=\"-91.3\">(None, 32)</text>\n</g>\n<!-- 140425234187656&#45;&gt;140425237803248 -->\n<g class=\"edge\" id=\"edge2\"><title>140425234187656-&gt;140425237803248</title>\n<path d=\"M90.5,-166.366C90.5,-158.152 90.5,-148.658 90.5,-139.725\" fill=\"none\" stroke=\"black\"/>\n<polygon fill=\"black\" points=\"94.0001,-139.607 90.5,-129.607 87.0001,-139.607 94.0001,-139.607\" stroke=\"black\"/>\n</g>\n<!-- 140425231818144 -->\n<g class=\"node\" id=\"node3\"><title>140425231818144</title>\n<polygon fill=\"none\" points=\"0,-0.5 0,-46.5 181,-46.5 181,-0.5 0,-0.5\" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"25\" y=\"-19.8\">Dense</text>\n<polyline fill=\"none\" points=\"50,-0.5 50,-46.5 \" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"77.5\" y=\"-31.3\">input:</text>\n<polyline fill=\"none\" points=\"50,-23.5 105,-23.5 \" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"77.5\" y=\"-8.3\">output:</text>\n<polyline fill=\"none\" points=\"105,-0.5 105,-46.5 \" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"143\" y=\"-31.3\">(None, 32)</text>\n<polyline fill=\"none\" points=\"105,-23.5 181,-23.5 \" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"143\" y=\"-8.3\">(None, 1)</text>\n</g>\n<!-- 140425237803248&#45;&gt;140425231818144 -->\n<g class=\"edge\" id=\"edge3\"><title>140425237803248-&gt;140425231818144</title>\n<path d=\"M90.5,-83.3664C90.5,-75.1516 90.5,-65.6579 90.5,-56.7252\" fill=\"none\" stroke=\"black\"/>\n<polygon fill=\"black\" points=\"94.0001,-56.6068 90.5,-46.6068 87.0001,-56.6069 94.0001,-56.6068\" stroke=\"black\"/>\n</g>\n<!-- 140425231697512 -->\n<g class=\"node\" id=\"node4\"><title>140425231697512</title>\n<polygon fill=\"none\" points=\"31.5,-249.5 31.5,-285.5 149.5,-285.5 149.5,-249.5 31.5,-249.5\" stroke=\"black\"/>\n<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"90.5\" y=\"-263.8\">140425231697512</text>\n</g>\n<!-- 140425231697512&#45;&gt;140425234187656 -->\n<g class=\"edge\" id=\"edge1\"><title>140425231697512-&gt;140425234187656</title>\n<path d=\"M90.5,-249.254C90.5,-241.363 90.5,-231.749 90.5,-222.602\" fill=\"none\" stroke=\"black\"/>\n<polygon fill=\"black\" points=\"94.0001,-222.591 90.5,-212.591 87.0001,-222.591 94.0001,-222.591\" stroke=\"black\"/>\n</g>\n</g>\n</svg>",
"text/plain": [
"<IPython.core.display.SVG object>"
]
},
"metadata": {
"tags": []
},
"execution_count": 35
}
]
},
{
"metadata": {
"id": "Uh72dB7j6W5M",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"plot_model(model=log_ratio, \n",
" show_layer_names=False, \n",
" show_shapes=True,\n",
" to_file='log_ratio_architecture.svg')"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "5u-FOFmD6W5S",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"x_p = Input(tensor=p_samples)\n",
"x_q = Input(tensor=q_samples)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "yAhingUC6W5U",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"log_ratio_p = log_ratio(x_p)\n",
"log_ratio_q = log_ratio(x_q)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "l617Cfun6W5W",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"def _binary_crossentropy(log_ratio_p, log_ratio_q):\n",
"\n",
" loss_p = tf.nn.sigmoid_cross_entropy_with_logits(\n",
" logits=log_ratio_p,\n",
" labels=tf.ones_like(log_ratio_p)\n",
" )\n",
"\n",
" loss_q = tf.nn.sigmoid_cross_entropy_with_logits(\n",
" logits=log_ratio_q,\n",
" labels=tf.zeros_like(log_ratio_q)\n",
" )\n",
"\n",
" return tf.reduce_mean(loss_p + loss_q)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "gNpA8LM16W5X",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"m = Model(inputs=[x_p, x_q], outputs=[log_ratio_p, log_ratio_q])\n",
"m.add_loss(_binary_crossentropy(log_ratio_p, log_ratio_q))\n",
"m.compile(optimizer='rmsprop', loss=None)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"scrolled": false,
"id": "1TZgr7616W5Z",
"colab_type": "code",
"colab": {},
"outputId": "eb64a67d-4479-4b8c-da73-888afa13538d"
},
"cell_type": "code",
"source": [
"m.evaluate(x=None, steps=1)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"\r1/1 [==============================] - 0s 215ms/step\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"1.357100009918213"
]
},
"metadata": {
"tags": []
},
"execution_count": 41
}
]
},
{
"metadata": {
"id": "bKaBK0Pi6W5b",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"class PredictionHistory(Callback):\n",
" \n",
" def __init__(self):\n",
"\n",
" self.predictions = []\n",
"\n",
" def on_epoch_begin(self, epoch, logs):\n",
"\n",
" self.predictions.append(log_ratio(xs).eval())"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "CyfIoRBn6W5c",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"hist_pred = PredictionHistory()"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "_FrIwbo56W5f",
"colab_type": "code",
"colab": {},
"outputId": "979d9091-eaf6-4756-eca9-f9e1fed15371"
},
"cell_type": "code",
"source": [
"hist = m.fit(x=None, y=None, steps_per_epoch=1, epochs=500, callbacks=[hist_pred])"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Epoch 1/500\n",
"1/1 [==============================] - 0s 78ms/step - loss: 1.3547\n",
"Epoch 2/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.3460\n",
"Epoch 3/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.3390\n",
"Epoch 4/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.3300\n",
"Epoch 5/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.3306\n",
"Epoch 6/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.3242\n",
"Epoch 7/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.3223\n",
"Epoch 8/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.3107\n",
"Epoch 9/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.3164\n",
"Epoch 10/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.3135\n",
"Epoch 11/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.3016\n",
"Epoch 12/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.3139\n",
"Epoch 13/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.3022\n",
"Epoch 14/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2897\n",
"Epoch 15/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.3050\n",
"Epoch 16/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2794\n",
"Epoch 17/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.2887\n",
"Epoch 18/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2726\n",
"Epoch 19/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.2929\n",
"Epoch 20/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2859\n",
"Epoch 21/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2723\n",
"Epoch 22/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.2709\n",
"Epoch 23/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2625\n",
"Epoch 24/500\n",
"1/1 [==============================] - 0s 6ms/step - loss: 1.2750\n",
"Epoch 25/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2670\n",
"Epoch 26/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2737\n",
"Epoch 27/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2670\n",
"Epoch 28/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.2604\n",
"Epoch 29/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2756\n",
"Epoch 30/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2676\n",
"Epoch 31/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2592\n",
"Epoch 32/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2664\n",
"Epoch 33/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2358\n",
"Epoch 34/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2418\n",
"Epoch 35/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2485\n",
"Epoch 36/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2721\n",
"Epoch 37/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2340\n",
"Epoch 38/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2369\n",
"Epoch 39/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2338\n",
"Epoch 40/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.2654\n",
"Epoch 41/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2360\n",
"Epoch 42/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.2713\n",
"Epoch 43/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2334\n",
"Epoch 44/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2228\n",
"Epoch 45/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.2348\n",
"Epoch 46/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2412\n",
"Epoch 47/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2259\n",
"Epoch 48/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2501\n",
"Epoch 49/500\n",
"1/1 [==============================] - 0s 6ms/step - loss: 1.2071\n",
"Epoch 50/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2374\n",
"Epoch 51/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2404\n",
"Epoch 52/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2025\n",
"Epoch 53/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.2036\n",
"Epoch 54/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.2334\n",
"Epoch 55/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.2147\n",
"Epoch 56/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.1970\n",
"Epoch 57/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1975\n",
"Epoch 58/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2216\n",
"Epoch 59/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2305\n",
"Epoch 60/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1782\n",
"Epoch 61/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1606\n",
"Epoch 62/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1953\n",
"Epoch 63/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2164\n",
"Epoch 64/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1865\n",
"Epoch 65/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1901\n",
"Epoch 66/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2187\n",
"Epoch 67/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.2146\n",
"Epoch 68/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2216\n",
"Epoch 69/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1946\n",
"Epoch 70/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2014\n",
"Epoch 71/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1830\n",
"Epoch 72/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1722\n",
"Epoch 73/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1928\n",
"Epoch 74/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1795\n",
"Epoch 75/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.2153\n",
"Epoch 76/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2065\n",
"Epoch 77/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1707\n",
"Epoch 78/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1800\n",
"Epoch 79/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2096\n",
"Epoch 80/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1687\n",
"Epoch 81/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1694\n",
"Epoch 82/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1646\n",
"Epoch 83/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1935\n",
"Epoch 84/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1924\n",
"Epoch 85/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1366\n",
"Epoch 86/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1485\n",
"Epoch 87/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1835\n",
"Epoch 88/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.2216\n",
"Epoch 89/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1867\n",
"Epoch 90/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1574\n",
"Epoch 91/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1759\n",
"Epoch 92/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1688\n",
"Epoch 93/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1557\n",
"Epoch 94/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1603\n",
"Epoch 95/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1322\n",
"Epoch 96/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1703\n",
"Epoch 97/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1983\n",
"Epoch 98/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1644\n",
"Epoch 99/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2133\n",
"Epoch 100/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1384\n",
"Epoch 101/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2194\n",
"Epoch 102/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1253\n",
"Epoch 103/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1637\n",
"Epoch 104/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1504\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"Epoch 105/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1397\n",
"Epoch 106/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1793\n",
"Epoch 107/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1838\n",
"Epoch 108/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1497\n",
"Epoch 109/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1473\n",
"Epoch 110/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1939\n",
"Epoch 111/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1742\n",
"Epoch 112/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1274\n",
"Epoch 113/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1267\n",
"Epoch 114/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1457\n",
"Epoch 115/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1577\n",
"Epoch 116/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1902\n",
"Epoch 117/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1752\n",
"Epoch 118/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1467\n",
"Epoch 119/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1256\n",
"Epoch 120/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1485\n",
"Epoch 121/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1566\n",
"Epoch 122/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.1587\n",
"Epoch 123/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1645\n",
"Epoch 124/500\n",
"1/1 [==============================] - 0s 7ms/step - loss: 1.1009\n",
"Epoch 125/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1594\n",
"Epoch 126/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1156\n",
"Epoch 127/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1314\n",
"Epoch 128/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1711\n",
"Epoch 129/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1790\n",
"Epoch 130/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0907\n",
"Epoch 131/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1418\n",
"Epoch 132/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1301\n",
"Epoch 133/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1643\n",
"Epoch 134/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1933\n",
"Epoch 135/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1461\n",
"Epoch 136/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1433\n",
"Epoch 137/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1015\n",
"Epoch 138/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1041\n",
"Epoch 139/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1560\n",
"Epoch 140/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1883\n",
"Epoch 141/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2050\n",
"Epoch 142/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.1162\n",
"Epoch 143/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1824\n",
"Epoch 144/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1590\n",
"Epoch 145/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1451\n",
"Epoch 146/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1244\n",
"Epoch 147/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1455\n",
"Epoch 148/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1605\n",
"Epoch 149/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1436\n",
"Epoch 150/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.1052\n",
"Epoch 151/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1889\n",
"Epoch 152/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1468\n",
"Epoch 153/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1207\n",
"Epoch 154/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1387\n",
"Epoch 155/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1440\n",
"Epoch 156/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1285\n",
"Epoch 157/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1322\n",
"Epoch 158/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1686\n",
"Epoch 159/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1082\n",
"Epoch 160/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1193\n",
"Epoch 161/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1170\n",
"Epoch 162/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0906\n",
"Epoch 163/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1226\n",
"Epoch 164/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1168\n",
"Epoch 165/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1458\n",
"Epoch 166/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1079\n",
"Epoch 167/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1473\n",
"Epoch 168/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1395\n",
"Epoch 169/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1001\n",
"Epoch 170/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1406\n",
"Epoch 171/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1413\n",
"Epoch 172/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1945\n",
"Epoch 173/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1741\n",
"Epoch 174/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1820\n",
"Epoch 175/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1532\n",
"Epoch 176/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1065\n",
"Epoch 177/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1668\n",
"Epoch 178/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1677\n",
"Epoch 179/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1770\n",
"Epoch 180/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1358\n",
"Epoch 181/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1191\n",
"Epoch 182/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1369\n",
"Epoch 183/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0827\n",
"Epoch 184/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1403\n",
"Epoch 185/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1302\n",
"Epoch 186/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1276\n",
"Epoch 187/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0572\n",
"Epoch 188/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1506\n",
"Epoch 189/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1693\n",
"Epoch 190/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1636\n",
"Epoch 191/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1681\n",
"Epoch 192/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1847\n",
"Epoch 193/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1172\n",
"Epoch 194/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.0903\n",
"Epoch 195/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1467\n",
"Epoch 196/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1915\n",
"Epoch 197/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1233\n",
"Epoch 198/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.1444\n",
"Epoch 199/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1244\n",
"Epoch 200/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1073\n",
"Epoch 201/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1477\n",
"Epoch 202/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1400\n",
"Epoch 203/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1375\n",
"Epoch 204/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1764\n",
"Epoch 205/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1482\n",
"Epoch 206/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1569\n",
"Epoch 207/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1653\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"Epoch 208/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1214\n",
"Epoch 209/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1719\n",
"Epoch 210/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0741\n",
"Epoch 211/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2381\n",
"Epoch 212/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1877\n",
"Epoch 213/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1771\n",
"Epoch 214/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1602\n",
"Epoch 215/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1639\n",
"Epoch 216/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1249\n",
"Epoch 217/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1204\n",
"Epoch 218/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1316\n",
"Epoch 219/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1622\n",
"Epoch 220/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1240\n",
"Epoch 221/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1383\n",
"Epoch 222/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1638\n",
"Epoch 223/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1595\n",
"Epoch 224/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1365\n",
"Epoch 225/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1415\n",
"Epoch 226/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1402\n",
"Epoch 227/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1849\n",
"Epoch 228/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1542\n",
"Epoch 229/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1331\n",
"Epoch 230/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1294\n",
"Epoch 231/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1242\n",
"Epoch 232/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1051\n",
"Epoch 233/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1470\n",
"Epoch 234/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1089\n",
"Epoch 235/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1449\n",
"Epoch 236/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1554\n",
"Epoch 237/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1286\n",
"Epoch 238/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.1090\n",
"Epoch 239/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1416\n",
"Epoch 240/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1854\n",
"Epoch 241/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1619\n",
"Epoch 242/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1685\n",
"Epoch 243/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1408\n",
"Epoch 244/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1357\n",
"Epoch 245/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1459\n",
"Epoch 246/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1512\n",
"Epoch 247/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1122\n",
"Epoch 248/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1016\n",
"Epoch 249/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1262\n",
"Epoch 250/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1171\n",
"Epoch 251/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1707\n",
"Epoch 252/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1563\n",
"Epoch 253/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1879\n",
"Epoch 254/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1321\n",
"Epoch 255/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1847\n",
"Epoch 256/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1781\n",
"Epoch 257/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1498\n",
"Epoch 258/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1691\n",
"Epoch 259/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1407\n",
"Epoch 260/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1408\n",
"Epoch 261/500\n",
"1/1 [==============================] - 0s 6ms/step - loss: 1.1225\n",
"Epoch 262/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1126\n",
"Epoch 263/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1074\n",
"Epoch 264/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1120\n",
"Epoch 265/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1475\n",
"Epoch 266/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1317\n",
"Epoch 267/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1321\n",
"Epoch 268/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1805\n",
"Epoch 269/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2043\n",
"Epoch 270/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1156\n",
"Epoch 271/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1039\n",
"Epoch 272/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1607\n",
"Epoch 273/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1498\n",
"Epoch 274/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1112\n",
"Epoch 275/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1329\n",
"Epoch 276/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1721\n",
"Epoch 277/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1291\n",
"Epoch 278/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1047\n",
"Epoch 279/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1517\n",
"Epoch 280/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1282\n",
"Epoch 281/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1352\n",
"Epoch 282/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1290\n",
"Epoch 283/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1454\n",
"Epoch 284/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1212\n",
"Epoch 285/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0813\n",
"Epoch 286/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1313\n",
"Epoch 287/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1241\n",
"Epoch 288/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1576\n",
"Epoch 289/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1249\n",
"Epoch 290/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1280\n",
"Epoch 291/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1179\n",
"Epoch 292/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1102\n",
"Epoch 293/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1253\n",
"Epoch 294/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1254\n",
"Epoch 295/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0861\n",
"Epoch 296/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1497\n",
"Epoch 297/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1680\n",
"Epoch 298/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1050\n",
"Epoch 299/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1490\n",
"Epoch 300/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1842\n",
"Epoch 301/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1177\n",
"Epoch 302/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1330\n",
"Epoch 303/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1542\n",
"Epoch 304/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1437\n",
"Epoch 305/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0965\n",
"Epoch 306/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1098\n",
"Epoch 307/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1247\n",
"Epoch 308/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1681\n",
"Epoch 309/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1352\n",
"Epoch 310/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1166\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"Epoch 311/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0795\n",
"Epoch 312/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1356\n",
"Epoch 313/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1719\n",
"Epoch 314/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1513\n",
"Epoch 315/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.0873\n",
"Epoch 316/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1608\n",
"Epoch 317/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1580\n",
"Epoch 318/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.1041\n",
"Epoch 319/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1493\n",
"Epoch 320/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.0978\n",
"Epoch 321/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1575\n",
"Epoch 322/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1235\n",
"Epoch 323/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1033\n",
"Epoch 324/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1534\n",
"Epoch 325/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1027\n",
"Epoch 326/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1538\n",
"Epoch 327/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0713\n",
"Epoch 328/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1587\n",
"Epoch 329/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1707\n",
"Epoch 330/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1006\n",
"Epoch 331/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1479\n",
"Epoch 332/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1738\n",
"Epoch 333/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1367\n",
"Epoch 334/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1428\n",
"Epoch 335/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1186\n",
"Epoch 336/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1553\n",
"Epoch 337/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1491\n",
"Epoch 338/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1307\n",
"Epoch 339/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1531\n",
"Epoch 340/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1380\n",
"Epoch 341/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1475\n",
"Epoch 342/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1588\n",
"Epoch 343/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0924\n",
"Epoch 344/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1319\n",
"Epoch 345/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1212\n",
"Epoch 346/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1306\n",
"Epoch 347/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1267\n",
"Epoch 348/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1256\n",
"Epoch 349/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1401\n",
"Epoch 350/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1088\n",
"Epoch 351/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1041\n",
"Epoch 352/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1147\n",
"Epoch 353/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1475\n",
"Epoch 354/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1130\n",
"Epoch 355/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1060\n",
"Epoch 356/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1754\n",
"Epoch 357/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0851\n",
"Epoch 358/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1048\n",
"Epoch 359/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0979\n",
"Epoch 360/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1038\n",
"Epoch 361/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1604\n",
"Epoch 362/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1555\n",
"Epoch 363/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1361\n",
"Epoch 364/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1746\n",
"Epoch 365/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1565\n",
"Epoch 366/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1007\n",
"Epoch 367/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1504\n",
"Epoch 368/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1433\n",
"Epoch 369/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1176\n",
"Epoch 370/500\n",
"1/1 [==============================] - 0s 6ms/step - loss: 1.1180\n",
"Epoch 371/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1098\n",
"Epoch 372/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2001\n",
"Epoch 373/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1439\n",
"Epoch 374/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0924\n",
"Epoch 375/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1063\n",
"Epoch 376/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0655\n",
"Epoch 377/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1417\n",
"Epoch 378/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1365\n",
"Epoch 379/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1812\n",
"Epoch 380/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1653\n",
"Epoch 381/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1221\n",
"Epoch 382/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1164\n",
"Epoch 383/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1361\n",
"Epoch 384/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1375\n",
"Epoch 385/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1531\n",
"Epoch 386/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1413\n",
"Epoch 387/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1669\n",
"Epoch 388/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1229\n",
"Epoch 389/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1733\n",
"Epoch 390/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1419\n",
"Epoch 391/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0995\n",
"Epoch 392/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1098\n",
"Epoch 393/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1390\n",
"Epoch 394/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1319\n",
"Epoch 395/500\n",
"1/1 [==============================] - 0s 7ms/step - loss: 1.1383\n",
"Epoch 396/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1808\n",
"Epoch 397/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1306\n",
"Epoch 398/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1374\n",
"Epoch 399/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1566\n",
"Epoch 400/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1467\n",
"Epoch 401/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1699\n",
"Epoch 402/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1170\n",
"Epoch 403/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1354\n",
"Epoch 404/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1411\n",
"Epoch 405/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1520\n",
"Epoch 406/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1222\n",
"Epoch 407/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1439\n",
"Epoch 408/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1857\n",
"Epoch 409/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1194\n",
"Epoch 410/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1197\n",
"Epoch 411/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1852\n",
"Epoch 412/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1630\n",
"Epoch 413/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1798\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"Epoch 414/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1267\n",
"Epoch 415/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1004\n",
"Epoch 416/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1560\n",
"Epoch 417/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1078\n",
"Epoch 418/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1266\n",
"Epoch 419/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1249\n",
"Epoch 420/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.0938\n",
"Epoch 421/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1103\n",
"Epoch 422/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1749\n",
"Epoch 423/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1478\n",
"Epoch 424/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1011\n",
"Epoch 425/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1179\n",
"Epoch 426/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1144\n",
"Epoch 427/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1441\n",
"Epoch 428/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1519\n",
"Epoch 429/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1769\n",
"Epoch 430/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1296\n",
"Epoch 431/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.0812\n",
"Epoch 432/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1588\n",
"Epoch 433/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1322\n",
"Epoch 434/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1385\n",
"Epoch 435/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1900\n",
"Epoch 436/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1394\n",
"Epoch 437/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1000\n",
"Epoch 438/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1510\n",
"Epoch 439/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1287\n",
"Epoch 440/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1229\n",
"Epoch 441/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1168\n",
"Epoch 442/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1420\n",
"Epoch 443/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1057\n",
"Epoch 444/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1518\n",
"Epoch 445/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1318\n",
"Epoch 446/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1301\n",
"Epoch 447/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1271\n",
"Epoch 448/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0820\n",
"Epoch 449/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1356\n",
"Epoch 450/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1175\n",
"Epoch 451/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1170\n",
"Epoch 452/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0989\n",
"Epoch 453/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1461\n",
"Epoch 454/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1439\n",
"Epoch 455/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1696\n",
"Epoch 456/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1609\n",
"Epoch 457/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1345\n",
"Epoch 458/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1206\n",
"Epoch 459/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1124\n",
"Epoch 460/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1601\n",
"Epoch 461/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0884\n",
"Epoch 462/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1766\n",
"Epoch 463/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1178\n",
"Epoch 464/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1629\n",
"Epoch 465/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1679\n",
"Epoch 466/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1528\n",
"Epoch 467/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1308\n",
"Epoch 468/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1568\n",
"Epoch 469/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1322\n",
"Epoch 470/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1845\n",
"Epoch 471/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1720\n",
"Epoch 472/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1746\n",
"Epoch 473/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1031\n",
"Epoch 474/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1126\n",
"Epoch 475/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.0892\n",
"Epoch 476/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1604\n",
"Epoch 477/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.0991\n",
"Epoch 478/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1176\n",
"Epoch 479/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1359\n",
"Epoch 480/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1451\n",
"Epoch 481/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1180\n",
"Epoch 482/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1422\n",
"Epoch 483/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1629\n",
"Epoch 484/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1107\n",
"Epoch 485/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1604\n",
"Epoch 486/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1261\n",
"Epoch 487/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1279\n",
"Epoch 488/500\n",
"1/1 [==============================] - 0s 3ms/step - loss: 1.1337\n",
"Epoch 489/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1208\n",
"Epoch 490/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1583\n",
"Epoch 491/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1372\n",
"Epoch 492/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.0727\n",
"Epoch 493/500\n",
"1/1 [==============================] - 0s 5ms/step - loss: 1.1226\n",
"Epoch 494/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1693\n",
"Epoch 495/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1455\n",
"Epoch 496/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1075\n",
"Epoch 497/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1110\n",
"Epoch 498/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1380\n",
"Epoch 499/500\n",
"1/1 [==============================] - 0s 4ms/step - loss: 1.1834\n",
"Epoch 500/500\n",
"1/1 [==============================] - 0s 6ms/step - loss: 1.0987\n"