{"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 matplotlib.pyplot as plt\nfrom torchvision import datasets,transforms\nfrom torchvision.transforms import ToTensor\nimport torch.optim as optim\nimport torch.nn.functional as F\nimport os\nfrom torch.utils.data import DataLoader,Dataset\nfrom torchvision.io import read_image\nimport pandas as pd\nimport numpy as np\nfrom torch.distributions.multivariate_normal import MultivariateNormal\nfrom torchvision.utils import save_image\nfrom tqdm.auto import tqdm","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-05T07:43:45.853902Z","iopub.execute_input":"2023-10-05T07:43:45.854545Z","iopub.status.idle":"2023-10-05T07:43:50.501767Z","shell.execute_reply.started":"2023-10-05T07:43:45.854513Z","shell.execute_reply":"2023-10-05T07:43:50.500732Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class KanadaMNIST(Dataset):\n    def __init__(self,csv,transform=None,target_transform=None):\n        self.data=pd.read_csv(csv)\n        self.img_labels=self.data.iloc[:,0]\n        self.img=self.data.iloc[:,1:]\n        self.transform=transform\n        self.target=target_transform\n\n    def __len__(self):\n        return len(self.img_labels)\n\n    def __getitem__(self,idx):\n        image=self.img.iloc[idx,:].values\n        #image=pixel_val.reshape((28,28))\n        label=self.img_labels.iloc[idx]\n        if self.transform:\n              image=self.transform(image)\n        if self.target:\n              label=self.target(label)\n        return image,label","metadata":{"execution":{"iopub.status.busy":"2023-10-05T07:43:50.507140Z","iopub.execute_input":"2023-10-05T07:43:50.509601Z","iopub.status.idle":"2023-10-05T07:43:50.521256Z","shell.execute_reply.started":"2023-10-05T07:43:50.509563Z","shell.execute_reply":"2023-10-05T07:43:50.518444Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data_f=\"/kaggle/input/Kannada-MNIST/train.csv\"\ntest_data_f=\"/kaggle/input/Kannada-MNIST/test.csv\"\nval_data_f=\"/kaggle/input/Kannada-MNIST/Dig-MNIST.csv\"","metadata":{"execution":{"iopub.status.busy":"2023-10-05T07:43:50.526714Z","iopub.execute_input":"2023-10-05T07:43:50.529519Z","iopub.status.idle":"2023-10-05T07:43:50.535595Z","shell.execute_reply.started":"2023-10-05T07:43:50.529486Z","shell.execute_reply":"2023-10-05T07:43:50.534388Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train=KanadaMNIST(train_data_f)\ntest=KanadaMNIST(test_data_f)\nval=KanadaMNIST(val_data_f)","metadata":{"execution":{"iopub.status.busy":"2023-10-05T07:43:50.542289Z","iopub.execute_input":"2023-10-05T07:43:50.544531Z","iopub.status.idle":"2023-10-05T07:43:57.270836Z","shell.execute_reply.started":"2023-10-05T07:43:50.544500Z","shell.execute_reply":"2023-10-05T07:43:57.269806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size=100\ntrain_data=DataLoader(train,batch_size=batch_size,shuffle=True)\ntest_data=DataLoader(test,batch_size=batch_size,shuffle=True)\nval_data=DataLoader(val,batch_size=batch_size,shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2023-10-05T07:43:57.272470Z","iopub.execute_input":"2023-10-05T07:43:57.273131Z","iopub.status.idle":"2023-10-05T07:43:57.279192Z","shell.execute_reply.started":"2023-10-05T07:43:57.273100Z","shell.execute_reply":"2023-10-05T07:43:57.277980Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_features, train_labels = next(iter(train_data))\nprint(f\"Feature batch shape: {train_features.size()}\")\nprint(f\"Labels batch shape: {train_labels.size()}\")\n\n# Reshape the feature tensor to 2D (28x28)\nimg = np.array(train_features[0].reshape(28, 28))\n\nlabel = train_labels[0].item()  # Convert tensor to Python scalar\nplt.imshow(img, cmap=\"gray\")\nplt.show()\nprint(f\"Label: {label}\")\n     ","metadata":{"execution":{"iopub.status.busy":"2023-10-05T07:43:57.281117Z","iopub.execute_input":"2023-10-05T07:43:57.281922Z","iopub.status.idle":"2023-10-05T07:43:57.766511Z","shell.execute_reply.started":"2023-10-05T07:43:57.281892Z","shell.execute_reply":"2023-10-05T07:43:57.765453Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class VAE(nn.Module):\n    def __init__(self, D_in, H, D_out):\n        super(VAE, self).__init__()\n        self.D_in, self.H, self.D_out = D_in, H, D_out\n        # Encoder layers (Gaussian MLP)\n        self.input_layer = nn.Linear(D_in, H)\n        self.hidden_layer_mean = nn.Linear(H, D_out)\n        self.hidden_layer_var = nn.Linear(H, D_out)\n        # Decoder layers (Bernoulli MLP for MNIST data)\n        self.recon_layer = nn.Linear(D_out, H)\n        self.recon_output = nn.Linear(H, D_in)\n        self.tanh = nn.Tanh()\n        self.sigmoid = nn.Sigmoid()\n    def encode(self, inp):\n        h_vec = self.input_layer(inp.float())\n        h_vec = self.sigmoid(h_vec)\n        means = self.hidden_layer_mean(h_vec)\n        log_vars = self.hidden_layer_var(h_vec)\n        return means, log_vars\n    def decode(self, means, log_vars):\n        # Reparametrization trick\n        std_devs = torch.pow(2,log_vars)**0.5\n        aux = MultivariateNormal(torch.zeros(self.D_out), \\\n        torch.eye(self.D_out)).sample()\n        sample = means + aux * std_devs\n        # Reconstruction\n        h_vec = self.recon_layer(sample)\n        h_vec = self.tanh(h_vec)\n        output = self.sigmoid(self.recon_output(h_vec))\n        return output\n    def forward(self, inp):\n        means, log_vars = self.encode(inp)\n        output = self.decode(means, log_vars)\n        return output, means, log_vars\n    def reconstruct(self, sample):\n        h_vec = self.recon_layer(sample)\n        h_vec = self.tanh(h_vec)\n        output = self.sigmoid(self.recon_output(h_vec))\n        return output","metadata":{"execution":{"iopub.status.busy":"2023-10-05T07:46:22.745845Z","iopub.execute_input":"2023-10-05T07:46:22.746210Z","iopub.status.idle":"2023-10-05T07:46:22.754785Z","shell.execute_reply.started":"2023-10-05T07:46:22.746181Z","shell.execute_reply":"2023-10-05T07:46:22.753823Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def compute_loss(inp, recon_inp, means, log_vars):\n # Calculate reverse KL divergence\n # (formula provided in Kingma and Welling)\n     kl_loss = -0.5 * torch.sum(1 + log_vars- means ** 2 - torch.pow(2,log_vars))\n # Calculate BCE loss\n     loss = nn.BCELoss(reduction=\"sum\")\n     recon_loss = loss(recon_inp, inp.float())\n     return kl_loss + recon_loss","metadata":{"execution":{"iopub.status.busy":"2023-10-05T07:46:23.007688Z","iopub.execute_input":"2023-10-05T07:46:23.007992Z","iopub.status.idle":"2023-10-05T07:46:23.013279Z","shell.execute_reply.started":"2023-10-05T07:46:23.007966Z","shell.execute_reply":"2023-10-05T07:46:23.012211Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"D_in,H,D_out=784,500,20\nvae=VAE(D_in,H,D_out)\nvae.to(\"cpu\")","metadata":{"execution":{"iopub.status.busy":"2023-10-05T07:46:23.275689Z","iopub.execute_input":"2023-10-05T07:46:23.275979Z","iopub.status.idle":"2023-10-05T07:46:23.292163Z","shell.execute_reply.started":"2023-10-05T07:46:23.275955Z","shell.execute_reply":"2023-10-05T07:46:23.291236Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train():\n    vae.train()\n    optimizer=optim.Adam(vae.parameters(),lr=1e-3)\n    epochs=50\n    for epoch in tqdm(range(epochs)):\n        for batch_idx,(data,_),in enumerate(train_data):\n            optimizer.zero_grad()\n            #data=data.float()\n            #data = data.view((64,784))\n            output, means, log_vars = vae(data)\n            loss = compute_loss(data, output, means, log_vars)\n            loss.backward()\n            optimizer.step()\n            if (batch_idx * len(data)) % 10000 == 0:\n                print(\n                \"Train Epoch: {} [{}/{} ({:.0f}%)]\\tloss: {:.6f}\"\\\n                .format(\n                epoch,batch_idx*len(data),len(train_data),100.*batch_idx/len(train_data),loss.item()))\n    torch.save(vae.state_dict(),\"vae.%d\"%epoch)","metadata":{"execution":{"iopub.status.busy":"2023-10-05T07:46:23.563698Z","iopub.execute_input":"2023-10-05T07:46:23.564636Z","iopub.status.idle":"2023-10-05T07:46:23.571803Z","shell.execute_reply.started":"2023-10-05T07:46:23.564597Z","shell.execute_reply":"2023-10-05T07:46:23.570744Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def test():\n    dist = MultivariateNormal(torch.zeros(D_out), torch.eye(D_out))\n    vae = VAE(D_in, H, D_out)\n    vae.load_state_dict(torch.load(\"vae.%d\" % 49))\n    vae.eval()\n    outputs = []\n    for i in range(100):\n        sample = dist.sample()\n        outputs.append(vae.reconstruct(sample).view((1,1,28,28)))\n    outputs = torch.stack(outputs).view(100,1,28,28)\n    save_image(outputs, \"prior_reconstruct_100.png\", nrow=10)","metadata":{"execution":{"iopub.status.busy":"2023-10-05T08:35:59.066874Z","iopub.execute_input":"2023-10-05T08:35:59.067770Z","iopub.status.idle":"2023-10-05T08:35:59.073708Z","shell.execute_reply.started":"2023-10-05T08:35:59.067737Z","shell.execute_reply":"2023-10-05T08:35:59.072649Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train()","metadata":{"execution":{"iopub.status.busy":"2023-10-05T07:46:24.209590Z","iopub.execute_input":"2023-10-05T07:46:24.209913Z","iopub.status.idle":"2023-10-05T07:59:52.813090Z","shell.execute_reply.started":"2023-10-05T07:46:24.209887Z","shell.execute_reply":"2023-10-05T07:59:52.812096Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test()","metadata":{"execution":{"iopub.status.busy":"2023-10-05T08:36:05.186994Z","iopub.execute_input":"2023-10-05T08:36:05.187482Z","iopub.status.idle":"2023-10-05T08:36:05.301448Z","shell.execute_reply.started":"2023-10-05T08:36:05.187447Z","shell.execute_reply":"2023-10-05T08:36:05.300402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = plt.imread('/kaggle/working/prior_reconstruct_100.png')\n\n# Plot the image\nplt.imshow(img)\n\n# Show the plot\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-10-05T08:36:06.705485Z","iopub.execute_input":"2023-10-05T08:36:06.705801Z","iopub.status.idle":"2023-10-05T08:36:06.958918Z","shell.execute_reply.started":"2023-10-05T08:36:06.705774Z","shell.execute_reply":"2023-10-05T08:36:06.958040Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}