{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "autoencoder.ipynb",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/gmihaila/machine_learning_toolbox/blob/master/autoencoder.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "metadata": {
        "id": "RImy6vgHvuLS",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "### Universal Autoencoder\n",
        "\n",
        "Materials: \n",
        "\n",
        "https://blog.keras.io/building-autoencoders-in-keras.html\n",
        "\n",
        "https://ramhiser.com/post/2018-05-14-autoencoders-with-keras/\n",
        "\n",
        "https://www.datacamp.com/community/tutorials/autoencoder-keras-tutorial\n",
        "\n",
        "![alt text](https://blog.keras.io/img/ae/autoencoder_schema.jpg)\n"
      ]
    },
    {
      "metadata": {
        "id": "iyenTzSTirW_",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "c16d883e-51cd-4d75-ae7c-b4e2124c084b"
      },
      "cell_type": "code",
      "source": [
        "from IPython.display import clear_output\n",
        "\n",
        "print(\"Install pydot\")\n",
        "!apt-get -qq install -y graphviz && pip install -q pydot\n",
        "clear_output()\n",
        "\n",
        "print(\"Downloading data...\")\n",
        "\n",
        "clear_output()\n",
        "\n",
        "!ls"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "sample_data\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "HaZfGbjrrdHS",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "from keras.models import Model\n",
        "from keras.layers import Input, Dense, Softmax\n",
        "from keras import optimizers\n",
        "from keras.utils.vis_utils import plot_model\n",
        "from IPython.display import Image\n",
        "\n",
        "\n",
        "\n",
        "\n",
        "encoding_dim = 300\n",
        "\n",
        "# input\n",
        "model_input = Input(shape=(2,), name='INPUT')\n",
        "# encoder layer\n",
        "encod = Dense(units=encoding_dim, activation='relu', name='ENCODER', use_bias=True, )(model_input)\n",
        "# decoder layer\n",
        "decode = Dense(units=2, activation='sigmoid', name='DECODER', use_bias=True, )(encod)\n",
        "\n",
        "# assemble model\n",
        "autoencoder = Model(model_input, decode)\n",
        "\n",
        "# Encoder model\n",
        "encoder = Model(model_input, encod)\n",
        "\n",
        "# Decoder model\n",
        "encoded_input = Input(shape=(encoding_dim,))\n",
        "# retrieve the last layer of the autoencoder model\n",
        "decoder_layer = autoencoder.layers[-1]\n",
        "# create the decoder model\n",
        "decoder = Model(encoded_input, decoder_layer(encoded_input))\n",
        "\n",
        "# compile model\n",
        "autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')\n",
        "\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "Kogc2-LfuI1K",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 312
        },
        "outputId": "4a6e8c99-9598-4464-b03e-d86c062ffbdf"
      },
      "cell_type": "code",
      "source": [
        "# image model\n",
        "plot_model(autoencoder, to_file='model.png', show_shapes=True, show_layer_names=True)\n",
        "Image('model.png')"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "image/png": "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\ngg==\n",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 6
        }
      ]
    },
    {
      "metadata": {
        "id": "RS0B815vvIDV",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "autoencoder.fit(x_train, x_train,\n",
        "                epochs=50,\n",
        "                batch_size=256,\n",
        "                shuffle=True,\n",
        "                validation_data=(x_test, x_test))"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "c3WIYWT2vJYi",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "# encode and decode some digits\n",
        "# note that we take them from the *test* set\n",
        "encoded_imgs = encoder.predict(x_test)\n",
        "decoded_imgs = decoder.predict(encoded_imgs)"
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}