├── .ipynb_checkpoints └── Autoencoders in Keras and Deep Learning-checkpoint.ipynb ├── Autoencoders in Keras and Deep Learning.ipynb ├── Denoising Autoencoder.ipynb ├── README.md └── Variational Autoencoder.ipynb /Denoising Autoencoder.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "ExecuteTime": { 8 | "end_time": "2020-10-28T08:29:40.046001Z", 9 | "start_time": "2020-10-28T08:29:38.644804Z" 10 | } 11 | }, 12 | "outputs": [], 13 | "source": [ 14 | "import numpy as np\n", 15 | "import matplotlib.pyplot as plt\n", 16 | "import pandas as pd\n", 17 | "import seaborn as sns\n", 18 | "import warnings\n", 19 | "warnings.filterwarnings('ignore')\n", 20 | "%matplotlib inline" 21 | ] 22 | }, 23 | { 24 | "cell_type": "markdown", 25 | "metadata": {}, 26 | "source": [ 27 | "# Loading Dataset" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 2, 33 | "metadata": { 34 | "ExecuteTime": { 35 | "end_time": "2020-10-28T08:29:43.799273Z", 36 | "start_time": "2020-10-28T08:29:40.592538Z" 37 | } 38 | }, 39 | "outputs": [ 40 | { 41 | "name": "stdout", 42 | "output_type": "stream", 43 | "text": [ 44 | "Training data shapes: X=(60000, 28, 28), y=(60000,)\n", 45 | "Testing data shapes: X=(10000, 28, 28), y=(10000,)\n" 46 | ] 47 | }, 48 | { 49 | "data": { 50 | "image/png": "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\n6kn9B3QUlSoAAAAASUVORK5CYII=\n", 51 | "text/plain": [ 52 | "
" 53 | ] 54 | }, 55 | "metadata": {}, 56 | "output_type": "display_data" 57 | } 58 | ], 59 | "source": [ 60 | "from tensorflow.keras.datasets import mnist\n", 61 | "\n", 62 | "(trainX, trainy), (testX, testy) = mnist.load_data()\n", 63 | "\n", 64 | "print('Training data shapes: X=%s, y=%s' % (trainX.shape, trainy.shape))\n", 65 | "print('Testing data shapes: X=%s, y=%s' % (testX.shape, testy.shape))\n", 66 | "\n", 67 | "for j in range(5):\n", 68 | " i = np.random.randint(0, 10000)\n", 69 | " plt.subplot(550 + 1 + j)\n", 70 | " plt.imshow(trainX[i], cmap='gray')\n", 71 | " plt.title(trainy[i])\n", 72 | "plt.show()" 73 | ] 74 | }, 75 | { 76 | "cell_type": "markdown", 77 | "metadata": {}, 78 | "source": [ 79 | "# Adding Noise" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 3, 85 | "metadata": { 86 | "ExecuteTime": { 87 | "end_time": "2020-10-28T08:29:46.107144Z", 88 | "start_time": "2020-10-28T08:29:46.074938Z" 89 | }, 90 | "collapsed": true 91 | }, 92 | "outputs": [], 93 | "source": [ 94 | "# Adding Noise to the dataset\n", 95 | "def guassian_noise(image):\n", 96 | " r,c= image.shape\n", 97 | " mean = 0\n", 98 | " var = 0.1\n", 99 | " sigma = var**0.5\n", 100 | " gaussian = np.random.normal(mean,sigma,(r,c))\n", 101 | " gaussian = gaussian.reshape(r,c)\n", 102 | " noisy = image + gaussian\n", 103 | " return noisy\n", 104 | "\n", 105 | "def salt_and_pepper_noise(image):\n", 106 | " ratio = 0.9\n", 107 | " amount = 0.1\n", 108 | " noisy = np.copy(image)\n", 109 | " \n", 110 | " salt_count = np.ceil(amount * image.size * ratio)\n", 111 | " coords = [np.random.randint(0, i - 1, int(salt_count)) for i in image.shape]\n", 112 | " noisy[coords] = 1\n", 113 | "\n", 114 | " pepper_count = np.ceil(amount* image.size * (1. - ratio))\n", 115 | " coords = [np.random.randint(0, i - 1, int(pepper_count)) for i in image.shape]\n", 116 | " noisy[coords] = 0\n", 117 | " return noisy\n", 118 | "\n", 119 | "def poisson_noise(image):\n", 120 | " vals = len(np.unique(image))\n", 121 | " vals = 2 ** np.ceil(np.log2(vals))\n", 122 | " noisy = np.random.poisson(image * vals) / float(vals)\n", 123 | " return noisy\n", 124 | "\n", 125 | "def speckle_noise(image):\n", 126 | " r,c = image.shape\n", 127 | " speckle = np.random.randn(r,c)\n", 128 | " speckle = speckle.reshape(r,c) \n", 129 | " noisy = image + image * speckle\n", 130 | " return noisy \n", 131 | "\n", 132 | "def add_noise(image):\n", 133 | " p = np.random.random()\n", 134 | " if p <= 0.25:\n", 135 | " #print(\"Guassian\")\n", 136 | " noisy = guassian_noise(image)\n", 137 | " elif p <= 0.5:\n", 138 | " #print(\"SnP\")\n", 139 | " noisy = salt_and_pepper_noise(image)\n", 140 | " elif p <= 0.75:\n", 141 | " #print(\"Poison\")\n", 142 | " noisy = poisson_noise(image)\n", 143 | " else:\n", 144 | " #print(\"speckle\")\n", 145 | " noisy = speckle_noise(image)\n", 146 | " return noisy" 147 | ] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "execution_count": 4, 152 | "metadata": { 153 | "ExecuteTime": { 154 | "end_time": "2020-10-28T08:29:48.228578Z", 155 | "start_time": "2020-10-28T08:29:47.547729Z" 156 | }, 157 | "scrolled": false 158 | }, 159 | "outputs": [ 160 | { 161 | "name": "stdout", 162 | "output_type": "stream", 163 | "text": [ 164 | "Corrupted Example Samples\n" 165 | ] 166 | }, 167 | { 168 | "data": { 169 | "image/png": "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\nD96Z3r4L7+o1AAAAAElFTkSuQmCC\n", 170 | "text/plain": [ 171 | "
" 172 | ] 173 | }, 174 | "metadata": {}, 175 | "output_type": "display_data" 176 | } 177 | ], 178 | "source": [ 179 | "print (\"Corrupted Example Samples\")\n", 180 | "for j in range(9):\n", 181 | " i = np.random.randint(0, 10000)\n", 182 | " plt.subplot(330 + 1 + j)\n", 183 | " noisy = add_noise(trainX[i]/255)\n", 184 | " plt.imshow(noisy, cmap='gray')\n", 185 | "plt.show()" 186 | ] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": 5, 191 | "metadata": { 192 | "ExecuteTime": { 193 | "end_time": "2020-10-28T08:29:54.713271Z", 194 | "start_time": "2020-10-28T08:29:49.433671Z" 195 | } 196 | }, 197 | "outputs": [ 198 | { 199 | "name": "stdout", 200 | "output_type": "stream", 201 | "text": [ 202 | "(60000, 28, 28, 1) (60000, 28, 28, 1) (10000, 28, 28, 1) (10000, 28, 28, 1)\n" 203 | ] 204 | } 205 | ], 206 | "source": [ 207 | "train_clean = [image/255 for image in trainX]\n", 208 | "test_clean = [image/255 for image in testX]\n", 209 | "\n", 210 | "train_noisy = [add_noise(image/255) for image in trainX]\n", 211 | "test_noisy = [add_noise(image/255) for image in testX]\n", 212 | "\n", 213 | "train_clean = np.reshape(train_clean, (60000, 28, 28, 1))\n", 214 | "test_clean = np.reshape(test_clean, (10000, 28, 28, 1))\n", 215 | "\n", 216 | "train_noisy = np.reshape(train_noisy, (60000, 28, 28, 1))\n", 217 | "test_noisy = np.reshape(test_noisy, (10000, 28, 28, 1))\n", 218 | "\n", 219 | "print (train_clean.shape, train_noisy.shape, test_clean.shape, test_noisy.shape)" 220 | ] 221 | }, 222 | { 223 | "cell_type": "markdown", 224 | "metadata": {}, 225 | "source": [ 226 | "# Denoiser" 227 | ] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "execution_count": 6, 232 | "metadata": { 233 | "ExecuteTime": { 234 | "end_time": "2020-10-28T08:30:07.331867Z", 235 | "start_time": "2020-10-28T08:30:07.199155Z" 236 | } 237 | }, 238 | "outputs": [], 239 | "source": [ 240 | "import tensorflow\n", 241 | "\n", 242 | "input_data = tensorflow.keras.layers.Input(shape=(28, 28, 1))\n", 243 | "\n", 244 | "encoder = tensorflow.keras.layers.Conv2D(64, (5,5), activation='relu')(input_data)\n", 245 | "encoder = tensorflow.keras.layers.MaxPooling2D((2,2))(encoder)\n", 246 | "\n", 247 | "encoder = tensorflow.keras.layers.Conv2D(128, (3,3), activation='relu')(encoder)\n", 248 | "encoder = tensorflow.keras.layers.MaxPooling2D((2,2))(encoder)\n", 249 | "\n", 250 | "encoder = tensorflow.keras.layers.Conv2D(256, (3,3), activation='relu')(encoder)\n", 251 | "encoder = tensorflow.keras.layers.MaxPooling2D((2,2))(encoder)\n", 252 | "\n", 253 | "decoder = tensorflow.keras.layers.Conv2DTranspose(256, (3,3), activation='relu')(encoder)\n", 254 | "\n", 255 | "decoder = tensorflow.keras.layers.Conv2DTranspose(128, (3,3), activation='relu')(decoder)\n", 256 | "decoder = tensorflow.keras.layers.UpSampling2D((2,2))(decoder)\n", 257 | "\n", 258 | "decoder = tensorflow.keras.layers.Conv2DTranspose(64, (3,3), activation='relu')(decoder)\n", 259 | "decoder = tensorflow.keras.layers.UpSampling2D((2,2))(decoder)\n", 260 | "\n", 261 | "decoded = tensorflow.keras.layers.Conv2DTranspose(1, (5,5), activation='relu')(decoder)" 262 | ] 263 | }, 264 | { 265 | "cell_type": "code", 266 | "execution_count": 7, 267 | "metadata": { 268 | "ExecuteTime": { 269 | "end_time": "2020-10-28T08:30:24.844388Z", 270 | "start_time": "2020-10-28T08:30:24.790552Z" 271 | } 272 | }, 273 | "outputs": [ 274 | { 275 | "name": "stdout", 276 | "output_type": "stream", 277 | "text": [ 278 | "Model: \"functional_1\"\n", 279 | "_________________________________________________________________\n", 280 | "Layer (type) Output Shape Param # \n", 281 | "=================================================================\n", 282 | "input_1 (InputLayer) [(None, 28, 28, 1)] 0 \n", 283 | "_________________________________________________________________\n", 284 | "conv2d (Conv2D) (None, 24, 24, 64) 1664 \n", 285 | "_________________________________________________________________\n", 286 | "max_pooling2d (MaxPooling2D) (None, 12, 12, 64) 0 \n", 287 | "_________________________________________________________________\n", 288 | "conv2d_1 (Conv2D) (None, 10, 10, 128) 73856 \n", 289 | "_________________________________________________________________\n", 290 | "max_pooling2d_1 (MaxPooling2 (None, 5, 5, 128) 0 \n", 291 | "_________________________________________________________________\n", 292 | "conv2d_2 (Conv2D) (None, 3, 3, 256) 295168 \n", 293 | "_________________________________________________________________\n", 294 | "max_pooling2d_2 (MaxPooling2 (None, 1, 1, 256) 0 \n", 295 | "_________________________________________________________________\n", 296 | "conv2d_transpose (Conv2DTran (None, 3, 3, 256) 590080 \n", 297 | "_________________________________________________________________\n", 298 | "conv2d_transpose_1 (Conv2DTr (None, 5, 5, 128) 295040 \n", 299 | "_________________________________________________________________\n", 300 | "up_sampling2d (UpSampling2D) (None, 10, 10, 128) 0 \n", 301 | "_________________________________________________________________\n", 302 | "conv2d_transpose_2 (Conv2DTr (None, 12, 12, 64) 73792 \n", 303 | "_________________________________________________________________\n", 304 | "up_sampling2d_1 (UpSampling2 (None, 24, 24, 64) 0 \n", 305 | "_________________________________________________________________\n", 306 | "conv2d_transpose_3 (Conv2DTr (None, 28, 28, 1) 1601 \n", 307 | "=================================================================\n", 308 | "Total params: 1,331,201\n", 309 | "Trainable params: 1,331,201\n", 310 | "Non-trainable params: 0\n", 311 | "_________________________________________________________________\n" 312 | ] 313 | } 314 | ], 315 | "source": [ 316 | "autoencoder = tensorflow.keras.models.Model(inputs=input_data, outputs=decoded)\n", 317 | "autoencoder.compile(loss='mse', optimizer='adam')\n", 318 | "autoencoder.summary()" 319 | ] 320 | }, 321 | { 322 | "cell_type": "code", 323 | "execution_count": 9, 324 | "metadata": { 325 | "ExecuteTime": { 326 | "end_time": "2020-10-28T09:10:23.361619Z", 327 | "start_time": "2020-10-28T08:30:59.149637Z" 328 | } 329 | }, 330 | "outputs": [ 331 | { 332 | "name": "stdout", 333 | "output_type": "stream", 334 | "text": [ 335 | "Epoch 1/30\n", 336 | "938/938 [==============================] - 84s 90ms/step - loss: 0.0244 - val_loss: 0.0135\n", 337 | "Epoch 2/30\n", 338 | "938/938 [==============================] - 75s 80ms/step - loss: 0.0119 - val_loss: 0.0107\n", 339 | "Epoch 3/30\n", 340 | "938/938 [==============================] - 78s 84ms/step - loss: 0.0100 - val_loss: 0.0095\n", 341 | "Epoch 4/30\n", 342 | "938/938 [==============================] - 80s 85ms/step - loss: 0.0090 - val_loss: 0.0088\n", 343 | "Epoch 5/30\n", 344 | "938/938 [==============================] - 80s 85ms/step - loss: 0.0084 - val_loss: 0.0087\n", 345 | "Epoch 6/30\n", 346 | "938/938 [==============================] - 80s 85ms/step - loss: 0.0080 - val_loss: 0.0083\n", 347 | "Epoch 7/30\n", 348 | "938/938 [==============================] - 80s 85ms/step - loss: 0.0076 - val_loss: 0.0078\n", 349 | "Epoch 8/30\n", 350 | "938/938 [==============================] - 80s 85ms/step - loss: 0.0073 - val_loss: 0.0078\n", 351 | "Epoch 9/30\n", 352 | "938/938 [==============================] - 78s 84ms/step - loss: 0.0071 - val_loss: 0.0079\n", 353 | "Epoch 10/30\n", 354 | "938/938 [==============================] - 79s 84ms/step - loss: 0.0069 - val_loss: 0.0076\n", 355 | "Epoch 11/30\n", 356 | "938/938 [==============================] - 79s 84ms/step - loss: 0.0068 - val_loss: 0.0073\n", 357 | "Epoch 12/30\n", 358 | "938/938 [==============================] - 79s 84ms/step - loss: 0.0066 - val_loss: 0.0074\n", 359 | "Epoch 13/30\n", 360 | "938/938 [==============================] - 78s 84ms/step - loss: 0.0065 - val_loss: 0.0074\n", 361 | "Epoch 14/30\n", 362 | "938/938 [==============================] - 79s 84ms/step - loss: 0.0064 - val_loss: 0.0074\n", 363 | "Epoch 15/30\n", 364 | "938/938 [==============================] - 79s 84ms/step - loss: 0.0063 - val_loss: 0.0070\n", 365 | "Epoch 16/30\n", 366 | "938/938 [==============================] - 79s 85ms/step - loss: 0.0062 - val_loss: 0.0072\n", 367 | "Epoch 17/30\n", 368 | "938/938 [==============================] - 79s 85ms/step - loss: 0.0061 - val_loss: 0.0071\n", 369 | "Epoch 18/30\n", 370 | "938/938 [==============================] - 79s 84ms/step - loss: 0.0060 - val_loss: 0.0071\n", 371 | "Epoch 19/30\n", 372 | "938/938 [==============================] - 79s 84ms/step - loss: 0.0059 - val_loss: 0.0071\n", 373 | "Epoch 20/30\n", 374 | "938/938 [==============================] - 78s 84ms/step - loss: 0.0059 - val_loss: 0.0069\n", 375 | "Epoch 21/30\n", 376 | "938/938 [==============================] - 75s 80ms/step - loss: 0.0058 - val_loss: 0.0070\n", 377 | "Epoch 22/30\n", 378 | "938/938 [==============================] - 76s 81ms/step - loss: 0.0057 - val_loss: 0.0070\n", 379 | "Epoch 23/30\n", 380 | "938/938 [==============================] - 77s 83ms/step - loss: 0.0057 - val_loss: 0.0069\n", 381 | "Epoch 24/30\n", 382 | "938/938 [==============================] - 84s 90ms/step - loss: 0.0056 - val_loss: 0.0071\n", 383 | "Epoch 25/30\n", 384 | "938/938 [==============================] - 78s 83ms/step - loss: 0.0056 - val_loss: 0.0069\n", 385 | "Epoch 26/30\n", 386 | "938/938 [==============================] - 76s 81ms/step - loss: 0.0056 - val_loss: 0.0072\n", 387 | "Epoch 27/30\n", 388 | "938/938 [==============================] - 75s 80ms/step - loss: 0.0055 - val_loss: 0.0068\n", 389 | "Epoch 28/30\n", 390 | "938/938 [==============================] - 76s 81ms/step - loss: 0.0055 - val_loss: 0.0070\n", 391 | "Epoch 29/30\n", 392 | "938/938 [==============================] - 80s 85ms/step - loss: 0.0054 - val_loss: 0.0071\n", 393 | "Epoch 30/30\n", 394 | "938/938 [==============================] - 80s 86ms/step - loss: 0.0054 - val_loss: 0.0069\n" 395 | ] 396 | }, 397 | { 398 | "data": { 399 | "text/plain": [ 400 | "" 401 | ] 402 | }, 403 | "execution_count": 9, 404 | "metadata": {}, 405 | "output_type": "execute_result" 406 | } 407 | ], 408 | "source": [ 409 | "autoencoder.fit(train_noisy, train_clean, epochs=30, batch_size=64, validation_data=(test_noisy, test_clean))" 410 | ] 411 | }, 412 | { 413 | "cell_type": "code", 414 | "execution_count": 38, 415 | "metadata": { 416 | "ExecuteTime": { 417 | "end_time": "2020-10-28T09:19:01.250939Z", 418 | "start_time": "2020-10-28T09:18:59.808270Z" 419 | } 420 | }, 421 | "outputs": [ 422 | { 423 | "name": "stdout", 424 | "output_type": "stream", 425 | "text": [ 426 | "Noisy test images\n" 427 | ] 428 | }, 429 | { 430 | "data": { 431 | "image/png": "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\n6TiOU5D/D0oUGI/WvBQLAAAAAElFTkSuQmCC\n", 432 | "text/plain": [ 433 | "
" 434 | ] 435 | }, 436 | "metadata": {}, 437 | "output_type": "display_data" 438 | }, 439 | { 440 | "name": "stdout", 441 | "output_type": "stream", 442 | "text": [ 443 | "Cleaned Version(Denoising Autoencoder):) \n" 444 | ] 445 | }, 446 | { 447 | "data": { 448 | "image/png": "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\nYII=\n", 449 | "text/plain": [ 450 | "
" 451 | ] 452 | }, 453 | "metadata": {}, 454 | "output_type": "display_data" 455 | } 456 | ], 457 | "source": [ 458 | "offset=92\n", 459 | "# print (\"Real Test Images\")\n", 460 | "# # Real Images\n", 461 | "# for i in range(9):\n", 462 | "# plt.subplot(330 + 1 + i)\n", 463 | "# plt.imshow(test_clean[i+offset,:,:, -1], cmap='gray')\n", 464 | "# plt.show()\n", 465 | "\n", 466 | "print(\"Noisy test images\")\n", 467 | "for i in range(9):\n", 468 | " plt.subplot(330 + 1 + i)\n", 469 | " plt.imshow(test_noisy[i+offset,:,:, -1], cmap='gray')\n", 470 | "plt.show()\n", 471 | "\n", 472 | "# Reconstructed Images\n", 473 | "print (\"Cleaned Version(Denoising Autoencoder):) \")\n", 474 | "for i in range(9):\n", 475 | " plt.subplot(330 + 1 + i)\n", 476 | " output = autoencoder.predict(np.array([test_noisy[i+offset]]))\n", 477 | " op_image = np.reshape(output[0]*255, (28, 28))\n", 478 | " plt.imshow(op_image, cmap='gray')\n", 479 | "plt.show()" 480 | ] 481 | }, 482 | { 483 | "cell_type": "code", 484 | "execution_count": null, 485 | "metadata": { 486 | "collapsed": true 487 | }, 488 | "outputs": [], 489 | "source": [] 490 | } 491 | ], 492 | "metadata": { 493 | "kernelspec": { 494 | "display_name": "Python 3", 495 | "language": "python", 496 | "name": "python3" 497 | }, 498 | "language_info": { 499 | "codemirror_mode": { 500 | "name": "ipython", 501 | "version": 3 502 | }, 503 | "file_extension": ".py", 504 | "mimetype": "text/x-python", 505 | "name": "python", 506 | "nbconvert_exporter": "python", 507 | "pygments_lexer": "ipython3", 508 | "version": "3.6.9" 509 | } 510 | }, 511 | "nbformat": 4, 512 | "nbformat_minor": 2 513 | } 514 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Autoencoders with Keras 2 | 3 | ## This repository has working notebooks on the following types of autoencoders 4 | - Standard AutoEncoder 5 | - Denoising AutoEncoder 6 | - Variational AutoEncoder 7 | --------------------------------------------------------------------------------