{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","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":[{"sourceId":15062,"databundleVersionId":545987,"sourceType":"competition"}],"dockerImageVersionId":27938,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torchvision.transforms as transforms\nimport torchvision.datasets as datasets\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport os\nimport PIL\nimport PIL.Image\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator,load_img, img_to_array, array_to_img\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Dropout, Activation, Flatten,LeakyReLU\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Activation, Dense, Flatten, BatchNormalization, Conv2D, MaxPool2D,Reshape,Conv2DTranspose\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.metrics import categorical_crossentropy\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.metrics import confusion_matrix\nimport torch\nfrom torchvision import datasets, transforms\nimport itertools\nimport os\nimport shutil\nimport random\nimport glob\nimport matplotlib.pyplot as plt\nimport warnings\nfrom keras.optimizers import Adam\nfrom keras.models import Sequential\nfrom keras.layers import Dense\nfrom keras.layers import Reshape\nfrom keras.layers import Flatten\nfrom keras.layers import Conv2D\nfrom keras.layers import Conv2DTranspose\nfrom keras.layers import LeakyReLU\nfrom keras.layers import Dropout\nfrom keras.utils.vis_utils import plot_model\nfrom numpy import expand_dims\nfrom numpy import zeros\nfrom numpy import ones\nfrom numpy import vstack\nfrom numpy.random import randn\nfrom numpy.random import randint\nfrom keras.datasets.mnist import load_data\nfrom keras.optimizers import Adam\nfrom keras.models import Sequential\nfrom keras.layers import Dense\nfrom keras.layers import Reshape\nfrom keras.layers import Flatten\nfrom keras.layers import Conv2D\nfrom keras.layers import Conv2DTranspose\nfrom keras.layers import LeakyReLU\nfrom keras.layers import Dropout\nfrom matplotlib import pyplot\nimport zipfile\n\nwith zipfile.ZipFile(\"/kaggle/input/all-dogs.zip\",\"r\") as zip_ref:\n    zip_ref.extractall(\"/kaggle/working/\")\n    \nwith zipfile.ZipFile(\"/kaggle/input/Annotation.zip\",\"r\") as zip_ref:\n    zip_ref.extractall(\"/kaggle/working/\")\n    \ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n","metadata":{"execution":{"iopub.status.busy":"2024-08-14T22:10:02.383394Z","iopub.execute_input":"2024-08-14T22:10:02.383737Z","iopub.status.idle":"2024-08-14T22:10:26.425619Z","shell.execute_reply.started":"2024-08-14T22:10:02.383679Z","shell.execute_reply":"2024-08-14T22:10:26.424304Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Generative Dog Images\n","metadata":{}},{"cell_type":"markdown","source":" ## Brief description of the problem and data\n \n The goal of this notebook is to explore the dataset, clean the images, and construct a model that will allow us to generate images of dogs that are based on the dataset. ","metadata":{}},{"cell_type":"markdown","source":"setting up the data","metadata":{}},{"cell_type":"code","source":"unzipper = zipfile.ZipFile('/kaggle/input/Annotation.zip', 'r')\nunzipper.extractall('/kaggle/working/')","metadata":{"execution":{"iopub.status.busy":"2024-08-14T22:10:26.427775Z","iopub.execute_input":"2024-08-14T22:10:26.428131Z","iopub.status.idle":"2024-08-14T22:10:33.93869Z","shell.execute_reply.started":"2024-08-14T22:10:26.428071Z","shell.execute_reply":"2024-08-14T22:10:33.937627Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"unzipper = zipfile.ZipFile('/kaggle/input/all-dogs.zip', 'r')\nunzipper.extractall('/kaggle/working/')","metadata":{"execution":{"iopub.status.busy":"2024-08-14T22:10:33.940036Z","iopub.execute_input":"2024-08-14T22:10:33.940326Z","iopub.status.idle":"2024-08-14T22:10:44.657658Z","shell.execute_reply.started":"2024-08-14T22:10:33.94027Z","shell.execute_reply":"2024-08-14T22:10:44.656988Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ntransform = transforms.Compose([transforms.Resize(256),\n                                transforms.CenterCrop(256),\n                                transforms.ToTensor(),\n                                transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])\n\ntrain_data = datasets.ImageFolder('/kaggle/working/', transform=transform)\n\ndataloader = torch.utils.data.DataLoader(train_data, shuffle=True,\n                                           batch_size=32)\n\nimgs, label = next(iter(dataloader))\nimgs = imgs.numpy().transpose(0, 2, 3, 1)\n\nfor i in range(5):\n    plt.imshow(imgs[i])\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-08-14T22:10:44.659145Z","iopub.execute_input":"2024-08-14T22:10:44.659387Z","iopub.status.idle":"2024-08-14T22:10:46.585198Z","shell.execute_reply.started":"2024-08-14T22:10:44.659348Z","shell.execute_reply":"2024-08-14T22:10:46.584008Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Generator(nn.Module):\n    def __init__(self, latent_dim):\n        super(Generator, self).__init__()\n        self.model = nn.Sequential(\n            nn.Linear(latent_dim, 128),\n            nn.ReLU(True),\n            nn.Linear(128, 256),\n            nn.BatchNorm1d(256),\n            nn.ReLU(True),\n            nn.Linear(256, 512),\n            nn.BatchNorm1d(512),\n            nn.ReLU(True),\n            nn.Linear(512, 1024),\n            nn.BatchNorm1d(1024),\n            nn.ReLU(True),\n            nn.Linear(1024, 256*256*3),\n            nn.Tanh()\n        )\n\n    def forward(self, z):\n        img = self.model(z)\n        img = img.view(img.size(0), 3, 256, 256)\n        return img\n","metadata":{"execution":{"iopub.status.busy":"2024-08-14T22:10:46.589007Z","iopub.execute_input":"2024-08-14T22:10:46.58966Z","iopub.status.idle":"2024-08-14T22:10:46.606925Z","shell.execute_reply.started":"2024-08-14T22:10:46.58959Z","shell.execute_reply":"2024-08-14T22:10:46.605622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Discriminator(nn.Module):\n    def __init__(self):\n        super(Discriminator, self).__init__()\n        self.model = nn.Sequential(\n            nn.Linear(256*256*3, 1024),\n            nn.LeakyReLU(0.2, inplace=True),\n            nn.Dropout(0.3),\n            nn.Linear(1024, 512),\n            nn.LeakyReLU(0.2, inplace=True),\n            nn.Dropout(0.3),\n            nn.Linear(512, 256),\n            nn.LeakyReLU(0.2, inplace=True),\n            nn.Dropout(0.3),\n            nn.Linear(256, 1),\n            nn.Sigmoid()\n        )\n\n    def forward(self, img):\n        img_flat = img.view(img.size(0), -1)\n        validity = self.model(img_flat)\n        return validity\n","metadata":{"execution":{"iopub.status.busy":"2024-08-14T22:10:46.612854Z","iopub.execute_input":"2024-08-14T22:10:46.61326Z","iopub.status.idle":"2024-08-14T22:10:46.630877Z","shell.execute_reply.started":"2024-08-14T22:10:46.613191Z","shell.execute_reply":"2024-08-14T22:10:46.62961Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"latent_dim = 100\n\ngenerator = Generator(latent_dim).to(device)\ndiscriminator = Discriminator().to(device)\n\noptimizer_G = optim.Adam(generator.parameters(), lr=0.0002, betas=(0.5, 0.999))\noptimizer_D = optim.Adam(discriminator.parameters(), lr=0.0002, betas=(0.5, 0.999))\n\nadversarial_loss = nn.BCELoss()\n","metadata":{"execution":{"iopub.status.busy":"2024-08-14T22:10:46.633057Z","iopub.execute_input":"2024-08-14T22:10:46.633864Z","iopub.status.idle":"2024-08-14T22:10:57.056653Z","shell.execute_reply.started":"2024-08-14T22:10:46.633788Z","shell.execute_reply":"2024-08-14T22:10:57.055892Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_epochs = 275\nfor epoch in range(num_epochs):\n    for imgs, _ in dataloader:\n        imgs = imgs.to(device)\n\n        # Train Discriminator\n        optimizer_D.zero_grad()\n\n        real_labels = torch.ones(imgs.size(0), 1).to(device)\n        fake_labels = torch.zeros(imgs.size(0), 1).to(device)\n\n        real_loss = adversarial_loss(discriminator(imgs), real_labels)\n\n        z = torch.randn(imgs.size(0), latent_dim).to(device)\n        generated_imgs = generator(z)\n\n        fake_loss = adversarial_loss(discriminator(generated_imgs.detach()), fake_labels)\n        d_loss = real_loss + fake_loss\n        d_loss.backward()\n        optimizer_D.step()\n        torch.cuda.empty_cache()\n\n        # Train Generator\n        optimizer_G.zero_grad()\n\n        g_loss = adversarial_loss(discriminator(generated_imgs), real_labels)\n        g_loss.backward()\n        optimizer_G.step()\n        torch.cuda.empty_cache()\n\n\n    print(f\"Epoch [{epoch}/{num_epochs}] | D Loss: {d_loss.item()} | G Loss: {g_loss.item()}\")\n\n    if epoch % 10 == 0:\n        with torch.no_grad():\n            z = torch.randn(16, latent_dim).to(device)\n            generated_imgs = generator(z)\n            torch.cuda.empty_cache()\n            generated_imgs = generated_imgs.cpu().numpy().transpose(0, 2, 3, 1)\n            for i in range(5):\n                plt.imshow((generated_imgs[i] + 1) / 2)\n                plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-08-14T22:10:57.058153Z","iopub.execute_input":"2024-08-14T22:10:57.058464Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.save(generator.state_dict(), 'generator.pth')\ntorch.save(discriminator.state_dict(), 'discriminator.pth')\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"latent_dim = 100  # Should match the latent_dim used during training\n\ngenerator = Generator(latent_dim).to(device)\ngenerator.load_state_dict(torch.load('generator.pth'))\ngenerator.eval()  # Set the generator to evaluation mode\n\n# Number of images to generate\nnum_images = 5\n\n# Generate random noise\nz = torch.randn(num_images, latent_dim).to(device)\nwith torch.no_grad():  # No need to calculate gradients for prediction\n    generated_imgs = generator(z)\n    generated_imgs = generated_imgs.cpu().numpy().transpose(0, 2, 3, 1)\n\nfor i in range(num_images):\n    img = (generated_imgs[i] + 1) / 2  # Rescale to [0, 1] range from [-1, 1]\n    plt.imshow(img)\n    plt.axis('off')\n    plt.show()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}