{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## autoencoder on MNIST\n", "Name:Mohammad Hosseinipour" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "import tensorflow.keras as keras\n", "from tensorflow.keras.datasets import mnist\n", "from tensorflow.keras import layers\n", "from tensorflow.keras import activations\n", "from tensorflow.keras.models import Model, Sequential\n", "from IPython import display\n", "import numpy as np\n", "from sklearn.model_selection import train_test_split\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "(x_train, y_train), (x_test, y_test) = mnist.load_data()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(60000, 28, 28) (10000, 28, 28)\n" ] } ], "source": [ "#[0, 255] to [0,1]\n", "x_train = x_train/255.0\n", "x_test = x_test/255.0\n", "print(x_train.shape,x_test.shape)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "x_test, x_validation,y_test, y_validation = train_test_split(x_test,y_test, test_size=0.33, random_state=42)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Creating the Encoder and Decoder.\n", "\n", "## first lets explain some entities:\n", "\n", "### Dropout():\n", "\n", "Dropout is a technique where randomly selected neurons are ignored during training. They are “dropped out” randomly. This means that their contribution to the activation of downstream neurons is temporally removed on the forward pass, and any weight updates are not applied to the neuron on the backward pass.\n", "\n", "### LeakyReLU():\n", "\n", "Leaky Rectified Linear Unit, or Leaky ReLU, is a type of activation function based on a ReLU, but it has a small slope for negative values instead of a flat slope. The slope coefficient is determined before training, i.e. it is not learnt during training. This type of activation function is popular in tasks where we we may suffer from sparse gradients, for example training generative adversarial networks.\n", "\n", "### Dense():\n", "\n", "It's the most basic layer in neural networks. A Dense layer feeds all outputs from the previous layer to all its neurons, each neuron providing one output to the next layer.\n", "\n", "### Letant Size:\n", "\n", "Latent size is the size of the latent space: the vector holding the information after compression. This value is a crucial hyperparameter. If this value is too small, there won’t be enough data for reconstruction and if the value is too large, overfitting can occur." ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "#input: 28*28=784\n", "# latent=64\n", "LATENT_SIZE=64\n", "encoder = Sequential([\n", " layers.Flatten(input_shape = (28, 28)),\n", " layers.Dense(512),\n", " layers.Activation(activations.relu),\n", " layers.Dense(256),\n", " layers.Activation(activations.relu),\n", " layers.Dense(128),\n", " layers.Activation(activations.relu),\n", " layers.Dense(LATENT_SIZE),\n", " layers.Activation(activations.relu)\n", "])\n", "decoder = Sequential([\n", " layers.Dense(128, input_shape = (LATENT_SIZE,)),\n", " layers.Activation(activations.relu),\n", " layers.Dense(256),\n", " layers.Activation(activations.relu),\n", " layers.Dense(512),\n", " layers.Activation(activations.relu),\n", " layers.Dense(784),\n", " layers.Activation(activations.sigmoid),\n", " layers.Reshape((28, 28))\n", "])" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "img = layers.Input(shape = (28, 28))\n", "latent_vector = encoder(img)\n", "output = decoder(latent_vector)\n", "model = Model(inputs = img, outputs = output)\n", "model.compile(\"nadam\", loss = \"binary_crossentropy\")" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/15\n", "235/235 [==============================] - 5s 17ms/step - loss: 0.2106 - val_loss: 0.1640\n", "Epoch 2/15\n", "235/235 [==============================] - 4s 16ms/step - loss: 0.1473 - val_loss: 0.1384\n", "Epoch 3/15\n", "235/235 [==============================] - 3s 15ms/step - loss: 0.1316 - val_loss: 0.1244\n", "Epoch 4/15\n", "235/235 [==============================] - 3s 15ms/step - loss: 0.1214 - val_loss: 0.1208\n", "Epoch 5/15\n", "235/235 [==============================] - 3s 15ms/step - loss: 0.1148 - val_loss: 0.1113\n", "Epoch 6/15\n", "235/235 [==============================] - 3s 15ms/step - loss: 0.1101 - val_loss: 0.1064\n", "Epoch 7/15\n", "235/235 [==============================] - 3s 14ms/step - loss: 0.1063 - val_loss: 0.1093\n", "Epoch 8/15\n", "235/235 [==============================] - 3s 15ms/step - loss: 0.1035 - val_loss: 0.1018\n", "Epoch 9/15\n", "235/235 [==============================] - 3s 14ms/step - loss: 0.1011 - val_loss: 0.1011\n", "Epoch 10/15\n", "235/235 [==============================] - 3s 14ms/step - loss: 0.0991 - val_loss: 0.0992\n", "Epoch 11/15\n", "235/235 [==============================] - 3s 14ms/step - loss: 0.0972 - val_loss: 0.0990\n", "Epoch 12/15\n", "235/235 [==============================] - 3s 15ms/step - loss: 0.0956 - val_loss: 0.0940\n", "Epoch 13/15\n", "235/235 [==============================] - 3s 15ms/step - loss: 0.0941 - val_loss: 0.0950\n", "Epoch 14/15\n", "235/235 [==============================] - 3s 15ms/step - loss: 0.0929 - val_loss: 0.0924\n", "Epoch 15/15\n", "235/235 [==============================] - 4s 15ms/step - loss: 0.0917 - val_loss: 0.0958\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.fit(x_train, x_train, epochs=15, batch_size=256,validation_data=(x_validation, x_validation))" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABFgAAAD7CAYAAABexCD2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA++0lEQVR4nO3debRUxbn+8adEUBQHEEREEFQ0YhxQVESMAyhq5KJJnI2YuIIafkHUGDHGKV6vioIiMYkkEkwcrgjGISZxwIGLIk7BGZmUSQYBFVSMEPfvD9qiqjx96HN2D9W9v5+1WLz7vE13rXMed/fZ7qoySZIIAAAAAAAAjbdRpQcAAAAAAABQ7bjAAgAAAAAAkBIXWAAAAAAAAFLiAgsAAAAAAEBKXGABAAAAAABIiQssAAAAAAAAKaW6wGKMOdoY864xZpYxZmixBgU0BnlELMgiYkEWEQuyiJiQR8SCLNYekyRJ4/6hMU0kzZB0pKQFkl6SdGqSJG8Xb3hAYcgjYkEWEQuyiFiQRcSEPCIWZLE2bZzi3x4gaVaSJHMkyRjzv5L6S8obCGNM467moBSWJUnSptKDKKIG5ZEsRoUsIhaZzmLuMeQxHrWUR7JY3WopixLv09Us01nMPYY8xqPOPKaZItRe0nzneEHua6gOcys9gCIjj9WLLCIWZBExqaU8ksXqVktZlMhjNSOLiEmdeUxzB0tBjDEDJQ0s9esAG0IWEQuyiJiQR8SCLCIWZBExIY/VJc0FloWSOjjHO+S+5kmSZLSk0RK3NKGkNphHsogyIYuIBe/TiAVZREx4n0YsODfWoDRThF6S1MUY09kY00zSKZIeLs6wgAYjj4gFWUQsyCJiQRYRE/KIWJDFGtToO1iSJFlrjPl/kh6T1ETSmCRJ3irayIAGII+IBVlELMgiYkEWERPyiFiQxdrU6G2aG/Vi3NIUk1eSJOle6UFUClmMCllELDKdRYk8RibTeSSLUSGLiEWmsyiRx8jUmcc0U4QAAAAAAAAgLrAAAAAAAACkxgUWAAAAAACAlLjAAgAAAAAAkFKjdxECAAAAAJTHfvvt5x1PnjzZ1n/5y1+83sCBA8syJgA+7mABAAAAAABIiQssAAAAAAAAKTFFCAAAROGCCy6w9YgRI7zelClTbL1gwQKvN378eFuPGzeuRKMDiuuxxx6zdZ8+fbze9ttvb+slS5aUbUyIW5cuXbzjTTbZxNYnnXSS1xs+fLit33333Ua/Zvfu3fM+z6pVqxr9vMiuDh06eMc/+clPvOMBAwbYumPHjl7vD3/4g61/9atfeb2lS5cWa4ipcAcLAAAAAABASlxgAQAAAAAASIkLLAAAAAAAACmxBksZXXLJJba+7rrrvN5BBx1k66lTp5ZtTACQT9OmTW3dq1cvr/faa6/Z+uKLL/Z6m2++uXfcuXNnW1955ZVe79VXX009TlSvcM0Adw2WkPs+GTrxxBNtfeCBB3q9iy66qJGjA0orSZI6a0k65phjbD127NhyDQlVbMstt/SODznkEFs3ZA2WrbbayjseM2aMrR9//HGv577/hxkGXJ06dbL1r3/9a693+umn5/13X331lXd89tln2/rNN9/0erfeemuKERYPd7AAAAAAAACkxAUWAAAAAACAlJgiVEZt27a1dXgbXbt27co9HAAZ1KxZM+94yJAhtt5hhx28XteuXW19xBFH5H1OY4x3XN9twuH0jWOPPdbWL7/8ct5/h9rhbs943333eT13K+abb77Z67n5dKcEhc954YUXer1wS+fweYFy2WmnnbzjfffdN+9j33777VIPBzXOzVuTJk283qabbuodu1N5//SnP3m9b3/723XWknTppZfaes2aNY0fLGpOeL5zt6UPe2vXrvWOp02bZusXX3zR651zzjm23nvvvdMOsyS4gwUAAAAAACAlLrAAAAAAAACkxAUWAAAAAACAlFiDpYzCbc8AoBz22WcfW1977bVez90KtD6ffPKJd+xuBxmuwfKf//zHO/78889t3bp1a683YsQIW3/nO98paCyoHeF6KYWujxJuvTx8+PC8z+lmTJLGjx9v6/nz5xf0ekAx/PSnP/WOW7Vqlfex77//folHg1o3dOhQW/fq1cvrbb755t5xt27dCnrO9957zzsOt9BFtm288fpLC+F7r7vuSrhej5tVSbrlllvyvsakSZNsPXHixMYMs+S4gwUAAAAAACAlLrAAAAAAAACkxBShHPc2+f/7v//zep9++mlRXuPwww/P21u2bFlRXgO1rX379rYOb5EPvfTSS7ZetGiR13MzXaytcXv06JH3OcPt11Bam2yyiXd844032rp3795eb+XKlbaeM2eO13vttddsPXLkSK/nbuno3hIqSatXr/aOt9tuO1uPHj263rGj9rnTcoq1ZbJ7PnS3bJa+uaWzuzX5hs6jQDG1adOm4Me604muuuqqEowG1ai+rb3rE04RaojZs2fbum/fvl4vnBKMbHOnAfXr1y/v45566invuL4pQaH777+/weMqN+5gAQAAAAAASIkLLAAAAAAAAClxgQUAAAAAACClzK7BEm6Z/OCDD9r69ttv93qDBw9u1GscddRR3nE4L9w1efLkRr0Gattmm23mHf/pT3+ydbiWRsjdOjdJEq/nzpmtb42hcPvd8HlcW2yxha3dLdQKGSuKKzzXuOvj3HvvvV7PXQOjIevxTJs2LW8v3HrUXcsFKDV3G2bpm2uwuNs4swYLSqlJkybecfPmzb3j8D3W9bvf/a4kY0J1O+igg0r+Gs8995x3fMYZZ9h67ty5JX99VK/+/fsX9LhRo0aVeCSVtcE7WIwxY4wxS40xbzpfa2WMecIYMzP3d8vSDhNYhzwiFmQRsSCLiAl5RCzIImJBFrOlkClCYyUdHXxtqKSJSZJ0kTQxdwyUw1iRR8RhrMgi4jBWZBHxGCvyiDiMFVlEHMaKLGbGBqcIJUkyyRjTKfhyf0mH5eo7JT0j6ZJiDqzUmjVr5h03bdrU1h07dizKaxxyyCHesXur6K233lqU18iaWs2ja6+99rL1k08+6fVat25t63Ar3AceeMA73n777W3drVs3r+dmceutt847loZMEXLHU9/jakXMWVy4cKF3PHTo+vfs2267reiv9+1vf9s7/uMf/+gdu9uLo/hizmIljBs3zju+7777KjSSbCKP6+2+++7e8fe+9z3vuL73yiy8j5Za1rPofoZcvnx5vY91z5OPPPKI12Mr5vSyksXw86Br8eLFtna3/q5FjV3ktm2SJIty9WJJbYs0HqAxyCNiQRYRC7KImJBHxIIsIhZksUalXuQ2SZLEGJP3MrsxZqCkgWlfByhEfXkkiygnsohY8D6NmHBuRCzIImLB+3RtaewdLEuMMe0kKff30nwPTJJkdJIk3ZMk6d7I1wI2pKA8kkWUAVlELHifRkw4NyIWZBGx4H26RjX2DpaHJQ2QdH3u74eKNqIyueQSf4qbO9c13J6sIbbbbjtbn3XWWXlfI9xGEqlUdR4PPPBA79id+7rNNtt4PXe72379+nm9BQsWFPyaLVq0sPV+++1X8L+rjzufsiFjqTFRZDFcn6ex66506tTJ1vvvv7/Xu/jii2294447er02bdo06vVQVFFksVTCrcgbsnXp/Pnziz0cbFhN5zGfK664otJDwDdVdRbHjBnjHR988MF5H3vDDTfY+qmnnvJ6rPETharOYl3c32/d7b0l/3fkMLczZszI+5zHHXecd/zjH/8472MHDRpk60WLFuV9XKkVsk3zvZKmSNrNGLPAGHO21gXhSGPMTEl9csdAyZFHxIIsIhZkETEhj4gFWUQsyGK2FLKL0Kl5Wr2LPBZgg8gjYkEWEQuyiJiQR8SCLCIWZDFbUi9yW03cqRgXXnih13NvlZs+fXqjX+Occ86xtbtNbvi84S387tbQ8+bNa/Trozrsvffetg5v22zevLmtP/zwQ683ZMgQW6eZhvPpp5/a+tlnn23086C2uXkbPHhw3sc1ZDvvUNu2beusJWnJkiUFPw9qn7v98oknnliU5wynGjF9CMX0/e9/3zuu79w4bNgw73jFihUlGROqW/jZb+HChbZu376913viiSdsff7553u9UaNGlWB0yDp3KYNwa3B32YMLLrjA67lbikvSpZdeauuTTz7Z62299da2vueee7zeypUrGzbgEmnsIrcAAAAAAADI4QILAAAAAABASlxgAQAAAAAASMmUc5suY0xZ9wTbZZddvOOpU6faumXLll7P/T58+eWXXq++bZ7CtQe23XZbW2+66aYFj/Xpp5+2dZ8+fQr+dym8kuW91MudxdCIESNsHc6LdTMV/vfpZvONN97weuFc7ypaS4AsRiI8Zz7//PO2bt26dd5/F54Hw7VT9tlnH1sPHDjQ61111VW2/uijj7zeoYceaus333wz7+sXUaazKMWVx3COtnveLJbwPOluHRnBOTTTeYwpiw1x3nnn2fo3v/mN1wvf0+fOnWvrXr16eb1KbjFaB7IYqZ122snW7porktS5c2dbr1271utdd9113vHIkSNtHfn6P5nOohR3Hl39+vXzjh988MG8j33vvfe8Yze7IXfdFfd8K/lrTJZJnXnkDhYAAAAAAICUuMACAAAAAACQUk1v07zDDjt4x+62TmvWrPF6f/vb3/I+z5577mnrnXfe2evVtz1puN3z+PHjbT1nzhyvF24zhdp288032zrcVs/dTvzjjz/2em4W99tvP6939913e8ff+c530g4TGRNOa2zSpEnex9500022vvrqq71eeBv8559/butrr73W673wwgu2/uc//+n1Nt64pt+isAEHHXRQwY+dMmWKrW+55RavF55j3alH4TbN9913n6179uxZ8Osju8L3Yne75Y028v8/5ldffeUdz5w509aRTQlClXB/nzjyyCO9njslY4899vB6l19+uXfct29fWx9//PFeb/HixSlHiSx66qmnvOPJkyfbOpwSWeiUIMmfFlSBKUEF4Q4WAAAAAACAlLjAAgAAAAAAkBIXWAAAAAAAAFKq6Qnu4baed9xxh61///vfe71XX3017/O425OedtppXs/d1kzy59cOGTLE64XbpyG73O0/Tz755IL/nbsV89ixY71eOJ9x3333tXV9+Qa+Fp4zt9lmm6K/xn/+8x/v2F2rat68eV7vsMMOs/W0adOKPhbE7aSTTirJ8y5cuNDW7porkr/uS/j648aNK8l4UN3C9c6aN29u63DNlXB9qr///e+lGxgyJ1zfca+99rL18OHDvZ67FpUkHXDAAbaePXu21zv99NNtXd9Wu4Drs88+846XL1/eqOcJt7uPdd0VF3ewAAAAAAAApMQFFgAAAAAAgJS4wAIAAAAAAJCSCeeDlvTFjCnfi5XIqaee6h3ffffd3vFf/vIXWw8YMKAsY2qkV5Ik6V7pQVRKtWaxRYsWtp4xY4bXa9u2rXf84x//2NZ33nlnaQeWDlmEJOnyyy/3jn/4wx/a+uCDD/Z6H374YSmGkOksStnL4/PPP+8du2uwuGtlSVLHjh3LMiZHpvMYcxbd9ammTp3q9Tp16mRrY4zXe+qpp7zjU045xdaNXZ+gTMhilWvatKl33KdPH+/40ksvtXW4pp+75oW7HoskPfLII8UaYqEynUWpevL43e9+1zt2f0feaqutCn4e9/cZKbrfaerMI3ewAAAAAAAApMQFFgAAAAAAgJRqepvmYnFv9xwxYkS9jw1vNwaKqXv39XehtWzZst7HtmvXrtTDAYrq5Zdf9o6vvvpqW4e3k5ZoihAy5v777/eO3SlCHTp0KPdwUCVuueUWW7ufETckvLU98mlBqCFr1qzxjv/xj394x0888YSt3a3sJalNmza2PvHEE73e3/72N1uXc9kJxMk9H951111eb8stt2zUc/7gBz/wjiObIlQn7mABAAAAAABIiQssAAAAAAAAKXGBBQAAAAAAICXWYCmAu+7Ftttu6/Wee+4577ga5oWhNM4880zveJ999rH1ypUrvd4zzzxT0HOGW+Uddthhtm7WrFm9/zZcWwAA4AvXGgDqEn72cz8X1ufvf/+7dzx+/PiijQkoprVr19r68ccf93pnnHFGnbUknX322bYO13lB9ri/m9S35oq7ZbMk7bzzzt5xz549izuwMuMOFgAAAAAAgJS4wAIAAAAAAJASU4TqEG4HevPNN+d9bDgN44svvijJmBC/wYMHe8fdunXL+9jLL788b88YY+uGbHn3xz/+0TuePXt2wf8W2RGe39ztvpctW+b1Pv3007KM6WvhtrjueFavXl3WsaA8wp/5/Pnzy/r64faPLqZZZluTJk1sfdZZZ3m9XXfdtaDn6NevXzGHhCq3995723q33Xbzei+//LKtjzrqqIKf0/134fnzhBNOyPvv+vbt6x3vsssutu7atavXq++z6B577GHradOm1TtW1L6f/exneXvutvThFKFbbrmlVEOqCO5gAQAAAAAASGmDF1iMMR2MMU8bY942xrxljDk/9/VWxpgnjDEzc3+33NBzAWmQRcSEPCIWZBGxIIuICXlELMhithRyB8taSRclSdJVUg9Jg4wxXSUNlTQxSZIukibmjoFSIouICXlELMgiYkEWERPyiFiQxQzZ4BosSZIskrQoV68yxrwjqb2k/pIOyz3sTknPSLqkJKMssz59+njH7du3t/XUqVO93q233lqWMSH+LIbb2s2aNcvWxxxzjNfbYost8j6PuwbLV1995fXc7Z7D7F111VUFjxXpxZ7HfPbcc0/v+J577rH1DTfc4PXmzJlj67lz53q9t99+uyjjceeIDxs2zOv99re/tTXb6eZXrVmUpPvuu887dtc9qW/9szR69OhRZx2aMmVKSV6/llVzFkNt2rSx9f/8z/94vfrWpAi3ZkblxJZH9/eLG2+80eu5n/c22qjwFRzcfxfm0l1HqFjC8+Kbb75Z9NeoRbFlsVTq25p53rx5tt599929XrjuT7Vr0BosxphOkrpJmiqpbS4skrRYUtviDg3IjywiJuQRsSCLiAVZREzII2JBFmtfwbsIGWNaSJogaUiSJCuDnU4SY0ydl/ONMQMlDUw7UOBrZBExaUweySJKgXMjYkEWERPepxELzo3ZUNAFFmNMU60Lw91JkjyQ+/ISY0y7JEkWGWPaSVpa179NkmS0pNG5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keHqF071qa/XrFkzW2+99dZeb5999rH1lltu6fVWrVpl63nz5nm9ZcuW5X39NWvWeMdu3sKxub2vvvoq73OG2f/Pf/6T97Gofe7vxJJ0ww03eMeDBw+29dq1a73erFmzbH3rrbd6vXHjxtl65cqVqcfZWNzBAgAAAAAAkBIXWAAAAAAAAFLiAgsAAAAAAEBKrMFSZO7cxHCe5PDhw2196KGHer033njD1qeddprX+/zzz4s4QgBYzz1nuds9Sv7WePvtt5/XO+SQQ2wdzvtu3bq1d+zO9Z4zZ47Xu+2222xdyfmyKB93K9ErrrjC651zzjm23nzzzb2eu83ojjvu6PXcOdp9+/b1eu5cbslfz4J1AFBOYaYHDRpk6912283rnX766baeMGGC12MNluoX/gzd9+JwS+Vvfetbtj711FO93nbbbWfrLbbYwuu1adPG1pMmTfJ6H374oXe8fPlyW7do0cLruWtDvvPOO3l7ixYt8nru7y/hOhrIHnctoYEDB3q9n/zkJ96x+3k0XL/H/Wx6xBFHeL3Jkyfb2l2DSCrveZM7WAAAAAAAAFLiAgsAAAAAAEBKTBEqMvf2o/CWpgMPPNDW4S30K1assPWXX35ZotEByCL31uP27dt7PXeb0J///Odeb5tttrF1eD7L9/x1PdY9L3722Wdez91i0r0lXuKW4loR5sO93f2YY47xeu4t5Z988onXc7dmfvfdd71ex44dbR1OZ/vNb37jHW+66aa2/vOf/+z1mHqBUgqnfrhbj4fnTXfqB7msfe7PP5x227JlS1uHU2mPO+44W7tTJyR/CmSnTp28XvPmzb1jd4vlMItuz90iV5KeeOIJW4fnU/ecTYazx50SJEmjRo2y9UknneT1wsy99957tp4xY4bXe/755239+uuve73Fixfbur4txUuNO1gAAAAAAABS4gILAAAAAABASlxgAQAAAAAASIk1WHLcuV/hPDB3DmND5m+F2z+6c8H+/e9/ez13Cz7WHUAhwrmF4dzuNWvWlHM4qDA3D+G8V3fr98suu8zrufOyw0y5866/+OILr7d69Wpbh2tlhFuRulvWu1v0SlKPHj1s7a75IklLliwRql+Yq6VLl9r6+uuv93purqZNm+b1Fi5caGs3m5K/nkC4ltCFF17oHd966622njJlitcL53oDxbTzzjt7x9tuu23ex77y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ez13yk54i/CIESNsPX36dK8XbkVa6O3tDbkN3s1mOH3IfR5urS8/93te3+294XnRPQ7PWVdffbWtzzjjDK/nbvdcXxak+qf+fOtb37J1jx49vN6kSZPyPidqk5sl9zZgSTrzzDNtPWjQIK/nPjacvhieG91pGocccojXc7eODG9vBgrhvoefe+65Xi+cwuGeG8eMGeP1+OyHr7nv6a1bt/Z6hU6tDd+n3S1zJfKGxglz5P6ess8++3g99306zGP4vr3XXnvZ+tRT/WtTL730kq3D38tjyXFjF7kFAAAAAABADhdYAAAAAAAAUuICCwAAAAAAQEo1vQZLOJ/r+9//vq3dbc0kaccdd7R1OCfbnd+4YsUKrxceu2sIhOtuuGu57Lbbbl6vX79+tn700Ue9nru9M+sQVKdwS1E3G+GaP+68xHC+9mmnnWbrJ554wus999xz3rG7VVk4R7exOWKdleoX/tzc8+SVV17p9c466yxbb7rppnmfJ5yD++qrr3rH7tZ8BxxwgNfbc889bf2b3/zG651wwgm2drdzRu0I52G7eXjwwQe9XufOnfM+j7sVfbh2lbtlveSfj48//niv99RTT9k63DYXKMT2229v6969/fUrw/Ov+xkyzDvwNfccdumll3q9K664wtbt27f3eu72zuG59uc//7l3fNNNN9l62rRpXo9tm5FPuObJu+++a2s3U5L03e9+19Zt27b1esccc4x3PHjwYFuH66H961//svUnn3zSwBGXB3ewAAAAAAAApMQFFgAAAAAAgJRqboqQO/UinIbTsWNHW4dblbq3yYdbQ9a3VWOXLl28Y/c2+nBaxtKlS239wQcfeL1nn33W1uHtzEzFqH5hFt566y1bjxw50uu5WziHt3v27NnT1vvvv7/XW7RokXf8u9/9ztYvvPCC1wu3NUN2uecbd7t4SVq8eLGtw/Oi+9jzzjvP64VTK9xzWPfu3b3eNddcY+u9997b69155522PvbYY71erLeFomHcLW0lf1vbcPqk+x66cuVKr3f77bfb+sknn/R6u+++u3f805/+1NZdu3b1eu5Wub169fJ6nDdRl2bNmnnHbhbDXng7/cSJE23NtuDIx52iE07f+cEPfmDr8Jw5YMAAWx966KFeLzy/uf0///nPXu/yyy+3daHbQiOb3PPYP/7xD6/nLl0QLsfhTgmXpBYt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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "encoded_img = encoder.predict(x_test)\n", "decoded_img = decoder.predict(encoded_img)\n", "\n", "plt.figure(figsize=(20, 4))\n", "for i in range(1,8):\n", " ax = plt.subplot(2, 7, i)\n", " plt.imshow(x_test[i].reshape(28, 28))\n", " plt.gray()\n", " ax = plt.subplot(2, 7, i+7)\n", " plt.imshow(decoded_img[i].reshape(28, 28))\n", " plt.gray()" ] }, { "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.7.9" } }, "nbformat": 4, "nbformat_minor": 4 }