From 27e8a1bdad87528960fc18efafa6392ece822cc7 Mon Sep 17 00:00:00 2001 From: Saravanan G <cb.en.u4cse16049@cb.students.amrita.edu> Date: Wed, 10 Apr 2019 11:58:51 +0530 Subject: [PATCH] Upload New File --- sparse_autoencoder.ipynb | 549 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 549 insertions(+) create mode 100644 sparse_autoencoder.ipynb diff --git a/sparse_autoencoder.ipynb b/sparse_autoencoder.ipynb new file mode 100644 index 0000000..c343167 --- /dev/null +++ b/sparse_autoencoder.ipynb @@ -0,0 +1,549 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "sparse_autoencoder.ipynb", + "version": "0.3.2", + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + } + }, + "cells": [ + { + "metadata": { + "id": "QdMO8vTxLYVa", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 105 + }, + "outputId": "c3b82298-a010-4071-d81d-837849cf265e" + }, + "cell_type": "code", + "source": [ + "from keras.layers import Input, Dense\n", + "from keras.models import Model\n", + "\n", + "# this is the size of our encoded representations\n", + "encoding_dim = 32 # 32 floats -> compression of factor 24.5, assuming the input is 784 floats\n", + "\n", + "# this is our input placeholder\n", + "input_img = Input(shape=(784,))\n", + "# \"encoded\" is the encoded representation of the input\n", + "encoded = Dense(encoding_dim, activation='relu')(input_img)\n", + "# \"decoded\" is the lossy reconstruction of the input\n", + "decoded = Dense(784, activation='sigmoid')(encoded)\n", + "\n", + "# this model maps an input to its reconstruction\n", + "autoencoder = Model(input_img, decoded)" + ], + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Colocations handled automatically by placer.\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "7hM37wDDLb2C", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# this model maps an input to its encoded representation\n", + "encoder = Model(input_img, encoded)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "Bikkey04Lv8x", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# create a placeholder for an encoded (32-dimensional) input\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))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "z0m_F_ghLwZr", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "x8WNjAUpLe0u", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "from keras.datasets import mnist\n", + "import numpy as np\n", + "(x_train, _), (x_test, _) = mnist.load_data()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "xSAVGorPLhC1", + "colab_type": "code", + "outputId": "0cd2df12-e94b-4c83-a0a2-769f1cba0092", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + } + }, + "cell_type": "code", + "source": [ + "x_train = x_train.astype('float32') / 255.\n", + "x_test = x_test.astype('float32') / 255.\n", + "x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))\n", + "x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))\n", + "print(x_train.shape)\n", + "print(x_test.shape)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(60000, 784)\n", + "(10000, 784)\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "QML6tFjBLjvL", + "colab_type": "code", + "outputId": "1b9f7889-3c10-4f24-cc48-0807c8cf00d9", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1751 + } + }, + "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": [ + { + "output_type": "stream", + "text": [ + "Train on 60000 samples, validate on 10000 samples\n", + "Epoch 1/50\n", + "60000/60000 [==============================] - 5s 79us/step - loss: 0.3630 - val_loss: 0.2709\n", + "Epoch 2/50\n", + "60000/60000 [==============================] - 4s 74us/step - loss: 0.2634 - val_loss: 0.2523\n", + "Epoch 3/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.2418 - val_loss: 0.2290\n", + "Epoch 4/50\n", + "60000/60000 [==============================] - 4s 71us/step - loss: 0.2210 - val_loss: 0.2107\n", + "Epoch 5/50\n", + "60000/60000 [==============================] - 4s 71us/step - loss: 0.2056 - val_loss: 0.1979\n", + "Epoch 6/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1947 - val_loss: 0.1886\n", + "Epoch 7/50\n", + "60000/60000 [==============================] - 4s 75us/step - loss: 0.1865 - val_loss: 0.1815\n", + "Epoch 8/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1799 - val_loss: 0.1754\n", + "Epoch 9/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1743 - val_loss: 0.1702\n", + "Epoch 10/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1693 - val_loss: 0.1654\n", + "Epoch 11/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1647 - val_loss: 0.1610\n", + "Epoch 12/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1605 - val_loss: 0.1570\n", + "Epoch 13/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1567 - val_loss: 0.1534\n", + "Epoch 14/50\n", + "60000/60000 [==============================] - 4s 74us/step - loss: 0.1532 - val_loss: 0.1500\n", + "Epoch 15/50\n", + "60000/60000 [==============================] - 4s 74us/step - loss: 0.1499 - val_loss: 0.1468\n", + "Epoch 16/50\n", + "60000/60000 [==============================] - 4s 71us/step - loss: 0.1469 - val_loss: 0.1440\n", + "Epoch 17/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1441 - val_loss: 0.1411\n", + "Epoch 18/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1414 - val_loss: 0.1386\n", + "Epoch 19/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1390 - val_loss: 0.1363\n", + "Epoch 20/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1367 - val_loss: 0.1341\n", + "Epoch 21/50\n", + "60000/60000 [==============================] - 4s 75us/step - loss: 0.1345 - val_loss: 0.1318\n", + "Epoch 22/50\n", + "60000/60000 [==============================] - 5s 75us/step - loss: 0.1324 - val_loss: 0.1298\n", + "Epoch 23/50\n", + "60000/60000 [==============================] - 5s 78us/step - loss: 0.1304 - val_loss: 0.1279\n", + "Epoch 24/50\n", + "60000/60000 [==============================] - 5s 76us/step - loss: 0.1285 - val_loss: 0.1261\n", + "Epoch 25/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1266 - val_loss: 0.1242\n", + "Epoch 26/50\n", + "60000/60000 [==============================] - 4s 74us/step - loss: 0.1249 - val_loss: 0.1225\n", + "Epoch 27/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1232 - val_loss: 0.1208\n", + "Epoch 28/50\n", + "60000/60000 [==============================] - 4s 74us/step - loss: 0.1216 - val_loss: 0.1192\n", + "Epoch 29/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1201 - val_loss: 0.1177\n", + "Epoch 30/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1186 - val_loss: 0.1163\n", + "Epoch 31/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1173 - val_loss: 0.1150\n", + "Epoch 32/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1160 - val_loss: 0.1137\n", + "Epoch 33/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1148 - val_loss: 0.1126\n", + "Epoch 34/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1137 - val_loss: 0.1115\n", + "Epoch 35/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1126 - val_loss: 0.1105\n", + "Epoch 36/50\n", + "60000/60000 [==============================] - 4s 74us/step - loss: 0.1117 - val_loss: 0.1096\n", + "Epoch 37/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1108 - val_loss: 0.1088\n", + "Epoch 38/50\n", + "60000/60000 [==============================] - 4s 74us/step - loss: 0.1100 - val_loss: 0.1080\n", + "Epoch 39/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1093 - val_loss: 0.1072\n", + "Epoch 40/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1086 - val_loss: 0.1066\n", + "Epoch 41/50\n", + "60000/60000 [==============================] - 4s 74us/step - loss: 0.1080 - val_loss: 0.1060\n", + "Epoch 42/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1074 - val_loss: 0.1055\n", + "Epoch 43/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1069 - val_loss: 0.1049\n", + "Epoch 44/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1064 - val_loss: 0.1045\n", + "Epoch 45/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1060 - val_loss: 0.1040\n", + "Epoch 46/50\n", + "60000/60000 [==============================] - 4s 71us/step - loss: 0.1055 - val_loss: 0.1037\n", + "Epoch 47/50\n", + "60000/60000 [==============================] - 4s 73us/step - loss: 0.1052 - val_loss: 0.1033\n", + "Epoch 48/50\n", + "60000/60000 [==============================] - 4s 71us/step - loss: 0.1048 - val_loss: 0.1030\n", + "Epoch 49/50\n", + "60000/60000 [==============================] - 4s 70us/step - loss: 0.1045 - val_loss: 0.1027\n", + "Epoch 50/50\n", + "60000/60000 [==============================] - 4s 72us/step - loss: 0.1042 - val_loss: 0.1024\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "<keras.callbacks.History at 0x7f7774922b38>" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 21 + } + ] + }, + { + "metadata": { + "id": "WkHOQRu2Mq_G", + "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": [] + }, + { + "metadata": { + "id": "opIKa2ZsMio4", + "colab_type": "code", + "outputId": "05f129b1-dbc9-4f24-ffc9-bd3670499e1a", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 244 + } + }, + "cell_type": "code", + "source": [ + "# use Matplotlib (don't ask)\n", + "import matplotlib.pyplot as plt\n", + "\n", + "n = 10 # how many digits we will display\n", + "plt.figure(figsize=(20, 4))\n", + "for i in range(n):\n", + " # display original\n", + " ax = plt.subplot(2, n, i + 1)\n", + " plt.imshow(x_test[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "\n", + " # display reconstruction\n", + " ax = plt.subplot(2, n, i + 1 + n)\n", + " plt.imshow(decoded_imgs[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "plt.show()" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABGoAAADjCAYAAADdR/IFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3XecFdX5x/GzUaJgAUVAkaKAFVGU\naiGKYgmCFaPRGI0RS0xiiTVqYteXGiyx9xJjxRITJSKxIaJRKYKAAqEpVRRFsO/vj9/Lh+953Blm\nL/fuzr37ef/1XM7Zu7Mz98zMHc5znqrq6uoAAAAAAACA+vej+t4AAAAAAAAA/D8e1AAAAAAAAOQE\nD2oAAAAAAAByggc1AAAAAAAAOcGDGgAAAAAAgJzgQQ0AAAAAAEBOrJ7WWFVVRe3uelJdXV1VrPfi\nONafYh1HjmH9YSxWBsZi+WMsVgbGYvljLFYGxmL5YyxWhqTjyIwaAAAAAACAnOBBDQAAAAAAQE7w\noAYAAAAAACAneFADAAAAAACQEzyoAQAAAAAAyAke1AAAAAAAAOQED2oAAAAAAAByggc1AAAAAAAA\nObF6fW8AGo7TTz/d4saNG0dt2267rcWDBg1KfI+bb77Z4tdeey1qu//++1d1EwEAAAAAqFfMqAEA\nAAAAAMgJHtQAAAAAAADkBA9qAAAAAAAAcqKquro6ubGqKrkRJVVdXV1VrPeqz+P48MMPW5y29kwh\npk2bFr3u16+fxbNmzSrq7ypUsY5jpY7FzTffPHo9efJki08++WSL//rXv9bZNnmVMhazWmuttSy+\n6qqrLD7++OOjfm+99ZbFhxxySNQ2c+bMEm1d4RiL5a+hjcVKxVgsf4zFysBYrJ311lvP4nbt2mX6\nGX8/dOqpp1o8YcIEi997772o37hx4zK9P2OxMiQdR2bUAAAAAAAA5AQPagAAAAAAAHKC8twoKk11\nCiF7upOmvPz73/+2uEOHDlG/gQMHWtyxY8eo7YgjjrD48ssvz/R7Ub+233776PV3331n8Zw5c+p6\ncxBC2GijjSwePHiwxXpsQgihW7duFg8YMCBqu/HGG0u0dfjeDjvsYPHjjz8etW2yySYl+7177bVX\n9HrSpEkWz549u2S/F9noNTKEEP7xj39Y/Nvf/tbiW265Jer37bfflnbDKkzLli0tfuSRRyweNWpU\n1O+2226zeMaMGSXfru81bdo0ev2Tn/zE4mHDhln89ddf19k2AeVg3333tXi//faL2nbbbTeLO3Xq\nlOn9fEpT+/btLV5jjTUSf2611VbL9P6obMyoAQAAAAAAyAke1AAAAAAAAOQEqU9YZd27d7f4wAMP\nTOw3ceJEi/10wkWLFlm8dOlSi3/84x9H/UaPHm3xdtttF7U1b9484xYjL7p27Rq9/vzzzy1+4okn\n6npzGqQWLVpEr++999562hLUxt57721x2vTpYvOpNcccc4zFhx12WJ1tB1bQa99NN92U2O+GG26w\n+K677orali9fXvwNqyBa7SWE+H5G04zmz58f9auvdCetyhdCfJ7XtNWpU6eWfsPK0Lrrrhu91nT6\nbbbZxmKtNhoCqWR5psslnHTSSRZrincIITRu3NjiqqpVL6jkq5sCtcGMGgAAAAAAgJzgQQ0AAAAA\nAEBO8KAGAAAAAAAgJ+p0jRpfqlnzAj/88MOo7YsvvrD4gQcesHjevHlRP/Jr65+W8/X5nJrHrWsq\nzJ07N9N7/+EPf4heb7311ol9//Wvf2V6T9Qvze/WcrEhhHD//ffX9eY0SL///e8tPuCAA6K2nj17\n1vr9tPRrCCH86Ecr/g9g3LhxFr/88su1fm+ssPrqKy7Z/fv3r5dt8GtfnHbaaRavtdZaUZuuOYXS\n0fHXpk2bxH4PPvigxXqPhZptsMEGFj/88MNR2/rrr2+xrgv0u9/9rvQbluC8886zeNNNN43ajj/+\neIu5b67ZEUccYfGll14atbVt27bGn/Fr2Xz00UfF3zAUhZ4bTz755JL+rsmTJ1us34NQXFoiXc/X\nIcRrpmpZ9RBC+O677yy+5ZZbLH711Vejfnk4VzKjBgAAAAAAICd4UAMAAAAAAJATdZr6dOWVV0av\nN9lkk0w/p1M2P/vss6itLqeUzZkzx2L/t7z55pt1th158/TTT1us09BCiI/X4sWLa/3evtxro0aN\nav0eyJctt9zSYp8q4aeXozSuueYai3UKaKEOOuigxNczZ860+NBDD436+TQapOvbt6/FO+64o8X+\nelRKvkyxpqM2adIkaiP1qTR8OfZzzz03089paml1dXVRt6kS7bDDDhb7qfPqoosuqoOt+aHOnTtH\nrzVV/IknnojauLbWTNNhrr32Wou15H0IyePlr3/9a/Ra07kLuefFyvkUF01j0tSVYcOGRf2+/PJL\n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\njEOI73NbtWqVuE1q/vz50eu6SvtmRg0AAAAAAEBO8KAGAAAAAAAgJxpk6tPOO+8cvfari39PVyAP\nIYQJEyaUbJsagqFDh1rcvHnzxH5/+9vfLG5I1V4qSb9+/Sxef/31o7Zhw4ZZrJUUUFy+ap3SaaWl\nplP6/TalbeMFF1xg8ZFHHln07coLX4Vk4403tvjBBx+s680xHTt2rPHfuQ7Wj7QUi2JUHUIIb731\nVvR62223tbhr165R2z777GOxVjJZuHBh1O/ee+/N9Lu1gsi4ceMS+40aNcpi7o9qz59TNVVN0wt9\neoVWrzzwwAMt9lVidCz6tsGDB1usx/vdd9/NtO2Vzqe4KB1vf/7zn6O2p556ymKq3OXLf/7zn+i1\npkrr94QQQmjXrp3F119/vcVpqaCaSuXTrNIkpTt999130esnnnjC4t///vdR29y5czP/vlXBjBoA\nAAAAAICc4EENAAAAAABATvCgBgAAAAAAICeq0nK/qqqqkhvL2KWXXhq9PueccyweMWKExf3794/6\nlbL8llddXV218l7Z1Odx1PzfRx55xOJGjRpF/V588UWL999/f4vLvYRhsY5juY3FRx991OKDDz44\natPXmv+ZV+U0Fq+++mqLTz755MR+fvyV0u9+9zuLhwwZErXpGjU+N1jXCCjGWgx5HYuNGzeOXr/y\nyisW++Ok5YIXL15czM0ILVu2jF4n5V/7PO0bb7yxqNuRppzGYjHssssuFr/00ksW+7WdZs6cafEm\nm2xS8u1aVXkdi/WpQ4cOFk+dOjVq03U39t57b4v9ejh1qVzHol8zT/d106ZNdZuifknflZ5//vno\n9UknnWTxP//5z6hts802s/j222+3+IQTTljZZpdMnsai7mN/P5BG+95yyy0Wazn0EOI1UPS4T5w4\nMfG9O3fuHL1+7bXXLM5LmfByHYvNmjWLXut6sbqW7EcffRT1mzVrlsW6xt92220X9evZs2ett0k/\nPyGE8Mc//tFiXX+qFJKOIzNqAAAAAAAAcoIHNQAAAAAAADnRYMpz6/RyLfMWQghfffWVxVr2rS5T\nnSqFL7ut08bS0i10am+5pzs1VBtuuKHFffr0sXjKlClRv3JIdypXAwcOrJff26JFi+j11ltvbbGe\nA9L4afwN5fy7fPny6LWmefm0wX/9618W+zSyLLbZZpvotaZb+JSZpKn+tZmSjlWj19O0UvbDhw+v\n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\nz6cEdO/e3eK99947atOp23fccYfFmoITQuWluxSLHp/+/ftHbdtuu63Fus/89PkTTzzRYi3/qlPL\nQsheLrjQEtNJZXPTykP7KY/1qdDPZSGpJX6qrZa91yn7vuyyTtP3xzfpGKal3aR9DrKWnC3Xsog+\n1VD3uy+LnpRKllTW3vdLK33of5emvh100EEW+1Kmeq3wZRGnT59eY79yOTZ+O5PSMf340BS1pk2b\nRm39+vWzWKduv/HGG1G/Nddc02L9TOjU/hDiY/iTn/wkatNURp3y68sU+zGcRVpaWKUo5BrkUwM1\nlVGnePt9Pnz4cIt9OkxSSnjaNc1fD8plzCVJu0boZ1vTLX1b2rUqa6q17mN/LtRp+1riOYQQHnjg\nAYs1zTHtup02xtKukeV+rEP44d+gZXQ1dSWEEJ588kmL9913X4t9GW+9z9OUuLFjx0b9NI3f22yz\nzSzWc7RPSdXf7UsA62s9/v57V7kcR/38aRqaphWFEP+t/vud7leN09LBkr5jhhDvu169ekVt//vf\n/yzWcs233npr1E+/46RdI8vlONWG/r0+/e/555+3eMSIEVFb1vt/ve/t2rWrxb///e+jfrvuuqvF\n/l5K77MuueQSi5999tmon477YnznLAQzagAAAAAAAHKCBzUAAAAAAAA5wYMaAAAAAACAnCjJGjXF\noPleWdeG0TxDX+7unHPOsdjn6T/yyCMW33TTTRbr2jUr+90NmZY3v/zyy6M2zbXVnMBbbrkl6qd5\nvprfmLZ2Udb1iry08sZaMrF169YWa05yCOllpctRIaVZfV5vt27dLG7Tpo3FEydOjPotXrzY4rS1\nELKW20xTyHo15UTLfYYQwgYbbGCxX+9CP+sbbbSRxVOmTIn6Ja0xlrZGTefOnaO2q666ymI93/r3\n0PzfV155JWrTtTbKsTx3Wt67XtN8+Updo6t9+/ZRmx5DXatg4403jvrp50LXmvHrHeg6Gb4ksG6/\nHmu/fkYxrouVeG0t5G/y4/nggw+usc3fm7z22msW+3K+lX4OzMKPRT2f6Fj0576sa88UYptttkl8\n7ceplhwuZE2oECq/PLdKu1+YPXt21PanP/3J4iuvvNJifz5UaWvD6HXLj+c+ffpYvMMOO1js16jR\n67P/LOjx92O9HOn+03VddO2gEEL46KOPLO7SpUvUpvc9ui/9OlD+niiJfl7850DvdfS6O2PGjKif\n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\noy1eunSpxVoa1W9jpfHjWfez5or6caQlJV966SWLdT/W9neXUiUeQ/3cX3TRRVGbri+k49SXW/Z5\n9d/za1O9/vrrFv/ud7+L2iZNmmSxz7FH4dLWpcnCj69WrVpZ7Mu5K3/+U40bN7bYn6+Tfrcfe5W2\n7oLn97uugbDRRhtZ7MqK2MwAAAY1SURBVNdK0HPn7NmzLa7N2iRJ59RKPP/lgd/fenx1HUVPz6+6\nfkYIcSlhHWN+jb3afC4qjX6e/b2hjre0z73uP39+zVo6Om19RL0+6zVS751CSL9m6vtX+nmzELpP\npk6dGrXdfffdFg8ePNji1q1bR/308+OPjd7bPv300xa/9957idvBubZmfpzquVLX80orxz558mSL\nL7300qhfpex3ZtQAAAAAAADkBA9qAAAAAAAAcqIoqU9+elHS1L9Cy9g1b97c4iOPPDLqp2VmdRro\nLbfcEvVbsGBBpu0oVLmWOyzGtuoUPz9FXqcJauynByeluumU1RBCaNq0qcVt2rSJ2rRs7Pz58xO3\nadmyZRb7crL6OdS2PB/TpPKSaf3SpJW21GOt5ctDCOG5556zePjw4RbXJvUlaRvT/i7flnWKciXS\nv9dPiz/22GMtbtu2rcUDBgyI+mnZdZ06PHTo0KifpmKQTvpDWafHF/oZLWQ8+5LAmkrsy24vXrzY\n4mnTpln8ySefRP30HJ313NEQpuynpUBoipOmw/j9otPuFy5caLGWRPfv79+joZ0DsyhlOpg/1pqS\nn5a2oj/XokWLqG3ddde1WO9L0s67/v2TSk+X87k7aX+m/e36nSGE5LLo/j0KOWf5z9ny5ctX+nv9\na/95asjpbbWlqWYhhPD3v//dYr1f9Utq6Pl51qxZUdvMmTMt/vTTTy1uCNe0YtDvd3peCyGEPffc\n02K9Lvpz1EcffWTxHXfcYbF+t6skzKgBAAAAAADICR7UAAAAAAAA5ERRUp+8pGl7foVnnRboU1x0\nSpROh+rdu3fUT6cS6jT9UaNGRf106lRaqkRWae9RrmlQdSltqqdOIfSVZvR4+2pOSE9DLPRzqWNH\np33ecMMNUT9NcdK4GFPxs6aR1PR6VX5vOfN/rx4TPVdee+21dbZNqF9+bGhqjU4FDyGuPKOpT1Om\nTIn66fRvLy2VoBJkPaf6/a7n1HHjxlk8ZMiQqJ+mmWl1RU2DCoEKIyuTtk/0vrTQamRpaW6aqvLu\nu+9arFX4QojPz6+88krUpq91vKVVJkrbxkoZi0l/r98vmi7mv2skVTlMu5dKSzdPer8Q4opdWi3P\nfzfSdDmfvsP4Lpx+DvTa579LpKXac66tHT8edPy1b98+atPv95qm/dlnn0X9tDrvsGHDLK7U48GM\nGgAAAAAAgJzgQQ0AAAAAAEBO8KAGAAAAAAAgJ0qyRo3KWpLb5+tus802Fh9wwAEWd+rUKeqnuYRa\nmktzQUOIc0B9ebtCyxYntVVqnhzKTyHlrtPWD9I8el0vyPcr9RhgvKGclbp0d9Lv0vEbQgjTp0+3\n+MEHH4za1ltvPYv12jpjxoyon76nXxuiUtbCSJJ2fLTN7xfdn5MnT7Z40qRJUT/9OY055xVPqctT\na3nfRx55xOLhw4dH/fSedfz48VGbrlVU6PY25M+MrnXo19RKWqMo63p/nn6v8evhaGlwXYfz448/\njvqlnVNRfGnXqWKsadqQpa371apVq6hNx878+fMtfuedd6J+up7eBx98kPi7KgUzagAAAAAAAHKC\nBzUAAAAAAAA5UfLUJ53m1KhRo8R+fnqf9tXpg3Pnzo366VSpjz76qMafCSGe3pi1nK//90qfxg3U\nJGk6cFqKVF1uE1BJ6vKzrVPsZ8+eHbUtWLDAYk1z1DQCj2tkzdKmf/t0tLSfQz7pcfKp9UuXLrX4\n7bffttiXZNafS0vPJ+135bKmJIbww32d5eeypo77c6WWgZ4zZ47F/rxJmmN+sP9XTdq1T8tshxDC\nxIkTLd5uu+0s1rESQgjTpk2zWNOIK/VYMaMGAAAAAAAgJ3hQAwAAAAAAkBM8qAEAAAAAAMiJqpWU\nCa23hC/N39X1Zho3bpz4M1999ZXF/u/SPPD6XFsjq+rq6uQk2Fqqz+PY0BXrOHIM6w9jsTIwFssf\nY7EyVNpYzLpuTNpaiVnXSskLxuLKlUNp50obiw0RY7EyJB1HZtQAAAAAAADkBA9qAAAAAAAAciI1\n9QkAAAAAAAB1hxk1AAAAAAAAOcGDGgAAAAAAgJzgQQ0AAAAAAEBO8KAGAAAAAAAgJ3hQAwAAAAAA\nkBM8qAEAAAAAAMiJ/wN2Zgsj+f+QYwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "<Figure size 1440x288 with 20 Axes>" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "6G3td7f-YNwG", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# SPARSE AUTOENCODER" + ] + }, + { + "metadata": { + "id": "MJGHCiUukXI6", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "a12e2c2c-32a9-436a-de7a-d1569d6c09be" + }, + "cell_type": "code", + "source": [ + "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n", + "\n", + "x_train = x_train.astype('float32') / 255.0\n", + "x_test = x_test.astype('float32') / 255.0\n", + "x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))\n", + "x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))\n", + "\n", + "print(x_train.shape)\n", + "print(x_test.shape)" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(60000, 784)\n", + "(10000, 784)\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "Hk5MUqWDiPkO", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 697 + }, + "outputId": "8e0c8d13-05eb-46b4-889b-9c98ac17fa9d" + }, + "cell_type": "code", + "source": [ + "from keras.regularizers import l1\n", + "input_size = 784\n", + "code_size = 32\n", + "\n", + "input_img = Input(shape=(input_size,))\n", + "code = Dense(code_size, activation='relu', activity_regularizer=l1(10e-6))(input_img)\n", + "output_img = Dense(input_size, activation='sigmoid')(code)\n", + "\n", + "autoencoder_regularized = Model(input_img, output_img)\n", + "autoencoder_regularized.compile(optimizer='adam', loss='binary_crossentropy')\n", + "history_regularized = autoencoder_regularized.fit(x_train, x_train, epochs=20)\n", + "\n", + "encoded_regularized = Model(input_img, code)" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Epoch 1/20\n", + "60000/60000 [==============================] - 15s 247us/step - loss: 0.1835\n", + "Epoch 2/20\n", + "60000/60000 [==============================] - 15s 243us/step - loss: 0.1292\n", + "Epoch 3/20\n", + "60000/60000 [==============================] - 15s 242us/step - loss: 0.1190\n", + "Epoch 4/20\n", + "60000/60000 [==============================] - 14s 231us/step - loss: 0.1150\n", + "Epoch 5/20\n", + "60000/60000 [==============================] - 14s 234us/step - loss: 0.1125\n", + "Epoch 6/20\n", + "60000/60000 [==============================] - 14s 242us/step - loss: 0.1108\n", + "Epoch 7/20\n", + "60000/60000 [==============================] - 14s 229us/step - loss: 0.1095\n", + "Epoch 8/20\n", + "60000/60000 [==============================] - 15s 253us/step - loss: 0.1085\n", + "Epoch 9/20\n", + "60000/60000 [==============================] - 14s 231us/step - loss: 0.1076\n", + "Epoch 10/20\n", + "60000/60000 [==============================] - 15s 244us/step - loss: 0.1070\n", + "Epoch 11/20\n", + "60000/60000 [==============================] - 15s 249us/step - loss: 0.1064\n", + "Epoch 12/20\n", + "60000/60000 [==============================] - 14s 236us/step - loss: 0.1059\n", + "Epoch 13/20\n", + "60000/60000 [==============================] - 14s 237us/step - loss: 0.1054\n", + "Epoch 14/20\n", + "60000/60000 [==============================] - 15s 243us/step - loss: 0.1051\n", + "Epoch 15/20\n", + "60000/60000 [==============================] - 14s 241us/step - loss: 0.1047\n", + "Epoch 16/20\n", + "60000/60000 [==============================] - 15s 242us/step - loss: 0.1044\n", + "Epoch 17/20\n", + "60000/60000 [==============================] - 14s 235us/step - loss: 0.1041\n", + "Epoch 18/20\n", + "60000/60000 [==============================] - 14s 239us/step - loss: 0.1038\n", + "Epoch 19/20\n", + "60000/60000 [==============================] - 14s 231us/step - loss: 0.1036\n", + "Epoch 20/20\n", + "60000/60000 [==============================] - 14s 241us/step - loss: 0.1034\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "yBKmhyyikr0r", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "def plot_autoencoder_outputs(autoencoder, n, dims):\n", + " decoded_imgs = autoencoder.predict(x_test)\n", + "\n", + " # number of example digits to show\n", + " n = 5\n", + " plt.figure(figsize=(10, 4.5))\n", + " for i in range(n):\n", + " # plot original image\n", + " ax = plt.subplot(2, n, i + 1)\n", + " plt.imshow(x_test[i].reshape(*dims))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + " if i == n/2:\n", + " ax.set_title('Original Images')\n", + "\n", + " # plot reconstruction \n", + " ax = plt.subplot(2, n, i + 1 + n)\n", + " plt.imshow(decoded_imgs[i].reshape(*dims))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + " if i == n/2:\n", + " ax.set_title('Reconstructed Images')\n", + " plt.show()\n" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "k01y1jQeQPas", + "colab_type": "code", + "outputId": "be92f08d-5e93-4627-cf48-7200bf1f064c", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 261 + } + }, + "cell_type": "code", + "source": [ + "plot_autoencoder_outputs(autoencoder_regularized, 5, (28, 28))" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\nqdKjRo3ysVy2wL6mXQJk4cKFPt63b5/KhXav7W+WXKpj7ty5Mc+tWbOmyjVp0sTH9m+enNovp43/\n+9//VufJ+2B/4+X9sr9z8jUz5f7QwwMAAIJHgwcAAAQvT0ta8U55/LacJLvUJ0yYoHJyt2Y7FfNP\nf/pTzFy8JbRs7F6X/812imn79u19bLu8ZYnS7oJulx2I9Rqy691+vrIbNmoH7/Lly6tcx44dc7x+\nS3avO6enVcslDkIUtXK1LWm1a9fOx9/5znd8bEta8X5m9l7KabEsGaHJ5+izzz5TObksgF1ZVy4l\nYO+TvPfyebQla1nGkkMJnHOuXLlyPo5afmTPnj0qJ3+jQ1/x3j5jsuz44Ycfqtwnn3zi4ypVqqic\n3I3ePptyOZD//ve/PrZT/uWyAvfff7/Kyb+p8vfYuehhDHmFHh4AABA8GjwAACB4NHgAAEDw0j6G\nJ2oqo5Sberx8zbp16/p4yJAh6jxZ758zZ47Kffzxxz7OlGWw8wM5HsYuax5Vw5U1arnjrnO67izP\na9y4sTqvevXqPt60aZPKHThwwMd26muPHj18/NBDD6lctWrVfGzHF8il7eVS79aOHTvUsR2LEDI7\nJkouRS/HEETtfB/F/mYka3uMEMkxGlu2bFG5Ll26+Nhu/fC9733Px3Z8j9xmR05ztr+1cisZ+zsg\n75kdq3Ls2DEfjxgxQuUOHToU89+FTv49tDuPy/E98nfPOf1Zy99q5/TfObnMhv1s5Xgvu7yBZL8r\n8nc9N+N1U4keHgAAEDwaPAAAIHgZNS090RKXnA73zDPP+LhUqVLqPDnd7re//a3KJWOao+2my4bu\ndlkmtF2mUd2W8l5///vfV7nu3bv7WN5DOa3ZOd0NK1fqdU53f8sylXPOVa5c2ce2O19el/1OyK5k\nu9KyLNfY18zUlZaTRX4HBg8erHJVq1b1sfzMNmzYoM6Lt4QdNSU+28oc30Z+71auXKlysgR1++23\nq9ygQYN8bMvUsgwin3c75Vk+R1FTz+0UaPn9WbduXcz3zma5WcldfvZ2uY94nxd5v+xvvMzZ30T5\nu2D/tufVEhL08AAAgODR4AEAAMGjwQMAAIKX9jE8sm4YVZONmn4qa4PO6SmQrVq18vGFCxfUeXJ8\nj9x9NlWyYUyBvIdyx3nnnOvUqZOPv/vd76qcvId2rFXp0qV9HDUOSo7dqlWrlsrJ5fHt+AI5fdLW\nkuUUT7lUgXPOvfHGGz62y7vLaerp+G5lErmMgB3zIT97Oa7q008/Tei9krH9TLaQn4fcOsA559av\nX+/jtm3bqpzcETvRcYjyveX0eOec++c//+nj4cOHq5x8dtgq5Nol45mQz7D9Psgp68ePH1c5uYRB\npoxnpYcHAAAEjwYPAAAIXp46dB4uAAADD0lEQVROS4+aXhe1w3X9+vVVbty4cT6WU5f/85//qPPm\nzZsX872RGDnVccmSJSrXtWtXH/fq1UvlBgwY4GO5OrZzusRly1GS7E7dvXu3yskVR20JVL6mXRVZ\n7oIuu/2dc+7MmTM+tlM85fc19Gnottwsp/3bVXXlVH5Zykh0R3n73PIcx8eW9+WyHB06dFC5pk2b\n+jjq+ZOfvZ2SvHHjRh+PGjVK5dasWRPz3yG5ola1juffOKf/psrfXOf0ytibN29WOVnmjxqiks5n\nmB4eAAAQPBo8AAAgeDR4AABA8PJ0DE8UW9eTY3geeeQRlWvYsGGO/05OI3bu6umRuHby87ZbMchd\nwl944QWVk8e2ZizH3Mj6sZ2+LseH2NqynC4fNSXSjreR/47xITmzY6Lk9OFFixbFzE2dOtXHiW7l\nEnVPMmXqa34gp3/L5SOcc65///4+ljunO+dciRIlfLxixQofv/zyy+o8OSU59DFt6Wa/5/I46hmw\n0/xjPUt2vI38DbZTz+UYyNWrV6ucHKeXKc8mPTwAACB4NHgAAEDwClyJ6CPOy24o263WrVs3H8+c\nOVPlypQp4+PTp0/7uGfPnuo8OR0yv5QrknmdmdKtmM2SdT8z6dmUK17b3ZRl6UpOQQ5hFd1sfDbz\najpxOuSXZzPq9W1O/jfF+99nn2+5knrUEiJ2NW9Z1pQr2Dunn/9UfI9iluuS/k4AAAAZhgYPAAAI\nHg0eAAAQvIydli53zHbOuSeffNLHcsyOc7rmePLkSR/LGiKA5LDjb+ySAAhXaON28qOoe5CM+2Of\n7xMnTvh45cqVKhc1pivV43QSQQ8PAAAIHg0eAAAQvIwqaUWtGCnLVnI1XOf0TsBjxozx8alTp5J9\niQAAZA1ZjrJ/e/MbengAAEDwaPAAAIDg0eABAADBy9itJSy5Q7Nd+lpOf8vvNUYrG5evD1l+Wb4e\n345nMyw8m+FgawkAAJC1aPAAAIDgRZa0AAAAQkAPDwAACB4NHgAAEDwaPAAAIHg0eAAAQPBo8AAA\ngODR4AEAAMH7P4KIkagHdVZeAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<Figure size 720x324 with 10 Axes>" + ] + }, + "metadata": { + "tags": [] + } + } + ] + } + ] +} \ No newline at end of file -- GitLab