{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch.nn as nn\nimport torch\nimport torchvision.transforms as transforms\nimport os\nimport random\nfrom PIL import Image\nimport numpy as np     \nimport torch.optim as optim\nfrom torch.utils.data import DataLoader,Dataset\nimport PIL\nimport matplotlib.pyplot as plt\nimport datetime\nimport time\nfrom torch.autograd import Variable\nimport torch.nn.functional as F\nfrom tqdm.auto import tqdm\nimport torchvision\n\nimg_shape = [3,256,256]\n\nclass Generator(nn.Module):\n    def __init__(self):\n        super(Generator,self).__init__()\n\n        def block(input_channel,output_channel,normalize =True):\n            layers = [nn.Linear(input_channel,output_channel)]\n            if normalize :\n                layers.append(nn.BatchNorm1d(output_channel,0.8))\n            layers.append(nn.LeakyReLU(0.2,inplace= True))\n            return layers\n\n        self.model = nn.Sequential(\n            *block(256*256*3,128,normalize = None),\n            *block(128,256),\n            *block(256,512),\n            *block(512,1024),\n            nn.Linear(1024,int(np.prod(img_shape))),\n            nn.Tanh()\n            )\n    def forward(self,x:torch.Tensor):\n        generate = self.model(x)\n        return generate\n\nclass Discriminator(nn.Module):\n    def __init__(self):\n        super(Discriminator,self).__init__()\n\n        self.dis = nn.Sequential(\n            nn.Linear(int(np.prod(img_shape)),512),\n            nn.LeakyReLU(0.2, inplace=True),\n            nn.Linear(512,256),\n            nn.LeakyReLU(0.2, inplace=True),\n            nn.Linear(256,1),\n            nn.Sigmoid()\n        )\n\n    def forward(self,x:torch.Tensor):\n        w = self.dis(x)\n        return w\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-29T03:48:02.047707Z","iopub.execute_input":"2023-10-29T03:48:02.048720Z","iopub.status.idle":"2023-10-29T03:48:02.063726Z","shell.execute_reply.started":"2023-10-29T03:48:02.048679Z","shell.execute_reply":"2023-10-29T03:48:02.062512Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class art_dataset(Dataset):\n    def __init__(self, monet_dir, photo_dir, transform=True):\n        super().__init__()\n        # folder with monets\n        self.monet_dir = monet_dir\n        # folder with photos\n        self.photo_dir = photo_dir\n        self.monet_idx = dict()\n        self.photo_idx = dict()\n        if transform:\n            self.transform = transforms.Compose([\n                transforms.ToTensor(),\n                transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\n            ])\n        else:\n            self.transform = transforms.Compose([\n                transforms.ToTensor()\n            ])\n        for i, monet in enumerate(os.listdir(self.monet_dir)):\n            self.monet_idx[i] = monet\n        for i, photo in enumerate(os.listdir(self.photo_dir)):\n            self.photo_idx[i] = photo\n\n    def __getitem__(self, idx):\n        rand_idx = int(np.random.uniform(0, len(self.monet_idx.keys())))\n        photo_path = os.path.join(self.photo_dir, self.photo_idx[rand_idx])\n        monet_path = os.path.join(self.monet_dir, self.monet_idx[idx])\n        photo_img = Image.open(photo_path)\n        photo_img = self.transform(photo_img)\n        monet_img = Image.open(monet_path)\n        monet_img = self.transform(monet_img)\n        return photo_img, monet_img\n\n    def __len__(self):\n        return min(len(self.monet_idx.keys()), len(self.photo_idx.keys()))\n\nclass PhotoDataset(Dataset):\n    def __init__(self, photo_dir, size=(256, 256), normalize=True):\n        super().__init__()\n        self.photo_dir = photo_dir\n        self.photo_idx = dict()\n        if normalize:\n            self.transform = transforms.Compose([\n                transforms.Resize(size),\n                transforms.ToTensor(),\n                transforms.Normalize(mean=[0.5], std=[0.5])                                \n            ])\n        else:\n            self.transform = transforms.Compose([\n                transforms.Resize(size),\n                transforms.ToTensor()                               \n            ])\n        for i, fl in enumerate(os.listdir(self.photo_dir)):\n            self.photo_idx[i] = fl\n\n    def __len__(self):\n        return len(self.photo_idx.keys())    \n    \n    def __getitem__(self, idx):\n        photo_path = os.path.join(self.photo_dir, self.photo_idx[idx])\n        photo_img = Image.open(photo_path)\n        photo_img = self.transform(photo_img)\n        return photo_img","metadata":{"execution":{"iopub.status.busy":"2023-10-29T03:48:02.066606Z","iopub.execute_input":"2023-10-29T03:48:02.066963Z","iopub.status.idle":"2023-10-29T03:48:02.086223Z","shell.execute_reply.started":"2023-10-29T03:48:02.066936Z","shell.execute_reply":"2023-10-29T03:48:02.085378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndef show_tensor_images(image_tensor, num_images=5, size=(3, 256, 256)):\n    image_unflat = image_tensor.detach().cpu().view(-1, *size)\n    image_grid = torchvision.utils.make_grid(image_unflat[:num_images], nrow=5)\n    plt.figure(figsize = (20, 10))\n    plt.imshow(image_grid.permute(1, 2, 0).squeeze())\n    plt.show()\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nbatch = 128\nnum_worker = min([os.cpu_count(), batch if batch > 1 else 0, 8])\ntrain_dataset = art_dataset('../input/gan-getting-started/monet_jpg/','../input/gan-getting-started/photo_jpg/',transform=True)\ntrain_dataloader = torch.utils.data.DataLoader(train_dataset,\n                                                   shuffle=True,\n                                                   num_workers= num_worker,\n                                                   batch_size=batch,\n                                                   pin_memory=True)\nall_loss = torch.nn.BCELoss()\nmodel = Generator().to(device)\nmodel = model.cuda()\ngen_opt = optim.Adam(model.parameters(),lr=0.0002,betas=(0.5,0.999))\ndics = Discriminator().to(device)\ndics = dics.cuda()\ndisc_opt = optim.Adam(dics.parameters(),lr=0.0002,betas=(0.5,0.999))\ncurrent_step = 0\ndisplay_step = 50\nsave_step = 100\nstart_time = time.time()\nTensor = torch.FloatTensor\nloss_sum = []\n\nfor epoch in range(2000):\n    for photo, moment in train_dataloader:\n        num1 = len(photo)\n        photo = photo.cuda()\n        moment = moment.cuda()\n        photo = photo.view(num1, -1).to(device)\n        moment = moment.view(num1, -1).to(device)\n        disc_opt.zero_grad()\n        disc_fake = model(photo)\n        disc_fake_predict = dics(disc_fake.detach())\n        disc_fake_loss = all_loss(disc_fake_predict, torch.zeros_like(disc_fake_predict))\n        dic_real_predict = dics(moment)\n        dic_real_loss = all_loss(dic_real_predict, torch.ones_like(dic_real_predict))\n        dic_loss = (dic_real_loss + disc_fake_loss) / 2\n        dic_loss.backward(retain_graph=True)\n        disc_opt.step()\n        gen_opt.zero_grad()\n        disc_fake_predict = dics(disc_fake)\n        gen_fake_loss = all_loss(disc_fake_predict, torch.ones_like(disc_fake_predict))\n        gen_fake_loss.backward()\n        gen_opt.step()\n        mean_dic_loss = dic_loss.item() / display_step\n        mean_gen_loss = gen_fake_loss.item() / display_step\n        if current_step % display_step == 0 and current_step != 0:\n            print(f'Step: {current_step} mean_gen_loss: {mean_dic_loss} mean_gen_loss: {mean_gen_loss} ')\n        if current_step % save_step == 0 and current_step != 0:\n            save_file = {\"model\": model.state_dict(),\n                         \"discriminator\" : dics.state_dict(),\n                             \"dics\": dics.state_dict(),\n                             \"gen_opt\": gen_opt.state_dict(),\n                             \"disc_opt\": disc_opt.state_dict(),\n                             \"epoch\": epoch,\n                        }\n            torch.save(save_file, 'model')\n            show_tensor_images(disc_fake)\n            show_tensor_images(photo)\n        current_step += 1\n","metadata":{"execution":{"iopub.status.busy":"2023-10-29T03:48:02.087938Z","iopub.execute_input":"2023-10-29T03:48:02.088313Z","iopub.status.idle":"2023-10-29T05:09:29.254986Z","shell.execute_reply.started":"2023-10-29T03:48:02.088279Z","shell.execute_reply":"2023-10-29T05:09:29.253726Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_tensor_images1(image_tensor, num_images=5, size=(3, 256, 256)):\n    image_unflat = image_tensor.detach().cpu().view(-1, *size)\n    print(image_unflat.size())\n    plt.imshow(image_unflat.permute(0, 2, 3, 1).squeeze(0))\n    plt.show()\n\ndef unnorm(img, mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]):\n    for t, m, s in zip(img, mean, std):\n        t.mul_(s).add_(s)\n        \n    return img\n\nphoto_dataset = PhotoDataset('../input/gan-getting-started/photo_jpg/')\ndataloader = DataLoader(photo_dataset, batch_size=1, pin_memory=True)\n!mkdir ../images\nt = tqdm(dataloader, leave=False, total=dataloader.__len__())\ntopil = transforms.ToPILImage()\nmodel.eval()\n    \nfor i, photo in enumerate(t):\n    with torch.no_grad():\n        photo = photo.view(1, -1).to(device)\n        pred_monet = model(photo.to(device)).detach()\n    pred_monet = unnorm(pred_monet) \n    pred_monet = torch.reshape(pred_monet, (3, 256, 256))\n    img = topil(pred_monet)\n    img = img.convert(\"RGB\")\n    img.save(\"../images/\" + str(i+1) + \".jpg\")","metadata":{"execution":{"iopub.status.busy":"2023-10-29T05:09:29.256726Z","iopub.execute_input":"2023-10-29T05:09:29.257108Z","iopub.status.idle":"2023-10-29T05:11:10.384771Z","shell.execute_reply.started":"2023-10-29T05:09:29.257074Z","shell.execute_reply":"2023-10-29T05:11:10.383709Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import shutil\nshutil.make_archive(\"/kaggle/working/images\", 'zip', \"/kaggle/images\")","metadata":{"execution":{"iopub.status.busy":"2023-10-29T05:11:10.387065Z","iopub.execute_input":"2023-10-29T05:11:10.387375Z","iopub.status.idle":"2023-10-29T05:11:13.678050Z","shell.execute_reply.started":"2023-10-29T05:11:10.387348Z","shell.execute_reply":"2023-10-29T05:11:13.677184Z"},"trusted":true},"execution_count":null,"outputs":[]}]}