{"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"name":""},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceType":"datasetVersion","sourceId":791828,"datasetId":119698,"databundleVersionId":813580}],"dockerImageVersionId":30699,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!ls /kaggle/input/datasets/jessicali9530/stanford-dogs-dataset/images/Images/n02085620-Chihuahua","metadata":{"vscode":{"languageId":"python"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport torch\nimport torch.nn as nn\nfrom torch.nn.utils import spectral_norm\nimport torchvision\nfrom torchvision import datasets, transforms","metadata":{"vscode":{"languageId":"python"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define the path to the directory containing dog images\nPATH = '/kaggle/input/datasets/jessicali9530/stanford-dogs-dataset/images/Images/n02085620-Chihuahua/'\nLATENT_DIM = 100\n\nimages = os.listdir(PATH)\n\nprint(f'Total dog pictures available: {len(images)}')","metadata":{"vscode":{"languageId":"python"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class Generator(nn.Module):\n    def __init__(self, latent_dim):\n        super(Generator, self).__init__()\n        self.gen = nn.Sequential(\n            nn.ConvTranspose2d(latent_dim, 512, 4, 1, 0, bias=False),\n            nn.BatchNorm2d(512),\n            nn.ReLU(True),\n            \n            nn.ConvTranspose2d(512, 256, 4, 2, 1, bias=False),\n            nn.BatchNorm2d(256),\n            nn.ReLU(True),\n            \n            nn.ConvTranspose2d(256, 128, 4, 2, 1, bias=False),\n            nn.BatchNorm2d(128),\n            nn.ReLU(True),\n            \n            nn.ConvTranspose2d(128, 64, 4, 2, 1, bias=False),\n            nn.BatchNorm2d(64),\n            nn.ReLU(True),\n            \n            nn.ConvTranspose2d(64, 3, 4, 2, 1, bias=False),\n            nn.Tanh()\n        )\n\n    def forward(self, inputs):\n        return self.gen(inputs)","metadata":{"vscode":{"languageId":"python"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class Discriminator(nn.Module):\n    def __init__(self):\n        super(Discriminator, self).__init__()\n        self.disc = nn.Sequential(\n            nn.Conv2d(3, 64, 4, stride=2, padding=1, bias=False),\n            nn.LeakyReLU(0.2, inplace=True),\n            \n            spectral_norm(nn.Conv2d(64, 128, 4, stride=2, padding=1, bias=False)),\n            nn.LeakyReLU(0.2, inplace=True),\n            \n            spectral_norm(nn.Conv2d(128, 256, 4, stride=2, padding=1, bias=False)),\n            nn.LeakyReLU(0.2, inplace=True),\n            \n            spectral_norm(nn.Conv2d(256, 512, 4, stride=2, padding=1, bias=False)),\n            nn.LeakyReLU(0.2, inplace=True),\n            \n            nn.Conv2d(512, 1, 4, stride=1, padding=0, bias=False),\n            nn.Sigmoid()\n        )\n\n    def forward(self, inputs):\n        output = self.disc(inputs)\n        return output.view(-1)","metadata":{"vscode":{"languageId":"python"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def weights_init(m):\n    classname = m.__class__.__name__\n    if classname.find('Conv') != -1:\n        nn.init.normal_(m.weight.data, 0.0, 0.02)\n    elif classname.find('BatchNorm') != -1:\n        nn.init.normal_(m.weight.data, 1.0, 0.02)\n        nn.init.constant_(m.bias.data, 0)","metadata":{"vscode":{"languageId":"python"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\ngenerator_net = Generator(latent_dim=LATENT_DIM)\ndiscriminator_net = Discriminator()\n\ngenerator_net.apply(weights_init)\ndiscriminator_net.apply(weights_init)\n\ngenerator_net.to(device)\ndiscriminator_net.to(device)","metadata":{"vscode":{"languageId":"python"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# criterion = nn.BCELoss()\n\noptimizer_gen = torch.optim.Adam(generator_net.parameters(), lr=0.0001, betas=(0.5, 0.999))\noptimizer_disc = torch.optim.Adam(discriminator_net.parameters(), lr=0.0004, betas=(0.5, 0.999))","metadata":{"vscode":{"languageId":"python"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data = datasets.ImageFolder(root='/kaggle/input/datasets/jessicali9530/stanford-dogs-dataset/images/Images/', transform=transforms.Compose([\n    transforms.Resize((64, 64)),\n    transforms.ToTensor()\n]))\n\ntrain_loader = torch.utils.data.DataLoader(train_data, batch_size=32, shuffle=True)","metadata":{"vscode":{"languageId":"python"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for epoch in range(50):\n    for i, (real_images, _) in enumerate(train_loader):\n        real_images = real_images.to(device)\n        batch_size = real_images.size(0)\n\n        # Train Discriminator\n        optimizer_disc.zero_grad()\n        labels_real = torch.full((batch_size,), 0.9, device=device)\n        output_real = discriminator_net(real_images)\n        loss_real = torch.mean(nn.ReLU()(1.0 - output_real))\n\n        noise = torch.randn(batch_size, LATENT_DIM, 1, 1, device=device)\n        fake_images = generator_net(noise)\n        labels_fake = torch.zeros(batch_size, device=device)\n        output_fake = discriminator_net(fake_images.detach())\n        loss_fake = torch.mean(nn.ReLU()(1.0 + output_fake))\n\n        loss_disc = loss_real + loss_fake\n        loss_disc.backward()\n        optimizer_disc.step()\n\n        # Train Generator\n        optimizer_gen.zero_grad()\n        labels_gen = torch.full((batch_size,), 0.9, device=device)\n        output_gen = discriminator_net(fake_images)\n        loss_gen = -torch.mean(output_gen)\n        loss_gen.backward()\n        optimizer_gen.step()\n\n    print(f'Epoch [{epoch+1}/50], Loss D: {loss_disc.item():.4f}, Loss G: {loss_gen.item():.4f}')","metadata":{"vscode":{"languageId":"python"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fixed_noise = torch.randn(64, LATENT_DIM, 1, 1, device=device)\nwith torch.no_grad():\n    generated_images = generator_net(fixed_noise).cpu()\n    generated_images = (generated_images + 1) / 2  # Rescale to [0, 1]\n    grid = torchvision.utils.make_grid(generated_images, nrow=8)\n    plt.imshow(np.transpose(grid.numpy(), (1, 2, 0)))\n    plt.axis('off')\n    plt.savefig('generated_dogs.png')\n    plt.show()\n    ","metadata":{"vscode":{"languageId":"python"}},"outputs":[],"execution_count":null}]}