├── FashionGAN-Tutorial.ipynb └── generatormodel.h5 /FashionGAN-Tutorial.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "64f04b6a-fe54-41ce-92fe-ae94fc587387", 6 | "metadata": { 7 | "id": "64f04b6a-fe54-41ce-92fe-ae94fc587387" 8 | }, 9 | "source": [ 10 | "# 1. Import Dependencies and Data" 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": null, 16 | "id": "c3c355f3-39f9-4f73-ac4e-5ad62198a580", 17 | "metadata": { 18 | "tags": [] 19 | }, 20 | "outputs": [], 21 | "source": [ 22 | "!pip install tensorflow tensorflow-gpu matplotlib tensorflow-datasets ipywidgets" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": null, 28 | "id": "e6112401-2397-423d-b8c2-113a9d323ab0", 29 | "metadata": { 30 | "tags": [] 31 | }, 32 | "outputs": [], 33 | "source": [ 34 | "!pip list" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 3, 40 | "id": "b84be907-35e2-43db-a645-b6b164302aaa", 41 | "metadata": {}, 42 | "outputs": [], 43 | "source": [ 44 | "# Bringing in tensorflow\n", 45 | "import tensorflow as tf\n", 46 | "gpus = tf.config.experimental.list_physical_devices('GPU')\n", 47 | "for gpu in gpus: \n", 48 | " tf.config.experimental.set_memory_growth(gpu, True)" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 6, 54 | "id": "a0f2aa32-064b-448c-bb27-f19a48c40115", 55 | "metadata": {}, 56 | "outputs": [], 57 | "source": [ 58 | "# Brining in tensorflow datasets for fashion mnist \n", 59 | "import tensorflow_datasets as tfds\n", 60 | "# Bringing in matplotlib for viz stuff\n", 61 | "from matplotlib import pyplot as plt" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": 7, 67 | "id": "c933f988-d1ee-4d4d-8028-368a158c27e2", 68 | "metadata": {}, 69 | "outputs": [], 70 | "source": [ 71 | "# Use the tensorflow datasets api to bring in the data source\n", 72 | "ds = tfds.load('fashion_mnist', split='train')" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 14, 78 | "id": "c361db0d-8e7b-43e1-97f9-5e3f7cb01ffe", 79 | "metadata": {}, 80 | "outputs": [ 81 | { 82 | "data": { 83 | "text/plain": [ 84 | "2" 85 | ] 86 | }, 87 | "execution_count": 14, 88 | "metadata": {}, 89 | "output_type": "execute_result" 90 | } 91 | ], 92 | "source": [ 93 | "ds.as_numpy_iterator().next()['label']" 94 | ] 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "id": "ea1635e4-4beb-493d-92c1-b106c806ca70", 99 | "metadata": { 100 | "id": "ea1635e4-4beb-493d-92c1-b106c806ca70" 101 | }, 102 | "source": [ 103 | "# 2. Viz Data and Build Dataset" 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": 16, 109 | "id": "b0c62caf-e406-4d12-af31-6f4848155844", 110 | "metadata": {}, 111 | "outputs": [], 112 | "source": [ 113 | "# Do some data transformation\n", 114 | "import numpy as np" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 17, 120 | "id": "3215c900-6e85-4b39-b300-ea18faf30e5c", 121 | "metadata": {}, 122 | "outputs": [], 123 | "source": [ 124 | "# Setup connection aka iterator\n", 125 | "dataiterator = ds.as_numpy_iterator()" 126 | ] 127 | }, 128 | { 129 | "cell_type": "code", 130 | "execution_count": null, 131 | "id": "c1d6e079-46da-43ca-80d2-b3c864d90360", 132 | "metadata": { 133 | "scrolled": true, 134 | "tags": [] 135 | }, 136 | "outputs": [], 137 | "source": [ 138 | "# Getting data out of the pipeline\n", 139 | "dataiterator.next()['image']" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": 67, 145 | "id": "deb5fca0-fd8a-4557-9c72-1a60c289a2e5", 146 | "metadata": {}, 147 | "outputs": [ 148 | { 149 | "data": { 150 | "image/png": "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\n", 151 | "text/plain": [ 152 | "
" 153 | ] 154 | }, 155 | "metadata": { 156 | "needs_background": "light" 157 | }, 158 | "output_type": "display_data" 159 | } 160 | ], 161 | "source": [ 162 | "# Setup the subplot formatting \n", 163 | "fig, ax = plt.subplots(ncols=4, figsize=(20,20))\n", 164 | "# Loop four times and get images \n", 165 | "for idx in range(4): \n", 166 | " # Grab an image and label\n", 167 | " sample = dataiterator.next()\n", 168 | " # Plot the image using a specific subplot \n", 169 | " ax[idx].imshow(np.squeeze(sample['image']))\n", 170 | " # Appending the image label as the plot title \n", 171 | " ax[idx].title.set_text(sample['label'])" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": 69, 177 | "id": "66c9d901-6a5c-42fd-ad06-cc03f7829728", 178 | "metadata": {}, 179 | "outputs": [], 180 | "source": [ 181 | "# Scale and return images only \n", 182 | "def scale_images(data): \n", 183 | " image = data['image']\n", 184 | " return image / 255" 185 | ] 186 | }, 187 | { 188 | "cell_type": "code", 189 | "execution_count": 72, 190 | "id": "dfc9b6b1-e06e-421c-9c5c-bfc3b3e3be77", 191 | "metadata": {}, 192 | "outputs": [], 193 | "source": [ 194 | "# Reload the dataset \n", 195 | "ds = tfds.load('fashion_mnist', split='train')\n", 196 | "# Running the dataset through the scale_images preprocessing step\n", 197 | "ds = ds.map(scale_images) \n", 198 | "# Cache the dataset for that batch \n", 199 | "ds = ds.cache()\n", 200 | "# Shuffle it up \n", 201 | "ds = ds.shuffle(60000)\n", 202 | "# Batch into 128 images per sample\n", 203 | "ds = ds.batch(128)\n", 204 | "# Reduces the likelihood of bottlenecking \n", 205 | "ds = ds.prefetch(64)" 206 | ] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "execution_count": 74, 211 | "id": "fbb52952-faa1-445f-8931-2f0f37224bfb", 212 | "metadata": {}, 213 | "outputs": [ 214 | { 215 | "data": { 216 | "text/plain": [ 217 | "(128, 28, 28, 1)" 218 | ] 219 | }, 220 | "execution_count": 74, 221 | "metadata": {}, 222 | "output_type": "execute_result" 223 | } 224 | ], 225 | "source": [ 226 | "ds.as_numpy_iterator().next().shape" 227 | ] 228 | }, 229 | { 230 | "cell_type": "markdown", 231 | "id": "9a5b08df-7b20-41f4-a8ff-112dface1cb0", 232 | "metadata": { 233 | "id": "9a5b08df-7b20-41f4-a8ff-112dface1cb0" 234 | }, 235 | "source": [ 236 | "# 3. Build Neural Network" 237 | ] 238 | }, 239 | { 240 | "cell_type": "markdown", 241 | "id": "38f66add-a3db-467f-96c3-f87b9f880159", 242 | "metadata": { 243 | "id": "38f66add-a3db-467f-96c3-f87b9f880159" 244 | }, 245 | "source": [ 246 | "### 3.1 Import Modelling Components" 247 | ] 248 | }, 249 | { 250 | "cell_type": "code", 251 | "execution_count": 75, 252 | "id": "bb72da39-377f-4264-b525-c87f49fb0356", 253 | "metadata": {}, 254 | "outputs": [], 255 | "source": [ 256 | "# Bring in the sequential api for the generator and discriminator\n", 257 | "from tensorflow.keras.models import Sequential\n", 258 | "# Bring in the layers for the neural network\n", 259 | "from tensorflow.keras.layers import Conv2D, Dense, Flatten, Reshape, LeakyReLU, Dropout, UpSampling2D" 260 | ] 261 | }, 262 | { 263 | "cell_type": "markdown", 264 | "id": "c40405df-1439-4661-8785-d76698df8152", 265 | "metadata": { 266 | "id": "c40405df-1439-4661-8785-d76698df8152" 267 | }, 268 | "source": [ 269 | "### 3.2 Build Generator" 270 | ] 271 | }, 272 | { 273 | "cell_type": "code", 274 | "execution_count": 101, 275 | "id": "5d29d43a-e02a-4031-a0ec-de8aa810c118", 276 | "metadata": {}, 277 | "outputs": [], 278 | "source": [ 279 | "def build_generator(): \n", 280 | " model = Sequential()\n", 281 | " \n", 282 | " # Takes in random values and reshapes it to 7x7x128\n", 283 | " # Beginnings of a generated image\n", 284 | " model.add(Dense(7*7*128, input_dim=128))\n", 285 | " model.add(LeakyReLU(0.2))\n", 286 | " model.add(Reshape((7,7,128)))\n", 287 | " \n", 288 | " # Upsampling block 1 \n", 289 | " model.add(UpSampling2D())\n", 290 | " model.add(Conv2D(128, 5, padding='same'))\n", 291 | " model.add(LeakyReLU(0.2))\n", 292 | " \n", 293 | " # Upsampling block 2 \n", 294 | " model.add(UpSampling2D())\n", 295 | " model.add(Conv2D(128, 5, padding='same'))\n", 296 | " model.add(LeakyReLU(0.2))\n", 297 | " \n", 298 | " # Convolutional block 1\n", 299 | " model.add(Conv2D(128, 4, padding='same'))\n", 300 | " model.add(LeakyReLU(0.2))\n", 301 | " \n", 302 | " # Convolutional block 2\n", 303 | " model.add(Conv2D(128, 4, padding='same'))\n", 304 | " model.add(LeakyReLU(0.2))\n", 305 | " \n", 306 | " # Conv layer to get to one channel\n", 307 | " model.add(Conv2D(1, 4, padding='same', activation='sigmoid'))\n", 308 | " \n", 309 | " return model" 310 | ] 311 | }, 312 | { 313 | "cell_type": "code", 314 | "execution_count": 107, 315 | "id": "741b0d58-1b9f-4260-8405-dc400c73f843", 316 | "metadata": {}, 317 | "outputs": [], 318 | "source": [ 319 | "generator = build_generator()" 320 | ] 321 | }, 322 | { 323 | "cell_type": "code", 324 | "execution_count": 132, 325 | "id": "259ab9c1-6d6c-49a0-b0c4-f45b7c68f588", 326 | "metadata": { 327 | "scrolled": true, 328 | "tags": [] 329 | }, 330 | "outputs": [ 331 | { 332 | "name": "stdout", 333 | "output_type": "stream", 334 | "text": [ 335 | "Model: \"sequential_10\"\n", 336 | "_________________________________________________________________\n", 337 | " Layer (type) Output Shape Param # \n", 338 | "=================================================================\n", 339 | " dense_10 (Dense) (None, 6272) 809088 \n", 340 | " \n", 341 | " leaky_re_lu_26 (LeakyReLU) (None, 6272) 0 \n", 342 | " \n", 343 | " reshape_9 (Reshape) (None, 7, 7, 128) 0 \n", 344 | " \n", 345 | " up_sampling2d_12 (UpSamplin (None, 14, 14, 128) 0 \n", 346 | " g2D) \n", 347 | " \n", 348 | " conv2d_19 (Conv2D) (None, 14, 14, 128) 409728 \n", 349 | " \n", 350 | " leaky_re_lu_27 (LeakyReLU) (None, 14, 14, 128) 0 \n", 351 | " \n", 352 | " up_sampling2d_13 (UpSamplin (None, 28, 28, 128) 0 \n", 353 | " g2D) \n", 354 | " \n", 355 | " conv2d_20 (Conv2D) (None, 28, 28, 128) 409728 \n", 356 | " \n", 357 | " leaky_re_lu_28 (LeakyReLU) (None, 28, 28, 128) 0 \n", 358 | " \n", 359 | " conv2d_21 (Conv2D) (None, 28, 28, 128) 262272 \n", 360 | " \n", 361 | " leaky_re_lu_29 (LeakyReLU) (None, 28, 28, 128) 0 \n", 362 | " \n", 363 | " conv2d_22 (Conv2D) (None, 28, 28, 128) 262272 \n", 364 | " \n", 365 | " leaky_re_lu_30 (LeakyReLU) (None, 28, 28, 128) 0 \n", 366 | " \n", 367 | " conv2d_23 (Conv2D) (None, 28, 28, 1) 2049 \n", 368 | " \n", 369 | "=================================================================\n", 370 | "Total params: 2,155,137\n", 371 | "Trainable params: 2,155,137\n", 372 | "Non-trainable params: 0\n", 373 | "_________________________________________________________________\n" 374 | ] 375 | } 376 | ], 377 | "source": [ 378 | "generator.summary()" 379 | ] 380 | }, 381 | { 382 | "cell_type": "code", 383 | "execution_count": 166, 384 | "id": "10ba4d1c-6a15-4097-bf63-5fe6ddb404b6", 385 | "metadata": {}, 386 | "outputs": [], 387 | "source": [ 388 | "img = generator.predict(np.random.randn(4,128,1))" 389 | ] 390 | }, 391 | { 392 | "cell_type": "code", 393 | "execution_count": 136, 394 | "id": "9b4e0cb6-d741-4d43-b845-2a8f2615765b", 395 | "metadata": {}, 396 | "outputs": [ 397 | { 398 | "data": { 399 | "image/png": "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\n", 400 | "text/plain": [ 401 | "
" 402 | ] 403 | }, 404 | "metadata": { 405 | "needs_background": "light" 406 | }, 407 | "output_type": "display_data" 408 | } 409 | ], 410 | "source": [ 411 | "# Generate new fashion\n", 412 | "img = generator.predict(np.random.randn(4,128,1))\n", 413 | "# Setup the subplot formatting \n", 414 | "fig, ax = plt.subplots(ncols=4, figsize=(20,20))\n", 415 | "# Loop four times and get images \n", 416 | "for idx, img in enumerate(img): \n", 417 | " # Plot the image using a specific subplot \n", 418 | " ax[idx].imshow(np.squeeze(img))\n", 419 | " # Appending the image label as the plot title \n", 420 | " ax[idx].title.set_text(idx)" 421 | ] 422 | }, 423 | { 424 | "cell_type": "markdown", 425 | "id": "2415abbf-24ed-4bac-8fb8-12c65017ec22", 426 | "metadata": { 427 | "id": "2415abbf-24ed-4bac-8fb8-12c65017ec22" 428 | }, 429 | "source": [ 430 | "### 3.3 Build Discriminator" 431 | ] 432 | }, 433 | { 434 | "cell_type": "code", 435 | "execution_count": 150, 436 | "id": "b4e70bcb-cfd5-42bb-aed0-79f19bb38d17", 437 | "metadata": {}, 438 | "outputs": [], 439 | "source": [ 440 | "def build_discriminator(): \n", 441 | " model = Sequential()\n", 442 | " \n", 443 | " # First Conv Block\n", 444 | " model.add(Conv2D(32, 5, input_shape = (28,28,1)))\n", 445 | " model.add(LeakyReLU(0.2))\n", 446 | " model.add(Dropout(0.4))\n", 447 | " \n", 448 | " # Second Conv Block\n", 449 | " model.add(Conv2D(64, 5))\n", 450 | " model.add(LeakyReLU(0.2))\n", 451 | " model.add(Dropout(0.4))\n", 452 | " \n", 453 | " # Third Conv Block\n", 454 | " model.add(Conv2D(128, 5))\n", 455 | " model.add(LeakyReLU(0.2))\n", 456 | " model.add(Dropout(0.4))\n", 457 | " \n", 458 | " # Fourth Conv Block\n", 459 | " model.add(Conv2D(256, 5))\n", 460 | " model.add(LeakyReLU(0.2))\n", 461 | " model.add(Dropout(0.4))\n", 462 | " \n", 463 | " # Flatten then pass to dense layer\n", 464 | " model.add(Flatten())\n", 465 | " model.add(Dropout(0.4))\n", 466 | " model.add(Dense(1, activation='sigmoid'))\n", 467 | " \n", 468 | " return model " 469 | ] 470 | }, 471 | { 472 | "cell_type": "code", 473 | "execution_count": 151, 474 | "id": "7173eb57-250b-4d21-9b37-de842c4552ac", 475 | "metadata": {}, 476 | "outputs": [], 477 | "source": [ 478 | "discriminator = build_discriminator()" 479 | ] 480 | }, 481 | { 482 | "cell_type": "code", 483 | "execution_count": 152, 484 | "id": "ed6fecbc-f214-4f50-865c-91887b2430e7", 485 | "metadata": { 486 | "scrolled": true, 487 | "tags": [] 488 | }, 489 | "outputs": [ 490 | { 491 | "name": "stdout", 492 | "output_type": "stream", 493 | "text": [ 494 | "Model: \"sequential_15\"\n", 495 | "_________________________________________________________________\n", 496 | " Layer (type) Output Shape Param # \n", 497 | "=================================================================\n", 498 | " conv2d_32 (Conv2D) (None, 24, 24, 32) 832 \n", 499 | " \n", 500 | " leaky_re_lu_39 (LeakyReLU) (None, 24, 24, 32) 0 \n", 501 | " \n", 502 | " dropout_8 (Dropout) (None, 24, 24, 32) 0 \n", 503 | " \n", 504 | " conv2d_33 (Conv2D) (None, 20, 20, 64) 51264 \n", 505 | " \n", 506 | " leaky_re_lu_40 (LeakyReLU) (None, 20, 20, 64) 0 \n", 507 | " \n", 508 | " dropout_9 (Dropout) (None, 20, 20, 64) 0 \n", 509 | " \n", 510 | " conv2d_34 (Conv2D) (None, 16, 16, 128) 204928 \n", 511 | " \n", 512 | " leaky_re_lu_41 (LeakyReLU) (None, 16, 16, 128) 0 \n", 513 | " \n", 514 | " dropout_10 (Dropout) (None, 16, 16, 128) 0 \n", 515 | " \n", 516 | " conv2d_35 (Conv2D) (None, 12, 12, 256) 819456 \n", 517 | " \n", 518 | " leaky_re_lu_42 (LeakyReLU) (None, 12, 12, 256) 0 \n", 519 | " \n", 520 | " dropout_11 (Dropout) (None, 12, 12, 256) 0 \n", 521 | " \n", 522 | " flatten (Flatten) (None, 36864) 0 \n", 523 | " \n", 524 | " dropout_12 (Dropout) (None, 36864) 0 \n", 525 | " \n", 526 | " dense_11 (Dense) (None, 1) 36865 \n", 527 | " \n", 528 | "=================================================================\n", 529 | "Total params: 1,113,345\n", 530 | "Trainable params: 1,113,345\n", 531 | "Non-trainable params: 0\n", 532 | "_________________________________________________________________\n" 533 | ] 534 | } 535 | ], 536 | "source": [ 537 | "discriminator.summary()" 538 | ] 539 | }, 540 | { 541 | "cell_type": "code", 542 | "execution_count": 161, 543 | "id": "19e32424-f9c5-499c-a13f-b450bc525bdc", 544 | "metadata": {}, 545 | "outputs": [], 546 | "source": [ 547 | "img = img[0]" 548 | ] 549 | }, 550 | { 551 | "cell_type": "code", 552 | "execution_count": 163, 553 | "id": "9ce3acc9-02c8-468f-915a-0efd52da0bad", 554 | "metadata": {}, 555 | "outputs": [ 556 | { 557 | "data": { 558 | "text/plain": [ 559 | "(28, 28, 1)" 560 | ] 561 | }, 562 | "execution_count": 163, 563 | "metadata": {}, 564 | "output_type": "execute_result" 565 | } 566 | ], 567 | "source": [ 568 | "img.shape" 569 | ] 570 | }, 571 | { 572 | "cell_type": "code", 573 | "execution_count": 167, 574 | "id": "8cd15246-b40c-4c7a-912d-b88a1c5c463b", 575 | "metadata": {}, 576 | "outputs": [ 577 | { 578 | "data": { 579 | "text/plain": [ 580 | "array([[0.50057805],\n", 581 | " [0.5006448 ],\n", 582 | " [0.50065 ],\n", 583 | " [0.5005127 ]], dtype=float32)" 584 | ] 585 | }, 586 | "execution_count": 167, 587 | "metadata": {}, 588 | "output_type": "execute_result" 589 | } 590 | ], 591 | "source": [ 592 | "discriminator.predict(img)" 593 | ] 594 | }, 595 | { 596 | "cell_type": "markdown", 597 | "id": "39b343b0-38d3-4281-bedb-72099a18097e", 598 | "metadata": { 599 | "id": "39b343b0-38d3-4281-bedb-72099a18097e" 600 | }, 601 | "source": [ 602 | "# 4. Construct Training Loop" 603 | ] 604 | }, 605 | { 606 | "cell_type": "markdown", 607 | "id": "884abab3-2f74-442d-856f-e104ef1ac8ef", 608 | "metadata": { 609 | "id": "884abab3-2f74-442d-856f-e104ef1ac8ef" 610 | }, 611 | "source": [ 612 | "### 4.1 Setup Losses and Optimizers" 613 | ] 614 | }, 615 | { 616 | "cell_type": "code", 617 | "execution_count": 168, 618 | "id": "0bb1d23a-ea68-451a-bb38-e7795dc24311", 619 | "metadata": {}, 620 | "outputs": [], 621 | "source": [ 622 | "# Adam is going to be the optimizer for both\n", 623 | "from tensorflow.keras.optimizers import Adam\n", 624 | "# Binary cross entropy is going to be the loss for both \n", 625 | "from tensorflow.keras.losses import BinaryCrossentropy" 626 | ] 627 | }, 628 | { 629 | "cell_type": "code", 630 | "execution_count": 169, 631 | "id": "198b2d4e-d6b9-4b6c-a98c-65cd1b81da26", 632 | "metadata": {}, 633 | "outputs": [], 634 | "source": [ 635 | "g_opt = Adam(learning_rate=0.0001) \n", 636 | "d_opt = Adam(learning_rate=0.00001) \n", 637 | "g_loss = BinaryCrossentropy()\n", 638 | "d_loss = BinaryCrossentropy()" 639 | ] 640 | }, 641 | { 642 | "cell_type": "markdown", 643 | "id": "9f170b0e-f731-4cbd-8068-24896f462c08", 644 | "metadata": { 645 | "id": "9f170b0e-f731-4cbd-8068-24896f462c08" 646 | }, 647 | "source": [ 648 | "### 4.2 Build Subclassed Model" 649 | ] 650 | }, 651 | { 652 | "cell_type": "code", 653 | "execution_count": 170, 654 | "id": "9e2f5654-ed22-462d-be32-6c43d8b99b74", 655 | "metadata": {}, 656 | "outputs": [], 657 | "source": [ 658 | "# Importing the base model class to subclass our training step \n", 659 | "from tensorflow.keras.models import Model" 660 | ] 661 | }, 662 | { 663 | "cell_type": "code", 664 | "execution_count": 193, 665 | "id": "40a0af46-0243-4396-94d6-c1316d984de9", 666 | "metadata": {}, 667 | "outputs": [], 668 | "source": [ 669 | "class FashionGAN(Model): \n", 670 | " def __init__(self, generator, discriminator, *args, **kwargs):\n", 671 | " # Pass through args and kwargs to base class \n", 672 | " super().__init__(*args, **kwargs)\n", 673 | " \n", 674 | " # Create attributes for gen and disc\n", 675 | " self.generator = generator \n", 676 | " self.discriminator = discriminator \n", 677 | " \n", 678 | " def compile(self, g_opt, d_opt, g_loss, d_loss, *args, **kwargs): \n", 679 | " # Compile with base class\n", 680 | " super().compile(*args, **kwargs)\n", 681 | " \n", 682 | " # Create attributes for losses and optimizers\n", 683 | " self.g_opt = g_opt\n", 684 | " self.d_opt = d_opt\n", 685 | " self.g_loss = g_loss\n", 686 | " self.d_loss = d_loss \n", 687 | "\n", 688 | " def train_step(self, batch):\n", 689 | " # Get the data \n", 690 | " real_images = batch\n", 691 | " fake_images = self.generator(tf.random.normal((128, 128, 1)), training=False)\n", 692 | " \n", 693 | " # Train the discriminator\n", 694 | " with tf.GradientTape() as d_tape: \n", 695 | " # Pass the real and fake images to the discriminator model\n", 696 | " yhat_real = self.discriminator(real_images, training=True) \n", 697 | " yhat_fake = self.discriminator(fake_images, training=True)\n", 698 | " yhat_realfake = tf.concat([yhat_real, yhat_fake], axis=0)\n", 699 | " \n", 700 | " # Create labels for real and fakes images\n", 701 | " y_realfake = tf.concat([tf.zeros_like(yhat_real), tf.ones_like(yhat_fake)], axis=0)\n", 702 | " \n", 703 | " # Add some noise to the TRUE outputs\n", 704 | " noise_real = 0.15*tf.random.uniform(tf.shape(yhat_real))\n", 705 | " noise_fake = -0.15*tf.random.uniform(tf.shape(yhat_fake))\n", 706 | " y_realfake += tf.concat([noise_real, noise_fake], axis=0)\n", 707 | " \n", 708 | " # Calculate loss - BINARYCROSS \n", 709 | " total_d_loss = self.d_loss(y_realfake, yhat_realfake)\n", 710 | " \n", 711 | " # Apply backpropagation - nn learn \n", 712 | " dgrad = d_tape.gradient(total_d_loss, self.discriminator.trainable_variables) \n", 713 | " self.d_opt.apply_gradients(zip(dgrad, self.discriminator.trainable_variables))\n", 714 | " \n", 715 | " # Train the generator \n", 716 | " with tf.GradientTape() as g_tape: \n", 717 | " # Generate some new images\n", 718 | " gen_images = self.generator(tf.random.normal((128,128,1)), training=True)\n", 719 | " \n", 720 | " # Create the predicted labels\n", 721 | " predicted_labels = self.discriminator(gen_images, training=False)\n", 722 | " \n", 723 | " # Calculate loss - trick to training to fake out the discriminator\n", 724 | " total_g_loss = self.g_loss(tf.zeros_like(predicted_labels), predicted_labels) \n", 725 | " \n", 726 | " # Apply backprop\n", 727 | " ggrad = g_tape.gradient(total_g_loss, self.generator.trainable_variables)\n", 728 | " self.g_opt.apply_gradients(zip(ggrad, self.generator.trainable_variables))\n", 729 | " \n", 730 | " return {\"d_loss\":total_d_loss, \"g_loss\":total_g_loss}" 731 | ] 732 | }, 733 | { 734 | "cell_type": "code", 735 | "execution_count": 194, 736 | "id": "24d248c3-f4c1-4478-a699-a5811a7b1fd0", 737 | "metadata": {}, 738 | "outputs": [], 739 | "source": [ 740 | "# Create instance of subclassed model\n", 741 | "fashgan = FashionGAN(generator, discriminator)" 742 | ] 743 | }, 744 | { 745 | "cell_type": "code", 746 | "execution_count": 195, 747 | "id": "e1cf7e02-ee1a-4901-bdf0-9aa2301f8cfc", 748 | "metadata": {}, 749 | "outputs": [], 750 | "source": [ 751 | "# Compile the model\n", 752 | "fashgan.compile(g_opt, d_opt, g_loss, d_loss)" 753 | ] 754 | }, 755 | { 756 | "cell_type": "markdown", 757 | "id": "e06d0adb-38d0-4558-b824-7416cf880082", 758 | "metadata": { 759 | "id": "e06d0adb-38d0-4558-b824-7416cf880082" 760 | }, 761 | "source": [ 762 | "### 4.3 Build Callback" 763 | ] 764 | }, 765 | { 766 | "cell_type": "code", 767 | "execution_count": 184, 768 | "id": "548f6918-366c-4799-9dac-1acedaab40c4", 769 | "metadata": {}, 770 | "outputs": [], 771 | "source": [ 772 | "import os\n", 773 | "from tensorflow.keras.preprocessing.image import array_to_img\n", 774 | "from tensorflow.keras.callbacks import Callback" 775 | ] 776 | }, 777 | { 778 | "cell_type": "code", 779 | "execution_count": 185, 780 | "id": "d3e2bb77-2d7d-40d0-809f-526b8fd34170", 781 | "metadata": {}, 782 | "outputs": [], 783 | "source": [ 784 | "class ModelMonitor(Callback):\n", 785 | " def __init__(self, num_img=3, latent_dim=128):\n", 786 | " self.num_img = num_img\n", 787 | " self.latent_dim = latent_dim\n", 788 | "\n", 789 | " def on_epoch_end(self, epoch, logs=None):\n", 790 | " random_latent_vectors = tf.random.uniform((self.num_img, self.latent_dim,1))\n", 791 | " generated_images = self.model.generator(random_latent_vectors)\n", 792 | " generated_images *= 255\n", 793 | " generated_images.numpy()\n", 794 | " for i in range(self.num_img):\n", 795 | " img = array_to_img(generated_images[i])\n", 796 | " img.save(os.path.join('images', f'generated_img_{epoch}_{i}.png'))" 797 | ] 798 | }, 799 | { 800 | "cell_type": "markdown", 801 | "id": "16e2f159-25e7-4e35-95ef-f0fd18ac5897", 802 | "metadata": { 803 | "id": "16e2f159-25e7-4e35-95ef-f0fd18ac5897" 804 | }, 805 | "source": [ 806 | "### 4.3 Train " 807 | ] 808 | }, 809 | { 810 | "cell_type": "code", 811 | "execution_count": 196, 812 | "id": "a779dceb-aba6-4bf3-af49-0d32a76dd2f7", 813 | "metadata": { 814 | "scrolled": true, 815 | "tags": [] 816 | }, 817 | "outputs": [ 818 | { 819 | "name": "stdout", 820 | "output_type": "stream", 821 | "text": [ 822 | "Epoch 1/20\n", 823 | "469/469 [==============================] - 43s 88ms/step - d_loss: 0.5911 - g_loss: 0.6832\n", 824 | "Epoch 2/20\n", 825 | "469/469 [==============================] - 41s 88ms/step - d_loss: 0.4158 - g_loss: 3.2742\n", 826 | "Epoch 3/20\n", 827 | "469/469 [==============================] - 40s 85ms/step - d_loss: 0.2878 - g_loss: 6.5225\n", 828 | "Epoch 4/20\n", 829 | "469/469 [==============================] - 40s 85ms/step - d_loss: 0.2780 - g_loss: 6.5009\n", 830 | "Epoch 5/20\n", 831 | "469/469 [==============================] - 40s 85ms/step - d_loss: 0.2755 - g_loss: 6.2294\n", 832 | "Epoch 6/20\n", 833 | "469/469 [==============================] - 40s 85ms/step - d_loss: 0.2732 - g_loss: 5.9429\n", 834 | "Epoch 7/20\n", 835 | "469/469 [==============================] - 40s 85ms/step - d_loss: 0.2728 - g_loss: 5.6715\n", 836 | "Epoch 8/20\n", 837 | "469/469 [==============================] - 40s 85ms/step - d_loss: 0.2708 - g_loss: 5.4097\n", 838 | "Epoch 9/20\n", 839 | "469/469 [==============================] - 40s 85ms/step - d_loss: 0.2704 - g_loss: 5.1352\n", 840 | "Epoch 10/20\n", 841 | "469/469 [==============================] - 40s 85ms/step - d_loss: 0.2701 - g_loss: 4.8858\n", 842 | "Epoch 11/20\n", 843 | "469/469 [==============================] - 40s 85ms/step - d_loss: 0.2694 - g_loss: 4.6344\n", 844 | "Epoch 12/20\n", 845 | "469/469 [==============================] - 40s 85ms/step - d_loss: 0.2691 - g_loss: 4.3753\n", 846 | "Epoch 13/20\n", 847 | "469/469 [==============================] - 40s 86ms/step - d_loss: 0.2694 - g_loss: 4.1332\n", 848 | "Epoch 14/20\n", 849 | "469/469 [==============================] - 40s 86ms/step - d_loss: 0.2687 - g_loss: 3.9182\n", 850 | "Epoch 15/20\n", 851 | "469/469 [==============================] - 40s 86ms/step - d_loss: 0.2679 - g_loss: 3.7484\n", 852 | "Epoch 16/20\n", 853 | "469/469 [==============================] - 40s 86ms/step - d_loss: 0.2681 - g_loss: 3.5493\n", 854 | "Epoch 17/20\n", 855 | "469/469 [==============================] - 40s 86ms/step - d_loss: 0.2683 - g_loss: 3.3835\n", 856 | "Epoch 18/20\n", 857 | "469/469 [==============================] - 40s 86ms/step - d_loss: 0.2675 - g_loss: 3.2472\n", 858 | "Epoch 19/20\n", 859 | "469/469 [==============================] - 40s 86ms/step - d_loss: 0.2679 - g_loss: 3.1084\n", 860 | "Epoch 20/20\n", 861 | "469/469 [==============================] - 40s 86ms/step - d_loss: 0.3128 - g_loss: 2.6171\n" 862 | ] 863 | } 864 | ], 865 | "source": [ 866 | "# Recommend 2000 epochs\n", 867 | "hist = fashgan.fit(ds, epochs=20, callbacks=[ModelMonitor()])" 868 | ] 869 | }, 870 | { 871 | "cell_type": "markdown", 872 | "id": "39c665a1-a4cc-41ac-a08a-2e14ba64e88d", 873 | "metadata": { 874 | "id": "39c665a1-a4cc-41ac-a08a-2e14ba64e88d" 875 | }, 876 | "source": [ 877 | "### 4.4 Review Performance" 878 | ] 879 | }, 880 | { 881 | "cell_type": "code", 882 | "execution_count": 198, 883 | "id": "54381e8c-93ee-4022-9df6-24c4356720fe", 884 | "metadata": {}, 885 | "outputs": [ 886 | { 887 | "data": { 888 | "image/png": "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\n", 889 | "text/plain": [ 890 | "
" 891 | ] 892 | }, 893 | "metadata": { 894 | "needs_background": "light" 895 | }, 896 | "output_type": "display_data" 897 | } 898 | ], 899 | "source": [ 900 | "plt.suptitle('Loss')\n", 901 | "plt.plot(hist.history['d_loss'], label='d_loss')\n", 902 | "plt.plot(hist.history['g_loss'], label='g_loss')\n", 903 | "plt.legend()\n", 904 | "plt.show()" 905 | ] 906 | }, 907 | { 908 | "cell_type": "markdown", 909 | "id": "d319a982-7ae5-4754-adcf-b490f17a79d6", 910 | "metadata": { 911 | "id": "d319a982-7ae5-4754-adcf-b490f17a79d6" 912 | }, 913 | "source": [ 914 | "# 5. Test Out the Generator" 915 | ] 916 | }, 917 | { 918 | "cell_type": "markdown", 919 | "id": "206ba81f-978a-4c31-9c3d-6ebe5a5bfc29", 920 | "metadata": { 921 | "id": "206ba81f-978a-4c31-9c3d-6ebe5a5bfc29" 922 | }, 923 | "source": [ 924 | "### 5.1 Generate Images" 925 | ] 926 | }, 927 | { 928 | "cell_type": "code", 929 | "execution_count": 211, 930 | "id": "c46f3d6a-8aa5-40d2-a5ac-67a0606a82f0", 931 | "metadata": {}, 932 | "outputs": [], 933 | "source": [ 934 | "generator.load_weights(os.path.join('archive', 'generatormodel.h5'))" 935 | ] 936 | }, 937 | { 938 | "cell_type": "code", 939 | "execution_count": 228, 940 | "id": "14cde11f-cb26-4ebf-ad04-2c64a54f871e", 941 | "metadata": {}, 942 | "outputs": [], 943 | "source": [ 944 | "imgs = generator.predict(tf.random.normal((16, 128, 1)))" 945 | ] 946 | }, 947 | { 948 | "cell_type": "code", 949 | "execution_count": 229, 950 | "id": "f745982f-c4d7-451f-91a7-f7c4341cb7b7", 951 | "metadata": {}, 952 | "outputs": [ 953 | { 954 | "data": { 955 | "image/png": "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\n", 956 | "text/plain": [ 957 | "
" 958 | ] 959 | }, 960 | "metadata": { 961 | "needs_background": "light" 962 | }, 963 | "output_type": "display_data" 964 | } 965 | ], 966 | "source": [ 967 | "fig, ax = plt.subplots(ncols=4, nrows=4, figsize=(10,10))\n", 968 | "for r in range(4): \n", 969 | " for c in range(4): \n", 970 | " ax[r][c].imshow(imgs[(r+1)*(c+1)-1])" 971 | ] 972 | }, 973 | { 974 | "cell_type": "markdown", 975 | "id": "5137cffa-784d-4076-beef-0a067b86d3aa", 976 | "metadata": { 977 | "id": "5137cffa-784d-4076-beef-0a067b86d3aa" 978 | }, 979 | "source": [ 980 | "### 5.2 Save the Model" 981 | ] 982 | }, 983 | { 984 | "cell_type": "code", 985 | "execution_count": null, 986 | "id": "a7011d68-ef71-4377-91e2-e26a02fab382", 987 | "metadata": {}, 988 | "outputs": [], 989 | "source": [ 990 | "generator.save('generator.h5')\n", 991 | "discriminator.save('discriminator.h5')" 992 | ] 993 | }, 994 | { 995 | "cell_type": "code", 996 | "execution_count": null, 997 | "id": "d14c2bd3-a344-4ac1-b2ee-6c90420368e6", 998 | "metadata": {}, 999 | "outputs": [], 1000 | "source": [] 1001 | } 1002 | ], 1003 | "metadata": { 1004 | "accelerator": "GPU", 1005 | "colab": { 1006 | "background_execution": "on", 1007 | "collapsed_sections": [ 1008 | "206ba81f-978a-4c31-9c3d-6ebe5a5bfc29" 1009 | ], 1010 | "name": "FashionGAN.ipynb", 1011 | "provenance": [] 1012 | }, 1013 | "kernelspec": { 1014 | "display_name": "fashgan", 1015 | "language": "python", 1016 | "name": "fashgan" 1017 | }, 1018 | "language_info": { 1019 | "codemirror_mode": { 1020 | "name": "ipython", 1021 | "version": 3 1022 | }, 1023 | "file_extension": ".py", 1024 | "mimetype": "text/x-python", 1025 | "name": "python", 1026 | "nbconvert_exporter": "python", 1027 | "pygments_lexer": "ipython3", 1028 | "version": "3.9.7" 1029 | } 1030 | }, 1031 | "nbformat": 4, 1032 | "nbformat_minor": 5 1033 | } 1034 | -------------------------------------------------------------------------------- /generatormodel.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicknochnack/GANBasics/b0eabe8d22fd1e87f0f4408fbce1b6bd4b3d91b1/generatormodel.h5 --------------------------------------------------------------------------------