{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Variational Auto-Encoder\n", "\n", "Work in progress." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n", "ConX, version 3.7.3\n" ] } ], "source": [ "import conx as cx\n", "import keras.backend as K" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need a function to use as the activation function for the Sampler layer:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "LENGTH = 5 # latent size" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def sampler(inputs):\n", " ## inputs is a merged concat\n", " mean, stddev = inputs[:, :LENGTH], inputs[:, LENGTH:]\n", " # we sample from the standard normal a matrix of batch_size * latent_size (taking into account minibatches)\n", " std_norm = K.random_normal(shape=(K.shape(mean)[0], LENGTH), mean=0, stddev=1)\n", " # sampling from Z~N(μ, σ^2) is the same as sampling from μ + σX, X~N(0,1)\n", " return mean + K.exp(stddev) * std_norm" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "CAPACITY = 5 # size of encoded bank\n", "BETA = 1.5\n", "\n", "def bvae_loss(tensor):\n", " print(\"HERE!\", tensor.shape)\n", " LENGTH = tensor.shape[1]\n", " if LENGTH == 10:\n", " mean, stddev = tensor[:,:LENGTH//2], tensor[:,LENGTH//2:]\n", " else:\n", " mean, stddev = tensor, tensor\n", " # kl divergence:\n", " latent_loss = -0.5 * K.mean(1 + stddev\n", " - K.square(mean)\n", " - K.exp(stddev), axis=-1)\n", " # use beta to force less usage of vector space:\n", " # also try to use dimensions of the space:\n", " latent_loss = BETA * K.abs(latent_loss - CAPACITY/LENGTH)\n", " return K.sum(latent_loss)\n", "\n", "def vae_loss(tensor):\n", " print(\"HERE!\", tensor.shape)\n", " LENGTH = tensor.shape[1]\n", " if LENGTH == 10:\n", " mean, stddev = tensor[:,:LENGTH//2], tensor[:,LENGTH//2:]\n", " else:\n", " mean, stddev = tensor, tensor\n", " # kl divergence:\n", " latent_loss = -0.5 * K.mean(1 + stddev\n", " - K.square(mean)\n", " - K.exp(stddev), axis=-1)\n", " return K.sum(latent_loss)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "net = cx.Network(\"vae\")\n", "net.add(cx.Layer(\"input\", 2),\n", " cx.Layer(\"mean\", LENGTH, activation=\"sigmoid\"),\n", " cx.Layer(\"stddev\", LENGTH, activation=\"sigmoid\"),\n", " cx.LambdaLayer(\"encode\", 5, sampler), # function, that takes input layer's output\n", " cx.Layer(\"output\", 1, activation=\"sigmoid\"));\n", "#net.additional_output_banks = [\"encode\"]" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "net.connect(\"input\", \"mean\")\n", "net.connect(\"input\", \"stddev\")\n", "net.connect(\"mean\", \"encode\")\n", "net.connect(\"stddev\", \"encode\")\n", "net.connect(\"encode\", \"output\")" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "net.build_model()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "HERE! (?, 5)\n" ] } ], "source": [ "net.add_loss(\"encode\", vae_loss)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "net.compile(loss=\"mse\", optimizer=\"adam\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To allow an additional error function, we need to declare \"encode\" (an internal bank) as an output:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And then we can provide a dictionary of error functions by name:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "\n", "require(['base/js/namespace'], function(Jupyter) {\n", " Jupyter.notebook.kernel.comm_manager.register_target('conx_svg_control', function(comm, msg) {\n", " comm.on_msg(function(msg) {\n", " console.log(\"received!\")\n", " console.log(msg)\n", " var data = msg[\"content\"][\"data\"];\n", " var images = document.getElementsByClassName(data[\"class\"]);\n", " for (var i = 0; i < images.length; i++) {\n", " if (data[\"xlink:href\"]) {\n", " var xlinkns=\"http://www.w3.org/1999/xlink\";\n", " images[i].setAttributeNS(xlinkns, \"href\", data[\"xlink:href\"]);\n", " }\n", " if (data[\"src\"]) {\n", " images[i].setAttributeNS(null, \"src\", data[\"src\"]);\n", " }\n", " }\n", " });\n", " });\n", "});\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " Layer: output (output)\n", " output range: (0, 1)\n", " shape = (1,)\n", " Keras class = Dense\n", " activation = sigmoidoutputWeights from encode to output\n", " output_2/kernel:0 has shape (5, 1)\n", " output_2/bias:0 has shape (1,)Layer: encode (hidden)\n", " output range: (-Infinity, +Infinity)\n", " shape = (5,)\n", " Keras class = Lambda\n", " function = <function sampler at 0x7f30c800bb70>encodeWeights from mean to encodeLayer: mean (hidden)\n", " output range: (0, 1)\n", " shape = (5,)\n", " Keras class = Dense\n", " activation = sigmoidmeanWeights from stddev to encodeLayer: stddev (hidden)\n", " output range: (0, 1)\n", " shape = (5,)\n", " Keras class = Dense\n", " activation = sigmoidstddevWeights from input to mean\n", " mean_2/kernel:0 has shape (2, 5)\n", " mean_2/bias:0 has shape (5,)Weights from input to stddev\n", " stddev_2/kernel:0 has shape (2, 5)\n", " stddev_2/bias:0 has shape (5,)Layer: input (input)\n", " output range: (-1, 1)\n", " shape = (2,)\n", " Keras class = Inputinputvae" ], "text/plain": [ "" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "net.picture([1,-1], hspace=200, scale=1.0)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "net.dataset.load([\n", " [[0, 0], [0]],\n", " [[0, 1], [1]],\n", " [[1, 0], [1]],\n", " [[1, 1], [0]],\n", "])" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "========================================================\n", "Testing validation dataset with tolerance 0.1...\n", "Total count: 4\n", " correct: 0\n", " incorrect: 4\n", "Total percentage correct: 0.0\n" ] } ], "source": [ "net.evaluate(show=True)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "vae Dataset:\n", "Patterns Shape Range \n", "=================================================================\n", "inputs (2,) (0.0, 1.0) \n", "targets (1,) (0.0, 1.0) \n", "=================================================================\n", "Total patterns: 4\n", " Training patterns: 4\n", " Testing patterns: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "net.dataset.summary()" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-0.5848038 , 0.86490923, -0.04118258, -0.6218531 , -2.0275912 ],\n", " [ 1.4013709 , -0.40050203, 2.3741612 , 0.33983442, 1.589536 ],\n", " [-1.9229012 , 3.6163 , 1.7998898 , 0.44848615, 1.546372 ],\n", " [ 2.0491967 , -2.4284263 , -0.8186321 , 1.8166237 , 0.07840455]],\n", " dtype=float32)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "net.propagate_to(\"encode\", net.dataset.inputs, sequence=True)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0.7198903 , 0.86922455, 2.8350933 , 3.4182205 , 1.9641373 ],\n", " [ 0.5212698 , 0.49677068, 2.7393699 , 0.24070835, 1.8382547 ],\n", " [ 1.5064052 , -0.4074353 , 0.6014143 , 0.78827447, -2.2850318 ],\n", " [-1.8501136 , 0.9037933 , 0.26733384, -0.2333259 , 1.3512714 ]],\n", " dtype=float32)" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "net.propagate_to(\"encode\", net.dataset.inputs, sequence=True)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0.9892443418502808]" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "net.propagate(net.dataset.inputs[0])" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.9027333 ],\n", " [0.8923163 ],\n", " [0.36847237],\n", " [0.4038974 ]], dtype=float32)" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "net.propagate(net.dataset._inputs[0], sequence=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "CAPACITY used to break input down to a set number of basis.\n", "\n", "BETA (> 1) used for latent regularizer." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#net.reset()" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "========================================================\n", " | Training | Training \n", "Epochs | Error | Accuracy \n", "------ | --------- | --------- \n", "#45000 | 3.95330 | 0.00000 \n" ] } ], "source": [ "net.train(epochs=30000, report_rate=100)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "net.plot_activation_map(to_layer=\"encode\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }