{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"### Q1","metadata":{}},{"cell_type":"code","source":"# Importing necessary libraries\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing import sequence\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Embedding, LSTM, Dense\nfrom tensorflow.keras.datasets import imdb\n\n# Parameters\nmax_features = 5000  # Number of words to consider as features\nmaxlen = 500         # Cut texts after this number of words\nbatch_size = 32\nembedding_size = 128\n\n# Workaround to load IMDb dataset with allow_pickle=True\nnp_load_old = np.load\nnp.load = lambda *a, **k: np_load_old(*a, allow_pickle=True, **k)\n\n# Loading the data\n(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)\n\n# Restore np.load to its original state\nnp.load = np_load_old\n\n# Padding sequences to ensure uniform input size\nx_train = sequence.pad_sequences(x_train, maxlen=maxlen)\nx_test = sequence.pad_sequences(x_test, maxlen=maxlen)\n\n# Building the LSTM model\nmodel = Sequential()\nmodel.add(Embedding(max_features, embedding_size, input_length=maxlen))\nmodel.add(LSTM(64, dropout=0.2, recurrent_dropout=0.2))\nmodel.add(Dense(1, activation='sigmoid'))\n\n# Compiling the model\nmodel.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n\n# Training the model and saving training history\nhistory = model.fit(x_train, y_train,\n                    batch_size=batch_size,\n                    epochs=5,\n                    validation_data=(x_test, y_test))\n\n# Evaluating the model\nscore, acc = model.evaluate(x_test, y_test, batch_size=batch_size)\nprint(f\"Test score: {score}\")\nprint(f\"Test accuracy: {acc}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-08T16:11:30.070820Z","iopub.execute_input":"2024-11-08T16:11:30.071113Z","iopub.status.idle":"2024-11-08T17:22:57.393896Z","shell.execute_reply.started":"2024-11-08T16:11:30.071070Z","shell.execute_reply":"2024-11-08T17:22:57.393055Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(history.history.keys())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-08T17:24:36.172993Z","iopub.execute_input":"2024-11-08T17:24:36.173302Z","iopub.status.idle":"2024-11-08T17:24:36.177456Z","shell.execute_reply.started":"2024-11-08T17:24:36.173247Z","shell.execute_reply":"2024-11-08T17:24:36.176583Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Set a stylish background\nsns.set_style(\"whitegrid\")\n\n# Initialize the plot figure with a larger size\nplt.figure(figsize=(14, 6))\n\n# Plotting Training and Validation Accuracy\nplt.subplot(1, 2, 1)\nplt.plot(history.history['acc'], marker='o', color='b', linewidth=2, label='Training Accuracy')\nplt.plot(history.history['val_acc'], marker='o', color='orange', linewidth=2, label='Validation Accuracy')\nplt.title('Training and Validation Accuracy', fontsize=14)\nplt.xlabel('Epoch', fontsize=12)\nplt.ylabel('Accuracy', fontsize=12)\nplt.legend(loc='best')\nplt.grid(True)\n\n# Plotting Training and Validation Loss\nplt.subplot(1, 2, 2)\nplt.plot(history.history['loss'], marker='o', color='r', linewidth=2, label='Training Loss')\nplt.plot(history.history['val_loss'], marker='o', color='purple', linewidth=2, label='Validation Loss')\nplt.title('Training and Validation Loss', fontsize=14)\nplt.xlabel('Epoch', fontsize=12)\nplt.ylabel('Loss', fontsize=12)\nplt.legend(loc='best')\nplt.grid(True)\n\n# Display the plots\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-08T17:25:47.434936Z","iopub.execute_input":"2024-11-08T17:25:47.435255Z","iopub.status.idle":"2024-11-08T17:25:48.164657Z","shell.execute_reply.started":"2024-11-08T17:25:47.435194Z","shell.execute_reply":"2024-11-08T17:25:48.164017Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from glob import glob\nfrom PIL import Image\nfrom IPython import display\nimport tensorflow.keras as kr\nimport tensorflow as tf\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport imageio\nimport os","metadata":{"id":"YfIk2es3hJEd","execution":{"iopub.status.busy":"2024-11-08T15:47:29.964856Z","iopub.execute_input":"2024-11-08T15:47:29.965157Z","iopub.status.idle":"2024-11-08T15:47:30.947464Z","shell.execute_reply.started":"2024-11-08T15:47:29.965103Z","shell.execute_reply":"2024-11-08T15:47:30.946752Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"BATCH_SIZE = 128\nLATENT_DIM = 100\nSAMPLE_INTERVAL = 200\nEPOCHS = 10000","metadata":{"id":"xSzYytsVd9Hf","execution":{"iopub.status.busy":"2024-11-08T15:47:30.949181Z","iopub.execute_input":"2024-11-08T15:47:30.949503Z","iopub.status.idle":"2024-11-08T15:47:30.953780Z","shell.execute_reply.started":"2024-11-08T15:47:30.949446Z","shell.execute_reply":"2024-11-08T15:47:30.952993Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\n\ndef sample_images(generator, epoch=None, save=True, name=None):\n    # Define the grid size (adjust as needed)\n    num_images = 5\n    image_shape = (28, 28)  # Size of the fashion MNIST images\n\n    # Generate random noise as input for the generator\n    noise = np.random.normal(0, 1, (num_images, LATENT_DIM))\n    gen_images = generator.predict(noise)\n\n    # Select real images randomly\n    real_images = X[np.random.randint(0, X.shape[0], num_images)]\n\n    # Rescale images for display (from [-1, 1] to [0, 1])\n    gen_images = 0.5 * gen_images + 0.5\n    real_images = 0.5 * real_images + 0.5\n\n    # Plot original and generated images side-by-side\n    fig, axes = plt.subplots(2, num_images, figsize=(num_images * 2, 4))\n    for i in range(num_images):\n        # Display real images\n        axes[0, i].imshow(real_images[i].reshape(image_shape), cmap='gray')\n        axes[0, i].axis('off')\n        axes[0, i].set_title(\"Original\")\n\n        # Display generated images\n        axes[1, i].imshow(gen_images[i].reshape(image_shape), cmap='gray')\n        axes[1, i].axis('off')\n        axes[1, i].set_title(\"Generated\")\n\n    # Save or display the plot\n    if save and name:\n        plt.savefig(f\"{name}_epoch{epoch}.png\")\n    plt.show()\n","metadata":{"id":"vjZv8b1Ud9H4","execution":{"iopub.status.busy":"2024-11-08T16:03:07.314424Z","iopub.execute_input":"2024-11-08T16:03:07.314708Z","iopub.status.idle":"2024-11-08T16:03:07.323728Z","shell.execute_reply.started":"2024-11-08T16:03:07.314664Z","shell.execute_reply":"2024-11-08T16:03:07.322959Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## GAN with Fashion MNIST","metadata":{"id":"OqhDxtQvd9JP"}},{"cell_type":"code","source":"(X, _), (_, _) = kr.datasets.fashion_mnist.load_data()\n\nX = X.reshape(X.shape[0], 28, 28, 1).astype('float32')\nX = (X - 127.5) / 127.5 # Normalize the images to [-1, 1]","metadata":{"id":"3es9LJjLd9JS","execution":{"iopub.status.busy":"2024-11-08T15:51:39.536594Z","iopub.execute_input":"2024-11-08T15:51:39.536920Z","iopub.status.idle":"2024-11-08T15:51:40.779360Z","shell.execute_reply.started":"2024-11-08T15:51:39.536862Z","shell.execute_reply":"2024-11-08T15:51:40.778752Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### The Generator Model","metadata":{"id":"-tEyxE-GMC48"}},{"cell_type":"code","source":"def generator_model():\n    model = kr.Sequential()\n    \n    model.add(kr.layers.Dense(7 * 7 * 128, activation=\"relu\", input_shape=(LATENT_DIM,)))\n    model.add(kr.layers.Reshape((7, 7, 128)))\n    \n    model.add(kr.layers.UpSampling2D())\n    model.add(kr.layers.Conv2D(128, (3, 3), padding='same'))\n    model.add(kr.layers.BatchNormalization(momentum=0.8))\n    model.add(kr.layers.ReLU())\n\n    model.add(kr.layers.UpSampling2D())\n    model.add(kr.layers.Conv2D(64, (3, 3), padding='same'))\n    model.add(kr.layers.BatchNormalization(momentum=0.8))\n    model.add(kr.layers.ReLU())\n\n    model.add(kr.layers.Conv2D(1, (3, 3), padding='same', activation='tanh'))\n  \n    return model\n\n\ngenerator = generator_model()\ngenerator.summary()","metadata":{"id":"6bpTcDqoLWjY","outputId":"9244696e-a710-464d-c867-b46678d7515f","execution":{"iopub.status.busy":"2024-11-08T15:51:40.780706Z","iopub.execute_input":"2024-11-08T15:51:40.780977Z","iopub.status.idle":"2024-11-08T15:51:40.999850Z","shell.execute_reply.started":"2024-11-08T15:51:40.780923Z","shell.execute_reply":"2024-11-08T15:51:40.998938Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Discriminator model","metadata":{"id":"D0IKnaCtg6WE"}},{"cell_type":"code","source":"def discriminator_model():\n    model = kr.Sequential()\n    \n    model.add(kr.layers.Conv2D(32, (3, 3), strides=(2, 2), padding='same', input_shape=(28, 28, 1)))\n    model.add(kr.layers.LeakyReLU(alpha=0.2))\n    model.add(kr.layers.Dropout(0.25))\n      \n    model.add(kr.layers.Conv2D(64, (3, 3), strides=(2, 2), padding='same'))\n    # model.add(kr.layers.ZeroPadding2D(padding=((0,1),(0,1))))\n    model.add(kr.layers.BatchNormalization(momentum=0.8))\n    model.add(kr.layers.LeakyReLU(alpha=0.2))\n    model.add(kr.layers.Dropout(0.25))\n    \n    model.add(kr.layers.Conv2D(128, (3, 3), strides=(2, 2), padding='same'))\n    model.add(kr.layers.BatchNormalization(momentum=0.8))\n    model.add(kr.layers.LeakyReLU(alpha=0.2))\n    model.add(kr.layers.Dropout(0.25))\n    \n    model.add(kr.layers.Conv2D(256, (3, 3), strides=(2, 2), padding='same'))\n    model.add(kr.layers.BatchNormalization(momentum=0.8))\n    model.add(kr.layers.LeakyReLU(alpha=0.2))\n    model.add(kr.layers.Dropout(0.25))\n       \n    model.add(kr.layers.Flatten())\n    model.add(kr.layers.Dense(1, activation='sigmoid'))\n     \n    return model\n\n\ndiscriminator = discriminator_model()\ndiscriminator.summary()","metadata":{"id":"dw2tPLmk2pEP","outputId":"eb6caf35-2d08-43f8-e961-613675197eff","execution":{"iopub.status.busy":"2024-11-08T15:51:41.001669Z","iopub.execute_input":"2024-11-08T15:51:41.002065Z","iopub.status.idle":"2024-11-08T15:51:41.346054Z","shell.execute_reply.started":"2024-11-08T15:51:41.001927Z","shell.execute_reply":"2024-11-08T15:51:41.345284Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Compiling the GAN Model**","metadata":{"id":"Aak4cIMYd9Js"}},{"cell_type":"code","source":"optimizer = kr.optimizers.Adam(0.0002, 0.5)\n\ndiscriminator.compile(loss='binary_crossentropy', optimizer=optimizer,  metrics=['acc'])\ndiscriminator.trainable = False    # For GAN we will only train the generator\n\nz = kr.Input(shape=(LATENT_DIM,)) \nvalid = discriminator(generator(z))\n\nmodel = kr.Model(z, valid)\nmodel.compile(loss='binary_crossentropy', optimizer=optimizer)\nmodel.summary()","metadata":{"id":"kwTx7Csxd9Jv","outputId":"204fd20f-7c22-4bc1-b6ae-e1914dc04add","execution":{"iopub.status.busy":"2024-11-08T15:51:41.347250Z","iopub.execute_input":"2024-11-08T15:51:41.347470Z","iopub.status.idle":"2024-11-08T15:51:41.841636Z","shell.execute_reply.started":"2024-11-08T15:51:41.347432Z","shell.execute_reply":"2024-11-08T15:51:41.840843Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Adversarial ground truths\nvalid_labels = np.ones((BATCH_SIZE, 1))\nfake_labels = np.zeros((BATCH_SIZE, 1))\n\nfor epoch in range(EPOCHS):\n    noise = np.random.normal(size=(BATCH_SIZE, LATENT_DIM))\n    \n    # Shuffle and batch data \n    imgs = X[np.random.randint(0, X.shape[0], BATCH_SIZE)] \n    \n    loss_real = discriminator.train_on_batch(imgs, valid_labels)\n    loss_fake = discriminator.train_on_batch(generator.predict(noise), fake_labels)\n    d_loss, d_acc = 0.5 * np.add(loss_real, loss_fake)\n    \n    noise = np.random.normal(size=(BATCH_SIZE, LATENT_DIM))\n    g_loss = model.train_on_batch(noise, valid_labels)\n    display.clear_output(wait=True)\n    print (\"Epoch : %d [D loss: %f, acc.: %.2f%%] [G loss: %f]\" % (epoch, d_loss, 100*d_acc, g_loss))\n\n    # If at save interval => save generated image samples\n    if epoch % SAMPLE_INTERVAL == 0:\n        sample_images(generator, epoch, name='../working/fmnist')","metadata":{"id":"jbp7DEl3d9J3","outputId":"76798198-3aa6-49d0-fd65-c7491fddc0dc","execution":{"iopub.status.busy":"2024-11-08T15:51:41.843250Z","iopub.execute_input":"2024-11-08T15:51:41.843496Z","iopub.status.idle":"2024-11-08T15:59:42.505674Z","shell.execute_reply.started":"2024-11-08T15:51:41.843449Z","shell.execute_reply":"2024-11-08T15:59:42.505031Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_images(generator, None, save=False, name='../working/fmnist')","metadata":{"id":"BRxBKX30d9J8","outputId":"56055b7f-bba6-4287-bfdf-ef8817d9b2f7","execution":{"iopub.status.busy":"2024-11-08T16:03:16.098902Z","iopub.execute_input":"2024-11-08T16:03:16.099228Z","iopub.status.idle":"2024-11-08T16:03:16.736025Z","shell.execute_reply.started":"2024-11-08T16:03:16.099158Z","shell.execute_reply":"2024-11-08T16:03:16.734707Z"},"trusted":true},"outputs":[],"execution_count":null}]}